raSystem  1.0 bata
raSDKmesh.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 
3 namespace System
4 {
5  void CDXUTSDKMesh::LoadMaterials( raDirectX* pd3dDevice, SDKMESH_MATERIAL* pMaterials, UINT numMaterials,
6  SDKMESH_CALLBACKS11* pLoaderCallbacks )
7  {
8  // TODO: D3D11
9  char strPath[MAX_PATH];
10 
11  if( pLoaderCallbacks && pLoaderCallbacks->pCreateTextureFromFile )
12  {
13  for( UINT m = 0; m < numMaterials; m++ )
14  {
15  pMaterials[m].pDiffuseTexture11 = NULL;
16  pMaterials[m].pNormalTexture11 = NULL;
17  pMaterials[m].pSpecularTexture11 = NULL;
18  pMaterials[m].pDiffuseRV11 = NULL;
19  pMaterials[m].pNormalRV11 = NULL;
20  pMaterials[m].pSpecularRV11 = NULL;
21 
22  // load textures
23  if( pMaterials[m].DiffuseTexture[0] != 0 )
24  {
25  pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice,
26  pMaterials[m].DiffuseTexture, &pMaterials[m].pDiffuseRV11,
27  pLoaderCallbacks->pContext );
28  }
29  if( pMaterials[m].NormalTexture[0] != 0 )
30  {
31  pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice,
32  pMaterials[m].NormalTexture, &pMaterials[m].pNormalRV11,
33  pLoaderCallbacks->pContext );
34  }
35  if( pMaterials[m].SpecularTexture[0] != 0 )
36  {
37  pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice,
38  pMaterials[m].SpecularTexture, &pMaterials[m].pSpecularRV11,
39  pLoaderCallbacks->pContext );
40  }
41  }
42  }
43  else
44  {
45  for( UINT m = 0; m < numMaterials; m++ )
46  {
47  pMaterials[m].pDiffuseTexture11 = NULL;
48  pMaterials[m].pNormalTexture11 = NULL;
49  pMaterials[m].pSpecularTexture11 = NULL;
50  pMaterials[m].pDiffuseRV11 = NULL;
51  pMaterials[m].pNormalRV11 = NULL;
52  pMaterials[m].pSpecularRV11 = NULL;
53 
54  // load textures
55  if( pMaterials[m].DiffuseTexture[0] != 0 )
56  {
57  sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].DiffuseTexture );
58  if( FAILED( raResource::Instance().CreateTextureFromFile( pd3dDevice,strPath, &pMaterials[m].pDiffuseRV11, true ) ) )
59  pMaterials[m].pDiffuseRV11 = ( ID3D11ShaderResourceView* )ERROR_RESOURCE_VALUE;
60  }
61  if( pMaterials[m].NormalTexture[0] != 0 )
62  {
63  sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].NormalTexture );
64  if( FAILED( raResource::Instance().CreateTextureFromFile( pd3dDevice, strPath, &pMaterials[m].pNormalRV11 ) ) )
65  pMaterials[m].pNormalRV11 = ( ID3D11ShaderResourceView* )ERROR_RESOURCE_VALUE;
66  }
67  if( pMaterials[m].SpecularTexture[0] != 0 )
68  {
69  sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].SpecularTexture );
70  if( FAILED( raResource::Instance().CreateTextureFromFile( pd3dDevice, strPath, &pMaterials[m].pSpecularRV11 ) ) )
71  pMaterials[m].pSpecularRV11 = ( ID3D11ShaderResourceView* )ERROR_RESOURCE_VALUE;
72  }
73  }
74  }
75  }
77  void* pVertices, SDKMESH_CALLBACKS11* pLoaderCallbacks )
78  {
79  HRESULT hr;
80  pHeader->DataOffset = 0;
81  //Vertex Buffer
82  D3D11_BUFFER_DESC bufferDesc;
83  bufferDesc.ByteWidth = ( UINT )( pHeader->SizeBytes );
84  bufferDesc.Usage = D3D11_USAGE_DEFAULT;
85  bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
86  bufferDesc.CPUAccessFlags = 0;
87  bufferDesc.MiscFlags = 0;
88 
89  if( pLoaderCallbacks && pLoaderCallbacks->pCreateVertexBuffer )
90  {
91  pLoaderCallbacks->pCreateVertexBuffer( pd3dDevice, &pHeader->pVB11, bufferDesc, pVertices,
92  pLoaderCallbacks->pContext );
93  }
94  else
95  {
96  D3D11_SUBRESOURCE_DATA InitData;
97  InitData.pSysMem = pVertices;
98  hr = pd3dDevice->GetDevice()->CreateBuffer( &bufferDesc, &InitData, &pHeader->pVB11 );
99  }
100 
101  return hr;
102  }
103 
104  //--------------------------------------------------------------------------------------
106  void* pIndices, SDKMESH_CALLBACKS11* pLoaderCallbacks )
107  {
108  HRESULT hr = S_OK;
109  pHeader->DataOffset = 0;
110  //Index Buffer
111  D3D11_BUFFER_DESC bufferDesc;
112  bufferDesc.ByteWidth = ( UINT )( pHeader->SizeBytes );
113  bufferDesc.Usage = D3D11_USAGE_DEFAULT;
114  bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
115  bufferDesc.CPUAccessFlags = 0;
116  bufferDesc.MiscFlags = 0;
117 
118  if( pLoaderCallbacks && pLoaderCallbacks->pCreateIndexBuffer )
119  {
120  pLoaderCallbacks->pCreateIndexBuffer( pd3dDevice, &pHeader->pIB11, bufferDesc, pIndices,
121  pLoaderCallbacks->pContext );
122  }
123  else
124  {
125  D3D11_SUBRESOURCE_DATA InitData;
126  InitData.pSysMem = pIndices;
127  hr = pd3dDevice->GetDevice()->CreateBuffer( &bufferDesc, &InitData, &pHeader->pIB11 );
128  }
129 
130  return hr;
131  }
133  LPCTSTR szFileName,
134  bool bCreateAdjacencyIndices,
135  SDKMESH_CALLBACKS11* pLoaderCallbacks11)
136  {
137  HRESULT hr = S_OK;
138 
139  // Open the file
140  m_hFile = CreateFile( szFileName, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN,
141  NULL );
142  if( INVALID_HANDLE_VALUE == m_hFile )
143  return E_FAIL;
144 
145  // Get the file size
146  LARGE_INTEGER FileSize;
147  GetFileSizeEx( m_hFile, &FileSize );
148  UINT cBytes = FileSize.LowPart;
149 
150  // Allocate memory
151  m_pStaticMeshData = new BYTE[ cBytes ];
152  if( !m_pStaticMeshData )
153  {
154  CloseHandle( m_hFile );
155  return E_OUTOFMEMORY;
156  }
157 
158  // Read in the file
159  DWORD dwBytesRead;
160  if( !ReadFile( m_hFile, m_pStaticMeshData, cBytes, &dwBytesRead, NULL ) )
161  hr = E_FAIL;
162 
163  CloseHandle( m_hFile );
164 
165  if( SUCCEEDED( hr ) )
166  {
167  hr = CreateFromMemory( pDev11,
168  m_pStaticMeshData,
169  cBytes,
170  bCreateAdjacencyIndices,
171  false,
172  pLoaderCallbacks11);
173  if( FAILED( hr ) )
174  delete []m_pStaticMeshData;
175  }
176 
177  return hr;
178  }
179 
181  BYTE* pData,
182  UINT DataBytes,
183  bool bCreateAdjacencyIndices,
184  bool bCopyStatic,
185  SDKMESH_CALLBACKS11* pLoaderCallbacks11)
186  {
187  HRESULT hr = E_FAIL;
188  D3DXVECTOR3 lower;
189  D3DXVECTOR3 upper;
190 
191  m_pDev11 = pDev11;
192 
193  // Set outstanding resources to zero
194  m_NumOutstandingResources = 0;
195 
196  if( bCopyStatic )
197  {
198  SDKMESH_HEADER* pHeader = ( SDKMESH_HEADER* )pData;
199 
200  SIZE_T StaticSize = ( SIZE_T )( pHeader->HeaderSize + pHeader->NonBufferDataSize );
201  m_pHeapData = new BYTE[ StaticSize ];
202  if( !m_pHeapData )
203  return hr;
204 
205  m_pStaticMeshData = m_pHeapData;
206 
207  CopyMemory( m_pStaticMeshData, pData, StaticSize );
208  }
209  else
210  {
211  m_pHeapData = pData;
212  m_pStaticMeshData = pData;
213  }
214 
215  // Pointer fixup
216  m_pMeshHeader = ( SDKMESH_HEADER* )m_pStaticMeshData;
217  m_pVertexBufferArray = ( SDKMESH_VERTEX_BUFFER_HEADER* )( m_pStaticMeshData +
218  m_pMeshHeader->VertexStreamHeadersOffset );
219  m_pIndexBufferArray = ( SDKMESH_INDEX_BUFFER_HEADER* )( m_pStaticMeshData +
220  m_pMeshHeader->IndexStreamHeadersOffset );
221  m_pMeshArray = ( SDKMESH_MESH* )( m_pStaticMeshData + m_pMeshHeader->MeshDataOffset );
222  m_pSubsetArray = ( SDKMESH_SUBSET* )( m_pStaticMeshData + m_pMeshHeader->SubsetDataOffset );
223  m_pFrameArray = ( SDKMESH_FRAME* )( m_pStaticMeshData + m_pMeshHeader->FrameDataOffset );
224  m_pMaterialArray = ( SDKMESH_MATERIAL* )( m_pStaticMeshData + m_pMeshHeader->MaterialDataOffset );
225 
226  // Setup subsets
227  for( UINT i = 0; i < m_pMeshHeader->NumMeshes; i++ )
228  {
229  m_pMeshArray[i].pSubsets = ( UINT* )( m_pStaticMeshData + m_pMeshArray[i].SubsetOffset );
230  m_pMeshArray[i].pFrameInfluences = ( UINT* )( m_pStaticMeshData + m_pMeshArray[i].FrameInfluenceOffset );
231  }
232 
233  // error condition
234  if( m_pMeshHeader->Version != SDKMESH_FILE_VERSION )
235  {
236  hr = E_NOINTERFACE;
237  goto Error;
238  }
239 
240  // Setup buffer data pointer
241  BYTE* pBufferData = pData + m_pMeshHeader->HeaderSize + m_pMeshHeader->NonBufferDataSize;
242 
243  // Get the start of the buffer data
244  UINT64 BufferDataStart = m_pMeshHeader->HeaderSize + m_pMeshHeader->NonBufferDataSize;
245 
246  // Create VBs
247  m_ppVertices = new BYTE*[m_pMeshHeader->NumVertexBuffers];
248  for( UINT i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ )
249  {
250  BYTE* pVertices = NULL;
251  pVertices = ( BYTE* )( pBufferData + ( m_pVertexBufferArray[i].DataOffset - BufferDataStart ) );
252 
253  CreateVertexBuffer( pDev11, &m_pVertexBufferArray[i], pVertices, pLoaderCallbacks11 );
254 
255  m_ppVertices[i] = pVertices;
256  }
257 
258  // Create IBs
259  m_ppIndices = new BYTE*[m_pMeshHeader->NumIndexBuffers];
260  for( UINT i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ )
261  {
262  BYTE* pIndices = NULL;
263  pIndices = ( BYTE* )( pBufferData + ( m_pIndexBufferArray[i].DataOffset - BufferDataStart ) );
264 
265  CreateIndexBuffer( pDev11, &m_pIndexBufferArray[i], pIndices, pLoaderCallbacks11 );
266  m_ppIndices[i] = pIndices;
267  }
268 
269  // Load Materials
270  if( pDev11 )
271  LoadMaterials( pDev11, m_pMaterialArray, m_pMeshHeader->NumMaterials, pLoaderCallbacks11 );
272 
273  // Create a place to store our bind pose frame matrices
274  m_pBindPoseFrameMatrices = new D3DXMATRIX[ m_pMeshHeader->NumFrames ];
275  if( !m_pBindPoseFrameMatrices )
276  goto Error;
277 
278  // Create a place to store our transformed frame matrices
279  m_pTransformedFrameMatrices = new D3DXMATRIX[ m_pMeshHeader->NumFrames ];
280  if( !m_pTransformedFrameMatrices )
281  goto Error;
282  m_pWorldPoseFrameMatrices = new D3DXMATRIX[ m_pMeshHeader->NumFrames ];
283  if( !m_pWorldPoseFrameMatrices )
284  goto Error;
285 
286  SDKMESH_SUBSET* pSubset = NULL;
287  D3D11_PRIMITIVE_TOPOLOGY PrimType;
288 
289  // update bounding volume
290  SDKMESH_MESH* currentMesh = &m_pMeshArray[0];
291  int tris = 0;
292  for (UINT meshi=0; meshi < m_pMeshHeader->NumMeshes; ++meshi) {
293  lower.x = FLT_MAX; lower.y = FLT_MAX; lower.z = FLT_MAX;
294  upper.x = -FLT_MAX; upper.y = -FLT_MAX; upper.z = -FLT_MAX;
295  currentMesh = GetMesh( meshi );
296  INT indsize;
297  if (m_pIndexBufferArray[currentMesh->IndexBuffer].IndexType == IT_16BIT ) {
298  indsize = 2;
299  }else {
300  indsize = 4;
301  }
302 
303  for( UINT subset = 0; subset < currentMesh->NumSubsets; subset++ )
304  {
305  pSubset = GetSubset( meshi, subset ); //&m_pSubsetArray[ currentMesh->pSubsets[subset] ];
306 
307  PrimType = GetPrimitiveType11( ( SDKMESH_PRIMITIVE_TYPE )pSubset->PrimitiveType );
308  assert( PrimType == D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );// only triangle lists are handled.
309 
310  UINT IndexCount = ( UINT )pSubset->IndexCount;
311  UINT IndexStart = ( UINT )pSubset->IndexStart;
312 
313  UINT *ind = ( UINT * )m_ppIndices[currentMesh->IndexBuffer];
314  FLOAT *verts = ( FLOAT* )m_ppVertices[currentMesh->VertexBuffers[0]];
315  UINT stride = (UINT)m_pVertexBufferArray[currentMesh->VertexBuffers[0]].StrideBytes;
316  assert (stride % 4 == 0);
317  stride /=4;
318  for (UINT vertind = IndexStart; vertind < IndexStart + IndexCount; ++vertind) { //TODO: test 16 bit and 32 bit
319  UINT current_ind=0;
320  if (indsize == 2) {
321  UINT ind_div2 = vertind / 2;
322  current_ind = ind[ind_div2];
323  if (vertind %2 ==0) {
324  current_ind = current_ind << 16;
325  current_ind = current_ind >> 16;
326  }else {
327  current_ind = current_ind >> 16;
328  }
329  }else {
330  current_ind = ind[vertind];
331  }
332  tris++;
333  D3DXVECTOR3 *pt = (D3DXVECTOR3*)&(verts[stride * current_ind]);
334  if (pt->x < lower.x) {
335  lower.x = pt->x;
336  }
337  if (pt->y < lower.y) {
338  lower.y = pt->y;
339  }
340  if (pt->z < lower.z) {
341  lower.z = pt->z;
342  }
343  if (pt->x > upper.x) {
344  upper.x = pt->x;
345  }
346  if (pt->y > upper.y) {
347  upper.y = pt->y;
348  }
349  if (pt->z > upper.z) {
350  upper.z = pt->z;
351  }
352  }
353  }
354 
355  D3DXVECTOR3 half = upper - lower;
356  half *=0.5f;
357 
358  currentMesh->BoundingBoxCenter = lower + half;
359  currentMesh->BoundingBoxExtents = half;
360  }
361  // Update
362 
363  hr = S_OK;
364  Error:
365 
366  return hr;
367  }
368  void CDXUTSDKMesh::TransformBindPoseFrame( UINT iFrame, D3DXMATRIX* pParentWorld )
369  {
370  if( !m_pBindPoseFrameMatrices )
371  return;
372 
373  // Transform ourselves
374  D3DXMATRIX LocalWorld;
375  D3DXMatrixMultiply( &LocalWorld, &m_pFrameArray[iFrame].Matrix, pParentWorld );
376  m_pBindPoseFrameMatrices[iFrame] = LocalWorld;
377 
378  // Transform our siblings
379  if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME )
380  TransformBindPoseFrame( m_pFrameArray[iFrame].SiblingFrame, pParentWorld );
381 
382  // Transform our children
383  if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME )
384  TransformBindPoseFrame( m_pFrameArray[iFrame].ChildFrame, &LocalWorld );
385  }
386 
387  //--------------------------------------------------------------------------------------
388  // transform frame using a recursive traversal
389  //--------------------------------------------------------------------------------------
390  void CDXUTSDKMesh::TransformFrame( UINT iFrame, D3DXMATRIX* pParentWorld, double fTime )
391  {
392  // Get the tick data
393  D3DXMATRIX LocalTransform;
394  UINT iTick = GetAnimationKeyFromTime( fTime );
395 
396  if( INVALID_ANIMATION_DATA != m_pFrameArray[iFrame].AnimationDataIndex )
397  {
398  SDKANIMATION_FRAME_DATA* pFrameData = &m_pAnimationFrameData[ m_pFrameArray[iFrame].AnimationDataIndex ];
399  SDKANIMATION_DATA* pData = &pFrameData->pAnimationData[ iTick ];
400 
401  // turn it into a matrix (Ignore scaling for now)
402  D3DXVECTOR3 parentPos = pData->Translation;
403  D3DXMATRIX mTranslate;
404  D3DXMatrixTranslation( &mTranslate, parentPos.x, parentPos.y, parentPos.z );
405 
406  D3DXQUATERNION quat;
407  D3DXMATRIX mQuat;
408  quat.w = pData->Orientation.w;
409  quat.x = pData->Orientation.x;
410  quat.y = pData->Orientation.y;
411  quat.z = pData->Orientation.z;
412  if( quat.w == 0 && quat.x == 0 && quat.y == 0 && quat.z == 0 )
413  D3DXQuaternionIdentity( &quat );
414  D3DXQuaternionNormalize( &quat, &quat );
415  D3DXMatrixRotationQuaternion( &mQuat, &quat );
416  LocalTransform = ( mQuat * mTranslate );
417  }
418  else
419  {
420  LocalTransform = m_pFrameArray[iFrame].Matrix;
421  }
422 
423  // Transform ourselves
424  D3DXMATRIX LocalWorld;
425  D3DXMatrixMultiply( &LocalWorld, &LocalTransform, pParentWorld );
426  m_pTransformedFrameMatrices[iFrame] = LocalWorld;
427  m_pWorldPoseFrameMatrices[iFrame] = LocalWorld;
428 
429  // Transform our siblings
430  if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME )
431  TransformFrame( m_pFrameArray[iFrame].SiblingFrame, pParentWorld, fTime );
432 
433  // Transform our children
434  if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME )
435  TransformFrame( m_pFrameArray[iFrame].ChildFrame, &LocalWorld, fTime );
436  }
437 
438  //--------------------------------------------------------------------------------------
439  // transform frame assuming that it is an absolute transformation
440  //--------------------------------------------------------------------------------------
441  void CDXUTSDKMesh::TransformFrameAbsolute( UINT iFrame, double fTime )
442  {
443  D3DXMATRIX mTrans1;
444  D3DXMATRIX mTrans2;
445  D3DXMATRIX mRot1;
446  D3DXMATRIX mRot2;
447  D3DXQUATERNION quat1;
448  D3DXQUATERNION quat2;
449  D3DXMATRIX mTo;
450  D3DXMATRIX mInvTo;
451  D3DXMATRIX mFrom;
452 
453  UINT iTick = GetAnimationKeyFromTime( fTime );
454 
455  if( INVALID_ANIMATION_DATA != m_pFrameArray[iFrame].AnimationDataIndex )
456  {
457  SDKANIMATION_FRAME_DATA* pFrameData = &m_pAnimationFrameData[ m_pFrameArray[iFrame].AnimationDataIndex ];
458  SDKANIMATION_DATA* pData = &pFrameData->pAnimationData[ iTick ];
459  SDKANIMATION_DATA* pDataOrig = &pFrameData->pAnimationData[ 0 ];
460 
461  D3DXMatrixTranslation( &mTrans1, -pDataOrig->Translation.x,
462  -pDataOrig->Translation.y,
463  -pDataOrig->Translation.z );
464  D3DXMatrixTranslation( &mTrans2, pData->Translation.x,
465  pData->Translation.y,
466  pData->Translation.z );
467 
468  quat1.x = pDataOrig->Orientation.x;
469  quat1.y = pDataOrig->Orientation.y;
470  quat1.z = pDataOrig->Orientation.z;
471  quat1.w = pDataOrig->Orientation.w;
472  D3DXQuaternionInverse( &quat1, &quat1 );
473  D3DXMatrixRotationQuaternion( &mRot1, &quat1 );
474  mInvTo = mTrans1 * mRot1;
475 
476  quat2.x = pData->Orientation.x;
477  quat2.y = pData->Orientation.y;
478  quat2.z = pData->Orientation.z;
479  quat2.w = pData->Orientation.w;
480  D3DXMatrixRotationQuaternion( &mRot2, &quat2 );
481  mFrom = mRot2 * mTrans2;
482 
483  D3DXMATRIX mOutput = mInvTo * mFrom;
484  m_pTransformedFrameMatrices[iFrame] = mOutput;
485  }
486  }
487 
488  #define MAX_D3D11_VERTEX_STREAMS D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT
489  //--------------------------------------------------------------------------------------
490  void CDXUTSDKMesh::RenderMesh( UINT iMesh,
491  bool bAdjacent,
492  UINT iDiffuseSlot,
493  UINT iNormalSlot,
494  UINT iSpecularSlot )
495  {
496  if( 0 < GetOutstandingBufferResources() )
497  return;
498 
499  SDKMESH_MESH* pMesh = &m_pMeshArray[iMesh];
500 
501  UINT Strides[MAX_D3D11_VERTEX_STREAMS];
502  UINT Offsets[MAX_D3D11_VERTEX_STREAMS];
503  ID3D11Buffer* pVB[MAX_D3D11_VERTEX_STREAMS];
504 
506  return;
507 
508  for( UINT64 i = 0; i < pMesh->NumVertexBuffers; i++ )
509  {
510  pVB[i] = m_pVertexBufferArray[ pMesh->VertexBuffers[i] ].pVB11;
511  Strides[i] = ( UINT )m_pVertexBufferArray[ pMesh->VertexBuffers[i] ].StrideBytes;
512  Offsets[i] = 0;
513  }
514 
515  SDKMESH_INDEX_BUFFER_HEADER* pIndexBufferArray;
516  if( bAdjacent )
517  pIndexBufferArray = m_pAdjacencyIndexBufferArray;
518  else
519  pIndexBufferArray = m_pIndexBufferArray;
520 
521  ID3D11Buffer* pIB = pIndexBufferArray[ pMesh->IndexBuffer ].pIB11;
522  DXGI_FORMAT ibFormat = DXGI_FORMAT_R16_UINT;
523  switch( pIndexBufferArray[ pMesh->IndexBuffer ].IndexType )
524  {
525  case IT_16BIT:
526  ibFormat = DXGI_FORMAT_R16_UINT;
527  break;
528  case IT_32BIT:
529  ibFormat = DXGI_FORMAT_R32_UINT;
530  break;
531  };
532 
533  m_pDev11->GetImmediateContext()->IASetVertexBuffers( 0, pMesh->NumVertexBuffers, pVB, Strides, Offsets );
534  m_pDev11->GetImmediateContext()->IASetIndexBuffer( pIB, ibFormat, 0 );
535 
536  SDKMESH_SUBSET* pSubset = NULL;
537  SDKMESH_MATERIAL* pMat = NULL;
538  D3D11_PRIMITIVE_TOPOLOGY PrimType;
539 
540  for( UINT subset = 0; subset < pMesh->NumSubsets; subset++ )
541  {
542  pSubset = &m_pSubsetArray[ pMesh->pSubsets[subset] ];
543 
544  PrimType = GetPrimitiveType11( ( SDKMESH_PRIMITIVE_TYPE )pSubset->PrimitiveType );
545  if( bAdjacent )
546  {
547  switch( PrimType )
548  {
549  case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST:
550  PrimType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ;
551  break;
552  case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP:
553  PrimType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ;
554  break;
555  case D3D11_PRIMITIVE_TOPOLOGY_LINELIST:
556  PrimType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ;
557  break;
558  case D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP:
559  PrimType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ;
560  break;
561  }
562  }
563 
564  m_pDev11->GetImmediateContext()->IASetPrimitiveTopology( PrimType );
565 
566  pMat = &m_pMaterialArray[ pSubset->MaterialID ];
567  if( iDiffuseSlot != INVALID_SAMPLER_SLOT && !IsErrorResource( pMat->pDiffuseRV11 ) )
568  m_pDev11->GetImmediateContext()->PSSetShaderResources( iDiffuseSlot, 1, &pMat->pDiffuseRV11 );
569  if( iNormalSlot != INVALID_SAMPLER_SLOT && !IsErrorResource( pMat->pNormalRV11 ) )
570  m_pDev11->GetImmediateContext()->PSSetShaderResources( iNormalSlot, 1, &pMat->pNormalRV11 );
571  if( iSpecularSlot != INVALID_SAMPLER_SLOT && !IsErrorResource( pMat->pSpecularRV11 ) )
572  m_pDev11->GetImmediateContext()->PSSetShaderResources( iSpecularSlot, 1, &pMat->pSpecularRV11 );
573 
574  UINT IndexCount = ( UINT )pSubset->IndexCount;
575  UINT IndexStart = ( UINT )pSubset->IndexStart;
576  UINT VertexStart = ( UINT )pSubset->VertexStart;
577  if( bAdjacent )
578  {
579  IndexCount *= 2;
580  IndexStart *= 2;
581  }
582 
583  m_pDev11->GetImmediateContext()->DrawIndexed( IndexCount, IndexStart, VertexStart );
584  }
585  }
586 
587  //--------------------------------------------------------------------------------------
588  void CDXUTSDKMesh::RenderFrame( UINT iFrame,
589  bool bAdjacent,
590  UINT iDiffuseSlot,
591  UINT iNormalSlot,
592  UINT iSpecularSlot )
593  {
594  if( !m_pStaticMeshData || !m_pFrameArray )
595  return;
596 
597  if( m_pFrameArray[iFrame].Mesh != INVALID_MESH )
598  {
599  RenderMesh( m_pFrameArray[iFrame].Mesh,
600  bAdjacent,
601  iDiffuseSlot,
602  iNormalSlot,
603  iSpecularSlot );
604  }
605 
606  // Render our children
607  if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME )
608  RenderFrame( m_pFrameArray[iFrame].ChildFrame, bAdjacent, iDiffuseSlot,
609  iNormalSlot, iSpecularSlot );
610 
611  // Render our siblings
612  if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME )
613  RenderFrame( m_pFrameArray[iFrame].SiblingFrame, bAdjacent, iDiffuseSlot,
614  iNormalSlot, iSpecularSlot );
615  }
616  CDXUTSDKMesh::CDXUTSDKMesh() : m_NumOutstandingResources( 0 ),
617  m_bLoading( false ),
618  m_hFile( 0 ),
619  m_hFileMappingObject( 0 ),
620  m_pMeshHeader( NULL ),
621  m_pStaticMeshData( NULL ),
622  m_pHeapData( NULL ),
623  m_pAdjacencyIndexBufferArray( NULL ),
624  m_pAnimationData( NULL ),
625  m_pAnimationHeader( NULL ),
626  m_ppVertices( NULL ),
627  m_ppIndices( NULL ),
628  m_pBindPoseFrameMatrices( NULL ),
629  m_pTransformedFrameMatrices( NULL ),
630  m_pWorldPoseFrameMatrices( NULL ),
631  m_pDev11( NULL )
632  {
633  }
634 
635  //--------------------------------------------------------------------------------------
637  {
638  Destroy();
639  }
640  HRESULT CDXUTSDKMesh::Create( raDirectX* pDev11, LPCTSTR szFileName, bool bCreateAdjacencyIndices,
641  SDKMESH_CALLBACKS11* pLoaderCallbacks )
642  {
643  return CreateFromFile( pDev11, szFileName, bCreateAdjacencyIndices, pLoaderCallbacks);
644  }
645  HRESULT CDXUTSDKMesh::Create( raDirectX* pDev11, BYTE* pData, UINT DataBytes, bool bCreateAdjacencyIndices,
646  bool bCopyStatic, SDKMESH_CALLBACKS11* pLoaderCallbacks )
647  {
648  return CreateFromMemory( pDev11, pData, DataBytes, bCreateAdjacencyIndices, bCopyStatic,
649  pLoaderCallbacks);
650  }
652  {
653  HRESULT hr = E_FAIL;
654  DWORD dwBytesRead = 0;
655  LARGE_INTEGER liMove;
656 
657  // Open the file
658  HANDLE hFile = CreateFile( szFileName.c_str(), FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING,
659  FILE_FLAG_SEQUENTIAL_SCAN, NULL );
660  if( INVALID_HANDLE_VALUE == hFile )
661  return E_FAIL;
662 
664  // Header
665  SDKANIMATION_FILE_HEADER fileheader;
666  if( !ReadFile( hFile, &fileheader, sizeof( SDKANIMATION_FILE_HEADER ), &dwBytesRead, NULL ) )
667  goto Error;
668 
669  //allocate
670  m_pAnimationData = new BYTE[ ( size_t )( sizeof( SDKANIMATION_FILE_HEADER ) + fileheader.AnimationDataSize ) ];
671  if( !m_pAnimationData )
672  {
673  hr = E_OUTOFMEMORY;
674  goto Error;
675  }
676 
677  // read it all in
678  liMove.QuadPart = 0;
679  if( !SetFilePointerEx( hFile, liMove, NULL, FILE_BEGIN ) )
680  goto Error;
681  if( !ReadFile( hFile, m_pAnimationData, ( DWORD )( sizeof( SDKANIMATION_FILE_HEADER ) +
682  fileheader.AnimationDataSize ), &dwBytesRead, NULL ) )
683  goto Error;
684 
685  // pointer fixup
688 
689  UINT64 BaseOffset = sizeof( SDKANIMATION_FILE_HEADER );
690  for( UINT i = 0; i < m_pAnimationHeader->NumFrames; i++ )
691  {
693  m_pAnimationFrameData[i].DataOffset +
694  BaseOffset );
695  SDKMESH_FRAME* pFrame = FindFrame( m_pAnimationFrameData[i].FrameName );
696  if( pFrame )
697  {
698  pFrame->AnimationDataIndex = i;
699  }
700  }
701 
702  hr = S_OK;
703  Error:
704  CloseHandle( hFile );
705  return hr;
706  }
707 
708  //--------------------------------------------------------------------------------------
710  {
711  if( !CheckLoadDone() )
712  return;
713 
714  if( m_pStaticMeshData )
715  {
716  if( m_pMaterialArray )
717  {
718  for( UINT64 m = 0; m < m_pMeshHeader->NumMaterials; m++ )
719  {
720  //ID3D11Resource* pRes = NULL;
721  if( m_pMaterialArray[m].pDiffuseRV11 && !IsErrorResource( m_pMaterialArray[m].pDiffuseRV11 ) )
722  {
723  //m_pMaterialArray[m].pDiffuseRV11->GetResource( &pRes );
724  //SAFE_RELEASE( pRes );
725 
726  SAFE_RELEASE( m_pMaterialArray[m].pDiffuseRV11 );
727  }
728  if( m_pMaterialArray[m].pNormalRV11 && !IsErrorResource( m_pMaterialArray[m].pNormalRV11 ) )
729  {
730  //m_pMaterialArray[m].pNormalRV11->GetResource( &pRes );
731  //SAFE_RELEASE( pRes );
732 
733  SAFE_RELEASE( m_pMaterialArray[m].pNormalRV11 );
734  }
735  if( m_pMaterialArray[m].pSpecularRV11 && !IsErrorResource( m_pMaterialArray[m].pSpecularRV11 ) )
736  {
737  //m_pMaterialArray[m].pSpecularRV11->GetResource( &pRes );
738  //SAFE_RELEASE( pRes );
739 
740  SAFE_RELEASE( m_pMaterialArray[m].pSpecularRV11 );
741  }
742  }
743  }
744  }
745 
747  {
748  for( UINT64 i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ )
749  {
751  }
752  }
754 
756  m_pStaticMeshData = NULL;
761 
764 
765  m_pMeshHeader = NULL;
766  m_pVertexBufferArray = NULL;
767  m_pIndexBufferArray = NULL;
768  m_pMeshArray = NULL;
769  m_pSubsetArray = NULL;
770  m_pFrameArray = NULL;
771  m_pMaterialArray = NULL;
772 
773  m_pAnimationHeader = NULL;
774  m_pAnimationFrameData = NULL;
775  }
776  void CDXUTSDKMesh::TransformBindPose( D3DXMATRIX* pWorld )
777  {
778  TransformBindPoseFrame( 0, pWorld );
779  }
780 
781  //--------------------------------------------------------------------------------------
782  // transform the mesh frames according to the animation for time fTime
783  //--------------------------------------------------------------------------------------
784  void CDXUTSDKMesh::TransformMesh( D3DXMATRIX* pWorld, double fTime )
785  {
787  {
788  TransformFrame( 0, pWorld, fTime );
789 
790  // For each frame, move the transform to the bind pose, then
791  // move it to the final position
792  D3DXMATRIX mInvBindPose;
793  D3DXMATRIX mFinal;
794  for( UINT i = 0; i < m_pMeshHeader->NumFrames; i++ )
795  {
796  D3DXMatrixInverse( &mInvBindPose, NULL, &m_pBindPoseFrameMatrices[i] );
797  mFinal = mInvBindPose * m_pTransformedFrameMatrices[i];
798  m_pTransformedFrameMatrices[i] = mFinal;
799  }
800  }
802  {
803  for( UINT i = 0; i < m_pAnimationHeader->NumFrames; i++ )
804  TransformFrameAbsolute( i, fTime );
805  }
806  }
807 
808  //--------------------------------------------------------------------------------------
809  void CDXUTSDKMesh::Render( UINT iDiffuseSlot,
810  UINT iNormalSlot,
811  UINT iSpecularSlot )
812  {
813  RenderFrame( 0, false, iDiffuseSlot, iNormalSlot, iSpecularSlot );
814  }
815 
816  //--------------------------------------------------------------------------------------
817  void CDXUTSDKMesh::RenderAdjacent( UINT iDiffuseSlot,
818  UINT iNormalSlot,
819  UINT iSpecularSlot )
820  {
821  RenderFrame( 0, true,iDiffuseSlot, iNormalSlot, iSpecularSlot );
822  }
823  D3D11_PRIMITIVE_TOPOLOGY CDXUTSDKMesh::GetPrimitiveType11( SDKMESH_PRIMITIVE_TYPE PrimType )
824  {
825  D3D11_PRIMITIVE_TOPOLOGY retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
826 
827  switch( PrimType )
828  {
829  case PT_TRIANGLE_LIST:
830  retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
831  break;
832  case PT_TRIANGLE_STRIP:
833  retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;
834  break;
835  case PT_LINE_LIST:
836  retType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST;
837  break;
838  case PT_LINE_STRIP:
839  retType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP;
840  break;
841  case PT_POINT_LIST:
842  retType = D3D11_PRIMITIVE_TOPOLOGY_POINTLIST;
843  break;
845  retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ;
846  break;
848  retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ;
849  break;
850  case PT_LINE_LIST_ADJ:
851  retType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ;
852  break;
853  case PT_LINE_STRIP_ADJ:
854  retType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ;
855  break;
856  };
857 
858  return retType;
859  }
860 
861  //--------------------------------------------------------------------------------------
862  DXGI_FORMAT CDXUTSDKMesh::GetIBFormat11( UINT iMesh )
863  {
864  switch( m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].IndexType )
865  {
866  case IT_16BIT:
867  return DXGI_FORMAT_R16_UINT;
868  case IT_32BIT:
869  return DXGI_FORMAT_R32_UINT;
870  };
871  return DXGI_FORMAT_R16_UINT;
872  }
873 
874  //--------------------------------------------------------------------------------------
875  ID3D11Buffer* CDXUTSDKMesh::GetVB11( UINT iMesh, UINT iVB )
876  {
877  return m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].pVB11;
878  }
879 
880  //--------------------------------------------------------------------------------------
881  ID3D11Buffer* CDXUTSDKMesh::GetIB11( UINT iMesh )
882  {
884  }
886  {
888  }
889  //--------------------------------------------------------------------------------------
890  ID3D11Buffer* CDXUTSDKMesh::GetAdjIB11( UINT iMesh )
891  {
893  }
895  {
896  return m_strPath;
897  }
898 
899  //--------------------------------------------------------------------------------------
900 
902  {
903  if( !m_pMeshHeader )
904  return 0;
905  return m_pMeshHeader->NumMeshes;
906  }
907 
908  //--------------------------------------------------------------------------------------
910  {
911  if( !m_pMeshHeader )
912  return 0;
913  return m_pMeshHeader->NumMaterials;
914  }
915 
916  //--------------------------------------------------------------------------------------
918  {
919  if( !m_pMeshHeader )
920  return 0;
922  }
923 
924  //--------------------------------------------------------------------------------------
926  {
927  if( !m_pMeshHeader )
928  return 0;
930  }
931 
932  //--------------------------------------------------------------------------------------
933  ID3D11Buffer* CDXUTSDKMesh::GetVB11At( UINT iVB )
934  {
935  return m_pVertexBufferArray[ iVB ].pVB11;
936  }
937 
938  //--------------------------------------------------------------------------------------
939  ID3D11Buffer* CDXUTSDKMesh::GetIB11At( UINT iIB )
940  {
941  return m_pIndexBufferArray[ iIB ].pIB11;
942  }
944  {
945  return m_ppVertices[iVB];
946  }
947 
948  //--------------------------------------------------------------------------------------
950  {
951  return m_ppIndices[iIB];
952  }
953 
954  //--------------------------------------------------------------------------------------
956  {
957  return &m_pMaterialArray[ iMaterial ];
958  }
959 
960  //--------------------------------------------------------------------------------------
962  {
963  return &m_pMeshArray[ iMesh ];
964  }
965 
966  //--------------------------------------------------------------------------------------
967  UINT CDXUTSDKMesh::GetNumSubsets( UINT iMesh )
968  {
969  return m_pMeshArray[ iMesh ].NumSubsets;
970  }
971 
972  //--------------------------------------------------------------------------------------
973  SDKMESH_SUBSET* CDXUTSDKMesh::GetSubset( UINT iMesh, UINT iSubset )
974  {
975  return &m_pSubsetArray[ m_pMeshArray[ iMesh ].pSubsets[iSubset] ];
976  }
977 
978  //--------------------------------------------------------------------------------------
979  UINT CDXUTSDKMesh::GetVertexStride( UINT iMesh, UINT iVB )
980  {
981  return ( UINT )m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].StrideBytes;
982  }
983 
984  //--------------------------------------------------------------------------------------
986  {
987  return m_pMeshHeader->NumFrames;
988  }
989 
990  //--------------------------------------------------------------------------------------
992  {
993  assert( iFrame < m_pMeshHeader->NumFrames );
994  return &m_pFrameArray[ iFrame ];
995  }
996 
997  //--------------------------------------------------------------------------------------
999  {
1000  for( UINT i = 0; i < m_pMeshHeader->NumFrames; i++ )
1001  {
1002  if( _stricmp( m_pFrameArray[i].Name, pszName.c_str() ) == 0 )
1003  {
1004  return &m_pFrameArray[i];
1005  }
1006  }
1007  return NULL;
1008  }
1009 
1010  //--------------------------------------------------------------------------------------
1011  UINT64 CDXUTSDKMesh::GetNumVertices( UINT iMesh, UINT iVB )
1012  {
1014  }
1015 
1016  //--------------------------------------------------------------------------------------
1017  UINT64 CDXUTSDKMesh::GetNumIndices( UINT iMesh )
1018  {
1020  }
1021 
1022  //--------------------------------------------------------------------------------------
1023  D3DXVECTOR3 CDXUTSDKMesh::GetMeshBBoxCenter( UINT iMesh )
1024  {
1025  return m_pMeshArray[iMesh].BoundingBoxCenter;
1026  }
1027 
1028  //--------------------------------------------------------------------------------------
1029  D3DXVECTOR3 CDXUTSDKMesh::GetMeshBBoxExtents( UINT iMesh )
1030  {
1031  return m_pMeshArray[iMesh].BoundingBoxExtents;
1032  }
1033 
1034  //--------------------------------------------------------------------------------------
1036  {
1037  UINT outstandingResources = 0;
1038  if( !m_pMeshHeader )
1039  return 1;
1040 
1041  outstandingResources += GetOutstandingBufferResources();
1042 
1043  for( UINT i = 0; i < m_pMeshHeader->NumMaterials; i++ )
1044  {
1045  if( m_pMaterialArray[i].DiffuseTexture[0] != 0 )
1046  {
1047  if( !m_pMaterialArray[i].pDiffuseRV11 && !IsErrorResource( m_pMaterialArray[i].pDiffuseRV11 ) )
1048  outstandingResources ++;
1049  }
1050 
1051  if( m_pMaterialArray[i].NormalTexture[0] != 0 )
1052  {
1053  if( !m_pMaterialArray[i].pNormalRV11 && !IsErrorResource( m_pMaterialArray[i].pNormalRV11 ) )
1054  outstandingResources ++;
1055  }
1056 
1057  if( m_pMaterialArray[i].SpecularTexture[0] != 0 )
1058  {
1059  if( !m_pMaterialArray[i].pSpecularRV11 && !IsErrorResource( m_pMaterialArray[i].pSpecularRV11 ) )
1060  outstandingResources ++;
1061  }
1062  }
1063 
1064  return outstandingResources;
1065  }
1066 
1067  //--------------------------------------------------------------------------------------
1068 
1069  //--------------------------------------------------------------------------------------
1071  {
1072  if( 0 == GetOutstandingResources() )
1073  {
1074  m_bLoading = false;
1075  return true;
1076  }
1077 
1078  return false;
1079  }
1080 
1081  //--------------------------------------------------------------------------------------
1083  {
1084  if( m_pStaticMeshData && !m_bLoading )
1085  {
1086  return true;
1087  }
1088 
1089  return false;
1090  }
1091 
1092  //--------------------------------------------------------------------------------------
1094  {
1095  return m_bLoading;
1096  }
1097 
1098  //--------------------------------------------------------------------------------------
1099  void CDXUTSDKMesh::SetLoading( bool bLoading )
1100  {
1101  m_bLoading = bLoading;
1102  }
1103 
1104  //--------------------------------------------------------------------------------------
1106  {
1107  return FALSE;
1108  }
1109 
1110  //--------------------------------------------------------------------------------------
1112  {
1113  return m_pMeshArray[iMesh].NumFrameInfluences;
1114  }
1115 
1116  //--------------------------------------------------------------------------------------
1117  const D3DXMATRIX* CDXUTSDKMesh::GetMeshInfluenceMatrix( UINT iMesh, UINT iInfluence )
1118  {
1119  UINT iFrame = m_pMeshArray[iMesh].pFrameInfluences[ iInfluence ];
1120  return &m_pTransformedFrameMatrices[iFrame];
1121  }
1122 
1123  const D3DXMATRIX* CDXUTSDKMesh::GetWorldMatrix( UINT iFrameIndex )
1124  {
1125  return &m_pWorldPoseFrameMatrices[iFrameIndex];
1126  }
1127 
1128  const D3DXMATRIX* CDXUTSDKMesh::GetInfluenceMatrix( UINT iFrameIndex )
1129  {
1130  return &m_pTransformedFrameMatrices[iFrameIndex];
1131  }
1132 
1133  //--------------------------------------------------------------------------------------
1135  {
1136  if( m_pAnimationHeader == NULL )
1137  {
1138  return 0;
1139  }
1140 
1141  UINT iTick = ( UINT )( m_pAnimationHeader->AnimationFPS * fTime );
1142 
1143  iTick = iTick % ( m_pAnimationHeader->NumAnimationKeys - 1 );
1144  iTick ++;
1145 
1146  return iTick;
1147  }
1148 
1149  bool CDXUTSDKMesh::GetAnimationProperties( UINT* pNumKeys, FLOAT* pFrameTime )
1150  {
1151  if( m_pAnimationHeader == NULL )
1152  {
1153  return false;
1154  }
1155 
1156  *pNumKeys = m_pAnimationHeader->NumAnimationKeys;
1157  *pFrameTime = 1.0f / (FLOAT)m_pAnimationHeader->AnimationFPS;
1158 
1159  return true;
1160  }
1162  {
1163  UINT outstandingResources = 0;
1164  if( !m_pMeshHeader )
1165  return 1;
1166 
1167  for( UINT i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ )
1168  {
1169  outstandingResources ++;
1170  }
1171 
1172  for( UINT i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ )
1173  {
1174  outstandingResources ++;
1175  }
1176 
1177  return outstandingResources;
1178  }
1179 };
SDKMESH_VERTEX_BUFFER_HEADER * m_pVertexBufferArray
Definition: raSDKmesh.h:273
UINT GetNumFrames()
Definition: raSDKmesh.cpp:985
UINT GetAnimationKeyFromTime(double fTime)
Definition: raSDKmesh.cpp:1134
ID3D11ShaderResourceView * pSpecularRV11
Definition: raSDKmesh.h:203
virtual void Destroy()
Definition: raSDKmesh.cpp:709
UINT64 VertexStart
Definition: raSDKmesh.h:143
SDKMESH_SUBSET * m_pSubsetArray
Definition: raSDKmesh.h:276
SDKANIMATION_DATA * pAnimationData
Definition: raSDKmesh.h:232
#define INVALID_ANIMATION_DATA
virtual ~CDXUTSDKMesh()
Definition: raSDKmesh.cpp:636
UINT64 GetNumIndices(UINT iMesh)
Definition: raSDKmesh.cpp:1017
SDKMESH_FRAME * FindFrame(raString pszName)
Definition: raSDKmesh.cpp:998
BYTE * GetRawIndicesAt(UINT iIB)
Definition: raSDKmesh.cpp:949
static raResource & Instance()
Definition: raResource.cpp:38
ID3D11Texture2D * pDiffuseTexture11
Definition: raSDKmesh.h:177
UINT GetOutstandingResources()
Definition: raSDKmesh.cpp:1035
void RenderFrame(UINT iFrame, bool bAdjacent, UINT iDiffuseSlot, UINT iNormalSlot, UINT iSpecularSlot)
Definition: raSDKmesh.cpp:588
virtual HRESULT CreateFromFile(raDirectX *pDev11, LPCTSTR szFileName, bool bCreateAdjacencyIndices, SDKMESH_CALLBACKS11 *pLoaderCallbacks11=NULL)
Definition: raSDKmesh.cpp:132
SDKMESH_FRAME * m_pFrameArray
Definition: raSDKmesh.h:277
DXGI_FORMAT GetIBFormat11(UINT iMesh)
Definition: raSDKmesh.cpp:862
void TransformBindPoseFrame(UINT iFrame, D3DXMATRIX *pParentWorld)
Definition: raSDKmesh.cpp:368
BOOL IsErrorResource(TYPE data)
Definition: raSDKmesh.h:29
bool GetAnimationProperties(UINT *pNumKeys, FLOAT *pFrameTime)
Definition: raSDKmesh.cpp:1149
ID3D11Texture2D * pNormalTexture11
Definition: raSDKmesh.h:182
LPCREATEINDEXBUFFER11 pCreateIndexBuffer
Definition: raSDKmesh.h:246
virtual HRESULT CreateFromMemory(raDirectX *pDev11, BYTE *pData, UINT DataBytes, bool bCreateAdjacencyIndices, bool bCopyStatic, SDKMESH_CALLBACKS11 *pLoaderCallbacks11=NULL)
Definition: raSDKmesh.cpp:180
HRESULT CreateVertexBuffer(raDirectX *pd3dDevice, SDKMESH_VERTEX_BUFFER_HEADER *pHeader, void *pVertices, SDKMESH_CALLBACKS11 *pLoaderCallbacks=NULL)
Definition: raSDKmesh.cpp:76
UINT AnimationDataIndex
Definition: raSDKmesh.h:155
UINT64 NonBufferDataSize
Definition: raSDKmesh.h:68
UINT * pFrameInfluences
Definition: raSDKmesh.h:132
ID3D11Buffer * GetAdjIB11(UINT iMesh)
Definition: raSDKmesh.cpp:890
static D3D11_PRIMITIVE_TOPOLOGY GetPrimitiveType11(SDKMESH_PRIMITIVE_TYPE PrimType)
Definition: raSDKmesh.cpp:823
BYTE ** m_ppIndices
Definition: raSDKmesh.h:265
SDKMESH_INDEX_BUFFER_HEADER * m_pIndexBufferArray
Definition: raSDKmesh.h:274
SDKMESH_INDEX_TYPE GetIndexType(UINT iMesh)
Definition: raSDKmesh.cpp:885
UINT GetOutstandingBufferResources()
Definition: raSDKmesh.cpp:1161
#define SAFE_DELETE_ARRAY(p)
Definition: d3dxGlobal.h:25
LPCREATEVERTEXBUFFER11 pCreateVertexBuffer
Definition: raSDKmesh.h:245
UINT GetNumIBs()
Definition: raSDKmesh.cpp:925
void RenderMesh(UINT iMesh, bool bAdjacent, UINT iDiffuseSlot, UINT iNormalSlot, UINT iSpecularSlot)
Definition: raSDKmesh.cpp:490
SDKANIMATION_FRAME_DATA * m_pAnimationFrameData
Definition: raSDKmesh.h:285
UINT * pSubsets
Definition: raSDKmesh.h:127
HRESULT CreateIndexBuffer(raDirectX *pd3dDevice, SDKMESH_INDEX_BUFFER_HEADER *pHeader, void *pIndices, SDKMESH_CALLBACKS11 *pLoaderCallbacks=NULL)
Definition: raSDKmesh.cpp:105
ID3D11Buffer * GetVB11(UINT iMesh, UINT iVB)
Definition: raSDKmesh.cpp:875
ID3D11Buffer * GetIB11(UINT iMesh)
Definition: raSDKmesh.cpp:881
UINT64 IndexCount
Definition: raSDKmesh.h:142
UINT GetVertexStride(UINT iMesh, UINT iVB)
Definition: raSDKmesh.cpp:979
void TransformFrame(UINT iFrame, D3DXMATRIX *pParentWorld, double fTime)
Definition: raSDKmesh.cpp:390
ID3D11Device * GetDevice(void)
Definition: raDirectX.h:29
LPCREATETEXTUREFROMFILE11 pCreateTextureFromFile
Definition: raSDKmesh.h:244
SDKMESH_SUBSET * GetSubset(UINT iMesh, UINT iSubset)
Definition: raSDKmesh.cpp:973
raString GetMeshPathA()
Definition: raSDKmesh.cpp:894
const D3DXMATRIX * GetMeshInfluenceMatrix(UINT iMesh, UINT iInfluence)
Definition: raSDKmesh.cpp:1117
const D3DXMATRIX * GetWorldMatrix(UINT iFrameIndex)
Definition: raSDKmesh.cpp:1123
UINT NumMaterials
Definition: raSDKmesh.h:77
UINT NumIndexBuffers
Definition: raSDKmesh.h:73
virtual void Render(UINT iDiffuseSlot=INVALID_SAMPLER_SLOT, UINT iNormalSlot=INVALID_SAMPLER_SLOT, UINT iSpecularSlot=INVALID_SAMPLER_SLOT)
Definition: raSDKmesh.cpp:809
SDKMESH_HEADER * m_pMeshHeader
Definition: raSDKmesh.h:272
BYTE * m_pStaticMeshData
Definition: raSDKmesh.h:261
void TransformMesh(D3DXMATRIX *pWorld, double fTime)
Definition: raSDKmesh.cpp:784
bool CheckLoadDone()
Definition: raSDKmesh.cpp:1070
BYTE ** m_ppVertices
Definition: raSDKmesh.h:264
bool IsLoaded()
Definition: raSDKmesh.cpp:1082
const D3DXMATRIX * GetInfluenceMatrix(UINT iFrameIndex)
Definition: raSDKmesh.cpp:1128
UINT NumFrameInfluences
Definition: raSDKmesh.h:119
ID3D11Buffer * GetIB11At(UINT iIB)
Definition: raSDKmesh.cpp:939
#define INVALID_SAMPLER_SLOT
D3DXMATRIX * m_pBindPoseFrameMatrices
Definition: raSDKmesh.h:286
UINT NumFrames
Definition: raSDKmesh.h:76
SDKMESH_MATERIAL * m_pMaterialArray
Definition: raSDKmesh.h:278
SDKMESH_PRIMITIVE_TYPE
Definition: raSDKmesh.h:35
SDKMESH_MESH * GetMesh(UINT iMesh)
Definition: raSDKmesh.cpp:961
SDKMESH_FRAME * GetFrame(UINT iFrame)
Definition: raSDKmesh.cpp:991
#define MAX_D3D11_VERTEX_STREAMS
Definition: raSDKmesh.cpp:488
#define ERROR_RESOURCE_VALUE
SDKMESH_MATERIAL * GetMaterial(UINT iMaterial)
Definition: raSDKmesh.cpp:955
UINT NumSubsets
Definition: raSDKmesh.h:118
#define SDKMESH_FILE_VERSION
ID3D11Buffer * GetVB11At(UINT iVB)
Definition: raSDKmesh.cpp:933
bool IsLoading()
Definition: raSDKmesh.cpp:1093
virtual HRESULT LoadAnimation(raString szFileName)
Definition: raSDKmesh.cpp:651
void TransformBindPose(D3DXMATRIX *pWorld)
Definition: raSDKmesh.cpp:776
ID3D11ShaderResourceView * pDiffuseRV11
Definition: raSDKmesh.h:193
SDKMESH_INDEX_BUFFER_HEADER * m_pAdjacencyIndexBufferArray
Definition: raSDKmesh.h:281
UINT64 IndexStart
Definition: raSDKmesh.h:141
UINT GetNumVBs()
Definition: raSDKmesh.cpp:917
D3DXVECTOR3 GetMeshBBoxCenter(UINT iMesh)
Definition: raSDKmesh.cpp:1023
virtual void RenderAdjacent(UINT iDiffuseSlot=INVALID_SAMPLER_SLOT, UINT iNormalSlot=INVALID_SAMPLER_SLOT, UINT iSpecularSlot=INVALID_SAMPLER_SLOT)
Definition: raSDKmesh.cpp:817
virtual HRESULT Create(raDirectX *pDev11, LPCTSTR szFileName, bool bCreateAdjacencyIndices=false, SDKMESH_CALLBACKS11 *pLoaderCallbacks=NULL)
Definition: raSDKmesh.cpp:640
BYTE * m_pAnimationData
Definition: raSDKmesh.h:263
UINT GetNumMeshes()
Definition: raSDKmesh.cpp:901
D3DXVECTOR3 BoundingBoxCenter
Definition: raSDKmesh.h:121
UINT GetNumMaterials()
Definition: raSDKmesh.cpp:909
std::string raString
Definition: raMain.h:107
UINT NumMeshes
Definition: raSDKmesh.h:74
SDKMESH_MESH * m_pMeshArray
Definition: raSDKmesh.h:275
D3DXVECTOR3 BoundingBoxExtents
Definition: raSDKmesh.h:122
raString szFileName
Definition: raSDKmesh.h:236
D3DXVECTOR3 GetMeshBBoxExtents(UINT iMesh)
Definition: raSDKmesh.cpp:1029
BYTE NumVertexBuffers
Definition: raSDKmesh.h:115
ID3D11Buffer D3D11_BUFFER_DESC void * pData
Definition: raSDKmesh.h:238
UINT64 HeaderSize
Definition: raSDKmesh.h:67
D3DXVECTOR4 Orientation
Definition: raSDKmesh.h:222
BOOL HadLoadingError()
Definition: raSDKmesh.cpp:1105
void LoadMaterials(raDirectX *pd3dDevice, SDKMESH_MATERIAL *pMaterials, UINT NumMaterials, SDKMESH_CALLBACKS11 *pLoaderCallbacks=NULL)
Definition: raSDKmesh.cpp:5
BYTE * m_pHeapData
Definition: raSDKmesh.h:262
D3DXMATRIX * m_pTransformedFrameMatrices
Definition: raSDKmesh.h:287
#define INVALID_MESH
#define SAFE_RELEASE(p)
Definition: d3dxGlobal.h:22
BYTE * GetRawVerticesAt(UINT iVB)
Definition: raSDKmesh.cpp:943
UINT GetNumInfluences(UINT iMesh)
Definition: raSDKmesh.cpp:1111
UINT VertexBuffers[MAX_VERTEX_STREAMS]
Definition: raSDKmesh.h:116
UINT PrimitiveType
Definition: raSDKmesh.h:140
ID3D11Texture2D * pSpecularTexture11
Definition: raSDKmesh.h:187
SDKANIMATION_FILE_HEADER * m_pAnimationHeader
Definition: raSDKmesh.h:284
void SetLoading(bool bLoading)
Definition: raSDKmesh.cpp:1099
UINT NumVertexBuffers
Definition: raSDKmesh.h:72
UINT IndexBuffer
Definition: raSDKmesh.h:117
void TransformFrameAbsolute(UINT iFrame, double fTime)
Definition: raSDKmesh.cpp:441
ID3D11ShaderResourceView * pNormalRV11
Definition: raSDKmesh.h:198
char m_strPath[MAX_PATH]
Definition: raSDKmesh.h:269
UINT GetNumSubsets(UINT iMesh)
Definition: raSDKmesh.cpp:967
SDKMESH_INDEX_TYPE
Definition: raSDKmesh.h:50
#define INVALID_FRAME
D3DXMATRIX * m_pWorldPoseFrameMatrices
Definition: raSDKmesh.h:288
D3DXVECTOR3 Translation
Definition: raSDKmesh.h:221
UINT64 GetNumVertices(UINT iMesh, UINT iVB)
Definition: raSDKmesh.cpp:1011