////////////////////////////////////////////////////////////////////////////// // // 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__ #include "d3d9fftypes.h" #include "dxfile.h" // {4F5621A3-7F25-46dc-8239-820B823795CB} DEFINE_GUID(IID_ID3DXBaseMesh, 0x4f5621a3, 0x7f25, 0x46dc, 0x82, 0x39, 0x82, 0xb, 0x82, 0x37, 0x95, 0xcb); // {29E3EB8D-4DD6-4524-B1A2-1EF0581E778D} DEFINE_GUID(IID_ID3DXMesh, 0x29e3eb8d, 0x4dd6, 0x4524, 0xb1, 0xa2, 0x1e, 0xf0, 0x58, 0x1e, 0x77, 0x8d); // {1da4801f-a26e-4623-bd5471ff57f4bd02} DEFINE_GUID(IID_ID3DXPMesh, 0x1da4801f, 0xa26e, 0x4623, 0xbd, 0x54, 0x71, 0xff, 0x57, 0xf4, 0xbd, 0x2); // {1C4E77C5-8391-4951-A019-D4C5A9539EEC} DEFINE_GUID(IID_ID3DXSPMesh, 0x1c4e77c5, 0x8391, 0x4951, 0xa0, 0x19, 0xd4, 0xc5, 0xa9, 0x53, 0x9e, 0xec); // {0E7DBBF3-421A-4dd8-B738-A5DAC3A48767} DEFINE_GUID(IID_ID3DXSkinInfo, 0xe7dbbf3, 0x421a, 0x4dd8, 0xb7, 0x38, 0xa5, 0xda, 0xc3, 0xa4, 0x87, 0x67); // {0AD3E8BC-290D-4dc7-91AB-73A82755B13E} DEFINE_GUID(IID_ID3DXPatchMesh, 0xad3e8bc, 0x290d, 0x4dc7, 0x91, 0xab, 0x73, 0xa8, 0x27, 0x55, 0xb1, 0x3e); //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 // Begin internal D3DXMESH_VALIDBITS = 0x1cfff, D3DXMESH_VALIDCLONEBITS = 0x1dfff, D3DXMESH_VALIDBLENDEDBITS = 0x1efff, // End internal }; //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, // begin internal D3DXMESHSIMP_VALIDBITS =0x03 // end internal }; enum _MAX_FVF_DECL_SIZE { MAX_FVF_DECL_SIZE = MAXD3DDECLLENGTH + 1 // +1 for END }; 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 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 // begin internal D3DXWELDEPSILONS_VALIDBITS = 0xf, // end internal }; 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, __deref_out 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_ __out_ecount(MAX_FVF_DECL_SIZE) D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; STDMETHOD_(DWORD, GetNumBytesPerVertex)(THIS) PURE; STDMETHOD_(DWORD, GetOptions)(THIS) PURE; STDMETHOD(GetDevice)(THIS_ __deref_out LPDIRECT3DDEVICE9* ppDevice) PURE; STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, DWORD FVF, __in LPDIRECT3DDEVICE9 pD3DDevice, __deref_out LPD3DXMESH* ppCloneMesh) PURE; STDMETHOD(CloneMesh)(THIS_ DWORD Options, __in CONST D3DVERTEXELEMENT9 *pDeclaration, __in LPDIRECT3DDEVICE9 pD3DDevice, __deref_out LPD3DXMESH* ppCloneMesh) PURE; STDMETHOD(GetVertexBuffer)(THIS_ __deref_out LPDIRECT3DVERTEXBUFFER9* ppVB) PURE; STDMETHOD(GetIndexBuffer)(THIS_ __deref_out LPDIRECT3DINDEXBUFFER9* ppIB) PURE; STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, __deref_out LPVOID *ppData) PURE; STDMETHOD(UnlockVertexBuffer)(THIS) PURE; STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, __deref_out LPVOID *ppData) PURE; STDMETHOD(UnlockIndexBuffer)(THIS) PURE; STDMETHOD(GetAttributeTable)( THIS_ __out_ecount_opt(*pAttribTableSize) D3DXATTRIBUTERANGE *pAttribTable, __inout DWORD* pAttribTableSize) PURE; STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ __in CONST DWORD* pPRep, __out DWORD* pAdjacency) PURE; STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ __in CONST DWORD* pAdjacency, __out DWORD* pPRep) PURE; STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, __out DWORD* pAdjacency) PURE; STDMETHOD(UpdateSemantics)(THIS_ __in_ecount(MAX_FVF_DECL_SIZE) D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; }; #undef INTERFACE #define INTERFACE ID3DXMesh DECLARE_INTERFACE_(ID3DXMesh, ID3DXBaseMesh) { // IUnknown STDMETHOD(QueryInterface)(THIS_ REFIID iid, __deref_out 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_ __out_ecount(MAX_FVF_DECL_SIZE) D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; STDMETHOD_(DWORD, GetNumBytesPerVertex)(THIS) PURE; STDMETHOD_(DWORD, GetOptions)(THIS) PURE; STDMETHOD(GetDevice)(THIS_ __deref_out LPDIRECT3DDEVICE9* ppDevice) PURE; STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, DWORD FVF, __in LPDIRECT3DDEVICE9 pD3DDevice, __deref_out LPD3DXMESH* ppCloneMesh) PURE; STDMETHOD(CloneMesh)(THIS_ DWORD Options, __in CONST D3DVERTEXELEMENT9 *pDeclaration, __in LPDIRECT3DDEVICE9 pD3DDevice, __deref_out LPD3DXMESH* ppCloneMesh) PURE; STDMETHOD(GetVertexBuffer)(THIS_ __deref_out LPDIRECT3DVERTEXBUFFER9* ppVB) PURE; STDMETHOD(GetIndexBuffer)(THIS_ __deref_out LPDIRECT3DINDEXBUFFER9* ppIB) PURE; STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, __deref_out LPVOID *ppData) PURE; STDMETHOD(UnlockVertexBuffer)(THIS) PURE; STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, __deref_out LPVOID *ppData) PURE; STDMETHOD(UnlockIndexBuffer)(THIS) PURE; STDMETHOD(GetAttributeTable)( THIS_ __out_ecount_opt(*pAttribTableSize) D3DXATTRIBUTERANGE *pAttribTable, __inout DWORD* pAttribTableSize) PURE; STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ __in CONST DWORD* pPRep, __out DWORD* pAdjacency) PURE; STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ __in CONST DWORD* pAdjacency, __out DWORD* pPRep) PURE; STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, __out DWORD* pAdjacency) PURE; STDMETHOD(UpdateSemantics)(THIS_ __in_ecount(MAX_FVF_DECL_SIZE) D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; // ID3DXMesh STDMETHOD(LockAttributeBuffer)(THIS_ DWORD Flags, __deref_out DWORD** ppData) PURE; STDMETHOD(UnlockAttributeBuffer)(THIS) PURE; STDMETHOD(Optimize)(THIS_ DWORD Flags, __in_opt CONST DWORD* pAdjacencyIn, __out_opt DWORD* pAdjacencyOut, __out_opt DWORD* pFaceRemap, __deref_opt_out LPD3DXBUFFER *ppVertexRemap, __deref_out LPD3DXMESH* ppOptMesh) PURE; STDMETHOD(OptimizeInplace)(THIS_ DWORD Flags, __in_opt CONST DWORD* pAdjacencyIn, __out_opt DWORD* pAdjacencyOut, __out_opt DWORD* pFaceRemap, __deref_opt_out LPD3DXBUFFER *ppVertexRemap) PURE; STDMETHOD(SetAttributeTable)(THIS_ __in_ecount(cAttribTableSize) CONST D3DXATTRIBUTERANGE *pAttribTable, DWORD cAttribTableSize) PURE; }; #undef INTERFACE #define INTERFACE ID3DXPMesh DECLARE_INTERFACE_(ID3DXPMesh, ID3DXBaseMesh) { // IUnknown STDMETHOD(QueryInterface)(THIS_ REFIID iid, __deref_out 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_ __out_ecount(MAX_FVF_DECL_SIZE) D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; STDMETHOD_(DWORD, GetNumBytesPerVertex)(THIS) PURE; STDMETHOD_(DWORD, GetOptions)(THIS) PURE; STDMETHOD(GetDevice)(THIS_ __deref_out LPDIRECT3DDEVICE9* ppDevice) PURE; STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, DWORD FVF, __in LPDIRECT3DDEVICE9 pD3DDevice, __deref_out LPD3DXMESH* ppCloneMesh) PURE; STDMETHOD(CloneMesh)(THIS_ DWORD Options, __in CONST D3DVERTEXELEMENT9 *pDeclaration, __in LPDIRECT3DDEVICE9 pD3DDevice, __deref_out LPD3DXMESH* ppCloneMesh) PURE; STDMETHOD(GetVertexBuffer)(THIS_ __deref_out LPDIRECT3DVERTEXBUFFER9* ppVB) PURE; STDMETHOD(GetIndexBuffer)(THIS_ __deref_out LPDIRECT3DINDEXBUFFER9* ppIB) PURE; STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, __deref_out LPVOID *ppData) PURE; STDMETHOD(UnlockVertexBuffer)(THIS) PURE; STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, __deref_out LPVOID *ppData) PURE; STDMETHOD(UnlockIndexBuffer)(THIS) PURE; STDMETHOD(GetAttributeTable)( THIS_ __out_ecount_opt(*pAttribTableSize) D3DXATTRIBUTERANGE *pAttribTable, __inout DWORD* pAttribTableSize) PURE; STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ __in CONST DWORD* pPRep, __out DWORD* pAdjacency) PURE; STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ __in CONST DWORD* pAdjacency, __out DWORD* pPRep) PURE; STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, __out DWORD* pAdjacency) PURE; STDMETHOD(UpdateSemantics)(THIS_ __in_ecount(MAX_FVF_DECL_SIZE) D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; // ID3DXPMesh STDMETHOD(ClonePMeshFVF)(THIS_ DWORD Options, DWORD FVF, __in LPDIRECT3DDEVICE9 pD3D, __deref_out LPD3DXPMESH* ppCloneMesh) PURE; STDMETHOD(ClonePMesh)(THIS_ DWORD Options, __in CONST D3DVERTEXELEMENT9 *pDeclaration, __in LPDIRECT3DDEVICE9 pD3D, __deref_out 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_ __in IStream *pStream, __in_ecount_opt(NumMaterials) CONST D3DXMATERIAL* pMaterials, __in_opt CONST D3DXEFFECTINSTANCE* pEffectInstances, DWORD NumMaterials) PURE; STDMETHOD(Optimize)(THIS_ DWORD Flags, __out_opt DWORD* pAdjacencyOut, __out_opt DWORD* pFaceRemap, __deref_opt_out LPD3DXBUFFER *ppVertexRemap, __deref_out LPD3DXMESH* ppOptMesh) PURE; STDMETHOD(OptimizeBaseLOD)(THIS_ DWORD Flags, __out_opt DWORD* pFaceRemap) PURE; STDMETHOD(TrimByFaces)(THIS_ DWORD NewFacesMin, DWORD NewFacesMax, __out_opt DWORD *rgiFaceRemap, __out_opt DWORD *rgiVertRemap) PURE; STDMETHOD(TrimByVertices)(THIS_ DWORD NewVerticesMin, DWORD NewVerticesMax, __out_opt DWORD *rgiFaceRemap, __out_opt DWORD *rgiVertRemap) PURE; STDMETHOD(GetAdjacency)(THIS_ __out 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_ __out DWORD* pVertexHistory) PURE; }; #undef INTERFACE #define INTERFACE ID3DXSPMesh DECLARE_INTERFACE_(ID3DXSPMesh, IUnknown) { // IUnknown STDMETHOD(QueryInterface)(THIS_ REFIID iid, __deref_out 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_ __out_ecount(MAX_FVF_DECL_SIZE) D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; STDMETHOD_(DWORD, GetOptions)(THIS) PURE; STDMETHOD(GetDevice)(THIS_ __deref_out LPDIRECT3DDEVICE9* ppDevice) PURE; STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options, DWORD FVF, __in LPDIRECT3DDEVICE9 pD3D, __out_opt DWORD *pAdjacencyOut, __out_opt DWORD *pVertexRemapOut, __deref_out LPD3DXMESH* ppCloneMesh) PURE; STDMETHOD(CloneMesh)(THIS_ DWORD Options, __in CONST D3DVERTEXELEMENT9 *pDeclaration, __in LPDIRECT3DDEVICE9 pD3DDevice, __out_opt DWORD *pAdjacencyOut, __out_opt DWORD *pVertexRemapOut, __deref_out LPD3DXMESH* ppCloneMesh) PURE; STDMETHOD(ClonePMeshFVF)(THIS_ DWORD Options, DWORD FVF, __in LPDIRECT3DDEVICE9 pD3D, __out_opt DWORD *pVertexRemapOut, __out_opt FLOAT *pErrorsByFace, __deref_out LPD3DXPMESH* ppCloneMesh) PURE; STDMETHOD(ClonePMesh)(THIS_ DWORD Options, __in CONST D3DVERTEXELEMENT9 *pDeclaration, __in LPDIRECT3DDEVICE9 pD3D, __out_opt DWORD *pVertexRemapOut, __out_opt FLOAT *pErrorsbyFace, __deref_out 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_ __out LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights) PURE; STDMETHOD(GetVertexWeights)(THIS_ __out 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 // Start of internal data // NOTE: DEVICEINDEPENDENT is using a bit from the D3DXMESH_* flag space D3DXMESHOPT_VALIDBITS = 0x3f401000, D3DXMESHOPTINT_ALREADYATTRSORTED = 0x40000000, D3DXMESHOPTINT_INVERTFACEREMAP = 0x80000000, D3DXMESHOPTINT_PMESHSAVE = 0x00800000, // NOTE: a bit from the D3DXMESH_* flag space D3DXMESHOPTINT_VALIDBITS = 0xffc01000, // end of internal data }; // 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, __deref_out 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_ __out LPD3DVERTEXELEMENT9) PURE; STDMETHOD_(DWORD, GetControlVerticesPerPatch)(THIS) PURE; STDMETHOD_(DWORD, GetOptions)(THIS) PURE; STDMETHOD(GetDevice)(THIS_ __deref_out LPDIRECT3DDEVICE9 *ppDevice) PURE; STDMETHOD(GetPatchInfo)(THIS_ __out LPD3DXPATCHINFO PatchInfo) PURE; // Control mesh access STDMETHOD(GetVertexBuffer)(THIS_ __deref_out LPDIRECT3DVERTEXBUFFER9* ppVB) PURE; STDMETHOD(GetIndexBuffer)(THIS_ __deref_out LPDIRECT3DINDEXBUFFER9* ppIB) PURE; STDMETHOD(LockVertexBuffer)(THIS_ DWORD flags, __deref_out LPVOID *ppData) PURE; STDMETHOD(UnlockVertexBuffer)(THIS) PURE; STDMETHOD(LockIndexBuffer)(THIS_ DWORD flags, __deref_out LPVOID *ppData) PURE; STDMETHOD(UnlockIndexBuffer)(THIS) PURE; STDMETHOD(LockAttributeBuffer)(THIS_ DWORD flags, __deref_out 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 Adapative, __out DWORD *NumTriangles, __out 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, __in_opt CONST D3DVERTEXELEMENT9 *pDecl, __deref_out 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_ __in LPDIRECT3DBASETEXTURE9 Texture, D3DTEXTUREFILTERTYPE MinFilter, D3DTEXTUREFILTERTYPE MagFilter, D3DTEXTUREFILTERTYPE MipFilter, D3DTEXTUREADDRESS Wrap, DWORD dwLODBias) PURE; STDMETHOD(GetDisplaceParam)(THIS_ __deref_out LPDIRECT3DBASETEXTURE9 *Texture, __out D3DTEXTUREFILTERTYPE *MinFilter, __out D3DTEXTUREFILTERTYPE *MagFilter, __out D3DTEXTUREFILTERTYPE *MipFilter, __out D3DTEXTUREADDRESS *Wrap, __out 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, __inout 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_ __in CONST D3DXVECTOR4 *pTrans, DWORD dwMaxTessLevel, DWORD dwMinTessLevel, __inout LPD3DXMESH pMesh) PURE; }; #undef INTERFACE #define INTERFACE ID3DXSkinInfo DECLARE_INTERFACE_(ID3DXSkinInfo, IUnknown) { // IUnknown STDMETHOD(QueryInterface)(THIS_ REFIID iid, __deref_out 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, __in_ecount(numInfluences) CONST DWORD* vertices, __in_ecount(numInfluences) CONST FLOAT* weights) PURE; STDMETHOD_(DWORD, GetNumBoneInfluences)(THIS_ DWORD bone) PURE; STDMETHOD(GetBoneInfluence)(THIS_ DWORD bone, __out DWORD* vertices, __out FLOAT* weights) PURE; STDMETHOD(GetMaxVertexInfluences)(THIS_ __out DWORD* maxVertexInfluences) PURE; STDMETHOD_(DWORD, GetNumBones)(THIS) PURE; // This gets the max face influences based on a triangle mesh with the specified index buffer STDMETHOD(GetMaxFaceInfluences)(THIS_ __in LPDIRECT3DINDEXBUFFER9 pIB, DWORD NumFaces, __out 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, __in_z LPCSTR pName) PURE; // pName is copied to an internal string buffer STDMETHOD_(__out_z 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, __in CONST D3DXMATRIX *pBoneTransform) PURE; // pBoneTransform is copied to an internal buffer STDMETHOD_(__out 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_ __deref_out 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, __in_ecount(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_ __in CONST D3DVERTEXELEMENT9 *pDeclaration) PURE; STDMETHOD_(DWORD, GetFVF)(THIS) PURE; STDMETHOD(GetDeclaration)(THIS_ __out_ecount(MAX_FVF_DECL_SIZE) D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE; // Apply SW skinning based on current pose matrices to the target vertices. STDMETHOD(UpdateSkinnedMesh)(THIS_ __in CONST D3DXMATRIX* pBoneTransforms, __in CONST D3DXMATRIX* pBoneInvTransposeTransforms, __in LPCVOID pVerticesSrc, __out 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_ __in LPD3DXMESH pMesh, DWORD Options, __in CONST DWORD *pAdjacencyIn, __out LPDWORD pAdjacencyOut, __out_opt DWORD* pFaceRemap, __deref_opt_out LPD3DXBUFFER *ppVertexRemap, __out DWORD* pMaxFaceInfl, __out DWORD* pNumBoneCombinations, __deref_out LPD3DXBUFFER* ppBoneCombinationTable, __deref_out 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_ __in LPD3DXMESH pMesh, DWORD Options, DWORD paletteSize, __in CONST DWORD *pAdjacencyIn, __out LPDWORD pAdjacencyOut, __out_opt DWORD* pFaceRemap, __deref_opt_out LPD3DXBUFFER *ppVertexRemap, __out DWORD* pMaxVertexInfl, __out DWORD* pNumBoneCombinations, __deref_out LPD3DXBUFFER* ppBoneCombinationTable, __deref_out LPD3DXMESH* ppMesh) PURE; }; #ifdef __cplusplus extern "C" { #endif //__cplusplus HRESULT WINAPI D3DXCreateMesh( DWORD NumFaces, DWORD NumVertices, DWORD Options, __in CONST D3DVERTEXELEMENT9 *pDeclaration, __in LPDIRECT3DDEVICE9 pD3D, __deref_out LPD3DXMESH* ppMesh); HRESULT WINAPI D3DXCreateMeshFVF( DWORD NumFaces, DWORD NumVertices, DWORD Options, DWORD FVF, __in LPDIRECT3DDEVICE9 pD3D, __deref_out LPD3DXMESH* ppMesh); HRESULT WINAPI D3DXCreateSPMesh( __in LPD3DXMESH pMesh, __in CONST DWORD* pAdjacency, __in_opt CONST D3DXATTRIBUTEWEIGHTS *pVertexAttributeWeights, __in_opt CONST FLOAT *pVertexWeights, __deref_out LPD3DXSPMESH* ppSMesh); // clean a mesh up for simplification, try to make manifold HRESULT WINAPI D3DXCleanMesh( __in LPD3DXMESH pMeshIn, __in CONST DWORD* pAdjacencyIn, __deref_out LPD3DXMESH* ppMeshOut, __out DWORD* pAdjacencyOut, __deref_opt_out LPD3DXBUFFER* ppErrorsAndWarnings); HRESULT WINAPI D3DXValidMesh( __in LPD3DXMESH pMeshIn, __in CONST DWORD* pAdjacency, __deref_opt_out LPD3DXBUFFER* ppErrorsAndWarnings); HRESULT WINAPI D3DXGeneratePMesh( __in LPD3DXMESH pMesh, __in CONST DWORD* pAdjacency, __in_opt CONST D3DXATTRIBUTEWEIGHTS *pVertexAttributeWeights, __in_opt CONST FLOAT *pVertexWeights, DWORD MinValue, DWORD Options, __deref_out LPD3DXPMESH* ppPMesh); HRESULT WINAPI D3DXSimplifyMesh( __in LPD3DXMESH pMesh, __in CONST DWORD* pAdjacency, __in_opt CONST D3DXATTRIBUTEWEIGHTS *pVertexAttributeWeights, __in_opt CONST FLOAT *pVertexWeights, DWORD MinValue, DWORD Options, __deref_out LPD3DXMESH* ppMesh); HRESULT WINAPI D3DXComputeBoundingSphere( __in CONST D3DXVECTOR3 *pFirstPosition, // pointer to first position DWORD NumVertices, DWORD dwStride, // count in bytes to subsequent position vectors __out D3DXVECTOR3 *pCenter, __out FLOAT *pRadius); HRESULT WINAPI D3DXComputeBoundingBox( __in CONST D3DXVECTOR3 *pFirstPosition, // pointer to first position DWORD NumVertices, DWORD dwStride, // count in bytes to subsequent position vectors __out D3DXVECTOR3 *pMin, __out D3DXVECTOR3 *pMax); HRESULT WINAPI D3DXComputeNormals( __inout LPD3DXBASEMESH pMesh, __in_opt CONST DWORD *pAdjacency); HRESULT WINAPI D3DXCreateBuffer( DWORD NumBytes, __deref_out LPD3DXBUFFER *ppBuffer); HRESULT WINAPI D3DXLoadMeshFromXA( __in_z LPCSTR pFilename, DWORD Options, __in LPDIRECT3DDEVICE9 pD3D, __deref_opt_out LPD3DXBUFFER *ppAdjacency, __deref_opt_out LPD3DXBUFFER *ppMaterials, __deref_opt_out LPD3DXBUFFER *ppEffectInstances, __out_opt DWORD *pNumMaterials, __deref_out LPD3DXMESH *ppMesh); HRESULT WINAPI D3DXLoadMeshFromXW( __in_z LPCWSTR pFilename, DWORD Options, __in LPDIRECT3DDEVICE9 pD3D, __deref_opt_out LPD3DXBUFFER *ppAdjacency, __deref_opt_out LPD3DXBUFFER *ppMaterials, __deref_opt_out LPD3DXBUFFER *ppEffectInstances, __out_opt DWORD *pNumMaterials, __deref_out LPD3DXMESH *ppMesh); #ifdef UNICODE #define D3DXLoadMeshFromX D3DXLoadMeshFromXW #else #define D3DXLoadMeshFromX D3DXLoadMeshFromXA #endif HRESULT WINAPI D3DXLoadMeshFromXInMemory( __in_bcount(SizeOfMemory) LPCVOID Memory, DWORD SizeOfMemory, DWORD Options, __in LPDIRECT3DDEVICE9 pD3D, __deref_opt_out LPD3DXBUFFER *ppAdjacency, __deref_opt_out LPD3DXBUFFER *ppMaterials, __deref_opt_out LPD3DXBUFFER *ppEffectInstances, __out_opt DWORD *pNumMaterials, __deref_out LPD3DXMESH *ppMesh); HRESULT WINAPI D3DXLoadMeshFromXResource( __in HMODULE Module, __in_z LPCSTR Name, __in_z LPCSTR Type, DWORD Options, __in LPDIRECT3DDEVICE9 pD3D, __deref_opt_out LPD3DXBUFFER *ppAdjacency, __deref_opt_out LPD3DXBUFFER *ppMaterials, __deref_opt_out LPD3DXBUFFER *ppEffectInstances, __out_opt DWORD *pNumMaterials, __deref_out LPD3DXMESH *ppMesh); HRESULT WINAPI D3DXSaveMeshToXA( __in_z LPCSTR pFilename, __in LPD3DXMESH pMesh, __in_opt CONST DWORD* pAdjacency, __in_opt CONST D3DXMATERIAL* pMaterials, __in_opt CONST D3DXEFFECTINSTANCE* pEffectInstances, DWORD NumMaterials, DWORD Format ); HRESULT WINAPI D3DXSaveMeshToXW( __in_z LPCWSTR pFilename, __in LPD3DXMESH pMesh, __in_opt CONST DWORD* pAdjacency, __in_opt CONST D3DXMATERIAL* pMaterials, __in_opt CONST D3DXEFFECTINSTANCE* pEffectInstances, DWORD NumMaterials, DWORD Format ); #ifdef UNICODE #define D3DXSaveMeshToX D3DXSaveMeshToXW #else #define D3DXSaveMeshToX D3DXSaveMeshToXA #endif HRESULT WINAPI D3DXCreatePMeshFromStream( __in IStream *pStream, DWORD Options, __in LPDIRECT3DDEVICE9 pD3DDevice, __deref_opt_out LPD3DXBUFFER *ppMaterials, __deref_opt_out LPD3DXBUFFER *ppEffectInstances, __out_opt DWORD* pNumMaterials, __deref_out 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, __in CONST D3DVERTEXELEMENT9 *pDeclaration, DWORD NumBones, __deref_out 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, __deref_out LPD3DXSKININFO* ppSkinInfo); #ifdef __cplusplus } extern "C" { #endif //__cplusplus HRESULT WINAPI D3DXLoadMeshFromXof( __in LPDIRECTXFILEDATA pXofObjMesh, DWORD Options, __in LPDIRECT3DDEVICE9 pD3DDevice, __deref_opt_out LPD3DXBUFFER *ppAdjacency, __deref_opt_out LPD3DXBUFFER *ppMaterials, __deref_opt_out LPD3DXBUFFER *ppEffectInstances, __out_opt DWORD *pNumMaterials, __deref_out 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( __in LPDIRECTXFILEDATA pxofobjMesh, DWORD Options, __in LPDIRECT3DDEVICE9 pD3D, __deref_opt_out LPD3DXBUFFER* ppAdjacency, __deref_opt_out LPD3DXBUFFER* ppMaterials, __deref_opt_out LPD3DXBUFFER *ppEffectInstances, __out_opt DWORD *pMatOut, __deref_out LPD3DXSKININFO* ppSkinInfo, __deref_out 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( __in LPD3DXBASEMESH pMesh, DWORD NumBoneCombinations, __in_ecount(NumBoneCombinations) CONST D3DXBONECOMBINATION *pBoneCombinationTable, __deref_out LPD3DXSKININFO* ppSkinInfo); HRESULT WINAPI D3DXTessellateNPatches( __in LPD3DXMESH pMeshIn, __in_opt CONST DWORD* pAdjacencyIn, FLOAT NumSegs, BOOL QuadraticInterpNormals, // if false use linear intrep for normals, if true use quadratic __deref_out LPD3DXMESH *ppMeshOut, __deref_opt_out 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( __out D3DVERTEXELEMENT9 *pOutput, __in 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( __in LPDIRECTXFILEDATA pXofObjMesh, DWORD Options, __in LPDIRECT3DDEVICE9 pDevice, __deref_opt_out LPD3DXBUFFER *ppMaterials, __deref_opt_out LPD3DXBUFFER *ppEffectInstances, __out_opt PDWORD pNumMaterials, __deref_out LPD3DXPATCHMESH *ppMesh); //computes the size a single rect patch. HRESULT WINAPI D3DXRectPatchSize( __in CONST FLOAT *pfNumSegs, //segments for each edge (4) __out DWORD *pdwTriangles, //output number of triangles __out DWORD *pdwVertices); //output number of vertices //computes the size of a single triangle patch HRESULT WINAPI D3DXTriPatchSize( __in CONST FLOAT *pfNumSegs, //segments for each edge (3) __out DWORD *pdwTriangles, //output number of triangles __out DWORD *pdwVertices); //output number of vertices //tessellates a patch into a created mesh //similar to D3D RT patch HRESULT WINAPI D3DXTessellateRectPatch( __in LPDIRECT3DVERTEXBUFFER9 pVB, __in CONST FLOAT *pNumSegs, __in CONST D3DVERTEXELEMENT9 *pdwInDecl, __in CONST D3DRECTPATCH_INFO *pRectPatchInfo, __inout LPD3DXMESH pMesh); HRESULT WINAPI D3DXTessellateTriPatch( __in LPDIRECT3DVERTEXBUFFER9 pVB, __in CONST FLOAT *pNumSegs, __in CONST D3DVERTEXELEMENT9 *pInDecl, __in CONST D3DTRIPATCH_INFO *pTriPatchInfo, __inout LPD3DXMESH pMesh); //creates an NPatch PatchMesh from a D3DXMESH HRESULT WINAPI D3DXCreateNPatchMesh( __in LPD3DXMESH pMeshSysMem, __deref_out LPD3DXPATCHMESH *ppPatchMesh); //creates a patch mesh HRESULT WINAPI D3DXCreatePatchMesh( __in CONST D3DXPATCHINFO *pInfo, //patch type DWORD dwNumPatches, //number of patches DWORD dwNumVertices, //number of control vertices DWORD dwOptions, //options __in CONST D3DVERTEXELEMENT9 *pDecl, //format of control vertices __in LPDIRECT3DDEVICE9 pDevice, __deref_out LPD3DXPATCHMESH *ppPatchMesh); //returns the number of degenerates in a patch mesh - //text output put in string. HRESULT WINAPI D3DXValidPatchMesh(__in LPD3DXPATCHMESH pMesh, __out DWORD *dwcDegenerateVertices, __out DWORD *dwcDegeneratePatches, __deref_opt_out LPD3DXBUFFER *ppErrorsAndWarnings); UINT WINAPI D3DXGetFVFVertexSize(DWORD FVF); UINT WINAPI D3DXGetDeclVertexSize(__in CONST D3DVERTEXELEMENT9 *pDecl,DWORD Stream); UINT WINAPI D3DXGetDeclLength(__in CONST D3DVERTEXELEMENT9 *pDecl); HRESULT WINAPI D3DXDeclaratorFromFVF( DWORD FVF, __out D3DVERTEXELEMENT9 pDeclarator[MAX_FVF_DECL_SIZE]); HRESULT WINAPI D3DXFVFFromDeclarator( __in CONST D3DVERTEXELEMENT9 *pDeclarator, __out DWORD *pFVF); HRESULT WINAPI D3DXWeldVertices( __inout LPD3DXMESH pMesh, DWORD Flags, __in_opt CONST D3DXWELDEPSILONS *pEpsilons, __in_opt CONST DWORD *pAdjacencyIn, __out_opt DWORD *pAdjacencyOut, __out_opt DWORD *pFaceRemap, __deref_opt_out 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( __in LPD3DXBASEMESH pMesh, __in CONST D3DXVECTOR3 *pRayPos, __in CONST D3DXVECTOR3 *pRayDir, __out BOOL *pHit, // True if any faces were intersected __out_opt DWORD *pFaceIndex, // index of closest face intersected __out_opt FLOAT *pU, // Barycentric Hit Coordinates __out_opt FLOAT *pV, // Barycentric Hit Coordinates __out_opt FLOAT *pDist, // Ray-Intersection Parameter Distance __deref_opt_out LPD3DXBUFFER *ppAllHits, // Array of D3DXINTERSECTINFOs for all hits (not just closest) __out_opt DWORD *pCountOfHits); // Number of entries in AllHits array HRESULT WINAPI D3DXIntersectSubset( __in LPD3DXBASEMESH pMesh, DWORD AttribId, __in CONST D3DXVECTOR3 *pRayPos, __in CONST D3DXVECTOR3 *pRayDir, __out BOOL *pHit, // True if any faces were intersected __out_opt DWORD *pFaceIndex, // index of closest face intersected __out_opt FLOAT *pU, // Barycentric Hit Coordinates __out_opt FLOAT *pV, // Barycentric Hit Coordinates __out_opt FLOAT *pDist, // Ray-Intersection Parameter Distance __deref_opt_out LPD3DXBUFFER *ppAllHits, // Array of D3DXINTERSECTINFOs for all hits (not just closest) __out_opt DWORD *pCountOfHits); // Number of entries in AllHits array HRESULT WINAPI D3DXSplitMesh ( __in LPD3DXMESH pMeshIn, __in_opt CONST DWORD *pAdjacencyIn, CONST DWORD MaxSize, CONST DWORD Options, __out DWORD *pMeshesOut, __deref_out LPD3DXBUFFER *ppMeshArrayOut, __deref_opt_out LPD3DXBUFFER *ppAdjacencyArrayOut, __deref_opt_out LPD3DXBUFFER *ppFaceRemapArrayOut, __deref_opt_out LPD3DXBUFFER *ppVertRemapArrayOut ); BOOL WINAPI D3DXIntersectTri ( __in CONST D3DXVECTOR3 *p0, // Triangle vertex 0 position __in CONST D3DXVECTOR3 *p1, // Triangle vertex 1 position __in CONST D3DXVECTOR3 *p2, // Triangle vertex 2 position __in CONST D3DXVECTOR3 *pRayPos, // Ray origin __in CONST D3DXVECTOR3 *pRayDir, // Ray direction __out_opt FLOAT *pU, // Barycentric Hit Coordinates __out_opt FLOAT *pV, // Barycentric Hit Coordinates __out_opt FLOAT *pDist); // Ray-Intersection Parameter Distance BOOL WINAPI D3DXSphereBoundProbe( __in CONST D3DXVECTOR3 *pCenter, FLOAT Radius, __in CONST D3DXVECTOR3 *pRayPosition, __in CONST D3DXVECTOR3 *pRayDirection); BOOL WINAPI D3DXBoxBoundProbe( __in CONST D3DXVECTOR3 *pMin, __in CONST D3DXVECTOR3 *pMax, __in CONST D3DXVECTOR3 *pRayPosition, __in CONST D3DXVECTOR3 *pRayDirection); //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(__in LPD3DXMESH Mesh, DWORD TexStage, DWORD TangentIndex, DWORD BinormIndex, DWORD Wrap, __in_opt CONST DWORD *pAdjacency); HRESULT WINAPI D3DXConvertMeshSubsetToSingleStrip( __in LPD3DXBASEMESH MeshIn, DWORD AttribId, DWORD IBOptions, __deref_out LPDIRECT3DINDEXBUFFER9 *ppIndexBuffer, __out_opt DWORD *pNumIndices); HRESULT WINAPI D3DXConvertMeshSubsetToStrips( __in LPD3DXBASEMESH MeshIn, DWORD AttribId, DWORD IBOptions, __deref_out LPDIRECT3DINDEXBUFFER9 *ppIndexBuffer, __out_opt DWORD *pNumIndices, __deref_opt_out LPD3DXBUFFER *ppStripLengths, __out_opt 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( __in LPCVOID pbIndices, UINT cFaces, UINT cVertices, BOOL b32BitIndices, __out_ecount(cFaces) 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( __in LPCVOID pbIndices, UINT cFaces, UINT cVertices, BOOL b32BitIndices, __out_ecount(cVertices) 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; // for all properties that are colors the red channel is used // if the simulator is run with bSpectral FALSE 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; typedef struct _D3DXSHPRTBUFFER_DESC { UINT NumSamples; // number of texels or vertices sampled UINT Order; // order of spherical harmonics used UINT NumChannels; UINT Width; UINT Height; } D3DXSHPRTBUFFER_DESC; typedef struct _D3DXSHPRTCOMPBUFFER_DESC { UINT SampleSize; UINT NumSamples; // number of texels or vertices sampled UINT NumClusters; UINT NumPCA; UINT Order; // order of spherical harmonics used UINT NumChannels; } D3DXSHPRTCOMPBUFFER_DESC; // 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); #ifdef __cplusplus extern "C" { #endif //__cplusplus //=========================================================================== // // Spherical Harmonic Precomputation Routines // // NOTE: // * These functions are intended for offline use, extraction routines can // be used at load time, but the simulators and compressor should only be // used when authoring content. // //============================================================================ //============================================================================ // // D3DXSHPRTSimulation: // -------------------- // Runs the PRT simulation on a set of input meshes using a corresponding // set of materials. This function can take a long time to run and should // only done offline. // // Parameters: // Order // Order of SH to use, generates Order^2 coeffs (Degree is Order - 1) // NumMeshes // Number of meshes in the scene, where each mesh has a unique material // ppScene // Meshes that represent the scene // ppMaterials // Materials for each corresponding mesh // NumRays // Number of rays to shoot at each vertex // NumBounces // Number of bounces simulated - if this is not zero inter-reflections // are computed // EnableSubSurf // Indicates whether or not Subsurface Scattering is to be used // LengthScale // Scale used for subsurface scattering (1 would be a 1mm cube) // EnableSpectral // TRUE enables color bleeding by computing RGB transfer vectors // FALSE just uses the red channel for material properties // ppSimulationResults // Buffer that is allocated and filled in by the simulator // pProgressCallback // Optional function pointer that is called periodically // Must return S_OK or simulator exits // //============================================================================ HRESULT WINAPI D3DXSHPRTSimulation ( UINT Order, UINT NumMeshes, __in_ecount(NumMeshes) LPD3DXMESH *ppScene, __in_ecount(NumMeshes) D3DXSHMATERIAL **ppMaterials, UINT NumRays, UINT NumBounces, BOOL EnableSubSurf, FLOAT LengthScale, BOOL EnableSpectral, __deref_out LPD3DXBUFFER *ppSimulationResults, __in_opt LPD3DXSHPRTSIMCB pProgressCallback ); //============================================================================ // // D3DXSHPRTExtractChannel: // ------------------------ // Pulls the data for a given channel out of pSimulationResults // // Parameters: // Order // Order of spherical harmonic coefficients to extract // pTransferCoefficients // Array of Order^2 floats into which transfer coefficients for the // specified channel are written // Channel // Specifies the channel to extract (0/1/2 for R/G/B) // pSimulationResults // Buffer obtained from D3DXSHPRTSimulation // //============================================================================ HRESULT WINAPI D3DXSHPRTExtractChannel ( UINT Order, __out FLOAT *pTransferCoefficients, UINT Channel, __in LPD3DXBUFFER pSimulationResults ); //============================================================================ // // D3DXSHPRTGetRawDataPointer: // --------------------------- // Given a buffer that has been simulated, makes ppData reference the // raw data in the buffer. This pointer is invalid after the buffer // has been released. The data is formatted as follows: // FLOAT fRawData[NumSamples][NumChannels][Order*Order] // where NumSamples is the number of texels/vertices in the scene. // // Parameters: // pSimulationResults // Buffer obtained from the simulator that contains transfer vectors // ppRawData // Returns a pointer to the raw data inside the buffer // //============================================================================ HRESULT WINAPI D3DXSHPRTGetRawDataPointer ( __in LPD3DXBUFFER pSimulationResults, __deref_out FLOAT **ppRawData ); //============================================================================ // // D3DXSHPRTExtractDesc: // --------------------- // Given the result of a PRT simulation, this function extracts its // description. // // Parameters: // pSimulationResults // Buffer obtained from the simulator // pDesc // Structure to be filled in with information from the buffer // Width/Height non-zero only if the textured simulator was used // //============================================================================ HRESULT WINAPI D3DXSHPRTExtractDesc ( __in LPD3DXBUFFER pSimulationResults, __out D3DXSHPRTBUFFER_DESC *pDesc ); //============================================================================ // // D3DXSHPRTSimulationTex: // ----------------------- // Runs the PRT simulation on an input mesh in texture space. // Returns a buffer that contains PRT results for every texel. // This function can take a long time to run and should only done offline. // // Parameters: // Order // Order of SH to use, generates Order^2 coeffs per channel per texel // pScene // Mesh that represents the scene // pMaterial // Material which specifies the albedo for the scene (if no albedo // texture was specified), and the subsurface scattering properties // NumRays // Number of rays to shoot at each texel // NumBounces // Number of bounces simulated - if this is not zero inter-reflections // are computed // EnableSubSurf // Indicates whether or not subsurface scattering is to be used // LengthScale // Scale used for subsurface scattering (1 would be a 1mm cube) // EnableSpectral // TRUE enables color bleeding by computing RGB transfer vectors // FALSE just uses the red channel for material properties // ppSimulationResults // Buffer that is allocated and filled in by the simulator // Width // Number of texels to sample across horizontally // Height // Number of texels to sample across vertically // pAlbedoTexture // Albedo (diffuse reflectance) of surface (can be NULL) // pProgressCallback // Optional function pointer that is called periodically // (must return S_OK or simulator exits) // //============================================================================ HRESULT WINAPI D3DXSHPRTSimulationTex ( UINT Order, __in LPD3DXMESH pScene, __in D3DXSHMATERIAL *pMaterial, UINT NumRays, UINT NumBounces, BOOL EnableSubSurf, FLOAT LengthScale, BOOL EnableSpectral, __deref_out LPD3DXBUFFER *ppSimulationResults, UINT Width, UINT Height, __in_opt LPDIRECT3DTEXTURE9 pAlbedoTexture, __in_opt LPD3DXSHPRTSIMCB pProgressCallback ); //============================================================================ // // D3DXSHPRTExtractTexture: // ------------------------ // Pulls the data for a given channel out of pSimulationResults. // // Parameters: // Channel // Channel to be extracted. // StartCoefficient // Initial coefficient to extract // NumCoefficients // Number of coefficients to extract // pSimulationResults // Buffer obtained from D3DXSHPRTSimulationTex // pTexture // Texture where data will be stored - must match dimensions specified // when simulator was run and be a signed or float format // // Example: // For an order 4 simulation, there are 16 coefficients, which can be // stored into four 4-channel textures by calling D3DXSPHRTExtractTexture // 4 times with NumCoefficients set to 4, and StartCoefficient set to // 0, 4, 8, and 12 in succession. // //============================================================================ HRESULT WINAPI D3DXSHPRTExtractTexture ( UINT Channel, UINT StartCoefficent, UINT NumCoefficients, __in LPD3DXBUFFER pSimulationResults, __in LPDIRECT3DTEXTURE9 pTexture ); //============================================================================ // // D3DXSHPRTExtractToMesh: // ----------------------- // Pulls transfer coefficients from the buffer containing the simulation // results and attaches them to the input mesh. // Can only be called on single channel buffers (use D3DXSHPRTExtractChannel // otherwise). // // Parameters: // Order // Order of SH to use, generates Order^2 coeffs, degree is Order-1 // pScene // Single mesh that data is going to be packed into // pSimulationResults // Buffer obtained from D3DXSHPRTSimulation // Usage // D3DDECLUSAGE where coefficients are to be stored // UsageIndexStart // Starting index for coefficients to be stored // //============================================================================ HRESULT WINAPI D3DXSHPRTExtractToMesh ( UINT Order, __in LPD3DXMESH pScene, __in LPD3DXBUFFER pSimulationResults, D3DDECLUSAGE Usage, UINT UsageIndexStart ); //============================================================================ // // D3DXSHPRTCompress: // ------------------ // This function compresses a PRT buffer, generating a new compressed // buffer. // // Parameters: // Order // Order of SH to compress, generates Order^2 coeffs, degree is Order-1 // pSimulationResults // Buffer obtained from the simulator that contains transfer vectors. // Quality // Type of compression to use // NumClusters // Number of clusters to use for compression // NumPCA // Number of PCA vectors to use in each cluster // ppCompressedResults // Returns the compressed data // //============================================================================ HRESULT WINAPI D3DXSHPRTCompress ( UINT Order, __in LPD3DXBUFFER pSimulationResults, D3DXSHCOMPRESSQUALITYTYPE Quality, UINT NumClusters, UINT NumPCA, __deref_out LPD3DXBUFFER *ppCompressedResults ); //============================================================================ // // D3DXSHPRTCompExtractToMesh: // --------------------------- // Pulls PCA coefficients from compressed buffer and attaches them to the // mesh. // // Parameters: // NumPCA // Number of PCA coefficients to extract // pScene // Single mesh that data is going to be packed into // pCompressedResults // Buffer obtained from D3DXSHPRTCompress // Usage // D3DDECLUSAGE where coefficients are to be stored // UsageIndexStart // Starting index for coefficients to be stored // //============================================================================ HRESULT WINAPI D3DXSHPRTCompExtractToMesh ( UINT NumPCA, __in LPD3DXMESH pScene, __in LPD3DXBUFFER pCompressedResults, D3DDECLUSAGE Usage, UINT UsageIndexStart ); //============================================================================ // // D3DXSHPRTCompExtractDesc: // ------------------------- // Given a compressed buffer, extracts a description of the data. // // Parameters: // pCompressedResults // Buffer obtained D3DXSHPRTCompress // pDesc // Structure to be filled in with information from the buffer // //============================================================================ HRESULT WINAPI D3DXSHPRTCompExtractDesc ( __in LPD3DXBUFFER pCompressedResults, __out D3DXSHPRTCOMPBUFFER_DESC *pDesc ); //============================================================================ // // D3DXSHPRTCompNormalizeData: // --------------------------- // Given a compressed buffer, rescales all of the PCA projection coefficients // so that they are within [-1, 1]. The PCA vectors are scaled so that // reconstruction is still correct. This maximizes precision when packing // into textures. // // Parameters: // pCompressedResults // Buffer obtained from D3DXSHPRTCompress // //============================================================================ HRESULT WINAPI D3DXSHPRTCompNormalizeData ( __inout LPD3DXBUFFER pCompressedResults ); //============================================================================ // // D3DXSHPRTCompExtractBasis: // -------------------------- // Extracts the mean + PCA basis vectors for a given cluster from a // compressed buffer. The data is laid out in memory: // FLOAT fData[NumSamples][NumChannels][Order*Order] // Where NumSamples/NumChannels/Order are from the D3DXSHPRTCOMPBUFFER_DESC // that can be extracted from pBuffer. // // Parameters: // Cluster // Cluster whose basis is going to be extracted // pCompressedResults // Buffer obtained from D3DXSHPRTCompress // pClusterBasis // Array of floats into which cluster basis is written // //============================================================================ HRESULT WINAPI D3DXSHPRTCompExtractBasis ( UINT Cluster, __in LPD3DXBUFFER pCompressedResults, __out FLOAT *pClusterBasis ); //============================================================================ // // D3DXSHPRTCompExtractClusterIDs: // ------------------------------- // Extracts the per sample cluster ID from a compressed data set. // // Parameters: // pCompressedResults // Buffer obtained from D3DXSHPRTCompress // pClusterIDs // Pointer where D3DXSHPRTCOMPBUFFER_DESC::NumSamples IDs are written // //============================================================================ HRESULT WINAPI D3DXSHPRTCompExtractClusterIDs ( __in LPD3DXBUFFER pCompressedResults, __out UINT *pClusterIDs ); //============================================================================ // // D3DXSHPRTCompExtractPCA: // ------------------------ // Extracts the per-sample PCA coefficients from a compressed buffer. // // Parameters: // StartPCA // Starting PCA projection coefficient to extract // NumExtract // Number of PCA projection coefficients to extract // pCompressedResults // Buffer obtained from D3DXSHPRTCompress // pPCACoefficients // Pointer where NumSamples * NumPCA PCA coefficients are written // //============================================================================ HRESULT WINAPI D3DXSHPRTCompExtractPCA ( UINT StartPCA, UINT NumExtract, __in LPD3DXBUFFER pCompressedResults, __out FLOAT *pPCACoefficients ); //============================================================================ // // D3DXSHPRTCompExtractTexture: // ---------------------------- // Extracts the per sample PCA coefficients from a compressed data set. They // are extracted into a texture that has already been allocated. // // Parameters: // StartPCA // Starting PCA projection coefficient to extract // NumExtract // Number of PCA projection coefficients to extract // pCompressedResults // Buffer obtained from D3DXSHPRTCompress // pTexture // Texture where data is stored - must match dimensions of simulator // and be a signed or floating point format // //============================================================================ HRESULT WINAPI D3DXSHPRTCompExtractTexture ( UINT StartPCA, UINT NumExtract, __in LPD3DXBUFFER pCompressedResults, __inout LPDIRECT3DTEXTURE9 pTexture ); //============================================================================ // // 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 ( __in UINT *pClusterIDs, __in LPD3DXMESH pScene, UINT MaxNumClusters, UINT NumClusters, __out_ecount(NumClusters) UINT *pSuperClusterIDs, __out 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 // 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 // Mapping of each face in ppIBData to original faces. Length is // *pIBDataLength/3. Allocated in function // ppVertData // 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 ( __in UINT *pClusterIDs, UINT NumVertices, UINT NumClusters, __out_ecount(NumClusters) UINT *pSuperClusterIDs, UINT NumSuperClusters, __in LPVOID pInputIB, BOOL InputIBIs32Bit, UINT NumFaces, __deref_out LPVOID *ppIBData, __out UINT *pIBDataLength, BOOL OutputIBIs32Bit, __deref_out UINT **ppFaceRemap, __deref_out D3DXSHPRTSPLITMESHVERTDATA **ppVertData, __out UINT *pVertDataLength, __out UINT *pSCClusterList, __out 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); #define XSKINEXP_TEMPLATES \ "xof 0303txt 0032\ template XSkinMeshHeader \ { \ <3CF169CE-FF7C-44ab-93C0-F78F62D172E2> \ WORD nMaxSkinWeightsPerVertex; \ WORD nMaxSkinWeightsPerFace; \ WORD nBones; \ } \ template VertexDuplicationIndices \ { \ \ DWORD nIndices; \ DWORD nOriginalVertices; \ array DWORD indices[nIndices]; \ } \ template FaceAdjacency \ { \ \ 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 \ { \ \ DWORD nControlIndices; \ array DWORD controlIndices[nControlIndices]; \ } \ template PatchMesh \ { \ \ DWORD nVertices; \ array Vector vertices[nVertices]; \ DWORD nPatches; \ array Patch patches[nPatches]; \ [ ... ] \ } \ template PatchMesh9 \ { \ \ DWORD Type; \ DWORD Degree; \ DWORD Basis; \ DWORD nVertices; \ array Vector vertices[nVertices]; \ DWORD nPatches; \ array Patch patches[nPatches]; \ [ ... ] \ } " \ "template EffectFloats \ { \ \ DWORD nFloats; \ array float Floats[nFloats]; \ } \ template EffectString \ { \ \ 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 \ { \ \ STRING ParamName; \ DWORD Value; \ } \ template EffectInstance \ { \ \ STRING EffectFilename; \ [ ... ] \ } " \ "template AnimTicksPerSecond \ { \ <9E415A43-7BA6-4a73-8743-B73D47E88476> \ DWORD AnimTicksPerSecond; \ } " #define XEXTENSIONS_TEMPLATES \ "xof 0303txt 0032\ template FVFData \ { \ \ DWORD dwFVF; \ DWORD nDWords; \ array DWORD data[nDWords]; \ } \ template VertexElement \ { \ \ DWORD Type; \ DWORD Method; \ DWORD Usage; \ DWORD UsageIndex; \ } \ template DeclData \ { \ \ 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 \ { \ \ 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__