aboutsummaryrefslogtreecommitdiff
path: root/samples/DX_APIUsage/DXUT/Optional/SDKmesh.h
diff options
context:
space:
mode:
authorDave Clark <[email protected]>2018-02-28 17:22:22 -0500
committerDave Clark <[email protected]>2018-02-28 17:22:22 -0500
commit25528fd230f5f4298c35123a833cdb112675808e (patch)
treef5aca3f5ee5a7734df41e7b974a04c37ddff528e /samples/DX_APIUsage/DXUT/Optional/SDKmesh.h
parentPush GfeSDK #173 (diff)
downloadgfesdk-25528fd230f5f4298c35123a833cdb112675808e.tar.xz
gfesdk-25528fd230f5f4298c35123a833cdb112675808e.zip
Push SDK # 1.1.186
Documentation updates.
Diffstat (limited to 'samples/DX_APIUsage/DXUT/Optional/SDKmesh.h')
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/SDKmesh.h589
1 files changed, 589 insertions, 0 deletions
diff --git a/samples/DX_APIUsage/DXUT/Optional/SDKmesh.h b/samples/DX_APIUsage/DXUT/Optional/SDKmesh.h
new file mode 100644
index 0000000..2032c52
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/SDKmesh.h
@@ -0,0 +1,589 @@
+//--------------------------------------------------------------------------------------
+// File: SDKMesh.h
+//
+// Disclaimer:
+// The SDK Mesh format (.sdkmesh) is not a recommended file format for shipping titles.
+// It was designed to meet the specific needs of the SDK samples. Any real-world
+// applications should avoid this file format in favor of a destination format that
+// meets the specific needs of the application.
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+#pragma once
+#ifndef _SDKMESH_
+#define _SDKMESH_
+
+//--------------------------------------------------------------------------------------
+// Hard Defines for the various structures
+//--------------------------------------------------------------------------------------
+#define SDKMESH_FILE_VERSION 101
+#define MAX_VERTEX_ELEMENTS 32
+#define MAX_VERTEX_STREAMS 16
+#define MAX_FRAME_NAME 100
+#define MAX_MESH_NAME 100
+#define MAX_SUBSET_NAME 100
+#define MAX_MATERIAL_NAME 100
+#define MAX_TEXTURE_NAME MAX_PATH
+#define MAX_MATERIAL_PATH MAX_PATH
+#define INVALID_FRAME ((UINT)-1)
+#define INVALID_MESH ((UINT)-1)
+#define INVALID_MATERIAL ((UINT)-1)
+#define INVALID_SUBSET ((UINT)-1)
+#define INVALID_ANIMATION_DATA ((UINT)-1)
+#define INVALID_SAMPLER_SLOT ((UINT)-1)
+#define ERROR_RESOURCE_VALUE 1
+
+template<typename TYPE> BOOL IsErrorResource( TYPE data )
+{
+ if( ( TYPE )ERROR_RESOURCE_VALUE == data )
+ return TRUE;
+ return FALSE;
+}
+//--------------------------------------------------------------------------------------
+// Enumerated Types. These will have mirrors in both D3D9 and D3D11
+//--------------------------------------------------------------------------------------
+enum SDKMESH_PRIMITIVE_TYPE
+{
+ PT_TRIANGLE_LIST = 0,
+ PT_TRIANGLE_STRIP,
+ PT_LINE_LIST,
+ PT_LINE_STRIP,
+ PT_POINT_LIST,
+ PT_TRIANGLE_LIST_ADJ,
+ PT_TRIANGLE_STRIP_ADJ,
+ PT_LINE_LIST_ADJ,
+ PT_LINE_STRIP_ADJ,
+ PT_QUAD_PATCH_LIST,
+ PT_TRIANGLE_PATCH_LIST,
+};
+
+enum SDKMESH_INDEX_TYPE
+{
+ IT_16BIT = 0,
+ IT_32BIT,
+};
+
+enum FRAME_TRANSFORM_TYPE
+{
+ FTT_RELATIVE = 0,
+ FTT_ABSOLUTE, //This is not currently used but is here to support absolute transformations in the future
+};
+
+//--------------------------------------------------------------------------------------
+// Structures. Unions with pointers are forced to 64bit.
+//--------------------------------------------------------------------------------------
+struct SDKMESH_HEADER
+{
+ //Basic Info and sizes
+ UINT Version;
+ BYTE IsBigEndian;
+ UINT64 HeaderSize;
+ UINT64 NonBufferDataSize;
+ UINT64 BufferDataSize;
+
+ //Stats
+ UINT NumVertexBuffers;
+ UINT NumIndexBuffers;
+ UINT NumMeshes;
+ UINT NumTotalSubsets;
+ UINT NumFrames;
+ UINT NumMaterials;
+
+ //Offsets to Data
+ UINT64 VertexStreamHeadersOffset;
+ UINT64 IndexStreamHeadersOffset;
+ UINT64 MeshDataOffset;
+ UINT64 SubsetDataOffset;
+ UINT64 FrameDataOffset;
+ UINT64 MaterialDataOffset;
+};
+
+struct SDKMESH_VERTEX_BUFFER_HEADER
+{
+ UINT64 NumVertices;
+ UINT64 SizeBytes;
+ UINT64 StrideBytes;
+ D3DVERTEXELEMENT9 Decl[MAX_VERTEX_ELEMENTS];
+ union
+ {
+ UINT64 DataOffset; //(This also forces the union to 64bits)
+ IDirect3DVertexBuffer9* pVB9;
+ ID3D11Buffer* pVB11;
+ };
+};
+
+struct SDKMESH_INDEX_BUFFER_HEADER
+{
+ UINT64 NumIndices;
+ UINT64 SizeBytes;
+ UINT IndexType;
+ union
+ {
+ UINT64 DataOffset; //(This also forces the union to 64bits)
+ IDirect3DIndexBuffer9* pIB9;
+ ID3D11Buffer* pIB11;
+ };
+};
+
+struct SDKMESH_MESH
+{
+ char Name[MAX_MESH_NAME];
+ BYTE NumVertexBuffers;
+ UINT VertexBuffers[MAX_VERTEX_STREAMS];
+ UINT IndexBuffer;
+ UINT NumSubsets;
+ UINT NumFrameInfluences; //aka bones
+
+ D3DXVECTOR3 BoundingBoxCenter;
+ D3DXVECTOR3 BoundingBoxExtents;
+
+ union
+ {
+ UINT64 SubsetOffset; //Offset to list of subsets (This also forces the union to 64bits)
+ UINT* pSubsets; //Pointer to list of subsets
+ };
+ union
+ {
+ UINT64 FrameInfluenceOffset; //Offset to list of frame influences (This also forces the union to 64bits)
+ UINT* pFrameInfluences; //Pointer to list of frame influences
+ };
+};
+
+struct SDKMESH_SUBSET
+{
+ char Name[MAX_SUBSET_NAME];
+ UINT MaterialID;
+ UINT PrimitiveType;
+ UINT64 IndexStart;
+ UINT64 IndexCount;
+ UINT64 VertexStart;
+ UINT64 VertexCount;
+};
+
+struct SDKMESH_FRAME
+{
+ char Name[MAX_FRAME_NAME];
+ UINT Mesh;
+ UINT ParentFrame;
+ UINT ChildFrame;
+ UINT SiblingFrame;
+ D3DXMATRIX Matrix;
+ UINT AnimationDataIndex; //Used to index which set of keyframes transforms this frame
+};
+
+struct SDKMESH_MATERIAL
+{
+ char Name[MAX_MATERIAL_NAME];
+
+ // Use MaterialInstancePath
+ char MaterialInstancePath[MAX_MATERIAL_PATH];
+
+ // Or fall back to d3d8-type materials
+ char DiffuseTexture[MAX_TEXTURE_NAME];
+ char NormalTexture[MAX_TEXTURE_NAME];
+ char SpecularTexture[MAX_TEXTURE_NAME];
+
+ D3DXVECTOR4 Diffuse;
+ D3DXVECTOR4 Ambient;
+ D3DXVECTOR4 Specular;
+ D3DXVECTOR4 Emissive;
+ FLOAT Power;
+
+ union
+ {
+ UINT64 Force64_1; //Force the union to 64bits
+ IDirect3DTexture9* pDiffuseTexture9;
+ ID3D11Texture2D* pDiffuseTexture11;
+ };
+ union
+ {
+ UINT64 Force64_2; //Force the union to 64bits
+ IDirect3DTexture9* pNormalTexture9;
+ ID3D11Texture2D* pNormalTexture11;
+ };
+ union
+ {
+ UINT64 Force64_3; //Force the union to 64bits
+ IDirect3DTexture9* pSpecularTexture9;
+ ID3D11Texture2D* pSpecularTexture11;
+ };
+
+ union
+ {
+ UINT64 Force64_4; //Force the union to 64bits
+ ID3D11ShaderResourceView* pDiffuseRV11;
+ };
+ union
+ {
+ UINT64 Force64_5; //Force the union to 64bits
+ ID3D11ShaderResourceView* pNormalRV11;
+ };
+ union
+ {
+ UINT64 Force64_6; //Force the union to 64bits
+ ID3D11ShaderResourceView* pSpecularRV11;
+ };
+
+};
+
+struct SDKANIMATION_FILE_HEADER
+{
+ UINT Version;
+ BYTE IsBigEndian;
+ UINT FrameTransformType;
+ UINT NumFrames;
+ UINT NumAnimationKeys;
+ UINT AnimationFPS;
+ UINT64 AnimationDataSize;
+ UINT64 AnimationDataOffset;
+};
+
+struct SDKANIMATION_DATA
+{
+ D3DXVECTOR3 Translation;
+ D3DXVECTOR4 Orientation;
+ D3DXVECTOR3 Scaling;
+};
+
+struct SDKANIMATION_FRAME_DATA
+{
+ char FrameName[MAX_FRAME_NAME];
+ union
+ {
+ UINT64 DataOffset;
+ SDKANIMATION_DATA* pAnimationData;
+ };
+};
+
+#ifndef _CONVERTER_APP_
+
+//--------------------------------------------------------------------------------------
+// AsyncLoading callbacks
+//--------------------------------------------------------------------------------------
+typedef void ( CALLBACK*LPCREATETEXTUREFROMFILE9 )( IDirect3DDevice9* pDev, char* szFileName,
+ IDirect3DTexture9** ppTexture, void* pContext );
+typedef void ( CALLBACK*LPCREATEVERTEXBUFFER9 )( IDirect3DDevice9* pDev, IDirect3DVertexBuffer9** ppBuffer,
+ UINT iSizeBytes, DWORD Usage, DWORD FVF, D3DPOOL Pool, void* pData,
+ void* pContext );
+typedef void ( CALLBACK*LPCREATEINDEXBUFFER9 )( IDirect3DDevice9* pDev, IDirect3DIndexBuffer9** ppBuffer,
+ UINT iSizeBytes, DWORD Usage, D3DFORMAT ibFormat, D3DPOOL Pool,
+ void* pData, void* pContext );
+struct SDKMESH_CALLBACKS9
+{
+ LPCREATETEXTUREFROMFILE9 pCreateTextureFromFile;
+ LPCREATEVERTEXBUFFER9 pCreateVertexBuffer;
+ LPCREATEINDEXBUFFER9 pCreateIndexBuffer;
+ void* pContext;
+};
+
+
+typedef void ( CALLBACK*LPCREATETEXTUREFROMFILE11 )( ID3D11Device* pDev, char* szFileName,
+ ID3D11ShaderResourceView** ppRV, void* pContext );
+typedef void ( CALLBACK*LPCREATEVERTEXBUFFER11 )( ID3D11Device* pDev, ID3D11Buffer** ppBuffer,
+ D3D11_BUFFER_DESC BufferDesc, void* pData, void* pContext );
+typedef void ( CALLBACK*LPCREATEINDEXBUFFER11 )( ID3D11Device* pDev, ID3D11Buffer** ppBuffer,
+ D3D11_BUFFER_DESC BufferDesc, void* pData, void* pContext );
+struct SDKMESH_CALLBACKS11
+{
+ LPCREATETEXTUREFROMFILE11 pCreateTextureFromFile;
+ LPCREATEVERTEXBUFFER11 pCreateVertexBuffer;
+ LPCREATEINDEXBUFFER11 pCreateIndexBuffer;
+ void* pContext;
+};
+
+//--------------------------------------------------------------------------------------
+// CDXUTSDKMesh class. This class reads the sdkmesh file format for use by the samples
+//--------------------------------------------------------------------------------------
+class CDXUTSDKMesh
+{
+private:
+ UINT m_NumOutstandingResources;
+ bool m_bLoading;
+ //BYTE* m_pBufferData;
+ HANDLE m_hFile;
+ HANDLE m_hFileMappingObject;
+ CGrowableArray <BYTE*> m_MappedPointers;
+ IDirect3DDevice9* m_pDev9;
+ ID3D11Device* m_pDev11;
+ ID3D11DeviceContext* m_pDevContext11;
+
+protected:
+ //These are the pointers to the two chunks of data loaded in from the mesh file
+ BYTE* m_pStaticMeshData;
+ BYTE* m_pHeapData;
+ BYTE* m_pAnimationData;
+ BYTE** m_ppVertices;
+ BYTE** m_ppIndices;
+
+ //Keep track of the path
+ WCHAR m_strPathW[MAX_PATH];
+ char m_strPath[MAX_PATH];
+
+ //General mesh info
+ SDKMESH_HEADER* m_pMeshHeader;
+ SDKMESH_VERTEX_BUFFER_HEADER* m_pVertexBufferArray;
+ SDKMESH_INDEX_BUFFER_HEADER* m_pIndexBufferArray;
+ SDKMESH_MESH* m_pMeshArray;
+ SDKMESH_SUBSET* m_pSubsetArray;
+ SDKMESH_FRAME* m_pFrameArray;
+ SDKMESH_MATERIAL* m_pMaterialArray;
+
+ // Adjacency information (not part of the m_pStaticMeshData, so it must be created and destroyed separately )
+ SDKMESH_INDEX_BUFFER_HEADER* m_pAdjacencyIndexBufferArray;
+
+ //Animation (TODO: Add ability to load/track multiple animation sets)
+ SDKANIMATION_FILE_HEADER* m_pAnimationHeader;
+ SDKANIMATION_FRAME_DATA* m_pAnimationFrameData;
+ D3DXMATRIX* m_pBindPoseFrameMatrices;
+ D3DXMATRIX* m_pTransformedFrameMatrices;
+ D3DXMATRIX* m_pWorldPoseFrameMatrices;
+
+protected:
+ void LoadMaterials( ID3D11Device* pd3dDevice, SDKMESH_MATERIAL* pMaterials,
+ UINT NumMaterials, SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL );
+
+ void LoadMaterials( IDirect3DDevice9* pd3dDevice, SDKMESH_MATERIAL* pMaterials,
+ UINT NumMaterials, SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL );
+
+ HRESULT CreateVertexBuffer( ID3D11Device* pd3dDevice,
+ SDKMESH_VERTEX_BUFFER_HEADER* pHeader, void* pVertices,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL );
+ HRESULT CreateVertexBuffer( IDirect3DDevice9* pd3dDevice,
+ SDKMESH_VERTEX_BUFFER_HEADER* pHeader, void* pVertices,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL );
+
+ HRESULT CreateIndexBuffer( ID3D11Device* pd3dDevice, SDKMESH_INDEX_BUFFER_HEADER* pHeader,
+ void* pIndices, SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL );
+ HRESULT CreateIndexBuffer( IDirect3DDevice9* pd3dDevice,
+ SDKMESH_INDEX_BUFFER_HEADER* pHeader, void* pIndices,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL );
+
+ virtual HRESULT CreateFromFile( ID3D11Device* pDev11,
+ IDirect3DDevice9* pDev9,
+ LPCTSTR szFileName,
+ bool bCreateAdjacencyIndices,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks11 = NULL,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks9 = NULL );
+
+ virtual HRESULT CreateFromMemory( ID3D11Device* pDev11,
+ IDirect3DDevice9* pDev9,
+ BYTE* pData,
+ UINT DataBytes,
+ bool bCreateAdjacencyIndices,
+ bool bCopyStatic,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks11 = NULL,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks9 = NULL );
+
+ //frame manipulation
+ void TransformBindPoseFrame( UINT iFrame, D3DXMATRIX* pParentWorld );
+ void TransformFrame( UINT iFrame, D3DXMATRIX* pParentWorld, double fTime );
+ void TransformFrameAbsolute( UINT iFrame, double fTime );
+
+ //Direct3D 11 rendering helpers
+ void RenderMesh( UINT iMesh,
+ bool bAdjacent,
+ ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot,
+ UINT iNormalSlot,
+ UINT iSpecularSlot );
+ void RenderFrame( UINT iFrame,
+ bool bAdjacent,
+ ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot,
+ UINT iNormalSlot,
+ UINT iSpecularSlot );
+
+
+ //Direct3D 9 rendering helpers
+ void RenderMesh( UINT iMesh,
+ LPDIRECT3DDEVICE9 pd3dDevice,
+ LPD3DXEFFECT pEffect,
+ D3DXHANDLE hTechnique,
+ D3DXHANDLE htxDiffuse,
+ D3DXHANDLE htxNormal,
+ D3DXHANDLE htxSpecular );
+ void RenderFrame( UINT iFrame,
+ LPDIRECT3DDEVICE9 pd3dDevice,
+ LPD3DXEFFECT pEffect,
+ D3DXHANDLE hTechnique,
+ D3DXHANDLE htxDiffuse,
+ D3DXHANDLE htxNormal,
+ D3DXHANDLE htxSpecular );
+
+public:
+ CDXUTSDKMesh();
+ virtual ~CDXUTSDKMesh();
+
+ virtual HRESULT Create( ID3D11Device* pDev11, LPCTSTR szFileName, bool bCreateAdjacencyIndices=
+ false, SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL );
+ virtual HRESULT Create( IDirect3DDevice9* pDev9, LPCTSTR szFileName, bool bCreateAdjacencyIndices=
+ false, SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL );
+ virtual HRESULT Create( ID3D11Device* pDev11, BYTE* pData, UINT DataBytes,
+ bool bCreateAdjacencyIndices=false, bool bCopyStatic=false,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL );
+ virtual HRESULT Create( IDirect3DDevice9* pDev9, BYTE* pData, UINT DataBytes,
+ bool bCreateAdjacencyIndices=false, bool bCopyStatic=false,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL );
+ virtual HRESULT LoadAnimation( WCHAR* szFileName );
+ virtual void Destroy();
+
+ //Frame manipulation
+ void TransformBindPose( D3DXMATRIX* pWorld );
+ void TransformMesh( D3DXMATRIX* pWorld, double fTime );
+
+
+ //Direct3D 11 Rendering
+ virtual void Render( ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot = INVALID_SAMPLER_SLOT,
+ UINT iNormalSlot = INVALID_SAMPLER_SLOT,
+ UINT iSpecularSlot = INVALID_SAMPLER_SLOT );
+ virtual void RenderAdjacent( ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot = INVALID_SAMPLER_SLOT,
+ UINT iNormalSlot = INVALID_SAMPLER_SLOT,
+ UINT iSpecularSlot = INVALID_SAMPLER_SLOT );
+
+ //Direct3D 9 Rendering
+ virtual void Render( LPDIRECT3DDEVICE9 pd3dDevice,
+ LPD3DXEFFECT pEffect,
+ D3DXHANDLE hTechnique,
+ D3DXHANDLE htxDiffuse = 0,
+ D3DXHANDLE htxNormal = 0,
+ D3DXHANDLE htxSpecular = 0 );
+
+ //Helpers (D3D11 specific)
+ static D3D11_PRIMITIVE_TOPOLOGY GetPrimitiveType11( SDKMESH_PRIMITIVE_TYPE PrimType );
+ DXGI_FORMAT GetIBFormat11( UINT iMesh );
+ ID3D11Buffer* GetVB11( UINT iMesh, UINT iVB );
+ ID3D11Buffer* GetIB11( UINT iMesh );
+ SDKMESH_INDEX_TYPE GetIndexType( UINT iMesh );
+
+ ID3D11Buffer* GetAdjIB11( UINT iMesh );
+
+ //Helpers (D3D9 specific)
+ static D3DPRIMITIVETYPE GetPrimitiveType9( SDKMESH_PRIMITIVE_TYPE PrimType );
+ D3DFORMAT GetIBFormat9( UINT iMesh );
+ IDirect3DVertexBuffer9* GetVB9( UINT iMesh, UINT iVB );
+ IDirect3DIndexBuffer9* GetIB9( UINT iMesh );
+
+ //Helpers (general)
+ char* GetMeshPathA();
+ WCHAR* GetMeshPathW();
+ UINT GetNumMeshes();
+ UINT GetNumMaterials();
+ UINT GetNumVBs();
+ UINT GetNumIBs();
+
+ ID3D11Buffer* GetVB11At( UINT iVB );
+ ID3D11Buffer* GetIB11At( UINT iIB );
+
+ IDirect3DVertexBuffer9* GetVB9At( UINT iVB );
+ IDirect3DIndexBuffer9* GetIB9At( UINT iIB );
+
+ BYTE* GetRawVerticesAt( UINT iVB );
+ BYTE* GetRawIndicesAt( UINT iIB );
+ SDKMESH_MATERIAL* GetMaterial( UINT iMaterial );
+ SDKMESH_MESH* GetMesh( UINT iMesh );
+ UINT GetNumSubsets( UINT iMesh );
+ SDKMESH_SUBSET* GetSubset( UINT iMesh, UINT iSubset );
+ UINT GetVertexStride( UINT iMesh, UINT iVB );
+ UINT GetNumFrames();
+ SDKMESH_FRAME* GetFrame( UINT iFrame );
+ SDKMESH_FRAME* FindFrame( char* pszName );
+ UINT64 GetNumVertices( UINT iMesh, UINT iVB );
+ UINT64 GetNumIndices( UINT iMesh );
+ D3DXVECTOR3 GetMeshBBoxCenter( UINT iMesh );
+ D3DXVECTOR3 GetMeshBBoxExtents( UINT iMesh );
+ UINT GetOutstandingResources();
+ UINT GetOutstandingBufferResources();
+ bool CheckLoadDone();
+ bool IsLoaded();
+ bool IsLoading();
+ void SetLoading( bool bLoading );
+ BOOL HadLoadingError();
+
+ //Animation
+ UINT GetNumInfluences( UINT iMesh );
+ const D3DXMATRIX* GetMeshInfluenceMatrix( UINT iMesh, UINT iInfluence );
+ UINT GetAnimationKeyFromTime( double fTime );
+ const D3DXMATRIX* GetWorldMatrix( UINT iFrameIndex );
+ const D3DXMATRIX* GetInfluenceMatrix( UINT iFrameIndex );
+ bool GetAnimationProperties( UINT* pNumKeys, FLOAT* pFrameTime );
+};
+
+//-----------------------------------------------------------------------------
+// Name: class CDXUTXFileMesh
+// Desc: Class for loading and rendering file-based meshes
+//-----------------------------------------------------------------------------
+class CDXUTXFileMesh
+{
+public:
+ WCHAR m_strName[512];
+ LPD3DXMESH m_pMesh; // Managed mesh
+
+ // Cache of data in m_pMesh for easy access
+ IDirect3DVertexBuffer9* m_pVB;
+ IDirect3DIndexBuffer9* m_pIB;
+ IDirect3DVertexDeclaration9* m_pDecl;
+ DWORD m_dwNumVertices;
+ DWORD m_dwNumFaces;
+ DWORD m_dwBytesPerVertex;
+
+ DWORD m_dwNumMaterials; // Materials for the mesh
+ D3DMATERIAL9* m_pMaterials;
+ CHAR (*m_strMaterials )[MAX_PATH];
+ IDirect3DBaseTexture9** m_pTextures;
+ bool m_bUseMaterials;
+
+public:
+ // Rendering
+ HRESULT Render( LPDIRECT3DDEVICE9 pd3dDevice,
+ bool bDrawOpaqueSubsets = true,
+ bool bDrawAlphaSubsets = true );
+ HRESULT Render( ID3DXEffect* pEffect,
+ D3DXHANDLE hTexture = NULL,
+ D3DXHANDLE hDiffuse = NULL,
+ D3DXHANDLE hAmbient = NULL,
+ D3DXHANDLE hSpecular = NULL,
+ D3DXHANDLE hEmissive = NULL,
+ D3DXHANDLE hPower = NULL,
+ bool bDrawOpaqueSubsets = true,
+ bool bDrawAlphaSubsets = true );
+
+ // Mesh access
+ LPD3DXMESH GetMesh()
+ {
+ return m_pMesh;
+ }
+
+ // Rendering options
+ void UseMeshMaterials( bool bFlag )
+ {
+ m_bUseMaterials = bFlag;
+ }
+ HRESULT SetFVF( LPDIRECT3DDEVICE9 pd3dDevice, DWORD dwFVF );
+ HRESULT SetVertexDecl( LPDIRECT3DDEVICE9 pd3dDevice, const D3DVERTEXELEMENT9* pDecl,
+ bool bAutoComputeNormals = true, bool bAutoComputeTangents = true,
+ bool bSplitVertexForOptimalTangents = false );
+
+ // Initializing
+ HRESULT RestoreDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice );
+ HRESULT InvalidateDeviceObjects();
+
+ // Creation/destruction
+ HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename );
+ HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData );
+ HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh* pInMesh, D3DXMATERIAL* pd3dxMaterials,
+ DWORD dwMaterials );
+ HRESULT CreateMaterials( LPCWSTR strPath, IDirect3DDevice9* pd3dDevice, D3DXMATERIAL* d3dxMtrls,
+ DWORD dwNumMaterials );
+ HRESULT Destroy();
+
+ CDXUTXFileMesh( LPCWSTR strName = L"CDXUTXMeshFile_Mesh" );
+ virtual ~CDXUTXFileMesh();
+};
+
+
+#endif
+
+#endif
+