/* * * 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 \ { \ \ 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; \ } \ 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 \ { \ \ 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__ */