raSystem  1.0 bata
raModel.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 
3 namespace System
4 {
5  raModel::raModel(raSmartPointer<raDirectX> dx, LPCSTR FileName) : raEntity(dx.get(), NULL, false, false, 0)
6  {
7  m_Modelfilename = FileName;
8  }
10  {
11  m_pVertices = NULL;
12  m_pIndices = NULL;
13  }
15  {
16  HANDLE hFile = CreateFile((std::string("raModel\\") +m_Modelfilename).c_str(), FILE_READ_DATA, FILE_SHARE_READ, NULL,
17  OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
18 
19  //Datei Größe
20  LARGE_INTEGER FileSize;
21  GetFileSizeEx(hFile, &FileSize);
22  UINT nBytes = FileSize.LowPart;
23  m_pMeshData = new BYTE[nBytes];
24 
25  // Daten lesen
26  DWORD nBytesRead;
27  ReadFile(hFile, m_pMeshData, nBytes, &nBytesRead, NULL);
28  CloseHandle(hFile);
29 
30  assert(nBytesRead > 0);
31 
32  RAMESH_HEADER * pMeshHeader = (RAMESH_HEADER*)m_pMeshData;
33  m_nIndices = 3 * pMeshHeader->NumTriangles;
34  m_nVertices = pMeshHeader->NumVertices;
35  m_numMaterials = pMeshHeader->NumMaterials;
36 
37  m_pVertices = (VERTEXPOSITIONNORMALTEXTURED*)(pMeshHeader + 1);
39  m_nVertices);
40  //...
41  //Materialien
45 
46  raArray<UINT> *pSubsets;
47  pSubsets = new raArray<UINT>[m_numSubsets];
48 
49  UINT* pNumChars = (UINT*) ( m_pIndices + m_nIndices);
50  for(UINT matNo = 0; matNo < m_numMaterials; matNo++)
51  {
52  m_pSubsets[matNo].MaterialID = matNo;
53  m_pSubsets[matNo].PrimitiveType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
54  if(*pNumChars > 0)
55  {
56  CHAR * pTextureFileName = (CHAR*)(pNumChars + 1);
57  pTextureFileName[*pNumChars] = (CHAR)0;
58  m_pMaterials[matNo] = new raTexturedMaterial(m_dx.get(), "raEffects\\MyEngine.fx", "RenderScene",
59  (std::string("raTextur\\") + pTextureFileName).c_str());
60  pNumChars = (UINT*)(pTextureFileName + *pNumChars);
61  }
62  else
63  {
64  m_pMaterials[matNo] = new raMaterial(m_dx.get(), "raEffects\\MyEngine.fx", "RenderWithMaterialColor");
65  pNumChars += 1;
66  }
67  }
68  // Subsets
69  UINT16 *pFaceIndexes = (UINT16*)pNumChars;
70  int idx = 0;
71  for(UINT i = 0; i < pMeshHeader->NumTriangles; i++)
72  {
73  for(int j = 0; j < 3; i++)
74  {
75  pSubsets[*pFaceIndexes].Add(m_pIndices[idx++]);
76  }
77  pFaceIndexes++;
78  }
79  //Indices Umsotieren
80  idx = 0;
81  for(UINT matNo=0; matNo < m_numMaterials; matNo++)
82  {
83  m_pSubsets[matNo].MaterialID = matNo;
84  m_pSubsets[matNo].IndexStart = idx;
85 
86  m_pSubsets[matNo].IndexCount = pSubsets[matNo].GetSize();
87  for(int i = 0; i < pSubsets[matNo].GetSize(); i++)
88  {
89  m_pIndices[idx++] = pSubsets[matNo][i];
90  }
91  }
92  delete[] pSubsets;
94  delete[] m_pMeshData;
95 
96  return true;
97  }
98 }
UINT NumMaterials
Definition: raModel.h:7
UINT NumVertices
Definition: raModel.h:5
UINT NumTriangles
Definition: raModel.h:6
unsigned short UINT16
Definition: d3dx11dbg.h:35
VERTEXPOSITIONNORMALTEXTURED * m_pVertices
Definition: raEntity.h:39
UINT64 IndexCount
Definition: raSDKmesh.h:142
virtual bool CreateMesh()
Definition: raModel.cpp:14
DWORD m_numSubsets
Definition: raVisual.h:120
raModel(raSmartPointer< raDirectX > dx, LPCSTR FileName)
Definition: raModel.cpp:5
~raModel(void)
Definition: raModel.cpp:9
SDKMESH_SUBSET * m_pSubsets
Definition: raVisual.h:121
UINT64 IndexStart
Definition: raSDKmesh.h:141
raMaterial ** m_pMaterials
Definition: raVisual.h:97
HRESULT Add(const TYPE &value)
Definition: raArray.h:119
raInt GetSize() const
Definition: raArray.h:20
UINT PrimitiveType
Definition: raSDKmesh.h:140
raSmartPointer< raDirectX > m_dx
Definition: raVisual.h:99
virtual bool CreateMesh()
Definition: raEntity.h:170
Definition: raArray.h:3
DWORD m_numMaterials
Definition: raVisual.h:96
T * get() const