raSystem  1.0 bata
raMeshFile.cpp
Go to the documentation of this file.
1 
2 #include "..\include\raMain.h"
3 
4 namespace raSystem
5 {
7  {
8  HANDLE hFile = CreateFile(m_ModelFileName,
9  FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING,
10  FILE_FLAG_SEQUENTIAL_SCAN, NULL);
11 
12  if(!hFile)
13  RERROR_FILE(m_ModelFileName, false);
14 
15  //Dateigröße ermitteln
16  LARGE_INTEGER FileSize;
17  GetFileSizeEx(hFile, &FileSize);
18  UINT nBytes = FileSize.LowPart;
19  m_pStaticMeshData = new BYTE[nBytes];
20 
21  //Daten lesen
22  DWORD nBytesRead;
23  ReadFile(hFile, m_pStaticMeshData, nBytes, &nBytesRead, NULL);
24  CloseHandle(hFile);
25 
26  assert(nBytesRead > 0);
27 
28  RAMESH_HEADER* pMeshHeader = (RAMESH_HEADER*)m_pStaticMeshData;
29  if(!pMeshHeader)
30  RERROR_OUTOFMEM(false);
31 
32  m_nIndices = 3 * pMeshHeader->NumTriangles;
33  m_nVertices = pMeshHeader->NumVertices;
34  m_numMaterials = pMeshHeader->NumMaterials;
35 
36  m_pVertices = (VERTEXPOSITIONNORMALTEXTURED*)(pMeshHeader + 1);
38  m_nVertices);
39 
43 
44  raArray<UINT> *pSubsets;
45  pSubsets = new raArray<UINT>[m_numSubsets];
46  if(!pSubsets)
47  RERROR_OUTOFMEM(false);
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  char DiffuseTexture[MAX_TEXTURE_NAME];
58  DiffuseTexture[*pNumChars] = (char) 0;
59  m_pMaterials[matNo] = new raTexturedMaterial(m_dx,
60  "raEffects\\MyEngine.fx", "RenderScene", DiffuseTexture);
61 
62  pNumChars = (UINT*) (pTextureFilename + *pNumChars);
63  }
64  else
65  {
66  m_pMaterials[matNo] = new raMaterial(m_dx,
67  "raEffects\\MyEngine.fx",
68  "RenderWithMaterialColor");
69  pNumChars += 1;
70  }
71  }
72 
73  UINT16* pFaceIndexes = (UINT16*)pNumChars;
74  int idx = 0;
75  for(UINT i = 0; i < pMeshHeader->NumTriangles; i++)
76  {
77  for(int j = 0; j < 3; j++)
78  {
79  pSubsets[*pFaceIndexes].Add(m_pIndices[idx++]);
80  }
81  pFaceIndexes++;
82  }
83 
84  //Indices umsortieren
85  idx = 0;
86  for(UINT matNo = 0; matNo < m_numMaterials; matNo++)
87  {
88  m_pSubsets[matNo].MaterialID = matNo;
89  m_pSubsets[matNo].IndexStart = idx;
90 
91  m_pSubsets[matNo].IndexCount = pSubsets[matNo].GetSize();
92  for(int i = 0; i < pSubsets[matNo].GetSize(); i++)
93  {
94  m_pIndices[idx++] = pSubsets[matNo][i];
95  }
96  }
97  delete[] pSubsets;
98 
100  RERROR("raEntity Create - MeshFile()", false);
101  delete[] m_pStaticMeshData;
102 
106 
107  ROK("ram File galden");
108  return true;
109  }
110  //-------------------------------------------------------------------------------------
111  raSDKMesh::raSDKMesh(raDirectX* dx, LPCSTR modelFileName,
112  LPCSTR effectFileName, LPCSTR techniqueName) : raVisual(dx)
113  {
114  m_ModelFileName = modelFileName;
115  m_bExternalMaterial = false;
116  m_numMaterials = 1;
117  m_pMaterials = new raMaterial*[1];
118  m_pMaterials[0] =
119  new raMaterial(dx, effectFileName, techniqueName);
120  }
121 
122  raSDKMesh::raSDKMesh(raDirectX* dx, LPCSTR modelFileName, raMaterial *pMaterial): raVisual(dx)
123  {
124  m_ModelFileName = modelFileName;
125  m_bExternalMaterial = true;
126  m_numMaterials = 1; //auch wenn für pMaterial NULL übergeben wird, Speicherplatz anlegen
127  m_pMaterials = new raMaterial*[1];
128  m_pMaterials[0] = pMaterial;
129  }
130 
132  {
133  HRESULT hr = m_Mesh.Create(m_dx, m_ModelFileName);
134  if(FAILED(hr))
135  RERROR_DX11("CreateMesh", hr, false);
136  return true;
137  }
138 
140  {
141  m_Mesh.Destroy();
142  return true;
143  }
144 
145  bool raSDKMesh::RenderMesh(LPCSTR techniqueName)
146  {
147  raMaterial* pMaterial = m_pMaterials[0];
148  ID3DX11EffectTechnique* pTechnique =
149  pMaterial->GetEffectTechnique(techniqueName);
150  pMaterial->Setup();
151 
152  pTechnique->GetPassByIndex(0)->Apply(0, m_dx->GetImmediateContext());
153 
155  {
156  m_Mesh.Render(-1, -1, -1);
157  }
158  else
159  {
160  m_Mesh.Render(0, -1, -1);
161  }
162  return true;
163  }
164 
165  bool raSDKMesh::Intersects(CONST raVector3 *pRayPos,
166  CONST raVector3 *pRayDir, float *pDist)
167  {
168  UINT64 nIndices = m_Mesh.GetNumIndices(0);
169 
172 
173  BYTE* pIndices = m_Mesh.GetRawIndicesAt(0);
174 
175  bool bIntersects = false;
176  FLOAT mindist = FLT_MAX;
177  FLOAT u = 0, v = 0, dist = false; //u, v nicht verwendet
178 
179  for (UINT64 idx = 0; idx < nIndices; idx += 3)
180  {
181  raVector3 p[3];
182  if(m_Mesh.GetIBFormat11(0) == DXGI_FORMAT_R16_UINT)
183  {
184  UINT16* pIndices16 = (UINT16*)pIndices;
185  for(int i = 0; i < 3; i++)
186  p[i] = (pVertices + pIndices16[idx + i])->position;
187  }
188  else
189  {
190  UINT32* pIndices32 = (UINT32*)pIndices;
191  for(int i = 0; i < 3; i++)
192  p[i] = (pVertices + pIndices32[idx + i])->position;
193  }
194 
195  if(D3DXIntersectTri((D3DXVECTOR3 *)&p[0], (D3DXVECTOR3 *)&p[1], (D3DXVECTOR3 *)&p[2],
196  (D3DXVECTOR3 *) pRayPos,(D3DXVECTOR3 *) pRayDir, &u, &v, &dist))
197  {
198  bIntersects = true;
199  if(dist < mindist)
200  {
201  mindist = dist;
202  }
203  }
204  }
205  *pDist = mindist;
206  return bIntersects;
207  }
208 };
virtual void Destroy()
Definition: raSDKmesh.cpp:709
UINT64 GetNumIndices(UINT iMesh)
Definition: raSDKmesh.cpp:1017
virtual bool DestroyMesh()
Definition: raMeshFile.cpp:139
BYTE * GetRawIndicesAt(UINT iIB)
Definition: raSDKmesh.cpp:949
raSDKMesh(raDirectX *dx, LPCSTR modelFileName, LPCSTR effectFileName="raEffects\yEngine.fx", LPCSTR techniqueName="RenderScene")
Definition: raMeshFile.cpp:111
DXGI_FORMAT GetIBFormat11(UINT iMesh)
Definition: raSDKmesh.cpp:862
LPCSTR m_ModelFileName
Definition: raMeshFile.h:74
ID3D11DeviceContext * GetImmediateContext(void)
Definition: raDirectX.h:31
unsigned short UINT16
Definition: d3dx11dbg.h:35
VERTEXPOSITIONNORMALTEXTURED * m_pVertices
Definition: raEntity.h:39
virtual bool CreateMesh()
Definition: raMeshFile.cpp:131
UINT64 IndexCount
Definition: raSDKmesh.h:142
interface ID3DX11EffectTechnique ID3DX11EffectTechnique
virtual bool Intersects(CONST raVector3 *pRayPos, CONST raVector3 *pRayDir, float *pDist)
Definition: raMeshFile.cpp:165
virtual bool RenderMesh(LPCSTR techniqueName="")
Definition: raMeshFile.cpp:145
void RAPI RERROR_DX11(raString x, HRESULT h)
Definition: raMain.cpp:156
virtual void Render(UINT iDiffuseSlot=INVALID_SAMPLER_SLOT, UINT iNormalSlot=INVALID_SAMPLER_SLOT, UINT iSpecularSlot=INVALID_SAMPLER_SLOT)
Definition: raSDKmesh.cpp:809
CDXUTSDKMesh m_Mesh
Definition: raMeshFile.h:75
DWORD m_numSubsets
Definition: raVisual.h:120
virtual void Setup()
Definition: raMaterial.cpp:160
void RAPI RERROR_FILE(raString f)
Definition: raMain.cpp:149
#define MAX_TEXTURE_NAME
SDKMESH_SUBSET * m_pSubsets
Definition: raVisual.h:121
virtual bool CreateMesh(void)
Definition: raMeshFile.cpp:6
UINT64 IndexStart
Definition: raSDKmesh.h:141
virtual HRESULT Create(raDirectX *pDev11, LPCTSTR szFileName, bool bCreateAdjacencyIndices=false, SDKMESH_CALLBACKS11 *pLoaderCallbacks=NULL)
Definition: raSDKmesh.cpp:640
void RAPI ROK(raString x)
Definition: raMain.cpp:114
raMaterial ** m_pMaterials
Definition: raVisual.h:97
HRESULT Add(const TYPE &value)
Definition: raArray.h:119
BYTE * GetRawVerticesAt(UINT iVB)
Definition: raSDKmesh.cpp:943
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
void RAPI RERROR_OUTOFMEM()
Definition: raMain.cpp:144
Definition: raArray.h:3
DWORD m_numMaterials
Definition: raVisual.h:96
ID3DX11EffectTechnique * GetEffectTechnique(LPCSTR techniqueName="")
Definition: raMaterial.h:31
void RAPI RERROR(raString x)
Definition: raMain.cpp:129