- ////////////////////////////////////////////////////////////////////////////// 
- // 
- //  Copyright (C) Microsoft Corporation.  All Rights Reserved. 
- // 
- //  File:       d3dx9mesh.h 
- //  Content:    D3DX mesh types and functions 
- // 
- ////////////////////////////////////////////////////////////////////////////// 
-   
- #include "d3dx9.h" 
-   
- #ifndef __D3DX9MESH_H__ 
- #define __D3DX9MESH_H__ 
-   
- // {7ED943DD-52E8-40b5-A8D8-76685C406330} 
- DEFINE_GUID(IID_ID3DXBaseMesh,  
- 0x7ed943dd, 0x52e8, 0x40b5, 0xa8, 0xd8, 0x76, 0x68, 0x5c, 0x40, 0x63, 0x30); 
-   
- // {4020E5C2-1403-4929-883F-E2E849FAC195} 
- DEFINE_GUID(IID_ID3DXMesh,  
- 0x4020e5c2, 0x1403, 0x4929, 0x88, 0x3f, 0xe2, 0xe8, 0x49, 0xfa, 0xc1, 0x95); 
-   
- // {8875769A-D579-4088-AAEB-534D1AD84E96} 
- DEFINE_GUID(IID_ID3DXPMesh,  
- 0x8875769a, 0xd579, 0x4088, 0xaa, 0xeb, 0x53, 0x4d, 0x1a, 0xd8, 0x4e, 0x96); 
-   
- // {667EA4C7-F1CD-4386-B523-7C0290B83CC5} 
- DEFINE_GUID(IID_ID3DXSPMesh,  
- 0x667ea4c7, 0xf1cd, 0x4386, 0xb5, 0x23, 0x7c, 0x2, 0x90, 0xb8, 0x3c, 0xc5); 
-   
- // {11EAA540-F9A6-4d49-AE6A-E19221F70CC4} 
- DEFINE_GUID(IID_ID3DXSkinInfo,  
- 0x11eaa540, 0xf9a6, 0x4d49, 0xae, 0x6a, 0xe1, 0x92, 0x21, 0xf7, 0xc, 0xc4); 
-   
- // {3CE6CC22-DBF2-44f4-894D-F9C34A337139} 
- DEFINE_GUID(IID_ID3DXPatchMesh,  
- 0x3ce6cc22, 0xdbf2, 0x44f4, 0x89, 0x4d, 0xf9, 0xc3, 0x4a, 0x33, 0x71, 0x39); 
-   
- //patch mesh can be quads or tris 
- typedef enum _D3DXPATCHMESHTYPE { 
-     D3DXPATCHMESH_RECT   = 0x001, 
-     D3DXPATCHMESH_TRI    = 0x002, 
-     D3DXPATCHMESH_NPATCH = 0x003, 
-   
-     D3DXPATCHMESH_FORCE_DWORD    = 0x7fffffff, /* force 32-bit size enum */ 
- } D3DXPATCHMESHTYPE; 
-   
- // Mesh options - lower 3 bytes only, upper byte used by _D3DXMESHOPT option flags 
- enum _D3DXMESH { 
-     D3DXMESH_32BIT                  = 0x001, // If set, then use 32 bit indices, if not set use 16 bit indices. 
-     D3DXMESH_DONOTCLIP              = 0x002, // Use D3DUSAGE_DONOTCLIP for VB & IB. 
-     D3DXMESH_POINTS                 = 0x004, // Use D3DUSAGE_POINTS for VB & IB.  
-     D3DXMESH_RTPATCHES              = 0x008, // Use D3DUSAGE_RTPATCHES for VB & IB.  
-     D3DXMESH_NPATCHES               = 0x4000,// Use D3DUSAGE_NPATCHES for VB & IB.  
-     D3DXMESH_VB_SYSTEMMEM           = 0x010, // Use D3DPOOL_SYSTEMMEM for VB. Overrides D3DXMESH_MANAGEDVERTEXBUFFER 
-     D3DXMESH_VB_MANAGED             = 0x020, // Use D3DPOOL_MANAGED for VB.  
-     D3DXMESH_VB_WRITEONLY           = 0x040, // Use D3DUSAGE_WRITEONLY for VB. 
-     D3DXMESH_VB_DYNAMIC             = 0x080, // Use D3DUSAGE_DYNAMIC for VB. 
-     D3DXMESH_VB_SOFTWAREPROCESSING = 0x8000, // Use D3DUSAGE_SOFTWAREPROCESSING for VB. 
-     D3DXMESH_IB_SYSTEMMEM           = 0x100, // Use D3DPOOL_SYSTEMMEM for IB. Overrides D3DXMESH_MANAGEDINDEXBUFFER 
-     D3DXMESH_IB_MANAGED             = 0x200, // Use D3DPOOL_MANAGED for IB. 
-     D3DXMESH_IB_WRITEONLY           = 0x400, // Use D3DUSAGE_WRITEONLY for IB. 
-     D3DXMESH_IB_DYNAMIC             = 0x800, // Use D3DUSAGE_DYNAMIC for IB. 
-     D3DXMESH_IB_SOFTWAREPROCESSING= 0x10000, // Use D3DUSAGE_SOFTWAREPROCESSING for IB. 
-   
-     D3DXMESH_VB_SHARE               = 0x1000, // Valid for Clone* calls only, forces cloned mesh/pmesh to share vertex buffer 
-   
-     D3DXMESH_USEHWONLY              = 0x2000, // Valid for ID3DXSkinInfo::ConvertToBlendedMesh 
-   
-     // Helper options 
-     D3DXMESH_SYSTEMMEM              = 0x110, // D3DXMESH_VB_SYSTEMMEM | D3DXMESH_IB_SYSTEMMEM 
-     D3DXMESH_MANAGED                = 0x220, // D3DXMESH_VB_MANAGED | D3DXMESH_IB_MANAGED 
-     D3DXMESH_WRITEONLY              = 0x440, // D3DXMESH_VB_WRITEONLY | D3DXMESH_IB_WRITEONLY 
-     D3DXMESH_DYNAMIC                = 0x880, // D3DXMESH_VB_DYNAMIC | D3DXMESH_IB_DYNAMIC 
-     D3DXMESH_SOFTWAREPROCESSING   = 0x18000, // D3DXMESH_VB_SOFTWAREPROCESSING | D3DXMESH_IB_SOFTWAREPROCESSING 
-   
- }; 
-   
- //patch mesh options 
- enum _D3DXPATCHMESH { 
-     D3DXPATCHMESH_DEFAULT = 000, 
- }; 
- // option field values for specifying min value in D3DXGeneratePMesh and D3DXSimplifyMesh 
- enum _D3DXMESHSIMP 
- { 
-     D3DXMESHSIMP_VERTEX   = 0x1, 
-     D3DXMESHSIMP_FACE     = 0x2, 
-   
- }; 
-   
- typedef enum _D3DXCLEANTYPE { 
-         D3DXCLEAN_BACKFACING    = 0x00000001, 
-         D3DXCLEAN_BOWTIES               = 0x00000002, 
-          
-         // Helper options 
-         D3DXCLEAN_SKINNING              = D3DXCLEAN_BACKFACING, // Bowtie cleaning modifies geometry and breaks skinning 
-         D3DXCLEAN_OPTIMIZATION  = D3DXCLEAN_BACKFACING, 
-         D3DXCLEAN_SIMPLIFICATION= D3DXCLEAN_BACKFACING | D3DXCLEAN_BOWTIES,      
- } D3DXCLEANTYPE; 
-   
- enum _MAX_FVF_DECL_SIZE 
- { 
-     MAX_FVF_DECL_SIZE = MAXD3DDECLLENGTH + 1 // +1 for END 
- }; 
-   
- typedef enum _D3DXTANGENT 
- { 
-     D3DXTANGENT_WRAP_U =                    0x01, 
-     D3DXTANGENT_WRAP_V =                    0x02, 
-     D3DXTANGENT_WRAP_UV =                   0x03, 
-     D3DXTANGENT_DONT_NORMALIZE_PARTIALS =   0x04, 
-     D3DXTANGENT_DONT_ORTHOGONALIZE =        0x08, 
-     D3DXTANGENT_ORTHOGONALIZE_FROM_V =      0x010, 
-     D3DXTANGENT_ORTHOGONALIZE_FROM_U =      0x020, 
-     D3DXTANGENT_WEIGHT_BY_AREA =            0x040, 
-     D3DXTANGENT_WEIGHT_EQUAL =              0x080, 
-     D3DXTANGENT_WIND_CW =                   0x0100, 
-     D3DXTANGENT_CALCULATE_NORMALS =         0x0200, 
-     D3DXTANGENT_GENERATE_IN_PLACE =         0x0400, 
- } D3DXTANGENT; 
-   
- // D3DXIMT_WRAP_U means the texture wraps in the U direction 
- // D3DXIMT_WRAP_V means the texture wraps in the V direction 
- // D3DXIMT_WRAP_UV means the texture wraps in both directions 
- typedef enum _D3DXIMT 
- { 
-     D3DXIMT_WRAP_U =                    0x01, 
-     D3DXIMT_WRAP_V =                    0x02, 
-     D3DXIMT_WRAP_UV =                   0x03, 
- } D3DXIMT; 
-   
- // These options are only valid for UVAtlasCreate and UVAtlasPartition, we may add more for UVAtlasPack if necessary 
- // D3DXUVATLAS_DEFAULT - Meshes with more than 25k faces go through fast, meshes with fewer than 25k faces go through quality 
- // D3DXUVATLAS_GEODESIC_FAST - Uses approximations to improve charting speed at the cost of added stretch or more charts. 
- // D3DXUVATLAS_GEODESIC_QUALITY - Provides better quality charts, but requires more time and memory than fast. 
- typedef enum _D3DXUVATLAS 
- { 
-     D3DXUVATLAS_DEFAULT               = 0x00, 
-     D3DXUVATLAS_GEODESIC_FAST         = 0x01, 
-     D3DXUVATLAS_GEODESIC_QUALITY      = 0x02, 
- } D3DXUVATLAS; 
-   
- typedef struct ID3DXBaseMesh *LPD3DXBASEMESH; 
- typedef struct ID3DXMesh *LPD3DXMESH; 
- typedef struct ID3DXPMesh *LPD3DXPMESH; 
- typedef struct ID3DXSPMesh *LPD3DXSPMESH; 
- typedef struct ID3DXSkinInfo *LPD3DXSKININFO; 
- typedef struct ID3DXPatchMesh *LPD3DXPATCHMESH; 
- typedef interface ID3DXTextureGutterHelper *LPD3DXTEXTUREGUTTERHELPER; 
- typedef interface ID3DXPRTBuffer *LPD3DXPRTBUFFER; 
-   
-   
- typedef struct _D3DXATTRIBUTERANGE 
- { 
-     DWORD AttribId; 
-     DWORD FaceStart; 
-     DWORD FaceCount; 
-     DWORD VertexStart; 
-     DWORD VertexCount; 
- } D3DXATTRIBUTERANGE; 
-   
- typedef D3DXATTRIBUTERANGE* LPD3DXATTRIBUTERANGE; 
-   
- typedef struct _D3DXMATERIAL 
- { 
-     D3DMATERIAL9  MatD3D; 
-     LPSTR         pTextureFilename; 
- } D3DXMATERIAL; 
- typedef D3DXMATERIAL *LPD3DXMATERIAL; 
-   
- typedef enum _D3DXEFFECTDEFAULTTYPE 
- { 
-     D3DXEDT_STRING = 0x1,       // pValue points to a null terminated ASCII string  
-     D3DXEDT_FLOATS = 0x2,       // pValue points to an array of floats - number of floats is NumBytes / sizeof(float) 
-     D3DXEDT_DWORD  = 0x3,       // pValue points to a DWORD 
-   
-     D3DXEDT_FORCEDWORD = 0x7fffffff 
- } D3DXEFFECTDEFAULTTYPE; 
-   
- typedef struct _D3DXEFFECTDEFAULT 
- { 
-     LPSTR                 pParamName; 
-     D3DXEFFECTDEFAULTTYPE Type;           // type of the data pointed to by pValue 
-     DWORD                 NumBytes;       // size in bytes of the data pointed to by pValue 
-     LPVOID                pValue;         // data for the default of the effect 
- } D3DXEFFECTDEFAULT, *LPD3DXEFFECTDEFAULT; 
-   
- typedef struct _D3DXEFFECTINSTANCE 
- { 
-     LPSTR               pEffectFilename; 
-     DWORD               NumDefaults; 
-     LPD3DXEFFECTDEFAULT pDefaults; 
- } D3DXEFFECTINSTANCE, *LPD3DXEFFECTINSTANCE; 
-   
- typedef struct _D3DXATTRIBUTEWEIGHTS 
- { 
-     FLOAT Position; 
-     FLOAT Boundary; 
-     FLOAT Normal; 
-     FLOAT Diffuse; 
-     FLOAT Specular; 
-     FLOAT Texcoord[8]; 
-     FLOAT Tangent; 
-     FLOAT Binormal; 
- } D3DXATTRIBUTEWEIGHTS, *LPD3DXATTRIBUTEWEIGHTS; 
-   
- enum _D3DXWELDEPSILONSFLAGS 
- { 
-     D3DXWELDEPSILONS_WELDALL             = 0x1,  // weld all vertices marked by adjacency as being overlapping 
-   
-     D3DXWELDEPSILONS_WELDPARTIALMATCHES  = 0x2,  // if a given vertex component is within epsilon, modify partial matched  
-                                                     // vertices so that both components identical AND if all components "equal" 
-                                                     // remove one of the vertices 
-     D3DXWELDEPSILONS_DONOTREMOVEVERTICES = 0x4,  // instructs weld to only allow modifications to vertices and not removal 
-                                                     // ONLY valid if D3DXWELDEPSILONS_WELDPARTIALMATCHES is set 
-                                                     // useful to modify vertices to be equal, but not allow vertices to be removed 
-   
-     D3DXWELDEPSILONS_DONOTSPLIT          = 0x8,  // instructs weld to specify the D3DXMESHOPT_DONOTSPLIT flag when doing an Optimize(ATTR_SORT) 
-                                                     // if this flag is not set, all vertices that are in separate attribute groups 
-                                                     // will remain split and not welded.  Setting this flag can slow down software vertex processing 
-   
- }; 
-   
- typedef struct _D3DXWELDEPSILONS 
- { 
-     FLOAT Position;                 // NOTE: This does NOT replace the epsilon in GenerateAdjacency 
-                                             // in general, it should be the same value or greater than the one passed to GeneratedAdjacency 
-     FLOAT BlendWeights; 
-     FLOAT Normal; 
-     FLOAT PSize; 
-     FLOAT Specular; 
-     FLOAT Diffuse; 
-     FLOAT Texcoord[8]; 
-     FLOAT Tangent; 
-     FLOAT Binormal; 
-     FLOAT TessFactor; 
- } D3DXWELDEPSILONS; 
-   
- typedef D3DXWELDEPSILONS* LPD3DXWELDEPSILONS; 
-   
-   
- #undef INTERFACE 
- #define INTERFACE ID3DXBaseMesh 
-   
- DECLARE_INTERFACE_(ID3DXBaseMesh, IUnknown) 
- { 
-     // IUnknown 
-     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 
-     STDMETHOD_(ULONG, AddRef)(THIS) PURE; 
-     STDMETHOD_(ULONG, Release)(THIS) PURE; 
-   
-     // ID3DXBaseMesh 
-     STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE; 
-     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetFVF)(THIS) PURE; 
-     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; 
-     STDMETHOD_(DWORD, GetNumBytesPerVertex)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetOptions)(THIS) PURE; 
-     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9* ppDevice) PURE; 
-     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options,  
-                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; 
-     STDMETHOD(CloneMesh)(THIS_ DWORD Options,  
-                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; 
-     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER9* ppVB) PURE; 
-     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER9* ppIB) PURE; 
-     STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE; 
-     STDMETHOD(UnlockVertexBuffer)(THIS) PURE; 
-     STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE; 
-     STDMETHOD(UnlockIndexBuffer)(THIS) PURE; 
-     STDMETHOD(GetAttributeTable)( 
-                 THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE; 
-   
-     STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE; 
-     STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE; 
-     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE; 
-   
-     STDMETHOD(UpdateSemantics)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; 
- }; 
-   
-   
- #undef INTERFACE 
- #define INTERFACE ID3DXMesh 
-   
- DECLARE_INTERFACE_(ID3DXMesh, ID3DXBaseMesh) 
- { 
-     // IUnknown 
-     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 
-     STDMETHOD_(ULONG, AddRef)(THIS) PURE; 
-     STDMETHOD_(ULONG, Release)(THIS) PURE; 
-   
-     // ID3DXBaseMesh 
-     STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE; 
-     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetFVF)(THIS) PURE; 
-     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; 
-     STDMETHOD_(DWORD, GetNumBytesPerVertex)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetOptions)(THIS) PURE; 
-     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9* ppDevice) PURE; 
-     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options,  
-                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; 
-     STDMETHOD(CloneMesh)(THIS_ DWORD Options,  
-                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; 
-     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER9* ppVB) PURE; 
-     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER9* ppIB) PURE; 
-     STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE; 
-     STDMETHOD(UnlockVertexBuffer)(THIS) PURE; 
-     STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE; 
-     STDMETHOD(UnlockIndexBuffer)(THIS) PURE; 
-     STDMETHOD(GetAttributeTable)( 
-                 THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE; 
-   
-     STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE; 
-     STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE; 
-     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE; 
-   
-     STDMETHOD(UpdateSemantics)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; 
-   
-     // ID3DXMesh 
-     STDMETHOD(LockAttributeBuffer)(THIS_ DWORD Flags, DWORD** ppData) PURE; 
-     STDMETHOD(UnlockAttributeBuffer)(THIS) PURE; 
-     STDMETHOD(Optimize)(THIS_ DWORD Flags, CONST DWORD* pAdjacencyIn, DWORD* pAdjacencyOut,  
-                      DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap,   
-                      LPD3DXMESH* ppOptMesh) PURE; 
-     STDMETHOD(OptimizeInplace)(THIS_ DWORD Flags, CONST DWORD* pAdjacencyIn, DWORD* pAdjacencyOut,  
-                      DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap) PURE; 
-     STDMETHOD(SetAttributeTable)(THIS_ CONST D3DXATTRIBUTERANGE *pAttribTable, DWORD cAttribTableSize) PURE; 
- }; 
-   
-   
- #undef INTERFACE 
- #define INTERFACE ID3DXPMesh 
-   
- DECLARE_INTERFACE_(ID3DXPMesh, ID3DXBaseMesh) 
- { 
-     // IUnknown 
-     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 
-     STDMETHOD_(ULONG, AddRef)(THIS) PURE; 
-     STDMETHOD_(ULONG, Release)(THIS) PURE; 
-   
-     // ID3DXBaseMesh 
-     STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE; 
-     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetFVF)(THIS) PURE; 
-     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; 
-     STDMETHOD_(DWORD, GetNumBytesPerVertex)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetOptions)(THIS) PURE; 
-     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9* ppDevice) PURE; 
-     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options,  
-                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; 
-     STDMETHOD(CloneMesh)(THIS_ DWORD Options,  
-                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE; 
-     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER9* ppVB) PURE; 
-     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER9* ppIB) PURE; 
-     STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE; 
-     STDMETHOD(UnlockVertexBuffer)(THIS) PURE; 
-     STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE; 
-     STDMETHOD(UnlockIndexBuffer)(THIS) PURE; 
-     STDMETHOD(GetAttributeTable)( 
-                 THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE; 
-   
-     STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE; 
-     STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE; 
-     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE; 
-   
-     STDMETHOD(UpdateSemantics)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; 
-   
-     // ID3DXPMesh 
-     STDMETHOD(ClonePMeshFVF)(THIS_ DWORD Options,  
-                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXPMESH* ppCloneMesh) PURE; 
-     STDMETHOD(ClonePMesh)(THIS_ DWORD Options,  
-                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXPMESH* ppCloneMesh) PURE; 
-     STDMETHOD(SetNumFaces)(THIS_ DWORD Faces) PURE; 
-     STDMETHOD(SetNumVertices)(THIS_ DWORD Vertices) PURE; 
-     STDMETHOD_(DWORD, GetMaxFaces)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetMinFaces)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetMaxVertices)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetMinVertices)(THIS) PURE; 
-     STDMETHOD(Save)(THIS_ IStream *pStream, CONST D3DXMATERIAL* pMaterials, CONST D3DXEFFECTINSTANCE* pEffectInstances, DWORD NumMaterials) PURE; 
-   
-     STDMETHOD(Optimize)(THIS_ DWORD Flags, DWORD* pAdjacencyOut,  
-                      DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap,   
-                      LPD3DXMESH* ppOptMesh) PURE; 
-   
-     STDMETHOD(OptimizeBaseLOD)(THIS_ DWORD Flags, DWORD* pFaceRemap) PURE; 
-     STDMETHOD(TrimByFaces)(THIS_ DWORD NewFacesMin, DWORD NewFacesMax, DWORD *rgiFaceRemap, DWORD *rgiVertRemap) PURE; 
-     STDMETHOD(TrimByVertices)(THIS_ DWORD NewVerticesMin, DWORD NewVerticesMax, DWORD *rgiFaceRemap, DWORD *rgiVertRemap) PURE; 
-   
-     STDMETHOD(GetAdjacency)(THIS_ DWORD* pAdjacency) PURE; 
-   
-     //  Used to generate the immediate "ancestor" for each vertex when it is removed by a vsplit.  Allows generation of geomorphs 
-     //     Vertex buffer must be equal to or greater than the maximum number of vertices in the pmesh 
-     STDMETHOD(GenerateVertexHistory)(THIS_ DWORD* pVertexHistory) PURE; 
- }; 
-   
-   
- #undef INTERFACE 
- #define INTERFACE ID3DXSPMesh 
-   
- DECLARE_INTERFACE_(ID3DXSPMesh, IUnknown) 
- { 
-     // IUnknown 
-     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 
-     STDMETHOD_(ULONG, AddRef)(THIS) PURE; 
-     STDMETHOD_(ULONG, Release)(THIS) PURE; 
-   
-     // ID3DXSPMesh 
-     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetFVF)(THIS) PURE; 
-     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; 
-     STDMETHOD_(DWORD, GetOptions)(THIS) PURE; 
-     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9* ppDevice) PURE; 
-     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options,  
-                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, DWORD *pAdjacencyOut, DWORD *pVertexRemapOut, LPD3DXMESH* ppCloneMesh) PURE; 
-     STDMETHOD(CloneMesh)(THIS_ DWORD Options,  
-                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, DWORD *pAdjacencyOut, DWORD *pVertexRemapOut, LPD3DXMESH* ppCloneMesh) PURE; 
-     STDMETHOD(ClonePMeshFVF)(THIS_ DWORD Options,  
-                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, DWORD *pVertexRemapOut, FLOAT *pErrorsByFace, LPD3DXPMESH* ppCloneMesh) PURE; 
-     STDMETHOD(ClonePMesh)(THIS_ DWORD Options,  
-                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, DWORD *pVertexRemapOut, FLOAT *pErrorsbyFace, LPD3DXPMESH* ppCloneMesh) PURE; 
-     STDMETHOD(ReduceFaces)(THIS_ DWORD Faces) PURE; 
-     STDMETHOD(ReduceVertices)(THIS_ DWORD Vertices) PURE; 
-     STDMETHOD_(DWORD, GetMaxFaces)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetMaxVertices)(THIS) PURE; 
-     STDMETHOD(GetVertexAttributeWeights)(THIS_ LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights) PURE; 
-     STDMETHOD(GetVertexWeights)(THIS_ FLOAT *pVertexWeights) PURE; 
- }; 
-   
- #define UNUSED16 (0xffff) 
- #define UNUSED32 (0xffffffff) 
-   
- // ID3DXMesh::Optimize options - upper byte only, lower 3 bytes used from _D3DXMESH option flags 
- enum _D3DXMESHOPT { 
-     D3DXMESHOPT_COMPACT       = 0x01000000, 
-     D3DXMESHOPT_ATTRSORT      = 0x02000000, 
-     D3DXMESHOPT_VERTEXCACHE   = 0x04000000, 
-     D3DXMESHOPT_STRIPREORDER  = 0x08000000, 
-     D3DXMESHOPT_IGNOREVERTS   = 0x10000000,  // optimize faces only, don't touch vertices 
-     D3DXMESHOPT_DONOTSPLIT    = 0x20000000,  // do not split vertices shared between attribute groups when attribute sorting 
-     D3DXMESHOPT_DEVICEINDEPENDENT = 0x00400000,  // Only affects VCache.  uses a static known good cache size for all cards 
-                              
-     // D3DXMESHOPT_SHAREVB has been removed, please use D3DXMESH_VB_SHARE instead 
-   
- }; 
-   
- // Subset of the mesh that has the same attribute and bone combination. 
- // This subset can be rendered in a single draw call 
- typedef struct _D3DXBONECOMBINATION 
- { 
-     DWORD AttribId; 
-     DWORD FaceStart; 
-     DWORD FaceCount; 
-     DWORD VertexStart; 
-     DWORD VertexCount; 
-     DWORD* BoneId; 
- } D3DXBONECOMBINATION, *LPD3DXBONECOMBINATION; 
-   
- // The following types of patch combinations are supported: 
- // Patch type   Basis       Degree 
- // Rect         Bezier      2,3,5 
- // Rect         B-Spline    2,3,5 
- // Rect         Catmull-Rom 3 
- // Tri          Bezier      2,3,5 
- // N-Patch      N/A         3 
-   
- typedef struct _D3DXPATCHINFO 
- { 
-     D3DXPATCHMESHTYPE PatchType; 
-     D3DDEGREETYPE Degree; 
-     D3DBASISTYPE Basis; 
- } D3DXPATCHINFO, *LPD3DXPATCHINFO; 
-   
- #undef INTERFACE 
- #define INTERFACE ID3DXPatchMesh 
-   
- DECLARE_INTERFACE_(ID3DXPatchMesh, IUnknown) 
- { 
-     // IUnknown 
-     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 
-     STDMETHOD_(ULONG, AddRef)(THIS) PURE; 
-     STDMETHOD_(ULONG, Release)(THIS) PURE; 
-   
-     // ID3DXPatchMesh 
-   
-     // Return creation parameters 
-     STDMETHOD_(DWORD, GetNumPatches)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE; 
-     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; 
-     STDMETHOD_(DWORD, GetControlVerticesPerPatch)(THIS) PURE; 
-     STDMETHOD_(DWORD, GetOptions)(THIS) PURE; 
-     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9 *ppDevice) PURE; 
-     STDMETHOD(GetPatchInfo)(THIS_ LPD3DXPATCHINFO PatchInfo) PURE; 
-   
-     // Control mesh access     
-     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER9* ppVB) PURE; 
-     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER9* ppIB) PURE; 
-     STDMETHOD(LockVertexBuffer)(THIS_ DWORD flags, LPVOID *ppData) PURE; 
-     STDMETHOD(UnlockVertexBuffer)(THIS) PURE; 
-     STDMETHOD(LockIndexBuffer)(THIS_ DWORD flags, LPVOID *ppData) PURE; 
-     STDMETHOD(UnlockIndexBuffer)(THIS) PURE; 
-     STDMETHOD(LockAttributeBuffer)(THIS_ DWORD flags, DWORD** ppData) PURE; 
-     STDMETHOD(UnlockAttributeBuffer)(THIS) PURE; 
-   
-     // This function returns the size of the tessellated mesh given a tessellation level. 
-     // This assumes uniform tessellation. For adaptive tessellation the Adaptive parameter must 
-     // be set to TRUE and TessellationLevel should be the max tessellation. 
-     // This will result in the max mesh size necessary for adaptive tessellation.     
-     STDMETHOD(GetTessSize)(THIS_ FLOAT fTessLevel,DWORD Adaptive, DWORD *NumTriangles,DWORD *NumVertices) PURE; 
-      
-     //GenerateAdjacency determines which patches are adjacent with provided tolerance 
-     //this information is used internally to optimize tessellation 
-     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Tolerance) PURE; 
-      
-     //CloneMesh Creates a new patchmesh with the specified decl, and converts the vertex buffer 
-     //to the new decl. Entries in the new decl which are new are set to 0. If the current mesh 
-     //has adjacency, the new mesh will also have adjacency 
-     STDMETHOD(CloneMesh)(THIS_ DWORD Options, CONST D3DVERTEXELEMENT9 *pDecl, LPD3DXPATCHMESH *pMesh) PURE; 
-      
-     // Optimizes the patchmesh for efficient tessellation. This function is designed 
-     // to perform one time optimization for patch meshes that need to be tessellated 
-     // repeatedly by calling the Tessellate() method. The optimization performed is 
-     // independent of the actual tessellation level used. 
-     // Currently Flags is unused. 
-     // If vertices are changed, Optimize must be called again 
-     STDMETHOD(Optimize)(THIS_ DWORD flags) PURE; 
-   
-     //gets and sets displacement parameters 
-     //displacement maps can only be 2D textures MIP-MAPPING is ignored for non adapative tessellation 
-     STDMETHOD(SetDisplaceParam)(THIS_ LPDIRECT3DBASETEXTURE9 Texture, 
-                               D3DTEXTUREFILTERTYPE MinFilter, 
-                               D3DTEXTUREFILTERTYPE MagFilter, 
-                               D3DTEXTUREFILTERTYPE MipFilter, 
-                               D3DTEXTUREADDRESS Wrap, 
-                               DWORD dwLODBias) PURE; 
-   
-     STDMETHOD(GetDisplaceParam)(THIS_ LPDIRECT3DBASETEXTURE9 *Texture, 
-                                 D3DTEXTUREFILTERTYPE *MinFilter, 
-                                 D3DTEXTUREFILTERTYPE *MagFilter, 
-                                 D3DTEXTUREFILTERTYPE *MipFilter, 
-                                 D3DTEXTUREADDRESS *Wrap, 
-                                 DWORD *dwLODBias) PURE; 
-          
-     // Performs the uniform tessellation based on the tessellation level.  
-     // This function will perform more efficiently if the patch mesh has been optimized using the Optimize() call. 
-     STDMETHOD(Tessellate)(THIS_ FLOAT fTessLevel,LPD3DXMESH pMesh) PURE; 
-   
-     // Performs adaptive tessellation based on the Z based adaptive tessellation criterion. 
-     // pTrans specifies a 4D vector that is dotted with the vertices to get the per vertex 
-     // adaptive tessellation amount. Each edge is tessellated to the average of the criterion 
-     // at the 2 vertices it connects. 
-     // MaxTessLevel specifies the upper limit for adaptive tesselation. 
-     // This function will perform more efficiently if the patch mesh has been optimized using the Optimize() call. 
-     STDMETHOD(TessellateAdaptive)(THIS_  
-         CONST D3DXVECTOR4 *pTrans, 
-         DWORD dwMaxTessLevel,  
-         DWORD dwMinTessLevel, 
-         LPD3DXMESH pMesh) PURE; 
-   
- }; 
-   
- #undef INTERFACE 
- #define INTERFACE ID3DXSkinInfo 
-   
- DECLARE_INTERFACE_(ID3DXSkinInfo, IUnknown) 
- { 
-     // IUnknown 
-     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 
-     STDMETHOD_(ULONG, AddRef)(THIS) PURE; 
-     STDMETHOD_(ULONG, Release)(THIS) PURE; 
-   
-     // Specify the which vertices do each bones influence and by how much 
-     STDMETHOD(SetBoneInfluence)(THIS_ DWORD bone, DWORD numInfluences, CONST DWORD* vertices, CONST FLOAT* weights) PURE; 
-         STDMETHOD(SetBoneVertexInfluence)(THIS_ DWORD boneNum, DWORD influenceNum, float weight) PURE; 
-     STDMETHOD_(DWORD, GetNumBoneInfluences)(THIS_ DWORD bone) PURE; 
-         STDMETHOD(GetBoneInfluence)(THIS_ DWORD bone, DWORD* vertices, FLOAT* weights) PURE; 
-         STDMETHOD(GetBoneVertexInfluence)(THIS_ DWORD boneNum, DWORD influenceNum, float *pWeight, DWORD *pVertexNum) PURE; 
-     STDMETHOD(GetMaxVertexInfluences)(THIS_ DWORD* maxVertexInfluences) PURE; 
-     STDMETHOD_(DWORD, GetNumBones)(THIS) PURE; 
-         STDMETHOD(FindBoneVertexInfluenceIndex)(THIS_ DWORD boneNum, DWORD vertexNum, DWORD *pInfluenceIndex) PURE; 
-   
-     // This gets the max face influences based on a triangle mesh with the specified index buffer 
-     STDMETHOD(GetMaxFaceInfluences)(THIS_ LPDIRECT3DINDEXBUFFER9 pIB, DWORD NumFaces, DWORD* maxFaceInfluences) PURE; 
-      
-     // Set min bone influence. Bone influences that are smaller than this are ignored 
-     STDMETHOD(SetMinBoneInfluence)(THIS_ FLOAT MinInfl) PURE; 
-     // Get min bone influence.  
-     STDMETHOD_(FLOAT, GetMinBoneInfluence)(THIS) PURE; 
-      
-     // Bone names are returned by D3DXLoadSkinMeshFromXof. They are not used by any other method of this object 
-     STDMETHOD(SetBoneName)(THIS_ DWORD Bone, LPCSTR pName) PURE; // pName is copied to an internal string buffer 
-     STDMETHOD_(LPCSTR, GetBoneName)(THIS_ DWORD Bone) PURE; // A pointer to an internal string buffer is returned. Do not free this. 
-      
-     // Bone offset matrices are returned by D3DXLoadSkinMeshFromXof. They are not used by any other method of this object 
-     STDMETHOD(SetBoneOffsetMatrix)(THIS_ DWORD Bone, CONST D3DXMATRIX *pBoneTransform) PURE; // pBoneTransform is copied to an internal buffer 
-     STDMETHOD_(LPD3DXMATRIX, GetBoneOffsetMatrix)(THIS_ DWORD Bone) PURE; // A pointer to an internal matrix is returned. Do not free this. 
-      
-     // Clone a skin info object 
-     STDMETHOD(Clone)(THIS_ LPD3DXSKININFO* ppSkinInfo) PURE; 
-      
-     // Update bone influence information to match vertices after they are reordered. This should be called  
-     // if the target vertex buffer has been reordered externally. 
-     STDMETHOD(Remap)(THIS_ DWORD NumVertices, DWORD* pVertexRemap) PURE; 
-   
-     // These methods enable the modification of the vertex layout of the vertices that will be skinned 
-     STDMETHOD(SetFVF)(THIS_ DWORD FVF) PURE; 
-     STDMETHOD(SetDeclaration)(THIS_ CONST D3DVERTEXELEMENT9 *pDeclaration) PURE; 
-     STDMETHOD_(DWORD, GetFVF)(THIS) PURE; 
-     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; 
-   
-     // Apply SW skinning based on current pose matrices to the target vertices. 
-     STDMETHOD(UpdateSkinnedMesh)(THIS_  
-         CONST D3DXMATRIX* pBoneTransforms,  
-         CONST D3DXMATRIX* pBoneInvTransposeTransforms,  
-         LPCVOID pVerticesSrc,  
-         PVOID pVerticesDst) PURE; 
-   
-     // Takes a mesh and returns a new mesh with per vertex blend weights and a bone combination 
-     // table that describes which bones affect which subsets of the mesh 
-     STDMETHOD(ConvertToBlendedMesh)(THIS_  
-         LPD3DXMESH pMesh, 
-         DWORD Options,  
-         CONST DWORD *pAdjacencyIn,  
-         LPDWORD pAdjacencyOut, 
-         DWORD* pFaceRemap,  
-         LPD3DXBUFFER *ppVertexRemap,  
-         DWORD* pMaxFaceInfl, 
-         DWORD* pNumBoneCombinations,  
-         LPD3DXBUFFER* ppBoneCombinationTable,  
-         LPD3DXMESH* ppMesh) PURE; 
-   
-     // Takes a mesh and returns a new mesh with per vertex blend weights and indices  
-     // and a bone combination table that describes which bones palettes affect which subsets of the mesh 
-     STDMETHOD(ConvertToIndexedBlendedMesh)(THIS_  
-         LPD3DXMESH pMesh, 
-         DWORD Options,  
-         DWORD paletteSize,  
-         CONST DWORD *pAdjacencyIn,  
-         LPDWORD pAdjacencyOut,  
-         DWORD* pFaceRemap,  
-         LPD3DXBUFFER *ppVertexRemap,  
-         DWORD* pMaxVertexInfl, 
-         DWORD* pNumBoneCombinations,  
-         LPD3DXBUFFER* ppBoneCombinationTable,  
-         LPD3DXMESH* ppMesh) PURE; 
- }; 
-   
- #ifdef __cplusplus 
- extern "C" { 
- #endif //__cplusplus 
-   
-   
- HRESULT WINAPI  
-     D3DXCreateMesh( 
-         DWORD NumFaces,  
-         DWORD NumVertices,  
-         DWORD Options,  
-         CONST D3DVERTEXELEMENT9 *pDeclaration,  
-         LPDIRECT3DDEVICE9 pD3DDevice,  
-         LPD3DXMESH* ppMesh); 
-   
- HRESULT WINAPI  
-     D3DXCreateMeshFVF( 
-         DWORD NumFaces,  
-         DWORD NumVertices,  
-         DWORD Options,  
-         DWORD FVF,  
-         LPDIRECT3DDEVICE9 pD3DDevice,  
-         LPD3DXMESH* ppMesh); 
-   
- HRESULT WINAPI  
-     D3DXCreateSPMesh( 
-         LPD3DXMESH pMesh,  
-         CONST DWORD* pAdjacency,  
-         CONST D3DXATTRIBUTEWEIGHTS *pVertexAttributeWeights, 
-         CONST FLOAT *pVertexWeights, 
-         LPD3DXSPMESH* ppSMesh); 
-   
- // clean a mesh up for simplification, try to make manifold 
- HRESULT WINAPI 
-     D3DXCleanMesh( 
-     D3DXCLEANTYPE CleanType, 
-     LPD3DXMESH pMeshIn, 
-     CONST DWORD* pAdjacencyIn, 
-     LPD3DXMESH* ppMeshOut, 
-     DWORD* pAdjacencyOut, 
-     LPD3DXBUFFER* ppErrorsAndWarnings); 
-   
- HRESULT WINAPI 
-     D3DXValidMesh( 
-     LPD3DXMESH pMeshIn, 
-     CONST DWORD* pAdjacency, 
-     LPD3DXBUFFER* ppErrorsAndWarnings); 
-   
- HRESULT WINAPI  
-     D3DXGeneratePMesh( 
-         LPD3DXMESH pMesh,  
-         CONST DWORD* pAdjacency,  
-         CONST D3DXATTRIBUTEWEIGHTS *pVertexAttributeWeights, 
-         CONST FLOAT *pVertexWeights, 
-         DWORD MinValue,  
-         DWORD Options,  
-         LPD3DXPMESH* ppPMesh); 
-   
- HRESULT WINAPI  
-     D3DXSimplifyMesh( 
-         LPD3DXMESH pMesh,  
-         CONST DWORD* pAdjacency,  
-         CONST D3DXATTRIBUTEWEIGHTS *pVertexAttributeWeights, 
-         CONST FLOAT *pVertexWeights, 
-         DWORD MinValue,  
-         DWORD Options,  
-         LPD3DXMESH* ppMesh); 
-   
- HRESULT WINAPI  
-     D3DXComputeBoundingSphere( 
-         CONST D3DXVECTOR3 *pFirstPosition,  // pointer to first position 
-         DWORD NumVertices,  
-         DWORD dwStride,                     // count in bytes to subsequent position vectors 
-         D3DXVECTOR3 *pCenter,  
-         FLOAT *pRadius); 
-   
- HRESULT WINAPI  
-     D3DXComputeBoundingBox( 
-         CONST D3DXVECTOR3 *pFirstPosition,  // pointer to first position 
-         DWORD NumVertices,  
-         DWORD dwStride,                     // count in bytes to subsequent position vectors 
-         D3DXVECTOR3 *pMin,  
-         D3DXVECTOR3 *pMax); 
-   
- HRESULT WINAPI  
-     D3DXComputeNormals( 
-         LPD3DXBASEMESH pMesh, 
-         CONST DWORD *pAdjacency); 
-   
- HRESULT WINAPI  
-     D3DXCreateBuffer( 
-         DWORD NumBytes,  
-         LPD3DXBUFFER *ppBuffer); 
-   
-   
- HRESULT WINAPI 
-     D3DXLoadMeshFromXA( 
-         LPCSTR pFilename,  
-         DWORD Options,  
-         LPDIRECT3DDEVICE9 pD3DDevice,  
-         LPD3DXBUFFER *ppAdjacency, 
-         LPD3DXBUFFER *ppMaterials,  
-         LPD3DXBUFFER *ppEffectInstances,  
-         DWORD *pNumMaterials, 
-         LPD3DXMESH *ppMesh); 
-   
- HRESULT WINAPI 
-     D3DXLoadMeshFromXW( 
-         LPCWSTR pFilename,  
-         DWORD Options,  
-         LPDIRECT3DDEVICE9 pD3DDevice,  
-         LPD3DXBUFFER *ppAdjacency, 
-         LPD3DXBUFFER *ppMaterials,  
-         LPD3DXBUFFER *ppEffectInstances,  
-         DWORD *pNumMaterials, 
-         LPD3DXMESH *ppMesh); 
-   
- #ifdef UNICODE 
- #define D3DXLoadMeshFromX D3DXLoadMeshFromXW 
- #else 
- #define D3DXLoadMeshFromX D3DXLoadMeshFromXA 
- #endif 
-   
- HRESULT WINAPI  
-     D3DXLoadMeshFromXInMemory( 
-         LPCVOID Memory, 
-         DWORD SizeOfMemory, 
-         DWORD Options,  
-         LPDIRECT3DDEVICE9 pD3DDevice,  
-         LPD3DXBUFFER *ppAdjacency, 
-         LPD3DXBUFFER *ppMaterials,  
-         LPD3DXBUFFER *ppEffectInstances,  
-         DWORD *pNumMaterials, 
-         LPD3DXMESH *ppMesh); 
-   
- HRESULT WINAPI  
-     D3DXLoadMeshFromXResource( 
-         HMODULE Module, 
-         LPCSTR Name, 
-         LPCSTR Type, 
-         DWORD Options,  
-         LPDIRECT3DDEVICE9 pD3DDevice,  
-         LPD3DXBUFFER *ppAdjacency, 
-         LPD3DXBUFFER *ppMaterials,  
-         LPD3DXBUFFER *ppEffectInstances,  
-         DWORD *pNumMaterials, 
-         LPD3DXMESH *ppMesh); 
-   
- HRESULT WINAPI  
-     D3DXSaveMeshToXA( 
-         LPCSTR pFilename, 
-         LPD3DXMESH pMesh, 
-         CONST DWORD* pAdjacency, 
-         CONST D3DXMATERIAL* pMaterials, 
-         CONST D3DXEFFECTINSTANCE* pEffectInstances,  
-         DWORD NumMaterials, 
-         DWORD Format 
-         ); 
-   
- HRESULT WINAPI  
-     D3DXSaveMeshToXW( 
-         LPCWSTR pFilename, 
-         LPD3DXMESH pMesh, 
-         CONST DWORD* pAdjacency, 
-         CONST D3DXMATERIAL* pMaterials, 
-         CONST D3DXEFFECTINSTANCE* pEffectInstances,  
-         DWORD NumMaterials, 
-         DWORD Format 
-         ); 
-          
- #ifdef UNICODE 
- #define D3DXSaveMeshToX D3DXSaveMeshToXW 
- #else 
- #define D3DXSaveMeshToX D3DXSaveMeshToXA 
- #endif 
-          
-   
- HRESULT WINAPI  
-     D3DXCreatePMeshFromStream( 
-         IStream *pStream,  
-         DWORD Options, 
-         LPDIRECT3DDEVICE9 pD3DDevice,  
-         LPD3DXBUFFER *ppMaterials, 
-         LPD3DXBUFFER *ppEffectInstances,  
-         DWORD* pNumMaterials, 
-         LPD3DXPMESH *ppPMesh); 
-   
- // Creates a skin info object based on the number of vertices, number of bones, and a declaration describing the vertex layout of the target vertices 
- // The bone names and initial bone transforms are not filled in the skin info object by this method. 
- HRESULT WINAPI 
-     D3DXCreateSkinInfo( 
-         DWORD NumVertices, 
-         CONST D3DVERTEXELEMENT9 *pDeclaration,  
-         DWORD NumBones, 
-         LPD3DXSKININFO* ppSkinInfo); 
-          
- // Creates a skin info object based on the number of vertices, number of bones, and a FVF describing the vertex layout of the target vertices 
- // The bone names and initial bone transforms are not filled in the skin info object by this method. 
- HRESULT WINAPI 
-     D3DXCreateSkinInfoFVF( 
-         DWORD NumVertices, 
-         DWORD FVF, 
-         DWORD NumBones, 
-         LPD3DXSKININFO* ppSkinInfo); 
-          
- #ifdef __cplusplus 
- } 
-   
- extern "C" { 
- #endif //__cplusplus 
-   
- HRESULT WINAPI  
-     D3DXLoadMeshFromXof( 
-         LPD3DXFILEDATA pxofMesh,  
-         DWORD Options,  
-         LPDIRECT3DDEVICE9 pD3DDevice,  
-         LPD3DXBUFFER *ppAdjacency, 
-         LPD3DXBUFFER *ppMaterials,  
-         LPD3DXBUFFER *ppEffectInstances,  
-         DWORD *pNumMaterials, 
-         LPD3DXMESH *ppMesh); 
-   
- // This similar to D3DXLoadMeshFromXof, except also returns skinning info if present in the file 
- // If skinning info is not present, ppSkinInfo will be NULL      
- HRESULT WINAPI 
-     D3DXLoadSkinMeshFromXof( 
-         LPD3DXFILEDATA pxofMesh,  
-         DWORD Options, 
-         LPDIRECT3DDEVICE9 pD3DDevice, 
-         LPD3DXBUFFER* ppAdjacency, 
-         LPD3DXBUFFER* ppMaterials, 
-         LPD3DXBUFFER *ppEffectInstances,  
-         DWORD *pMatOut, 
-         LPD3DXSKININFO* ppSkinInfo, 
-         LPD3DXMESH* ppMesh); 
-   
-   
- // The inverse of D3DXConvertTo{Indexed}BlendedMesh() functions. It figures out the skinning info from 
- // the mesh and the bone combination table and populates a skin info object with that data. The bone 
- // names and initial bone transforms are not filled in the skin info object by this method. This works 
- // with either a non-indexed or indexed blended mesh. It examines the FVF or declarator of the mesh to 
- // determine what type it is. 
- HRESULT WINAPI 
-     D3DXCreateSkinInfoFromBlendedMesh( 
-         LPD3DXBASEMESH pMesh, 
-         DWORD NumBones, 
-         CONST D3DXBONECOMBINATION *pBoneCombinationTable, 
-         LPD3DXSKININFO* ppSkinInfo); 
-          
- HRESULT WINAPI 
-     D3DXTessellateNPatches( 
-         LPD3DXMESH pMeshIn,              
-         CONST DWORD* pAdjacencyIn,              
-         FLOAT NumSegs,                     
-         BOOL  QuadraticInterpNormals,     // if false use linear intrep for normals, if true use quadratic 
-         LPD3DXMESH *ppMeshOut, 
-         LPD3DXBUFFER *ppAdjacencyOut); 
-   
-   
- //generates implied outputdecl from input decl 
- //the decl generated from this should be used to generate the output decl for 
- //the tessellator subroutines.  
-   
- HRESULT WINAPI 
-     D3DXGenerateOutputDecl( 
-         D3DVERTEXELEMENT9 *pOutput, 
-         CONST D3DVERTEXELEMENT9 *pInput); 
-   
- //loads patches from an XFileData 
- //since an X file can have up to 6 different patch meshes in it, 
- //returns them in an array - pNumPatches will contain the number of 
- //meshes in the actual file.  
- HRESULT WINAPI 
-     D3DXLoadPatchMeshFromXof( 
-         LPD3DXFILEDATA pXofObjMesh, 
-         DWORD Options, 
-         LPDIRECT3DDEVICE9 pD3DDevice, 
-         LPD3DXBUFFER *ppMaterials, 
-         LPD3DXBUFFER *ppEffectInstances,  
-         PDWORD pNumMaterials, 
-         LPD3DXPATCHMESH *ppMesh); 
-   
- //computes the size a single rect patch. 
- HRESULT WINAPI 
-     D3DXRectPatchSize( 
-         CONST FLOAT *pfNumSegs, //segments for each edge (4) 
-         DWORD *pdwTriangles,    //output number of triangles 
-         DWORD *pdwVertices);    //output number of vertices 
-   
- //computes the size of a single triangle patch       
- HRESULT WINAPI 
-     D3DXTriPatchSize( 
-         CONST FLOAT *pfNumSegs, //segments for each edge (3)     
-         DWORD *pdwTriangles,    //output number of triangles 
-         DWORD *pdwVertices);    //output number of vertices 
-   
-   
- //tessellates a patch into a created mesh 
- //similar to D3D RT patch 
- HRESULT WINAPI 
-     D3DXTessellateRectPatch( 
-         LPDIRECT3DVERTEXBUFFER9 pVB, 
-         CONST FLOAT *pNumSegs, 
-         CONST D3DVERTEXELEMENT9 *pdwInDecl, 
-         CONST D3DRECTPATCH_INFO *pRectPatchInfo, 
-         LPD3DXMESH pMesh); 
-   
-   
- HRESULT WINAPI 
-     D3DXTessellateTriPatch( 
-       LPDIRECT3DVERTEXBUFFER9 pVB, 
-       CONST FLOAT *pNumSegs, 
-       CONST D3DVERTEXELEMENT9 *pInDecl, 
-       CONST D3DTRIPATCH_INFO *pTriPatchInfo, 
-       LPD3DXMESH pMesh); 
-   
-   
-   
- //creates an NPatch PatchMesh from a D3DXMESH  
- HRESULT WINAPI 
-     D3DXCreateNPatchMesh( 
-         LPD3DXMESH pMeshSysMem, 
-         LPD3DXPATCHMESH *pPatchMesh); 
-   
-        
- //creates a patch mesh 
- HRESULT WINAPI 
-     D3DXCreatePatchMesh( 
-         CONST D3DXPATCHINFO *pInfo,     //patch type 
-         DWORD dwNumPatches,             //number of patches 
-         DWORD dwNumVertices,            //number of control vertices 
-         DWORD dwOptions,                //options  
-         CONST D3DVERTEXELEMENT9 *pDecl, //format of control vertices 
-         LPDIRECT3DDEVICE9 pD3DDevice,  
-         LPD3DXPATCHMESH *pPatchMesh); 
-   
-          
- //returns the number of degenerates in a patch mesh - 
- //text output put in string. 
- HRESULT WINAPI 
-     D3DXValidPatchMesh(LPD3DXPATCHMESH pMesh, 
-                         DWORD *dwcDegenerateVertices, 
-                         DWORD *dwcDegeneratePatches, 
-                         LPD3DXBUFFER *ppErrorsAndWarnings); 
-   
- UINT WINAPI 
-     D3DXGetFVFVertexSize(DWORD FVF); 
-   
- UINT WINAPI  
-     D3DXGetDeclVertexSize(CONST D3DVERTEXELEMENT9 *pDecl,DWORD Stream); 
-   
- UINT WINAPI  
-     D3DXGetDeclLength(CONST D3DVERTEXELEMENT9 *pDecl); 
-   
- HRESULT WINAPI 
-     D3DXDeclaratorFromFVF( 
-         DWORD FVF, 
-         D3DVERTEXELEMENT9 pDeclarator[MAX_FVF_DECL_SIZE]); 
-   
- HRESULT WINAPI 
-     D3DXFVFFromDeclarator( 
-         CONST D3DVERTEXELEMENT9 *pDeclarator, 
-         DWORD *pFVF); 
-   
- HRESULT WINAPI  
-     D3DXWeldVertices( 
-         LPD3DXMESH pMesh,          
-         DWORD Flags, 
-         CONST D3DXWELDEPSILONS *pEpsilons,                  
-         CONST DWORD *pAdjacencyIn,  
-         DWORD *pAdjacencyOut, 
-         DWORD *pFaceRemap,  
-         LPD3DXBUFFER *ppVertexRemap); 
-   
- typedef struct _D3DXINTERSECTINFO 
- { 
-     DWORD FaceIndex;                // index of face intersected 
-     FLOAT U;                        // Barycentric Hit Coordinates     
-     FLOAT V;                        // Barycentric Hit Coordinates 
-     FLOAT Dist;                     // Ray-Intersection Parameter Distance 
- } D3DXINTERSECTINFO, *LPD3DXINTERSECTINFO; 
-   
-   
- HRESULT WINAPI 
-     D3DXIntersect( 
-         LPD3DXBASEMESH pMesh, 
-         CONST D3DXVECTOR3 *pRayPos, 
-         CONST D3DXVECTOR3 *pRayDir,  
-         BOOL    *pHit,              // True if any faces were intersected 
-         DWORD   *pFaceIndex,        // index of closest face intersected 
-         FLOAT   *pU,                // Barycentric Hit Coordinates     
-         FLOAT   *pV,                // Barycentric Hit Coordinates 
-         FLOAT   *pDist,             // Ray-Intersection Parameter Distance 
-         LPD3DXBUFFER *ppAllHits,    // Array of D3DXINTERSECTINFOs for all hits (not just closest)  
-         DWORD   *pCountOfHits);     // Number of entries in AllHits array 
-   
- HRESULT WINAPI 
-     D3DXIntersectSubset( 
-         LPD3DXBASEMESH pMesh, 
-         DWORD AttribId, 
-         CONST D3DXVECTOR3 *pRayPos, 
-         CONST D3DXVECTOR3 *pRayDir,  
-         BOOL    *pHit,              // True if any faces were intersected 
-         DWORD   *pFaceIndex,        // index of closest face intersected 
-         FLOAT   *pU,                // Barycentric Hit Coordinates     
-         FLOAT   *pV,                // Barycentric Hit Coordinates 
-         FLOAT   *pDist,             // Ray-Intersection Parameter Distance 
-         LPD3DXBUFFER *ppAllHits,    // Array of D3DXINTERSECTINFOs for all hits (not just closest)  
-         DWORD   *pCountOfHits);     // Number of entries in AllHits array 
-   
-   
- HRESULT WINAPI D3DXSplitMesh 
-     ( 
-     LPD3DXMESH pMeshIn,          
-     CONST DWORD *pAdjacencyIn,  
-     CONST DWORD MaxSize, 
-     CONST DWORD Options, 
-     DWORD *pMeshesOut, 
-     LPD3DXBUFFER *ppMeshArrayOut, 
-     LPD3DXBUFFER *ppAdjacencyArrayOut, 
-     LPD3DXBUFFER *ppFaceRemapArrayOut, 
-     LPD3DXBUFFER *ppVertRemapArrayOut 
-     ); 
-   
- BOOL WINAPI D3DXIntersectTri  
- ( 
-     CONST D3DXVECTOR3 *p0,           // Triangle vertex 0 position 
-     CONST D3DXVECTOR3 *p1,           // Triangle vertex 1 position 
-     CONST D3DXVECTOR3 *p2,           // Triangle vertex 2 position 
-     CONST D3DXVECTOR3 *pRayPos,      // Ray origin 
-     CONST D3DXVECTOR3 *pRayDir,      // Ray direction 
-     FLOAT *pU,                       // Barycentric Hit Coordinates 
-     FLOAT *pV,                       // Barycentric Hit Coordinates 
-     FLOAT *pDist);                   // Ray-Intersection Parameter Distance 
-   
- BOOL WINAPI 
-     D3DXSphereBoundProbe( 
-         CONST D3DXVECTOR3 *pCenter, 
-         FLOAT Radius, 
-         CONST D3DXVECTOR3 *pRayPosition, 
-         CONST D3DXVECTOR3 *pRayDirection); 
-   
- BOOL WINAPI  
-     D3DXBoxBoundProbe( 
-         CONST D3DXVECTOR3 *pMin,  
-         CONST D3DXVECTOR3 *pMax, 
-         CONST D3DXVECTOR3 *pRayPosition, 
-         CONST D3DXVECTOR3 *pRayDirection); 
-   
-   
- HRESULT WINAPI D3DXComputeTangentFrame(ID3DXMesh *pMesh, 
-                                        DWORD dwOptions); 
-   
- HRESULT WINAPI D3DXComputeTangentFrameEx(ID3DXMesh *pMesh, 
-                                          DWORD dwTextureInSemantic, 
-                                          DWORD dwTextureInIndex, 
-                                          DWORD dwUPartialOutSemantic, 
-                                          DWORD dwUPartialOutIndex, 
-                                          DWORD dwVPartialOutSemantic, 
-                                          DWORD dwVPartialOutIndex, 
-                                          DWORD dwNormalOutSemantic, 
-                                          DWORD dwNormalOutIndex, 
-                                          DWORD dwOptions, 
-                                          CONST DWORD *pdwAdjacency, 
-                                          FLOAT fPartialEdgeThreshold, 
-                                          FLOAT fSingularPointThreshold, 
-                                          FLOAT fNormalEdgeThreshold, 
-                                          ID3DXMesh **ppMeshOut, 
-                                          ID3DXBuffer **ppVertexMapping); 
-   
-   
- //D3DXComputeTangent 
- // 
- //Computes the Tangent vectors for the TexStage texture coordinates 
- //and places the results in the TANGENT[TangentIndex] specified in the meshes' DECL 
- //puts the binorm in BINORM[BinormIndex] also specified in the decl. 
- // 
- //If neither the binorm or the tangnet are in the meshes declaration, 
- //the function will fail.  
- // 
- //If a tangent or Binorm field is in the Decl, but the user does not 
- //wish D3DXComputeTangent to replace them, then D3DX_DEFAULT specified 
- //in the TangentIndex or BinormIndex will cause it to ignore the specified  
- //semantic. 
- // 
- //Wrap should be specified if the texture coordinates wrap. 
-   
- HRESULT WINAPI D3DXComputeTangent(LPD3DXMESH Mesh, 
-                                  DWORD TexStage, 
-                                  DWORD TangentIndex, 
-                                  DWORD BinormIndex, 
-                                  DWORD Wrap, 
-                                  CONST DWORD *pAdjacency); 
-   
- //============================================================================ 
- // 
- // UVAtlas apis 
- // 
- //============================================================================ 
- typedef HRESULT (WINAPI *LPD3DXUVATLASCB)(FLOAT fPercentDone,  LPVOID lpUserContext); 
-   
- // This function creates atlases for meshes. There are two modes of operation, 
- // either based on the number of charts, or the maximum allowed stretch. If the 
- // maximum allowed stretch is 0, then each triangle will likely be in its own 
- // chart. 
-   
- // 
- // The parameters are as follows: 
- //  pMesh - Input mesh to calculate an atlas for. This must have a position 
- //          channel and at least a 2-d texture channel. 
- //  uMaxChartNumber - The maximum number of charts required for the atlas. 
- //                    If this is 0, it will be parameterized based solely on 
- //                    stretch. 
- //  fMaxStretch - The maximum amount of stretch, if 0, no stretching is allowed, 
- //                if 1, then any amount of stretching is allowed. 
- //  uWidth - The width of the texture the atlas will be used on. 
- //  uHeight - The height of the texture the atlas will be used on. 
- //  fGutter - The minimum distance, in texels between two charts on the atlas. 
- //            this gets scaled by the width, so if fGutter is 2.5, and it is 
- //            used on a 512x512 texture, then the minimum distance will be 
- //            2.5 / 512 in u-v space. 
- //  dwTextureIndex - Specifies which texture coordinate to write to in the 
- //                   output mesh (which is cloned from the input mesh). Useful 
- //                   if your vertex has multiple texture coordinates. 
- //  pdwAdjacency - a pointer to an array with 3 DWORDs per face, indicating 
- //                 which triangles are adjacent to each other. 
- //  pdwFalseEdgeAdjacency - a pointer to an array with 3 DWORDS per face, indicating 
- //                          at each face, whether an edge is a false edge or not (using 
- //                          the same ordering as the adjacency data structure). If this 
- //                          is NULL, then it is assumed that there are no false edges. If 
- //                          not NULL, then a non-false edge is indicated by -1 and a false 
- //                          edge is indicated by any other value (it is not required, but 
- //                          it may be useful for the caller to use the original adjacency 
- //                          value). This allows you to parameterize a mesh of quads, and 
- //                          the edges down the middle of each quad will not be cut when 
- //                          parameterizing the mesh. 
- //  pfIMTArray - a pointer to an array with 3 FLOATs per face, describing the 
- //               integrated metric tensor for that face. This lets you control 
- //               the way this triangle may be stretched in the atlas. The IMT 
- //               passed in will be 3 floats (a,b,c) and specify a symmetric 
- //               matrix (a b) that, given a vector (s,t), specifies the  
- //                      (b c) 
- //               distance between a vector v1 and a vector v2 = v1 + (s,t) as 
- //               sqrt((s, t) * M * (s, t)^T). 
- //               In other words, this lets one specify the magnitude of the 
- //               stretch in an arbitrary direction in u-v space. For example 
- //               if a = b = c = 1, then this scales the vector (1,1) by 2, and 
- //               the vector (1,-1) by 0. Note that this is multiplying the edge 
- //               length by the square of the matrix, so if you want the face to 
- //               stretch to twice its 
- //               size with no shearing, the IMT value should be (2, 0, 2), which 
- //               is just the identity matrix times 2. 
- //               Note that this assumes you have an orientation for the triangle 
- //               in some 2-D space. For D3DXUVAtlas, this space is created by 
- //               letting S be the direction from the first to the second 
- //               vertex, and T be the cross product between the normal and S. 
- //                
- //  pStatusCallback - Since the atlas creation process can be very CPU intensive, 
- //                    this allows the programmer to specify a function to be called 
- //                    periodically, similarly to how it is done in the PRT simulation 
- //                    engine. 
- //  fCallbackFrequency - This lets you specify how often the callback will be 
- //                       called. A decent default should be 0.0001f. 
- //  pUserContext - a void pointer to be passed back to the callback function 
- //  dwOptions - A combination of flags in the D3DXUVATLAS enum 
- //  ppMeshOut - A pointer to a location to store a pointer for the newly created 
- //              mesh. 
- //  ppFacePartitioning - A pointer to a location to store a pointer for an array, 
- //                       one DWORD per face, giving the final partitioning 
- //                       created by the atlasing algorithm. 
- //  ppVertexRemapArray - A pointer to a location to store a pointer for an array, 
- //                       one DWORD per vertex, giving the vertex it was copied 
- //                       from, if any vertices needed to be split. 
- //  pfMaxStretchOut - A location to store the maximum stretch resulting from the 
- //                    atlasing algorithm. 
- //  puNumChartsOut - A location to store the number of charts created, or if the 
- //                   maximum number of charts was too low, this gives the minimum 
- //                    number of charts needed to create an atlas. 
-   
- HRESULT WINAPI D3DXUVAtlasCreate(LPD3DXMESH pMesh, 
-                                  UINT uMaxChartNumber, 
-                                  FLOAT fMaxStretch, 
-                                  UINT uWidth, 
-                                  UINT uHeight, 
-                                  FLOAT fGutter, 
-                                  DWORD dwTextureIndex, 
-                                  CONST DWORD *pdwAdjacency, 
-                                  CONST DWORD *pdwFalseEdgeAdjacency, 
-                                  CONST FLOAT *pfIMTArray, 
-                                  LPD3DXUVATLASCB pStatusCallback, 
-                                  FLOAT fCallbackFrequency, 
-                                  LPVOID pUserContext, 
-                                  DWORD dwOptions, 
-                                  LPD3DXMESH *ppMeshOut, 
-                                  LPD3DXBUFFER *ppFacePartitioning, 
-                                  LPD3DXBUFFER *ppVertexRemapArray, 
-                                  FLOAT *pfMaxStretchOut, 
-                                  UINT *puNumChartsOut); 
-   
- // This has the same exact arguments as Create, except that it does not perform the 
- // final packing step. This method allows one to get a partitioning out, and possibly 
- // modify it before sending it to be repacked. Note that if you change the 
- // partitioning, you'll also need to calculate new texture coordinates for any faces 
- // that have switched charts. 
- // 
- // The partition result adjacency output parameter is meant to be passed to the 
- // UVAtlasPack function, this adjacency cuts edges that are between adjacent 
- // charts, and also can include cuts inside of a chart in order to make it 
- // equivalent to a disc. For example: 
- // 
- // _______ 
- // | ___ | 
- // | |_| | 
- // |_____| 
- // 
- // In order to make this equivalent to a disc, we would need to add a cut, and it 
- // Would end up looking like: 
- // _______ 
- // | ___ | 
- // | |_|_| 
- // |_____| 
- // 
- // The resulting partition adjacency parameter cannot be NULL, because it is 
- // required for the packing step. 
-   
-   
-   
- HRESULT WINAPI D3DXUVAtlasPartition(LPD3DXMESH pMesh, 
-                                     UINT uMaxChartNumber, 
-                                     FLOAT fMaxStretch, 
-                                     DWORD dwTextureIndex, 
-                                     CONST DWORD *pdwAdjacency, 
-                                     CONST DWORD *pdwFalseEdgeAdjacency, 
-                                     CONST FLOAT *pfIMTArray, 
-                                     LPD3DXUVATLASCB pStatusCallback, 
-                                     FLOAT fCallbackFrequency, 
-                                     LPVOID pUserContext, 
-                                     DWORD dwOptions, 
-                                     LPD3DXMESH *ppMeshOut, 
-                                     LPD3DXBUFFER *ppFacePartitioning, 
-                                     LPD3DXBUFFER *ppVertexRemapArray, 
-                                     LPD3DXBUFFER *ppPartitionResultAdjacency, 
-                                     FLOAT *pfMaxStretchOut, 
-                                     UINT *puNumChartsOut); 
-   
- // This takes the face partitioning result from Partition and packs it into an 
- // atlas of the given size. pdwPartitionResultAdjacency should be derived from 
- // the adjacency returned from the partition step. This value cannot be NULL 
- // because Pack needs to know where charts were cut in the partition step in 
- // order to find the edges of each chart. 
- // The options parameter is currently reserved. 
- HRESULT WINAPI D3DXUVAtlasPack(ID3DXMesh *pMesh, 
-                                UINT uWidth, 
-                                UINT uHeight, 
-                                FLOAT fGutter, 
-                                DWORD dwTextureIndex, 
-                                CONST DWORD *pdwPartitionResultAdjacency, 
-                                LPD3DXUVATLASCB pStatusCallback, 
-                                FLOAT fCallbackFrequency, 
-                                LPVOID pUserContext, 
-                                DWORD dwOptions, 
-                                LPD3DXBUFFER pFacePartitioning); 
-   
-   
- //============================================================================ 
- // 
- // IMT Calculation apis 
- // 
- // These functions all compute the Integrated Metric Tensor for use in the 
- // UVAtlas API. They all calculate the IMT with respect to the canonical 
- // triangle, where the coordinate system is set up so that the u axis goes 
- // from vertex 0 to 1 and the v axis is N x u. So, for example, the second 
- // vertex's canonical uv coordinates are (d,0) where d is the distance between 
- // vertices 0 and 1. This way the IMT does not depend on the parameterization 
- // of the mesh, and if the signal over the surface doesn't change, then 
- // the IMT doesn't need to be recalculated. 
- //============================================================================ 
-   
- // This callback is used by D3DXComputeIMTFromSignal. 
- // 
- // uv               - The texture coordinate for the vertex. 
- // uPrimitiveID     - Face ID of the triangle on which to compute the signal. 
- // uSignalDimension - The number of floats to store in pfSignalOut. 
- // pUserData        - The pUserData pointer passed in to ComputeIMTFromSignal. 
- // pfSignalOut      - A pointer to where to store the signal data. 
- typedef HRESULT (WINAPI* LPD3DXIMTSIGNALCALLBACK) 
-     (CONST D3DXVECTOR2 *uv, 
-      UINT uPrimitiveID, 
-      UINT uSignalDimension, 
-      VOID *pUserData, 
-      FLOAT *pfSignalOut); 
-   
- // This function is used to calculate the IMT from per vertex data. It sets 
- // up a linear system over the triangle, solves for the jacobian J, then 
- // constructs the IMT from that (J^TJ). 
- // This function allows you to calculate the IMT based off of any value in a 
- // mesh (color, normal, etc) by specifying the correct stride of the array. 
- // The IMT computed will cause areas of the mesh that have similar values to 
- // take up less space in the texture. 
- // 
- // pMesh            - The mesh to calculate the IMT for. 
- // pVertexSignal    - A float array of size uSignalStride * v, where v is the 
- //                    number of vertices in the mesh. 
- // uSignalDimension - How many floats per vertex to use in calculating the IMT. 
- // uSignalStride    - The number of bytes per vertex in the array. This must be 
- //                    a multiple of sizeof(float) 
- // ppIMTData        - Where to store the buffer holding the IMT data 
-   
- HRESULT WINAPI D3DXComputeIMTFromPerVertexSignal ( 
-     LPD3DXMESH pMesh, 
-     CONST FLOAT *pfVertexSignal, // uSignalDimension floats per vertex 
-     UINT uSignalDimension, 
-     UINT uSignalStride,         // stride of signal in bytes 
-     DWORD dwOptions,            // reserved for future use 
-     LPD3DXUVATLASCB pStatusCallback, 
-     LPVOID pUserContext, 
-     LPD3DXBUFFER *ppIMTData); 
-   
- // This function is used to calculate the IMT from data that varies over the 
- // surface of the mesh (generally at a higher frequency than vertex data). 
- // This function requires the mesh to already be parameterized (so it already 
- // has texture coordinates). It allows the user to define a signal arbitrarily 
- // over the surface of the mesh. 
- // 
- // pMesh            - The mesh to calculate the IMT for. 
- // dwTextureIndex   - This describes which set of texture coordinates in the 
- //                    mesh to use. 
- // uSignalDimension - How many components there are in the signal. 
- // fMaxUVDistance   - The subdivision will continue until the distance between 
- //                    all vertices is at most fMaxUVDistance. 
- // dwOptions        - reserved for future use 
- // pSignalCallback  - The callback to use to get the signal. 
- // pUserData        - A pointer that will be passed in to the callback. 
- // ppIMTData        - Where to store the buffer holding the IMT data 
- HRESULT WINAPI D3DXComputeIMTFromSignal( 
-     LPD3DXMESH pMesh, 
-     DWORD dwTextureIndex, 
-     UINT uSignalDimension, 
-     FLOAT fMaxUVDistance, 
-     DWORD dwOptions, // reserved for future use 
-     LPD3DXIMTSIGNALCALLBACK pSignalCallback, 
-     VOID *pUserData, 
-     LPD3DXUVATLASCB pStatusCallback, 
-     LPVOID pUserContext, 
-     LPD3DXBUFFER *ppIMTData); 
-   
- // This function is used to calculate the IMT from texture data. Given a texture 
- // that maps over the surface of the mesh, the algorithm computes the IMT for 
- // each face. This will cause large areas that are very similar to take up less 
- // room when parameterized with UVAtlas. The texture is assumed to be 
- // interpolated over the mesh bilinearly. 
- // 
- // pMesh            - The mesh to calculate the IMT for. 
- // pTexture         - The texture to load data from. 
- // dwTextureIndex   - This describes which set of texture coordinates in the 
- //                    mesh to use. 
- // dwOptions        - Combination of one or more D3DXIMT flags. 
- // ppIMTData        - Where to store the buffer holding the IMT data 
- HRESULT WINAPI D3DXComputeIMTFromTexture ( 
-     LPD3DXMESH pMesh, 
-     LPDIRECT3DTEXTURE9 pTexture, 
-     DWORD dwTextureIndex, 
-     DWORD dwOptions, 
-     LPD3DXUVATLASCB pStatusCallback, 
-     LPVOID pUserContext, 
-     LPD3DXBUFFER *ppIMTData); 
-   
- // This function is very similar to ComputeIMTFromTexture, but it uses a 
- // float array to pass in the data, and it can calculate higher dimensional 
- // values than 4. 
- // 
- // pMesh            - The mesh to calculate the IMT for. 
- // dwTextureIndex   - This describes which set of texture coordinates in the 
- //                    mesh to use. 
- // pfFloatArray     - a pointer to a float array of size 
- //                    uWidth*uHeight*uComponents 
- // uWidth           - The width of the texture 
- // uHeight          - The height of the texture 
- // uSignalDimension - The number of floats per texel in the signal 
- // uComponents      - The number of floats in each texel 
- // dwOptions        - Combination of one or more D3DXIMT flags 
- // ppIMTData        - Where to store the buffer holding the IMT data 
- HRESULT WINAPI D3DXComputeIMTFromPerTexelSignal( 
-     LPD3DXMESH pMesh, 
-     DWORD dwTextureIndex, 
-     FLOAT *pfTexelSignal, 
-     UINT uWidth, 
-     UINT uHeight, 
-     UINT uSignalDimension, 
-     UINT uComponents, 
-     DWORD dwOptions, 
-     LPD3DXUVATLASCB pStatusCallback, 
-     LPVOID pUserContext, 
-     LPD3DXBUFFER *ppIMTData); 
-   
- HRESULT WINAPI 
-     D3DXConvertMeshSubsetToSingleStrip( 
-         LPD3DXBASEMESH MeshIn, 
-         DWORD AttribId, 
-         DWORD IBOptions, 
-         LPDIRECT3DINDEXBUFFER9 *ppIndexBuffer, 
-         DWORD *pNumIndices); 
-   
- HRESULT WINAPI 
-     D3DXConvertMeshSubsetToStrips( 
-         LPD3DXBASEMESH MeshIn, 
-         DWORD AttribId, 
-         DWORD IBOptions, 
-         LPDIRECT3DINDEXBUFFER9 *ppIndexBuffer, 
-         DWORD *pNumIndices, 
-         LPD3DXBUFFER *ppStripLengths, 
-         DWORD *pNumStrips); 
-   
-          
- //============================================================================ 
- // 
- //  D3DXOptimizeFaces: 
- //  -------------------- 
- //  Generate a face remapping for a triangle list that more effectively utilizes 
- //    vertex caches.  This optimization is identical to the one provided 
- //    by ID3DXMesh::Optimize with the hardware independent option enabled. 
- // 
- //  Parameters: 
- //   pbIndices 
- //      Triangle list indices to use for generating a vertex ordering 
- //   NumFaces 
- //      Number of faces in the triangle list 
- //   NumVertices 
- //      Number of vertices referenced by the triangle list 
- //   b32BitIndices 
- //      TRUE if indices are 32 bit, FALSE if indices are 16 bit 
- //   pFaceRemap 
- //      Destination buffer to store face ordering 
- //      The number stored for a given element is where in the new ordering 
- //        the face will have come from.  See ID3DXMesh::Optimize for more info. 
- // 
- //============================================================================ 
- HRESULT WINAPI 
-     D3DXOptimizeFaces( 
-         LPCVOID pbIndices,  
-         UINT cFaces,  
-         UINT cVertices,  
-         BOOL b32BitIndices,  
-         DWORD* pFaceRemap); 
-          
- //============================================================================ 
- // 
- //  D3DXOptimizeVertices: 
- //  -------------------- 
- //  Generate a vertex remapping to optimize for in order use of vertices for  
- //    a given set of indices.  This is commonly used after applying the face 
- //    remap generated by D3DXOptimizeFaces 
- // 
- //  Parameters: 
- //   pbIndices 
- //      Triangle list indices to use for generating a vertex ordering 
- //   NumFaces 
- //      Number of faces in the triangle list 
- //   NumVertices 
- //      Number of vertices referenced by the triangle list 
- //   b32BitIndices 
- //      TRUE if indices are 32 bit, FALSE if indices are 16 bit 
- //   pVertexRemap 
- //      Destination buffer to store vertex ordering 
- //      The number stored for a given element is where in the new ordering 
- //        the vertex will have come from.  See ID3DXMesh::Optimize for more info. 
- // 
- //============================================================================ 
- HRESULT WINAPI 
-     D3DXOptimizeVertices( 
-         LPCVOID pbIndices,  
-         UINT cFaces,  
-         UINT cVertices,  
-         BOOL b32BitIndices,  
-         DWORD* pVertexRemap); 
-   
- #ifdef __cplusplus 
- } 
- #endif //__cplusplus 
-   
-   
- //=========================================================================== 
- // 
- //  Data structures for Spherical Harmonic Precomputation 
- // 
- // 
- //============================================================================ 
-   
- typedef enum _D3DXSHCOMPRESSQUALITYTYPE { 
-     D3DXSHCQUAL_FASTLOWQUALITY  = 1, 
-     D3DXSHCQUAL_SLOWHIGHQUALITY = 2, 
-     D3DXSHCQUAL_FORCE_DWORD     = 0x7fffffff 
- } D3DXSHCOMPRESSQUALITYTYPE; 
-   
- typedef enum _D3DXSHGPUSIMOPT { 
-     D3DXSHGPUSIMOPT_SHADOWRES256  = 1, 
-     D3DXSHGPUSIMOPT_SHADOWRES512  = 0, 
-     D3DXSHGPUSIMOPT_SHADOWRES1024 = 2, 
-     D3DXSHGPUSIMOPT_SHADOWRES2048 = 3, 
-   
-     D3DXSHGPUSIMOPT_HIGHQUALITY = 4,     
-      
-     D3DXSHGPUSIMOPT_FORCE_DWORD = 0x7fffffff 
- } D3DXSHGPUSIMOPT; 
-   
- // for all properties that are colors the luminance is computed 
- // if the simulator is run with a single channel using the following 
- // formula:  R * 0.2125 + G * 0.7154 + B * 0.0721 
-   
- typedef struct _D3DXSHMATERIAL { 
-     D3DCOLORVALUE Diffuse;  // Diffuse albedo of the surface.  (Ignored if object is a Mirror) 
-     BOOL          bMirror;  // Must be set to FALSE.  bMirror == TRUE not currently supported 
-     BOOL          bSubSurf; // true if the object does subsurface scattering - can't do this and be a mirror 
-   
-     // subsurface scattering parameters  
-     FLOAT         RelativeIndexOfRefraction; 
-     D3DCOLORVALUE Absorption; 
-     D3DCOLORVALUE ReducedScattering; 
-   
- } D3DXSHMATERIAL; 
-   
- // allocated in D3DXSHPRTCompSplitMeshSC 
- // vertices are duplicated into multiple super clusters but 
- // only have a valid status in one super cluster (fill in the rest) 
-   
- typedef struct _D3DXSHPRTSPLITMESHVERTDATA { 
-     UINT  uVertRemap;   // vertex in original mesh this corresponds to 
-     UINT  uSubCluster;  // cluster index relative to super cluster 
-     UCHAR ucVertStatus; // 1 if vertex has valid data, 0 if it is "fill" 
- } D3DXSHPRTSPLITMESHVERTDATA; 
-   
- // used in D3DXSHPRTCompSplitMeshSC 
- // information for each super cluster that maps into face/vert arrays 
-   
- typedef struct _D3DXSHPRTSPLITMESHCLUSTERDATA { 
-     UINT uVertStart;     // initial index into remapped vertex array 
-     UINT uVertLength;    // number of vertices in this super cluster 
-      
-     UINT uFaceStart;     // initial index into face array 
-     UINT uFaceLength;    // number of faces in this super cluster 
-      
-     UINT uClusterStart;  // initial index into cluster array 
-     UINT uClusterLength; // number of clusters in this super cluster 
- } D3DXSHPRTSPLITMESHCLUSTERDATA; 
-   
- // call back function for simulator 
- // return S_OK to keep running the simulator - anything else represents 
- // failure and the simulator will abort. 
-   
- typedef HRESULT (WINAPI *LPD3DXSHPRTSIMCB)(float fPercentDone,  LPVOID lpUserContext); 
-   
- // interfaces for PRT buffers/simulator 
-   
- // GUIDs 
- // {F1827E47-00A8-49cd-908C-9D11955F8728} 
- DEFINE_GUID(IID_ID3DXPRTBuffer,  
- 0xf1827e47, 0xa8, 0x49cd, 0x90, 0x8c, 0x9d, 0x11, 0x95, 0x5f, 0x87, 0x28); 
-   
- // {A758D465-FE8D-45ad-9CF0-D01E56266A07} 
- DEFINE_GUID(IID_ID3DXPRTCompBuffer,  
- 0xa758d465, 0xfe8d, 0x45ad, 0x9c, 0xf0, 0xd0, 0x1e, 0x56, 0x26, 0x6a, 0x7); 
-   
- // {838F01EC-9729-4527-AADB-DF70ADE7FEA9} 
- DEFINE_GUID(IID_ID3DXTextureGutterHelper,  
- 0x838f01ec, 0x9729, 0x4527, 0xaa, 0xdb, 0xdf, 0x70, 0xad, 0xe7, 0xfe, 0xa9); 
-   
- // {683A4278-CD5F-4d24-90AD-C4E1B6855D53} 
- DEFINE_GUID(IID_ID3DXPRTEngine,  
- 0x683a4278, 0xcd5f, 0x4d24, 0x90, 0xad, 0xc4, 0xe1, 0xb6, 0x85, 0x5d, 0x53); 
-   
- // interface defenitions 
-   
- typedef interface ID3DXTextureGutterHelper ID3DXTextureGutterHelper; 
- typedef interface ID3DXPRTBuffer ID3DXPRTBuffer; 
-   
- #undef INTERFACE 
- #define INTERFACE ID3DXPRTBuffer 
-   
- // Buffer interface - contains "NumSamples" samples 
- // each sample in memory is stored as NumCoeffs scalars per channel (1 or 3) 
- // Same interface is used for both Vertex and Pixel PRT buffers 
-   
- DECLARE_INTERFACE_(ID3DXPRTBuffer, IUnknown) 
- { 
-     // IUnknown 
-     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 
-     STDMETHOD_(ULONG, AddRef)(THIS) PURE; 
-     STDMETHOD_(ULONG, Release)(THIS) PURE; 
-   
-     // ID3DXPRTBuffer 
-     STDMETHOD_(UINT, GetNumSamples)(THIS) PURE; 
-     STDMETHOD_(UINT, GetNumCoeffs)(THIS) PURE; 
-     STDMETHOD_(UINT, GetNumChannels)(THIS) PURE; 
-   
-     STDMETHOD_(BOOL, IsTexture)(THIS) PURE; 
-     STDMETHOD_(UINT, GetWidth)(THIS) PURE; 
-     STDMETHOD_(UINT, GetHeight)(THIS) PURE; 
-   
-     // changes the number of samples allocated in the buffer 
-     STDMETHOD(Resize)(THIS_ UINT NewSize) PURE; 
-   
-     // ppData will point to the memory location where sample Start begins 
-     // pointer is valid for at least NumSamples samples 
-     STDMETHOD(LockBuffer)(THIS_ UINT Start, UINT NumSamples, FLOAT **ppData) PURE; 
-     STDMETHOD(UnlockBuffer)(THIS) PURE; 
-   
-     // every scalar in buffer is multiplied by Scale 
-     STDMETHOD(ScaleBuffer)(THIS_ FLOAT Scale) PURE; 
-      
-     // every scalar contains the sum of this and pBuffers values 
-     // pBuffer must have the same storage class/dimensions  
-     STDMETHOD(AddBuffer)(THIS_ LPD3DXPRTBUFFER pBuffer) PURE; 
-   
-     // GutterHelper (described below) will fill in the gutter 
-     // regions of a texture by interpolating "internal" values 
-     STDMETHOD(AttachGH)(THIS_ LPD3DXTEXTUREGUTTERHELPER) PURE; 
-     STDMETHOD(ReleaseGH)(THIS) PURE; 
-      
-     // Evaluates attached gutter helper on the contents of this buffer 
-     STDMETHOD(EvalGH)(THIS) PURE; 
-   
-     // extracts a given channel into texture pTexture 
-     // NumCoefficients starting from StartCoefficient are copied 
-     STDMETHOD(ExtractTexture)(THIS_ UINT Channel, UINT StartCoefficient,  
-                               UINT NumCoefficients, LPDIRECT3DTEXTURE9 pTexture) PURE; 
-   
-     // extracts NumCoefficients coefficients into mesh - only applicable on single channel 
-     // buffers, otherwise just lockbuffer and copy data.  With SHPRT data NumCoefficients  
-     // should be Order^2 
-     STDMETHOD(ExtractToMesh)(THIS_ UINT NumCoefficients, D3DDECLUSAGE Usage, UINT UsageIndexStart, 
-                              LPD3DXMESH pScene) PURE; 
-   
- }; 
-   
- typedef interface ID3DXPRTCompBuffer ID3DXPRTCompBuffer; 
- typedef interface ID3DXPRTCompBuffer *LPD3DXPRTCOMPBUFFER; 
-   
- #undef INTERFACE 
- #define INTERFACE ID3DXPRTCompBuffer 
-   
- // compressed buffers stored a compressed version of a PRTBuffer 
-   
- DECLARE_INTERFACE_(ID3DXPRTCompBuffer, IUnknown) 
- { 
-     // IUnknown 
-     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 
-     STDMETHOD_(ULONG, AddRef)(THIS) PURE; 
-     STDMETHOD_(ULONG, Release)(THIS) PURE; 
-   
-     // ID3DPRTCompBuffer 
-   
-     // NumCoeffs and NumChannels are properties of input buffer 
-     STDMETHOD_(UINT, GetNumSamples)(THIS) PURE; 
-     STDMETHOD_(UINT, GetNumCoeffs)(THIS) PURE; 
-     STDMETHOD_(UINT, GetNumChannels)(THIS) PURE; 
-   
-     STDMETHOD_(BOOL, IsTexture)(THIS) PURE; 
-     STDMETHOD_(UINT, GetWidth)(THIS) PURE; 
-     STDMETHOD_(UINT, GetHeight)(THIS) PURE; 
-   
-     // number of clusters, and PCA vectors per-cluster 
-     STDMETHOD_(UINT, GetNumClusters)(THIS) PURE; 
-     STDMETHOD_(UINT, GetNumPCA)(THIS) PURE; 
-   
-     // normalizes PCA weights so that they are between [-1,1] 
-     // basis vectors are modified to reflect this 
-     STDMETHOD(NormalizeData)(THIS) PURE; 
-   
-     // copies basis vectors for cluster "Cluster" into pClusterBasis 
-     // (NumPCA+1)*NumCoeffs*NumChannels floats 
-     STDMETHOD(ExtractBasis)(THIS_ UINT Cluster, FLOAT *pClusterBasis) PURE; 
-      
-     // UINT per sample - which cluster it belongs to 
-     STDMETHOD(ExtractClusterIDs)(THIS_ UINT *pClusterIDs) PURE; 
-      
-     // copies NumExtract PCA projection coefficients starting at StartPCA 
-     // into pPCACoefficients - NumSamples*NumExtract floats copied 
-     STDMETHOD(ExtractPCA)(THIS_ UINT StartPCA, UINT NumExtract, FLOAT *pPCACoefficients) PURE; 
-   
-     // copies NumPCA projection coefficients starting at StartPCA 
-     // into pTexture - should be able to cope with signed formats 
-     STDMETHOD(ExtractTexture)(THIS_ UINT StartPCA, UINT NumpPCA,  
-                               LPDIRECT3DTEXTURE9 pTexture) PURE; 
-                                
-     // copies NumPCA projection coefficients into mesh pScene 
-     // Usage is D3DDECLUSAGE where coefficients are to be stored 
-     // UsageIndexStart is starting index 
-     STDMETHOD(ExtractToMesh)(THIS_ UINT NumPCA, D3DDECLUSAGE Usage, UINT UsageIndexStart, 
-                              LPD3DXMESH pScene) PURE; 
- }; 
-   
-   
- #undef INTERFACE 
- #define INTERFACE ID3DXTextureGutterHelper 
-   
- // ID3DXTextureGutterHelper will build and manage 
- // "gutter" regions in a texture - this will allow for 
- // bi-linear interpolation to not have artifacts when rendering 
- // It generates a map (in texture space) where each texel 
- // is in one of 3 states: 
- //   0  Invalid - not used at all 
- //   1  Inside triangle 
- //   2  Gutter texel 
- //   4  represents a gutter texel that will be computed during PRT 
- // For each Inside/Gutter texel it stores the face it 
- // belongs to and barycentric coordinates for the 1st two 
- // vertices of that face.  Gutter vertices are assigned to 
- // the closest edge in texture space. 
- // 
- // When used with PRT this requires a unique parameterization 
- // of the model - every texel must correspond to a single point 
- // on the surface of the model and vice versa 
-   
- DECLARE_INTERFACE_(ID3DXTextureGutterHelper, IUnknown) 
- { 
-     // IUnknown 
-     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 
-     STDMETHOD_(ULONG, AddRef)(THIS) PURE; 
-     STDMETHOD_(ULONG, Release)(THIS) PURE; 
-   
-     // ID3DXTextureGutterHelper 
-      
-     // dimensions of texture this is bound too 
-     STDMETHOD_(UINT, GetWidth)(THIS) PURE; 
-     STDMETHOD_(UINT, GetHeight)(THIS) PURE; 
-   
-   
-     // Applying gutters recomputes all of the gutter texels of class "2" 
-     // based on texels of class "1" or "4" 
-      
-     // Applies gutters to a raw float buffer - each texel is NumCoeffs floats 
-     // Width and Height must match GutterHelper 
-     STDMETHOD(ApplyGuttersFloat)(THIS_ FLOAT *pDataIn, UINT NumCoeffs, UINT Width, UINT Height); 
-      
-     // Applies gutters to pTexture 
-     // Dimensions must match GutterHelper 
-     STDMETHOD(ApplyGuttersTex)(THIS_ LPDIRECT3DTEXTURE9 pTexture); 
-      
-     // Applies gutters to a D3DXPRTBuffer 
-     // Dimensions must match GutterHelper 
-     STDMETHOD(ApplyGuttersPRT)(THIS_ LPD3DXPRTBUFFER pBuffer); 
-         
-     // Resamples a texture from a mesh onto this gutterhelpers 
-     // parameterization.  It is assumed that the UV coordinates 
-     // for this gutter helper are in TEXTURE 0 (usage/usage index) 
-     // and the texture coordinates should all be within [0,1] for 
-     // both sets. 
-     // 
-     // pTextureIn - texture represented using parameterization in pMeshIn 
-     // pMeshIn    - Mesh with texture coordinates that represent pTextureIn 
-     //              pTextureOut texture coordinates are assumed to be in 
-     //              TEXTURE 0 
-     // Usage      - field in DECL for pMeshIn that stores texture coordinates 
-     //              for pTextureIn 
-     // UsageIndex - which index for Usage above for pTextureIn 
-     // pTextureOut- Resampled texture 
-     //  
-     // Usage would generally be D3DDECLUSAGE_TEXCOORD  and UsageIndex other than zero 
-     STDMETHOD(ResampleTex)(THIS_ LPDIRECT3DTEXTURE9 pTextureIn, 
-                                  LPD3DXMESH pMeshIn, 
-                                  D3DDECLUSAGE Usage, UINT UsageIndex, 
-                                  LPDIRECT3DTEXTURE9 pTextureOut);     
-      
-     // the routines below provide access to the data structures 
-     // used by the Apply functions 
-   
-     // face map is a UINT per texel that represents the 
-     // face of the mesh that texel belongs too -  
-     // only valid if same texel is valid in pGutterData 
-     // pFaceData must be allocated by the user 
-     STDMETHOD(GetFaceMap)(THIS_ UINT *pFaceData) PURE; 
-      
-     // BaryMap is a D3DXVECTOR2 per texel 
-     // the 1st two barycentric coordinates for the corresponding 
-     // face (3rd weight is always 1-sum of first two) 
-     // only valid if same texel is valid in pGutterData 
-     // pBaryData must be allocated by the user 
-     STDMETHOD(GetBaryMap)(THIS_ D3DXVECTOR2 *pBaryData) PURE; 
-      
-     // TexelMap is a D3DXVECTOR2 per texel that 
-     // stores the location in pixel coordinates where the 
-     // corresponding texel is mapped 
-     // pTexelData must be allocated by the user 
-     STDMETHOD(GetTexelMap)(THIS_ D3DXVECTOR2 *pTexelData) PURE; 
-      
-     // GutterMap is a BYTE per texel 
-     // 0/1/2 for Invalid/Internal/Gutter texels 
-     // 4 represents a gutter texel that will be computed 
-     // during PRT 
-     // pGutterData must be allocated by the user 
-     STDMETHOD(GetGutterMap)(THIS_ BYTE *pGutterData) PURE; 
-      
-     // face map is a UINT per texel that represents the 
-     // face of the mesh that texel belongs too -  
-     // only valid if same texel is valid in pGutterData 
-     STDMETHOD(SetFaceMap)(THIS_ UINT *pFaceData) PURE; 
-      
-     // BaryMap is a D3DXVECTOR2 per texel 
-     // the 1st two barycentric coordinates for the corresponding 
-     // face (3rd weight is always 1-sum of first two) 
-     // only valid if same texel is valid in pGutterData 
-     STDMETHOD(SetBaryMap)(THIS_ D3DXVECTOR2 *pBaryData) PURE; 
-      
-     // TexelMap is a D3DXVECTOR2 per texel that 
-     // stores the location in pixel coordinates where the 
-     // corresponding texel is mapped 
-     STDMETHOD(SetTexelMap)(THIS_ D3DXVECTOR2 *pTexelData) PURE; 
-      
-     // GutterMap is a BYTE per texel 
-     // 0/1/2 for Invalid/Internal/Gutter texels 
-     // 4 represents a gutter texel that will be computed 
-     // during PRT 
-     STDMETHOD(SetGutterMap)(THIS_ BYTE *pGutterData) PURE;     
- }; 
-   
-   
- typedef interface ID3DXPRTEngine ID3DXPRTEngine; 
- typedef interface ID3DXPRTEngine *LPD3DXPRTENGINE; 
-   
- #undef INTERFACE 
- #define INTERFACE ID3DXPRTEngine 
-   
- // ID3DXPRTEngine is used to compute a PRT simulation 
- // Use the following steps to compute PRT for SH 
- // (1) create an interface (which includes a scene) 
- // (2) call SetSamplingInfo 
- // (3) [optional] Set MeshMaterials/albedo's (required if doing bounces) 
- // (4) call ComputeDirectLightingSH 
- // (5) [optional] call ComputeBounce 
- // repeat step 5 for as many bounces as wanted. 
- // if you want to model subsurface scattering you 
- // need to call ComputeSS after direct lighting and 
- // each bounce. 
- // If you want to bake the albedo into the PRT signal, you 
- // must call MutliplyAlbedo, otherwise the user has to multiply 
- // the albedo themselves.  Not multiplying the albedo allows you 
- // to model albedo variation at a finer scale then illumination, and 
- // can result in better compression results. 
- // Luminance values are computed from RGB values using the following 
- // formula:  R * 0.2125 + G * 0.7154 + B * 0.0721 
-   
- DECLARE_INTERFACE_(ID3DXPRTEngine, IUnknown) 
- { 
-     // IUnknown 
-     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; 
-     STDMETHOD_(ULONG, AddRef)(THIS) PURE; 
-     STDMETHOD_(ULONG, Release)(THIS) PURE; 
-   
-     // ID3DXPRTEngine 
-      
-     // This sets a material per attribute in the scene mesh and it is 
-     // the only way to specify subsurface scattering parameters.  if 
-     // bSetAlbedo is FALSE, NumChannels must match the current 
-     // configuration of the PRTEngine.  If you intend to change 
-     // NumChannels (through some other SetAlbedo function) it must 
-     // happen before SetMeshMaterials is called. 
-     // 
-     // NumChannels 1 implies "grayscale" materials, set this to 3 to enable 
-     //  color bleeding effects 
-     // bSetAlbedo sets albedo from material if TRUE - which clobbers per texel/vertex 
-     //  albedo that might have been set before.  FALSE won't clobber. 
-     // fLengthScale is used for subsurface scattering - scene is mapped into a 1mm unit cube 
-     //  and scaled by this amount 
-     STDMETHOD(SetMeshMaterials)(THIS_ CONST D3DXSHMATERIAL **ppMaterials, UINT NumMeshes,  
-                                 UINT NumChannels, BOOL bSetAlbedo, FLOAT fLengthScale) PURE; 
-      
-     // setting albedo per-vertex or per-texel over rides the albedos stored per mesh 
-     // but it does not over ride any other settings 
-      
-     // sets an albedo to be used per vertex - the albedo is represented as a float 
-     // pDataIn input pointer (pointint to albedo of 1st sample) 
-     // NumChannels 1 implies "grayscale" materials, set this to 3 to enable 
-     //  color bleeding effects 
-     // Stride - stride in bytes to get to next samples albedo 
-     STDMETHOD(SetPerVertexAlbedo)(THIS_ CONST VOID *pDataIn, UINT NumChannels, UINT Stride) PURE; 
-      
-     // represents the albedo per-texel instead of per-vertex (even if per-vertex PRT is used) 
-     // pAlbedoTexture - texture that stores the albedo (dimension arbitrary) 
-     // NumChannels 1 implies "grayscale" materials, set this to 3 to enable 
-     //  color bleeding effects 
-     // pGH - optional gutter helper, otherwise one is constructed in computation routines and 
-     //  destroyed (if not attached to buffers) 
-     STDMETHOD(SetPerTexelAlbedo)(THIS_ LPDIRECT3DTEXTURE9 pAlbedoTexture,  
-                                  UINT NumChannels,  
-                                  LPD3DXTEXTUREGUTTERHELPER pGH) PURE; 
-                                   
-     // gets the per-vertex albedo 
-     STDMETHOD(GetVertexAlbedo)(THIS_ D3DXCOLOR *pVertColors, UINT NumVerts) PURE;                                  
-                                   
-     // If pixel PRT is being computed normals default to ones that are interpolated 
-     // from the vertex normals.  This specifies a texture that stores an object 
-     // space normal map instead (must use a texture format that can represent signed values) 
-     // pNormalTexture - normal map, must be same dimensions as PRTBuffers, signed                                 
-     STDMETHOD(SetPerTexelNormal)(THIS_ LPDIRECT3DTEXTURE9 pNormalTexture) PURE; 
-                                   
-     // Copies per-vertex albedo from mesh 
-     // pMesh - mesh that represents the scene.  It must have the same 
-     //  properties as the mesh used to create the PRTEngine 
-     // Usage - D3DDECLUSAGE to extract albedos from 
-     // NumChannels 1 implies "grayscale" materials, set this to 3 to enable 
-     //  color bleeding effects 
-     STDMETHOD(ExtractPerVertexAlbedo)(THIS_ LPD3DXMESH pMesh,  
-                                       D3DDECLUSAGE Usage,  
-                                       UINT NumChannels) PURE; 
-   
-     // Resamples the input buffer into the output buffer 
-     // can be used to move between per-vertex and per-texel buffers.  This can also be used 
-     // to convert single channel buffers to 3-channel buffers and vice-versa. 
-     STDMETHOD(ResampleBuffer)(THIS_ LPD3DXPRTBUFFER pBufferIn, LPD3DXPRTBUFFER pBufferOut) PURE; 
-      
-     // Returns the scene mesh - including modifications from adaptive spatial sampling 
-     // The returned mesh only has positions, normals and texture coordinates (if defined) 
-     // pD3DDevice - d3d device that will be used to allocate the mesh 
-     // pFaceRemap - each face has a pointer back to the face on the original mesh that it comes from 
-     //  if the face hasn't been subdivided this will be an identity mapping 
-     // pVertRemap - each vertex contains 3 vertices that this is a linear combination of 
-     // pVertWeights - weights for each of above indices (sum to 1.0f) 
-     // ppMesh - mesh that will be allocated and filled 
-     STDMETHOD(GetAdaptedMesh)(THIS_ LPDIRECT3DDEVICE9 pD3DDevice,UINT *pFaceRemap, UINT *pVertRemap, FLOAT *pfVertWeights, LPD3DXMESH *ppMesh) PURE; 
-   
-     // Number of vertices currently allocated (includes new vertices from adaptive sampling) 
-     STDMETHOD_(UINT, GetNumVerts)(THIS) PURE; 
-     // Number of faces currently allocated (includes new faces) 
-     STDMETHOD_(UINT, GetNumFaces)(THIS) PURE; 
-   
-     // Sets the Minimum/Maximum intersection distances, this can be used to control 
-     // maximum distance that objects can shadow/reflect light, and help with "bad" 
-     // art that might have near features that you don't want to shadow.  This does not 
-     // apply for GPU simulations. 
-     //  fMin - minimum intersection distance, must be positive and less than fMax 
-     //  fMax - maximum intersection distance, if 0.0f use the previous value, otherwise 
-     //      must be strictly greater than fMin 
-     STDMETHOD(SetMinMaxIntersection)(THIS_ FLOAT fMin, FLOAT fMax) PURE; 
-   
-     // This will subdivide faces on a mesh so that adaptively simulations can 
-     // use a more conservative threshold (it won't miss features.) 
-     // MinEdgeLength - minimum edge length that will be generated, if 0.0f a 
-     //  reasonable default will be used 
-     // MaxSubdiv - maximum level of subdivision, if 0 is specified a default 
-     //  value will be used (5) 
-     STDMETHOD(RobustMeshRefine)(THIS_ FLOAT MinEdgeLength, UINT MaxSubdiv) PURE; 
-   
-     // This sets to sampling information used by the simulator.  Adaptive sampling 
-     // parameters are currently ignored. 
-     // NumRays - number of rays to shoot per sample 
-     // UseSphere - if TRUE uses spherical samples, otherwise samples over 
-     //  the hemisphere.  Should only be used with GPU and Vol computations 
-     // UseCosine - if TRUE uses a cosine weighting - not used for Vol computations 
-     //  or if only the visiblity function is desired 
-     // Adaptive - if TRUE adaptive sampling (angular) is used 
-     // AdaptiveThresh - threshold used to terminate adaptive angular sampling 
-     //  ignored if adaptive sampling is not set 
-     STDMETHOD(SetSamplingInfo)(THIS_ UINT NumRays,  
-                                BOOL UseSphere,  
-                                BOOL UseCosine,  
-                                BOOL Adaptive,  
-                                FLOAT AdaptiveThresh) PURE; 
-   
-     // Methods that compute the direct lighting contribution for objects 
-     // always represente light using spherical harmonics (SH) 
-     // the albedo is not multiplied by the signal - it just integrates 
-     // incoming light.  If NumChannels is not 1 the vector is replicated 
-     // 
-     // SHOrder - order of SH to use 
-     // pDataOut - PRT buffer that is generated.  Can be single channel 
-     STDMETHOD(ComputeDirectLightingSH)(THIS_ UINT SHOrder,  
-                                        LPD3DXPRTBUFFER pDataOut) PURE; 
-                                         
-     // Adaptive variant of above function.  This will refine the mesh 
-     // generating new vertices/faces to approximate the PRT signal 
-     // more faithfully. 
-     // SHOrder - order of SH to use 
-     // AdaptiveThresh - threshold for adaptive subdivision (in PRT vector error) 
-     //  if value is less then 1e-6f, 1e-6f is specified 
-     // MinEdgeLength - minimum edge length that will be generated 
-     //  if value is too small a fairly conservative model dependent value 
-     //  is used 
-     // MaxSubdiv - maximum subdivision level, if 0 is specified it  
-     //  will default to 4 
-     // pDataOut - PRT buffer that is generated.  Can be single channel. 
-     STDMETHOD(ComputeDirectLightingSHAdaptive)(THIS_ UINT SHOrder,  
-                                                FLOAT AdaptiveThresh, 
-                                                FLOAT MinEdgeLength, 
-                                                UINT MaxSubdiv, 
-                                                LPD3DXPRTBUFFER pDataOut) PURE; 
-                                         
-     // Function that computes the direct lighting contribution for objects 
-     // light is always represented using spherical harmonics (SH) 
-     // This is done on the GPU and is much faster then using the CPU. 
-     // The albedo is not multiplied by the signal - it just integrates 
-     // incoming light.  If NumChannels is not 1 the vector is replicated. 
-     // ZBias/ZAngleBias are akin to parameters used with shadow zbuffers. 
-     // A reasonable default for both values is 0.005, but the user should 
-     // experiment (ZAngleBias can be zero, ZBias should not be.) 
-     // Callbacks should not use the Direct3D9Device the simulator is using. 
-     // SetSamplingInfo must be called with TRUE for UseSphere and 
-     // FALSE for UseCosine before this method is called. 
-     // 
-     // pD3DDevice - device used to run GPU simulator - must support PS2.0 
-     //  and FP render targets 
-     // Flags - parameters for the GPU simulator, combination of one or more 
-     //  D3DXSHGPUSIMOPT flags.  Only one SHADOWRES setting should be set and 
-     //  the defaults is 512 
-     // SHOrder - order of SH to use 
-     // ZBias - bias in normal direction (for depth test) 
-     // ZAngleBias - scaled by one minus cosine of angle with light (offset in depth) 
-     // pDataOut - PRT buffer that is filled in.  Can be single channel 
-     STDMETHOD(ComputeDirectLightingSHGPU)(THIS_ LPDIRECT3DDEVICE9 pD3DDevice, 
-                                           UINT Flags, 
-                                           UINT SHOrder, 
-                                           FLOAT ZBias, 
-                                           FLOAT ZAngleBias, 
-                                           LPD3DXPRTBUFFER pDataOut) PURE; 
-   
-   
-     // Functions that computes subsurface scattering (using material properties) 
-     // Albedo is not multiplied by result.  This only works for per-vertex data 
-     // use ResampleBuffer to move per-vertex data into a texture and back. 
-     // 
-     // pDataIn - input data (previous bounce) 
-     // pDataOut - result of subsurface scattering simulation 
-     // pDataTotal - [optional] results can be summed into this buffer 
-     STDMETHOD(ComputeSS)(THIS_ LPD3DXPRTBUFFER pDataIn,  
-                          LPD3DXPRTBUFFER pDataOut, LPD3DXPRTBUFFER pDataTotal) PURE; 
-   
-     // Adaptive version of ComputeSS. 
-     // 
-     // pDataIn - input data (previous bounce) 
-     // AdaptiveThresh - threshold for adaptive subdivision (in PRT vector error) 
-     //  if value is less then 1e-6f, 1e-6f is specified 
-     // MinEdgeLength - minimum edge length that will be generated 
-     //  if value is too small a fairly conservative model dependent value 
-     //  is used 
-     // MaxSubdiv - maximum subdivision level, if 0 is specified it  
-     //  will default to 4     
-     // pDataOut - result of subsurface scattering simulation 
-     // pDataTotal - [optional] results can be summed into this buffer 
-     STDMETHOD(ComputeSSAdaptive)(THIS_ LPD3DXPRTBUFFER pDataIn,  
-                                  FLOAT AdaptiveThresh, 
-                                  FLOAT MinEdgeLength, 
-                                  UINT MaxSubdiv, 
-                                  LPD3DXPRTBUFFER pDataOut, LPD3DXPRTBUFFER pDataTotal) PURE; 
-   
-     // computes a single bounce of inter-reflected light 
-     // works for SH based PRT or generic lighting 
-     // Albedo is not multiplied by result 
-     // 
-     // pDataIn - previous bounces data  
-     // pDataOut - PRT buffer that is generated 
-     // pDataTotal - [optional] can be used to keep a running sum 
-     STDMETHOD(ComputeBounce)(THIS_ LPD3DXPRTBUFFER pDataIn, 
-                              LPD3DXPRTBUFFER pDataOut, 
-                              LPD3DXPRTBUFFER pDataTotal) PURE; 
-   
-     // Adaptive version of above function. 
-     // 
-     // pDataIn - previous bounces data, can be single channel  
-     // AdaptiveThresh - threshold for adaptive subdivision (in PRT vector error) 
-     //  if value is less then 1e-6f, 1e-6f is specified 
-     // MinEdgeLength - minimum edge length that will be generated 
-     //  if value is too small a fairly conservative model dependent value 
-     //  is used 
-     // MaxSubdiv - maximum subdivision level, if 0 is specified it  
-     //  will default to 4 
-     // pDataOut - PRT buffer that is generated 
-     // pDataTotal - [optional] can be used to keep a running sum     
-     STDMETHOD(ComputeBounceAdaptive)(THIS_ LPD3DXPRTBUFFER pDataIn, 
-                                      FLOAT AdaptiveThresh, 
-                                      FLOAT MinEdgeLength, 
-                                      UINT MaxSubdiv, 
-                                      LPD3DXPRTBUFFER pDataOut, 
-                                      LPD3DXPRTBUFFER pDataTotal) PURE; 
-   
-     // Computes projection of distant SH radiance into a local SH radiance 
-     // function.  This models how direct lighting is attenuated by the  
-     // scene and is a form of "neighborhood transfer."  The result is 
-     // a linear operator (matrix) at every sample point, if you multiply 
-     // this matrix by the distant SH lighting coefficients you get an 
-     // approximation of the local incident radiance function from 
-     // direct lighting.  These resulting lighting coefficients can 
-     // than be projected into another basis or used with any rendering 
-     // technique that uses spherical harmonics as input. 
-     // SetSamplingInfo must be called with TRUE for UseSphere and 
-     // FALSE for UseCosine before this method is called.   
-     // Generates SHOrderIn*SHOrderIn*SHOrderOut*SHOrderOut scalars  
-     // per channel at each sample location. 
-     // 
-     // SHOrderIn  - Order of the SH representation of distant lighting 
-     // SHOrderOut - Order of the SH representation of local lighting 
-     // NumVolSamples  - Number of sample locations 
-     // pSampleLocs    - position of sample locations 
-     // pDataOut       - PRT Buffer that will store output results     
-     STDMETHOD(ComputeVolumeSamplesDirectSH)(THIS_ UINT SHOrderIn,  
-                                             UINT SHOrderOut,  
-                                             UINT NumVolSamples, 
-                                             CONST D3DXVECTOR3 *pSampleLocs, 
-                                             LPD3DXPRTBUFFER pDataOut) PURE; 
-                                      
-     // At each sample location computes a linear operator (matrix) that maps 
-     // the representation of source radiance (NumCoeffs in pSurfDataIn) 
-     // into a local incident radiance function approximated with spherical  
-     // harmonics.  For example if a light map data is specified in pSurfDataIn 
-     // the result is an SH representation of the flow of light at each sample 
-     // point.  If PRT data for an outdoor scene is used, each sample point 
-     // contains a matrix that models how distant lighting bounces of the objects 
-     // in the scene and arrives at the given sample point.  Combined with 
-     // ComputeVolumeSamplesDirectSH this gives the complete representation for 
-     // how light arrives at each sample point parameterized by distant lighting. 
-     // SetSamplingInfo must be called with TRUE for UseSphere and 
-     // FALSE for UseCosine before this method is called.     
-     // Generates pSurfDataIn->NumCoeffs()*SHOrder*SHOrder scalars 
-     // per channel at each sample location. 
-     // 
-     // pSurfDataIn    - previous bounce data 
-     // SHOrder        - order of SH to generate projection with 
-     // NumVolSamples  - Number of sample locations 
-     // pSampleLocs    - position of sample locations 
-     // pDataOut       - PRT Buffer that will store output results 
-     STDMETHOD(ComputeVolumeSamples)(THIS_ LPD3DXPRTBUFFER pSurfDataIn,  
-                                     UINT SHOrder,  
-                                     UINT NumVolSamples, 
-                                     CONST D3DXVECTOR3 *pSampleLocs, 
-                                     LPD3DXPRTBUFFER pDataOut) PURE; 
-   
-     // Computes direct lighting (SH) for a point not on the mesh 
-     // with a given normal - cannot use texture buffers. 
-     // 
-     // SHOrder      - order of SH to use 
-     // NumSamples   - number of sample locations 
-     // pSampleLocs  - position for each sample 
-     // pSampleNorms - normal for each sample 
-     // pDataOut     - PRT Buffer that will store output results 
-     STDMETHOD(ComputeSurfSamplesDirectSH)(THIS_ UINT SHOrder, 
-                                           UINT NumSamples, 
-                                           CONST D3DXVECTOR3 *pSampleLocs, 
-                                           CONST D3DXVECTOR3 *pSampleNorms, 
-                                           LPD3DXPRTBUFFER pDataOut) PURE; 
-   
-   
-     // given the solution for PRT or light maps, computes transfer vector at arbitrary  
-     // position/normal pairs in space 
-     // 
-     // pSurfDataIn  - input data 
-     // NumSamples   - number of sample locations 
-     // pSampleLocs  - position for each sample 
-     // pSampleNorms - normal for each sample 
-     // pDataOut     - PRT Buffer that will store output results 
-     // pDataTotal   - optional buffer to sum results into - can be NULL 
-     STDMETHOD(ComputeSurfSamplesBounce)(THIS_ LPD3DXPRTBUFFER pSurfDataIn, 
-                                         UINT NumSamples, 
-                                         CONST D3DXVECTOR3 *pSampleLocs, 
-                                         CONST D3DXVECTOR3 *pSampleNorms, 
-                                         LPD3DXPRTBUFFER pDataOut, 
-                                         LPD3DXPRTBUFFER pDataTotal) PURE; 
-   
-     // Frees temporary data structures that can be created for subsurface scattering 
-     // this data is freed when the PRTComputeEngine is freed and is lazily created 
-     STDMETHOD(FreeSSData)(THIS) PURE; 
-      
-     // Frees temporary data structures that can be created for bounce simulations 
-     // this data is freed when the PRTComputeEngine is freed and is lazily created 
-     STDMETHOD(FreeBounceData)(THIS) PURE; 
-   
-     // This computes the Local Deformable PRT (LDPRT) coefficients relative to the  
-     // per sample normals that minimize error in a least squares sense with respect  
-     // to the input PRT data set.  These coefficients can be used with skinned/transformed  
-     // normals to model global effects with dynamic objects.  Shading normals can  
-     // optionally be solved for - these normals (along with the LDPRT coefficients) can 
-     // more accurately represent the PRT signal.  The coefficients are for zonal 
-     // harmonics oriented in the normal/shading normal direction. 
-     // 
-     // pDataIn  - SH PRT dataset that is input 
-     // SHOrder  - Order of SH to compute conv coefficients for  
-     // pNormOut - Optional array of vectors (passed in) that will be filled with 
-     //             "shading normals", LDPRT coefficients are optimized for 
-     //             these normals.  This array must be the same size as the number of 
-     //             samples in pDataIn 
-     // pDataOut - Output buffer (SHOrder zonal harmonic coefficients per channel per sample) 
-     STDMETHOD(ComputeLDPRTCoeffs)(THIS_ LPD3DXPRTBUFFER pDataIn, 
-                                   UINT SHOrder, 
-                                   D3DXVECTOR3 *pNormOut, 
-                                   LPD3DXPRTBUFFER pDataOut) PURE; 
-   
-     // scales all the samples associated with a given sub mesh 
-     // can be useful when using subsurface scattering 
-     // fScale - value to scale each vector in submesh by 
-     STDMETHOD(ScaleMeshChunk)(THIS_ UINT uMeshChunk, FLOAT fScale, LPD3DXPRTBUFFER pDataOut) PURE; 
-      
-     // mutliplies each PRT vector by the albedo - can be used if you want to have the albedo 
-     // burned into the dataset, often better not to do this.  If this is not done the user 
-     // must mutliply the albedo themselves when rendering - just multiply the albedo times 
-     // the result of the PRT dot product. 
-     // If pDataOut is a texture simulation result and there is an albedo texture it 
-     // must be represented at the same resolution as the simulation buffer.  You can use 
-     // LoadSurfaceFromSurface and set a new albedo texture if this is an issue - but must 
-     // be careful about how the gutters are handled. 
-     // 
-     // pDataOut - dataset that will get albedo pushed into it 
-     STDMETHOD(MultiplyAlbedo)(THIS_ LPD3DXPRTBUFFER pDataOut) PURE; 
-      
-     // Sets a pointer to an optional call back function that reports back to the 
-     // user percentage done and gives them the option of quitting 
-     // pCB - pointer to call back function, return S_OK for the simulation 
-     //  to continue 
-     // Frequency - 1/Frequency is roughly the number of times the call back 
-     //  will be invoked 
-     // lpUserContext - will be passed back to the users call back 
-     STDMETHOD(SetCallBack)(THIS_ LPD3DXSHPRTSIMCB pCB, FLOAT Frequency,  LPVOID lpUserContext) PURE; 
-      
-     // Returns TRUE if the ray intersects the mesh, FALSE if it does not.  This function 
-     // takes into account settings from SetMinMaxIntersection.  If the closest intersection 
-     // is not needed this function is more efficient compared to the ClosestRayIntersection 
-     // method. 
-     // pRayPos - origin of ray 
-     // pRayDir - normalized ray direction (normalization required for SetMinMax to be meaningful) 
-      
-     STDMETHOD_(BOOL, ShadowRayIntersects)(THIS_ CONST D3DXVECTOR3 *pRayPos, CONST D3DXVECTOR3 *pRayDir) PURE; 
-      
-     // Returns TRUE if the ray intersects the mesh, FALSE if it does not.  If there is an 
-     // intersection the closest face that was intersected and its first two barycentric coordinates 
-     // are returned.  This function takes into account settings from SetMinMaxIntersection. 
-     // This is a slower function compared to ShadowRayIntersects and should only be used where 
-     // needed.  The third vertices barycentric coordinates will be 1 - pU - pV. 
-     // pRayPos     - origin of ray 
-     // pRayDir     - normalized ray direction (normalization required for SetMinMax to be meaningful) 
-     // pFaceIndex  - Closest face that intersects.  This index is based on stacking the pBlockerMesh 
-     //  faces before the faces from pMesh 
-     // pU          - Barycentric coordinate for vertex 0 
-     // pV          - Barycentric coordinate for vertex 1 
-     // pDist       - Distance along ray where the intersection occured 
-      
-     STDMETHOD_(BOOL, ClosestRayIntersects)(THIS_ CONST D3DXVECTOR3 *pRayPos, CONST D3DXVECTOR3 *pRayDir, 
-                                            DWORD *pFaceIndex, FLOAT *pU, FLOAT *pV, FLOAT *pDist) PURE; 
- }; 
-   
-   
- // API functions for creating interfaces 
-   
- #ifdef __cplusplus 
- extern "C" { 
- #endif //__cplusplus 
-   
- //============================================================================ 
- // 
- //  D3DXCreatePRTBuffer: 
- //  -------------------- 
- //  Generates a PRT Buffer that can be compressed or filled by a simulator 
- //  This function should be used to create per-vertex or volume buffers. 
- //  When buffers are created all values are initialized to zero. 
- // 
- //  Parameters: 
- //    NumSamples 
- //      Number of sample locations represented 
- //    NumCoeffs 
- //      Number of coefficients per sample location (order^2 for SH) 
- //    NumChannels 
- //      Number of color channels to represent (1 or 3) 
- //    ppBuffer 
- //      Buffer that will be allocated 
- // 
- //============================================================================ 
-   
- HRESULT WINAPI  
-     D3DXCreatePRTBuffer(  
-         UINT NumSamples, 
-         UINT NumCoeffs, 
-         UINT NumChannels, 
-         LPD3DXPRTBUFFER* ppBuffer); 
-   
- //============================================================================ 
- // 
- //  D3DXCreatePRTBufferTex: 
- //  -------------------- 
- //  Generates a PRT Buffer that can be compressed or filled by a simulator 
- //  This function should be used to create per-pixel buffers. 
- //  When buffers are created all values are initialized to zero. 
- // 
- //  Parameters: 
- //    Width 
- //      Width of texture 
- //    Height 
- //      Height of texture 
- //    NumCoeffs 
- //      Number of coefficients per sample location (order^2 for SH) 
- //    NumChannels 
- //      Number of color channels to represent (1 or 3) 
- //    ppBuffer 
- //      Buffer that will be allocated 
- // 
- //============================================================================ 
-   
- HRESULT WINAPI 
-     D3DXCreatePRTBufferTex(  
-         UINT Width, 
-         UINT Height, 
-         UINT NumCoeffs, 
-         UINT NumChannels, 
-         LPD3DXPRTBUFFER* ppBuffer); 
-   
- //============================================================================ 
- // 
- //  D3DXLoadPRTBufferFromFile: 
- //  -------------------- 
- //  Loads a PRT buffer that has been saved to disk. 
- // 
- //  Parameters: 
- //    pFilename 
- //      Name of the file to load 
- //    ppBuffer 
- //      Buffer that will be allocated 
- // 
- //============================================================================ 
-   
- HRESULT WINAPI 
-     D3DXLoadPRTBufferFromFileA( 
-         LPCSTR pFilename,  
-         LPD3DXPRTBUFFER*       ppBuffer); 
-          
- HRESULT WINAPI 
-     D3DXLoadPRTBufferFromFileW( 
-         LPCWSTR pFilename,  
-         LPD3DXPRTBUFFER*       ppBuffer); 
-   
- #ifdef UNICODE 
- #define D3DXLoadPRTBufferFromFile D3DXLoadPRTBufferFromFileW 
- #else 
- #define D3DXLoadPRTBufferFromFile D3DXLoadPRTBufferFromFileA 
- #endif 
-   
-   
- //============================================================================ 
- // 
- //  D3DXSavePRTBufferToFile: 
- //  -------------------- 
- //  Saves a PRTBuffer to disk. 
- // 
- //  Parameters: 
- //    pFilename 
- //      Name of the file to save 
- //    pBuffer 
- //      Buffer that will be saved 
- // 
- //============================================================================ 
-   
- HRESULT WINAPI 
-     D3DXSavePRTBufferToFileA( 
-         LPCSTR pFileName, 
-         LPD3DXPRTBUFFER pBuffer); 
-          
- HRESULT WINAPI 
-     D3DXSavePRTBufferToFileW( 
-         LPCWSTR pFileName, 
-         LPD3DXPRTBUFFER pBuffer); 
-   
- #ifdef UNICODE 
- #define D3DXSavePRTBufferToFile D3DXSavePRTBufferToFileW 
- #else 
- #define D3DXSavePRTBufferToFile D3DXSavePRTBufferToFileA 
- #endif                 
-   
-   
- //============================================================================ 
- // 
- //  D3DXLoadPRTCompBufferFromFile: 
- //  -------------------- 
- //  Loads a PRTComp buffer that has been saved to disk. 
- // 
- //  Parameters: 
- //    pFilename 
- //      Name of the file to load 
- //    ppBuffer 
- //      Buffer that will be allocated 
- // 
- //============================================================================ 
-   
- HRESULT WINAPI 
-     D3DXLoadPRTCompBufferFromFileA( 
-         LPCSTR pFilename,  
-         LPD3DXPRTCOMPBUFFER*       ppBuffer); 
-          
- HRESULT WINAPI 
-     D3DXLoadPRTCompBufferFromFileW( 
-         LPCWSTR pFilename,  
-         LPD3DXPRTCOMPBUFFER*       ppBuffer); 
-   
- #ifdef UNICODE 
- #define D3DXLoadPRTCompBufferFromFile D3DXLoadPRTCompBufferFromFileW 
- #else 
- #define D3DXLoadPRTCompBufferFromFile D3DXLoadPRTCompBufferFromFileA 
- #endif 
-   
- //============================================================================ 
- // 
- //  D3DXSavePRTCompBufferToFile: 
- //  -------------------- 
- //  Saves a PRTCompBuffer to disk. 
- // 
- //  Parameters: 
- //    pFilename 
- //      Name of the file to save 
- //    pBuffer 
- //      Buffer that will be saved 
- // 
- //============================================================================ 
-   
- HRESULT WINAPI 
-     D3DXSavePRTCompBufferToFileA( 
-         LPCSTR pFileName, 
-         LPD3DXPRTCOMPBUFFER pBuffer); 
-          
- HRESULT WINAPI 
-     D3DXSavePRTCompBufferToFileW( 
-         LPCWSTR pFileName, 
-         LPD3DXPRTCOMPBUFFER pBuffer); 
-   
- #ifdef UNICODE 
- #define D3DXSavePRTCompBufferToFile D3DXSavePRTCompBufferToFileW 
- #else 
- #define D3DXSavePRTCompBufferToFile D3DXSavePRTCompBufferToFileA 
- #endif  
-   
- //============================================================================ 
- // 
- //  D3DXCreatePRTCompBuffer: 
- //  -------------------- 
- //  Compresses a PRT buffer (vertex or texel) 
- // 
- //  Parameters: 
- //    D3DXSHCOMPRESSQUALITYTYPE 
- //      Quality of compression - low is faster (computes PCA per voronoi cluster) 
- //      high is slower but better quality (clusters based on distance to affine subspace) 
- //    NumClusters 
- //      Number of clusters to compute 
- //    NumPCA 
- //      Number of basis vectors to compute 
- //    pCB 
- //      Optional Callback function 
- //    lpUserContext 
- //      Optional user context 
- //    pBufferIn 
- //      Buffer that will be compressed 
- //    ppBufferOut 
- //      Compressed buffer that will be created 
- // 
- //============================================================================ 
-   
-   
- HRESULT WINAPI 
-     D3DXCreatePRTCompBuffer( 
-         D3DXSHCOMPRESSQUALITYTYPE Quality, 
-         UINT NumClusters,  
-         UINT NumPCA, 
-         LPD3DXSHPRTSIMCB pCB, 
-         LPVOID lpUserContext,         
-         LPD3DXPRTBUFFER  pBufferIn, 
-         LPD3DXPRTCOMPBUFFER *ppBufferOut 
-     ); 
-   
- //============================================================================ 
- // 
- //  D3DXCreateTextureGutterHelper: 
- //  -------------------- 
- //  Generates a "GutterHelper" for a given set of meshes and texture 
- //  resolution 
- // 
- //  Parameters: 
- //    Width 
- //      Width of texture 
- //    Height 
- //      Height of texture 
- //    pMesh 
- //      Mesh that represents the scene 
- //    GutterSize 
- //      Number of texels to over rasterize in texture space 
- //      this should be at least 1.0 
- //    ppBuffer 
- //      GutterHelper that will be created 
- // 
- //============================================================================ 
-   
-   
- HRESULT WINAPI  
-     D3DXCreateTextureGutterHelper(  
-         UINT Width, 
-         UINT Height, 
-         LPD3DXMESH pMesh,  
-         FLOAT GutterSize, 
-         LPD3DXTEXTUREGUTTERHELPER* ppBuffer); 
-   
-   
- //============================================================================ 
- // 
- //  D3DXCreatePRTEngine: 
- //  -------------------- 
- //  Computes a PRTEngine which can efficiently generate PRT simulations 
- //  of a scene 
- // 
- //  Parameters: 
- //    pMesh 
- //      Mesh that represents the scene - must have an AttributeTable 
- //      where vertices are in a unique attribute. 
- //    pAdjacency 
- //      Optional adjacency information 
- //    ExtractUVs 
- //      Set this to true if textures are going to be used for albedos 
- //      or to store PRT vectors 
- //    pBlockerMesh 
- //      Optional mesh that just blocks the scene 
- //    ppEngine 
- //      PRTEngine that will be created 
- // 
- //============================================================================ 
-   
-   
- HRESULT WINAPI  
-     D3DXCreatePRTEngine(  
-         LPD3DXMESH pMesh, 
-         DWORD *pAdjacency, 
-         BOOL ExtractUVs, 
-         LPD3DXMESH pBlockerMesh,  
-         LPD3DXPRTENGINE* ppEngine); 
-   
- //============================================================================ 
- // 
- //  D3DXConcatenateMeshes: 
- //  -------------------- 
- //  Concatenates a group of meshes into one common mesh.  This can optionaly transform 
- //  each sub mesh or its texture coordinates.  If no DECL is given it will 
- //  generate a union of all of the DECL's of the sub meshes, promoting channels 
- //  and types if neccesary.  It will create an AttributeTable if possible, one can 
- //  call OptimizeMesh with attribute sort and compacting enabled to ensure this. 
- // 
- //  Parameters: 
- //    ppMeshes 
- //      Array of pointers to meshes that can store PRT vectors 
- //    NumMeshes 
- //      Number of meshes 
- //    Options 
- //      Passed through to D3DXCreateMesh 
- //    pGeomXForms 
- //      [optional] Each sub mesh is transformed by the corresponding 
- //      matrix if this array is supplied 
- //    pTextureXForms 
- //      [optional] UV coordinates for each sub mesh are transformed 
- //      by corresponding matrix if supplied 
- //    pDecl 
- //      [optional] Only information in this DECL is used when merging 
- //      data 
- //    pD3DDevice 
- //      D3D device that is used to create the new mesh 
- //    ppMeshOut 
- //      Mesh that will be created 
- // 
- //============================================================================ 
-   
-   
- HRESULT WINAPI  
-     D3DXConcatenateMeshes( 
-         LPD3DXMESH *ppMeshes,  
-         UINT NumMeshes,  
-         DWORD Options,  
-         CONST D3DXMATRIX *pGeomXForms,  
-         CONST D3DXMATRIX *pTextureXForms,  
-         CONST D3DVERTEXELEMENT9 *pDecl, 
-         LPDIRECT3DDEVICE9 pD3DDevice,  
-         LPD3DXMESH *ppMeshOut); 
-   
- //============================================================================ 
- // 
- //  D3DXSHPRTCompSuperCluster: 
- //  -------------------------- 
- //  Used with compressed results of D3DXSHPRTSimulation. 
- //  Generates "super clusters" - groups of clusters that can be drawn in 
- //  the same draw call.  A greedy algorithm that minimizes overdraw is used 
- //  to group the clusters. 
- // 
- //  Parameters: 
- //   pClusterIDs 
- //      NumVerts cluster ID's (extracted from a compressed buffer) 
- //   pScene 
- //      Mesh that represents composite scene passed to the simulator 
- //   MaxNumClusters 
- //      Maximum number of clusters allocated per super cluster 
- //   NumClusters 
- //      Number of clusters computed in the simulator 
- //   pSuperClusterIDs 
- //      Array of length NumClusters, contains index of super cluster 
- //      that corresponding cluster was assigned to 
- //   pNumSuperClusters 
- //      Returns the number of super clusters allocated 
- //       
- //============================================================================ 
-   
- HRESULT WINAPI  
-     D3DXSHPRTCompSuperCluster( 
-         UINT *pClusterIDs,  
-         LPD3DXMESH pScene,  
-         UINT MaxNumClusters,  
-         UINT NumClusters, 
-         UINT *pSuperClusterIDs,  
-         UINT *pNumSuperClusters); 
-   
- //============================================================================ 
- // 
- //  D3DXSHPRTCompSplitMeshSC: 
- //  ------------------------- 
- //  Used with compressed results of the vertex version of the PRT simulator. 
- //  After D3DXSHRTCompSuperCluster has been called this function can be used 
- //  to split the mesh into a group of faces/vertices per super cluster. 
- //  Each super cluster contains all of the faces that contain any vertex 
- //  classified in one of its clusters.  All of the vertices connected to this 
- //  set of faces are also included with the returned array ppVertStatus  
- //  indicating whether or not the vertex belongs to the supercluster. 
- // 
- //  Parameters: 
- //   pClusterIDs 
- //      NumVerts cluster ID's (extracted from a compressed buffer) 
- //   NumVertices 
- //      Number of vertices in original mesh 
- //   NumClusters 
- //      Number of clusters (input parameter to compression) 
- //   pSuperClusterIDs 
- //      Array of size NumClusters that will contain super cluster ID's (from 
- //      D3DXSHCompSuerCluster) 
- //   NumSuperClusters 
- //      Number of superclusters allocated in D3DXSHCompSuerCluster 
- //   pInputIB 
- //      Raw index buffer for mesh - format depends on bInputIBIs32Bit 
- //   InputIBIs32Bit 
- //      Indicates whether the input index buffer is 32-bit (otherwise 16-bit 
- //      is assumed) 
- //   NumFaces 
- //      Number of faces in the original mesh (pInputIB is 3 times this length) 
- //   ppIBData 
- //      LPD3DXBUFFER holds raw index buffer that will contain the resulting split faces.   
- //      Format determined by bIBIs32Bit.  Allocated by function 
- //   pIBDataLength 
- //      Length of ppIBData, assigned in function 
- //   OutputIBIs32Bit 
- //      Indicates whether the output index buffer is to be 32-bit (otherwise  
- //      16-bit is assumed) 
- //   ppFaceRemap 
- //      LPD3DXBUFFER mapping of each face in ppIBData to original faces.  Length is 
- //      *pIBDataLength/3.  Optional paramter, allocated in function 
- //   ppVertData 
- //      LPD3DXBUFFER contains new vertex data structure.  Size of pVertDataLength 
- //   pVertDataLength 
- //      Number of new vertices in split mesh.  Assigned in function 
- //   pSCClusterList 
- //      Array of length NumClusters which pSCData indexes into (Cluster* fields) 
- //      for each SC, contains clusters sorted by super cluster 
- //   pSCData 
- //      Structure per super cluster - contains indices into ppIBData, 
- //      pSCClusterList and ppVertData 
- // 
- //============================================================================ 
-   
- HRESULT WINAPI  
-     D3DXSHPRTCompSplitMeshSC( 
-         UINT *pClusterIDs,  
-         UINT NumVertices,  
-         UINT NumClusters,  
-         UINT *pSuperClusterIDs,  
-         UINT NumSuperClusters, 
-         LPVOID pInputIB,  
-         BOOL InputIBIs32Bit,  
-         UINT NumFaces, 
-         LPD3DXBUFFER *ppIBData,  
-         UINT *pIBDataLength,  
-         BOOL OutputIBIs32Bit,  
-         LPD3DXBUFFER *ppFaceRemap,  
-         LPD3DXBUFFER *ppVertData,  
-         UINT *pVertDataLength,  
-         UINT *pSCClusterList, 
-         D3DXSHPRTSPLITMESHCLUSTERDATA *pSCData); 
-          
-          
- #ifdef __cplusplus 
- } 
- #endif //__cplusplus 
-   
- ////////////////////////////////////////////////////////////////////////////// 
- // 
- //  Definitions of .X file templates used by mesh load/save functions  
- //    that are not RM standard 
- // 
- ////////////////////////////////////////////////////////////////////////////// 
-   
- // {3CF169CE-FF7C-44ab-93C0-F78F62D172E2} 
- DEFINE_GUID(DXFILEOBJ_XSkinMeshHeader, 
- 0x3cf169ce, 0xff7c, 0x44ab, 0x93, 0xc0, 0xf7, 0x8f, 0x62, 0xd1, 0x72, 0xe2); 
-   
- // {B8D65549-D7C9-4995-89CF-53A9A8B031E3} 
- DEFINE_GUID(DXFILEOBJ_VertexDuplicationIndices,  
- 0xb8d65549, 0xd7c9, 0x4995, 0x89, 0xcf, 0x53, 0xa9, 0xa8, 0xb0, 0x31, 0xe3); 
-   
- // {A64C844A-E282-4756-8B80-250CDE04398C} 
- DEFINE_GUID(DXFILEOBJ_FaceAdjacency,  
- 0xa64c844a, 0xe282, 0x4756, 0x8b, 0x80, 0x25, 0xc, 0xde, 0x4, 0x39, 0x8c); 
-   
- // {6F0D123B-BAD2-4167-A0D0-80224F25FABB} 
- DEFINE_GUID(DXFILEOBJ_SkinWeights,  
- 0x6f0d123b, 0xbad2, 0x4167, 0xa0, 0xd0, 0x80, 0x22, 0x4f, 0x25, 0xfa, 0xbb); 
-   
- // {A3EB5D44-FC22-429d-9AFB-3221CB9719A6} 
- DEFINE_GUID(DXFILEOBJ_Patch,  
- 0xa3eb5d44, 0xfc22, 0x429d, 0x9a, 0xfb, 0x32, 0x21, 0xcb, 0x97, 0x19, 0xa6); 
-   
- // {D02C95CC-EDBA-4305-9B5D-1820D7704BBF} 
- DEFINE_GUID(DXFILEOBJ_PatchMesh,  
- 0xd02c95cc, 0xedba, 0x4305, 0x9b, 0x5d, 0x18, 0x20, 0xd7, 0x70, 0x4b, 0xbf); 
-   
- // {B9EC94E1-B9A6-4251-BA18-94893F02C0EA} 
- DEFINE_GUID(DXFILEOBJ_PatchMesh9,  
- 0xb9ec94e1, 0xb9a6, 0x4251, 0xba, 0x18, 0x94, 0x89, 0x3f, 0x2, 0xc0, 0xea); 
-   
- // {B6C3E656-EC8B-4b92-9B62-681659522947} 
- DEFINE_GUID(DXFILEOBJ_PMInfo,  
- 0xb6c3e656, 0xec8b, 0x4b92, 0x9b, 0x62, 0x68, 0x16, 0x59, 0x52, 0x29, 0x47); 
-   
- // {917E0427-C61E-4a14-9C64-AFE65F9E9844} 
- DEFINE_GUID(DXFILEOBJ_PMAttributeRange,  
- 0x917e0427, 0xc61e, 0x4a14, 0x9c, 0x64, 0xaf, 0xe6, 0x5f, 0x9e, 0x98, 0x44); 
-   
- // {574CCC14-F0B3-4333-822D-93E8A8A08E4C} 
- DEFINE_GUID(DXFILEOBJ_PMVSplitRecord, 
- 0x574ccc14, 0xf0b3, 0x4333, 0x82, 0x2d, 0x93, 0xe8, 0xa8, 0xa0, 0x8e, 0x4c); 
-   
- // {B6E70A0E-8EF9-4e83-94AD-ECC8B0C04897} 
- DEFINE_GUID(DXFILEOBJ_FVFData,  
- 0xb6e70a0e, 0x8ef9, 0x4e83, 0x94, 0xad, 0xec, 0xc8, 0xb0, 0xc0, 0x48, 0x97); 
-   
- // {F752461C-1E23-48f6-B9F8-8350850F336F} 
- DEFINE_GUID(DXFILEOBJ_VertexElement,  
- 0xf752461c, 0x1e23, 0x48f6, 0xb9, 0xf8, 0x83, 0x50, 0x85, 0xf, 0x33, 0x6f); 
-   
- // {BF22E553-292C-4781-9FEA-62BD554BDD93} 
- DEFINE_GUID(DXFILEOBJ_DeclData,  
- 0xbf22e553, 0x292c, 0x4781, 0x9f, 0xea, 0x62, 0xbd, 0x55, 0x4b, 0xdd, 0x93); 
-   
- // {F1CFE2B3-0DE3-4e28-AFA1-155A750A282D} 
- DEFINE_GUID(DXFILEOBJ_EffectFloats,  
- 0xf1cfe2b3, 0xde3, 0x4e28, 0xaf, 0xa1, 0x15, 0x5a, 0x75, 0xa, 0x28, 0x2d); 
-   
- // {D55B097E-BDB6-4c52-B03D-6051C89D0E42} 
- DEFINE_GUID(DXFILEOBJ_EffectString,  
- 0xd55b097e, 0xbdb6, 0x4c52, 0xb0, 0x3d, 0x60, 0x51, 0xc8, 0x9d, 0xe, 0x42); 
-   
- // {622C0ED0-956E-4da9-908A-2AF94F3CE716} 
- DEFINE_GUID(DXFILEOBJ_EffectDWord,  
- 0x622c0ed0, 0x956e, 0x4da9, 0x90, 0x8a, 0x2a, 0xf9, 0x4f, 0x3c, 0xe7, 0x16); 
-   
- // {3014B9A0-62F5-478c-9B86-E4AC9F4E418B} 
- DEFINE_GUID(DXFILEOBJ_EffectParamFloats,  
- 0x3014b9a0, 0x62f5, 0x478c, 0x9b, 0x86, 0xe4, 0xac, 0x9f, 0x4e, 0x41, 0x8b); 
-   
- // {1DBC4C88-94C1-46ee-9076-2C28818C9481} 
- DEFINE_GUID(DXFILEOBJ_EffectParamString,  
- 0x1dbc4c88, 0x94c1, 0x46ee, 0x90, 0x76, 0x2c, 0x28, 0x81, 0x8c, 0x94, 0x81); 
-   
- // {E13963BC-AE51-4c5d-B00F-CFA3A9D97CE5} 
- DEFINE_GUID(DXFILEOBJ_EffectParamDWord, 
- 0xe13963bc, 0xae51, 0x4c5d, 0xb0, 0xf, 0xcf, 0xa3, 0xa9, 0xd9, 0x7c, 0xe5); 
-   
- // {E331F7E4-0559-4cc2-8E99-1CEC1657928F} 
- DEFINE_GUID(DXFILEOBJ_EffectInstance,  
- 0xe331f7e4, 0x559, 0x4cc2, 0x8e, 0x99, 0x1c, 0xec, 0x16, 0x57, 0x92, 0x8f); 
-   
- // {9E415A43-7BA6-4a73-8743-B73D47E88476} 
- DEFINE_GUID(DXFILEOBJ_AnimTicksPerSecond,  
- 0x9e415a43, 0x7ba6, 0x4a73, 0x87, 0x43, 0xb7, 0x3d, 0x47, 0xe8, 0x84, 0x76); 
-   
- // {7F9B00B3-F125-4890-876E-1CFFBF697C4D} 
- DEFINE_GUID(DXFILEOBJ_CompressedAnimationSet,  
- 0x7f9b00b3, 0xf125, 0x4890, 0x87, 0x6e, 0x1c, 0x42, 0xbf, 0x69, 0x7c, 0x4d); 
-   
- #pragma pack(push, 1) 
- typedef struct _XFILECOMPRESSEDANIMATIONSET 
- { 
-     DWORD CompressedBlockSize; 
-     FLOAT TicksPerSec; 
-     DWORD PlaybackType; 
-     DWORD BufferLength; 
- } XFILECOMPRESSEDANIMATIONSET; 
- #pragma pack(pop) 
-   
- #define XSKINEXP_TEMPLATES \ 
-         "xof 0303txt 0032\ 
-         template XSkinMeshHeader \ 
-         { \ 
-             <3CF169CE-FF7C-44ab-93C0-F78F62D172E2> \ 
-             WORD nMaxSkinWeightsPerVertex; \ 
-             WORD nMaxSkinWeightsPerFace; \ 
-             WORD nBones; \ 
-         } \ 
-         template VertexDuplicationIndices \ 
-         { \ 
-             <B8D65549-D7C9-4995-89CF-53A9A8B031E3> \ 
-             DWORD nIndices; \ 
-             DWORD nOriginalVertices; \ 
-             array DWORD indices[nIndices]; \ 
-         } \ 
-         template FaceAdjacency \ 
-         { \ 
-             <A64C844A-E282-4756-8B80-250CDE04398C> \ 
-             DWORD nIndices; \ 
-             array DWORD indices[nIndices]; \ 
-         } \ 
-         template SkinWeights \ 
-         { \ 
-             <6F0D123B-BAD2-4167-A0D0-80224F25FABB> \ 
-             STRING transformNodeName; \ 
-             DWORD nWeights; \ 
-             array DWORD vertexIndices[nWeights]; \ 
-             array float weights[nWeights]; \ 
-             Matrix4x4 matrixOffset; \ 
-         } \ 
-         template Patch \ 
-         { \ 
-             <A3EB5D44-FC22-429D-9AFB-3221CB9719A6> \ 
-             DWORD nControlIndices; \ 
-             array DWORD controlIndices[nControlIndices]; \ 
-         } \ 
-         template PatchMesh \ 
-         { \ 
-             <D02C95CC-EDBA-4305-9B5D-1820D7704BBF> \ 
-             DWORD nVertices; \ 
-             array Vector vertices[nVertices]; \ 
-             DWORD nPatches; \ 
-             array Patch patches[nPatches]; \ 
-             [ ... ] \ 
-         } \ 
-         template PatchMesh9 \ 
-         { \ 
-             <B9EC94E1-B9A6-4251-BA18-94893F02C0EA> \ 
-             DWORD Type; \ 
-             DWORD Degree; \ 
-             DWORD Basis; \ 
-             DWORD nVertices; \ 
-             array Vector vertices[nVertices]; \ 
-             DWORD nPatches; \ 
-             array Patch patches[nPatches]; \ 
-             [ ... ] \ 
-         } " \ 
-         "template EffectFloats \ 
-         { \ 
-             <F1CFE2B3-0DE3-4e28-AFA1-155A750A282D> \ 
-             DWORD nFloats; \ 
-             array float Floats[nFloats]; \ 
-         } \ 
-         template EffectString \ 
-         { \ 
-             <D55B097E-BDB6-4c52-B03D-6051C89D0E42> \ 
-             STRING Value; \ 
-         } \ 
-         template EffectDWord \ 
-         { \ 
-             <622C0ED0-956E-4da9-908A-2AF94F3CE716> \ 
-             DWORD Value; \ 
-         } " \ 
-         "template EffectParamFloats \ 
-         { \ 
-             <3014B9A0-62F5-478c-9B86-E4AC9F4E418B> \ 
-             STRING ParamName; \ 
-             DWORD nFloats; \ 
-             array float Floats[nFloats]; \ 
-         } " \ 
-         "template EffectParamString \ 
-         { \ 
-             <1DBC4C88-94C1-46ee-9076-2C28818C9481> \ 
-             STRING ParamName; \ 
-             STRING Value; \ 
-         } \ 
-         template EffectParamDWord \ 
-         { \ 
-             <E13963BC-AE51-4c5d-B00F-CFA3A9D97CE5> \ 
-             STRING ParamName; \ 
-             DWORD Value; \ 
-         } \ 
-         template EffectInstance \ 
-         { \ 
-             <E331F7E4-0559-4cc2-8E99-1CEC1657928F> \ 
-             STRING EffectFilename; \ 
-             [ ... ] \ 
-         } " \ 
-         "template AnimTicksPerSecond \ 
-         { \ 
-             <9E415A43-7BA6-4a73-8743-B73D47E88476> \ 
-             DWORD AnimTicksPerSecond; \ 
-         } \ 
-         template CompressedAnimationSet \ 
-         { \ 
-             <7F9B00B3-F125-4890-876E-1C42BF697C4D> \ 
-             DWORD CompressedBlockSize; \ 
-             FLOAT TicksPerSec; \ 
-             DWORD PlaybackType; \ 
-             DWORD BufferLength; \ 
-             array DWORD CompressedData[BufferLength]; \ 
-         } " 
-   
- #define XEXTENSIONS_TEMPLATES \ 
-         "xof 0303txt 0032\ 
-         template FVFData \ 
-         { \ 
-             <B6E70A0E-8EF9-4e83-94AD-ECC8B0C04897> \ 
-             DWORD dwFVF; \ 
-             DWORD nDWords; \ 
-             array DWORD data[nDWords]; \ 
-         } \ 
-         template VertexElement \ 
-         { \ 
-             <F752461C-1E23-48f6-B9F8-8350850F336F> \ 
-             DWORD Type; \ 
-             DWORD Method; \ 
-             DWORD Usage; \ 
-             DWORD UsageIndex; \ 
-         } \ 
-         template DeclData \ 
-         { \ 
-             <BF22E553-292C-4781-9FEA-62BD554BDD93> \ 
-             DWORD nElements; \ 
-             array VertexElement Elements[nElements]; \ 
-             DWORD nDWords; \ 
-             array DWORD data[nDWords]; \ 
-         } \ 
-         template PMAttributeRange \ 
-         { \ 
-             <917E0427-C61E-4a14-9C64-AFE65F9E9844> \ 
-             DWORD iFaceOffset; \ 
-             DWORD nFacesMin; \ 
-             DWORD nFacesMax; \ 
-             DWORD iVertexOffset; \ 
-             DWORD nVerticesMin; \ 
-             DWORD nVerticesMax; \ 
-         } \ 
-         template PMVSplitRecord \ 
-         { \ 
-             <574CCC14-F0B3-4333-822D-93E8A8A08E4C> \ 
-             DWORD iFaceCLW; \ 
-             DWORD iVlrOffset; \ 
-             DWORD iCode; \ 
-         } \ 
-         template PMInfo \ 
-         { \ 
-             <B6C3E656-EC8B-4b92-9B62-681659522947> \ 
-             DWORD nAttributes; \ 
-             array PMAttributeRange attributeRanges[nAttributes]; \ 
-             DWORD nMaxValence; \ 
-             DWORD nMinLogicalVertices; \ 
-             DWORD nMaxLogicalVertices; \ 
-             DWORD nVSplits; \ 
-             array PMVSplitRecord splitRecords[nVSplits]; \ 
-             DWORD nAttributeMispredicts; \ 
-             array DWORD attributeMispredicts[nAttributeMispredicts]; \ 
-         } " 
-          
- #endif //__D3DX9MESH_H__ 
-   
-   
-