Subversion Repositories Games.Chess Giants

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  Copyright (C) Microsoft Corporation.  All Rights Reserved.
  4. //
  5. //  File:       d3dx9mesh.h
  6. //  Content:    D3DX mesh types and functions
  7. //
  8. //////////////////////////////////////////////////////////////////////////////
  9.  
  10. #include "d3dx9.h"
  11.  
  12. #ifndef __D3DX9MESH_H__
  13. #define __D3DX9MESH_H__
  14.  
  15. // {7ED943DD-52E8-40b5-A8D8-76685C406330}
  16. DEFINE_GUID(IID_ID3DXBaseMesh,
  17. 0x7ed943dd, 0x52e8, 0x40b5, 0xa8, 0xd8, 0x76, 0x68, 0x5c, 0x40, 0x63, 0x30);
  18.  
  19. // {4020E5C2-1403-4929-883F-E2E849FAC195}
  20. DEFINE_GUID(IID_ID3DXMesh,
  21. 0x4020e5c2, 0x1403, 0x4929, 0x88, 0x3f, 0xe2, 0xe8, 0x49, 0xfa, 0xc1, 0x95);
  22.  
  23. // {8875769A-D579-4088-AAEB-534D1AD84E96}
  24. DEFINE_GUID(IID_ID3DXPMesh,
  25. 0x8875769a, 0xd579, 0x4088, 0xaa, 0xeb, 0x53, 0x4d, 0x1a, 0xd8, 0x4e, 0x96);
  26.  
  27. // {667EA4C7-F1CD-4386-B523-7C0290B83CC5}
  28. DEFINE_GUID(IID_ID3DXSPMesh,
  29. 0x667ea4c7, 0xf1cd, 0x4386, 0xb5, 0x23, 0x7c, 0x2, 0x90, 0xb8, 0x3c, 0xc5);
  30.  
  31. // {11EAA540-F9A6-4d49-AE6A-E19221F70CC4}
  32. DEFINE_GUID(IID_ID3DXSkinInfo,
  33. 0x11eaa540, 0xf9a6, 0x4d49, 0xae, 0x6a, 0xe1, 0x92, 0x21, 0xf7, 0xc, 0xc4);
  34.  
  35. // {3CE6CC22-DBF2-44f4-894D-F9C34A337139}
  36. DEFINE_GUID(IID_ID3DXPatchMesh,
  37. 0x3ce6cc22, 0xdbf2, 0x44f4, 0x89, 0x4d, 0xf9, 0xc3, 0x4a, 0x33, 0x71, 0x39);
  38.  
  39. //patch mesh can be quads or tris
  40. typedef enum _D3DXPATCHMESHTYPE {
  41.     D3DXPATCHMESH_RECT   = 0x001,
  42.     D3DXPATCHMESH_TRI    = 0x002,
  43.     D3DXPATCHMESH_NPATCH = 0x003,
  44.  
  45.     D3DXPATCHMESH_FORCE_DWORD    = 0x7fffffff, /* force 32-bit size enum */
  46. } D3DXPATCHMESHTYPE;
  47.  
  48. // Mesh options - lower 3 bytes only, upper byte used by _D3DXMESHOPT option flags
  49. enum _D3DXMESH {
  50.     D3DXMESH_32BIT                  = 0x001, // If set, then use 32 bit indices, if not set use 16 bit indices.
  51.     D3DXMESH_DONOTCLIP              = 0x002, // Use D3DUSAGE_DONOTCLIP for VB & IB.
  52.     D3DXMESH_POINTS                 = 0x004, // Use D3DUSAGE_POINTS for VB & IB.
  53.     D3DXMESH_RTPATCHES              = 0x008, // Use D3DUSAGE_RTPATCHES for VB & IB.
  54.     D3DXMESH_NPATCHES               = 0x4000,// Use D3DUSAGE_NPATCHES for VB & IB.
  55.     D3DXMESH_VB_SYSTEMMEM           = 0x010, // Use D3DPOOL_SYSTEMMEM for VB. Overrides D3DXMESH_MANAGEDVERTEXBUFFER
  56.     D3DXMESH_VB_MANAGED             = 0x020, // Use D3DPOOL_MANAGED for VB.
  57.     D3DXMESH_VB_WRITEONLY           = 0x040, // Use D3DUSAGE_WRITEONLY for VB.
  58.     D3DXMESH_VB_DYNAMIC             = 0x080, // Use D3DUSAGE_DYNAMIC for VB.
  59.     D3DXMESH_VB_SOFTWAREPROCESSING = 0x8000, // Use D3DUSAGE_SOFTWAREPROCESSING for VB.
  60.     D3DXMESH_IB_SYSTEMMEM           = 0x100, // Use D3DPOOL_SYSTEMMEM for IB. Overrides D3DXMESH_MANAGEDINDEXBUFFER
  61.     D3DXMESH_IB_MANAGED             = 0x200, // Use D3DPOOL_MANAGED for IB.
  62.     D3DXMESH_IB_WRITEONLY           = 0x400, // Use D3DUSAGE_WRITEONLY for IB.
  63.     D3DXMESH_IB_DYNAMIC             = 0x800, // Use D3DUSAGE_DYNAMIC for IB.
  64.     D3DXMESH_IB_SOFTWAREPROCESSING= 0x10000, // Use D3DUSAGE_SOFTWAREPROCESSING for IB.
  65.  
  66.     D3DXMESH_VB_SHARE               = 0x1000, // Valid for Clone* calls only, forces cloned mesh/pmesh to share vertex buffer
  67.  
  68.     D3DXMESH_USEHWONLY              = 0x2000, // Valid for ID3DXSkinInfo::ConvertToBlendedMesh
  69.  
  70.     // Helper options
  71.     D3DXMESH_SYSTEMMEM              = 0x110, // D3DXMESH_VB_SYSTEMMEM | D3DXMESH_IB_SYSTEMMEM
  72.     D3DXMESH_MANAGED                = 0x220, // D3DXMESH_VB_MANAGED | D3DXMESH_IB_MANAGED
  73.     D3DXMESH_WRITEONLY              = 0x440, // D3DXMESH_VB_WRITEONLY | D3DXMESH_IB_WRITEONLY
  74.     D3DXMESH_DYNAMIC                = 0x880, // D3DXMESH_VB_DYNAMIC | D3DXMESH_IB_DYNAMIC
  75.     D3DXMESH_SOFTWAREPROCESSING   = 0x18000, // D3DXMESH_VB_SOFTWAREPROCESSING | D3DXMESH_IB_SOFTWAREPROCESSING
  76.  
  77. };
  78.  
  79. //patch mesh options
  80. enum _D3DXPATCHMESH {
  81.     D3DXPATCHMESH_DEFAULT = 000,
  82. };
  83. // option field values for specifying min value in D3DXGeneratePMesh and D3DXSimplifyMesh
  84. enum _D3DXMESHSIMP
  85. {
  86.     D3DXMESHSIMP_VERTEX   = 0x1,
  87.     D3DXMESHSIMP_FACE     = 0x2,
  88.  
  89. };
  90.  
  91. typedef enum _D3DXCLEANTYPE {
  92.         D3DXCLEAN_BACKFACING    = 0x00000001,
  93.         D3DXCLEAN_BOWTIES               = 0x00000002,
  94.        
  95.         // Helper options
  96.         D3DXCLEAN_SKINNING              = D3DXCLEAN_BACKFACING, // Bowtie cleaning modifies geometry and breaks skinning
  97.         D3DXCLEAN_OPTIMIZATION  = D3DXCLEAN_BACKFACING,
  98.         D3DXCLEAN_SIMPLIFICATION= D3DXCLEAN_BACKFACING | D3DXCLEAN_BOWTIES,    
  99. } D3DXCLEANTYPE;
  100.  
  101. enum _MAX_FVF_DECL_SIZE
  102. {
  103.     MAX_FVF_DECL_SIZE = MAXD3DDECLLENGTH + 1 // +1 for END
  104. };
  105.  
  106. typedef enum _D3DXTANGENT
  107. {
  108.     D3DXTANGENT_WRAP_U =                    0x01,
  109.     D3DXTANGENT_WRAP_V =                    0x02,
  110.     D3DXTANGENT_WRAP_UV =                   0x03,
  111.     D3DXTANGENT_DONT_NORMALIZE_PARTIALS =   0x04,
  112.     D3DXTANGENT_DONT_ORTHOGONALIZE =        0x08,
  113.     D3DXTANGENT_ORTHOGONALIZE_FROM_V =      0x010,
  114.     D3DXTANGENT_ORTHOGONALIZE_FROM_U =      0x020,
  115.     D3DXTANGENT_WEIGHT_BY_AREA =            0x040,
  116.     D3DXTANGENT_WEIGHT_EQUAL =              0x080,
  117.     D3DXTANGENT_WIND_CW =                   0x0100,
  118.     D3DXTANGENT_CALCULATE_NORMALS =         0x0200,
  119.     D3DXTANGENT_GENERATE_IN_PLACE =         0x0400,
  120. } D3DXTANGENT;
  121.  
  122. // D3DXIMT_WRAP_U means the texture wraps in the U direction
  123. // D3DXIMT_WRAP_V means the texture wraps in the V direction
  124. // D3DXIMT_WRAP_UV means the texture wraps in both directions
  125. typedef enum _D3DXIMT
  126. {
  127.     D3DXIMT_WRAP_U =                    0x01,
  128.     D3DXIMT_WRAP_V =                    0x02,
  129.     D3DXIMT_WRAP_UV =                   0x03,
  130. } D3DXIMT;
  131.  
  132. // These options are only valid for UVAtlasCreate and UVAtlasPartition, we may add more for UVAtlasPack if necessary
  133. // D3DXUVATLAS_DEFAULT - Meshes with more than 25k faces go through fast, meshes with fewer than 25k faces go through quality
  134. // D3DXUVATLAS_GEODESIC_FAST - Uses approximations to improve charting speed at the cost of added stretch or more charts.
  135. // D3DXUVATLAS_GEODESIC_QUALITY - Provides better quality charts, but requires more time and memory than fast.
  136. typedef enum _D3DXUVATLAS
  137. {
  138.     D3DXUVATLAS_DEFAULT               = 0x00,
  139.     D3DXUVATLAS_GEODESIC_FAST         = 0x01,
  140.     D3DXUVATLAS_GEODESIC_QUALITY      = 0x02,
  141. } D3DXUVATLAS;
  142.  
  143. typedef struct ID3DXBaseMesh *LPD3DXBASEMESH;
  144. typedef struct ID3DXMesh *LPD3DXMESH;
  145. typedef struct ID3DXPMesh *LPD3DXPMESH;
  146. typedef struct ID3DXSPMesh *LPD3DXSPMESH;
  147. typedef struct ID3DXSkinInfo *LPD3DXSKININFO;
  148. typedef struct ID3DXPatchMesh *LPD3DXPATCHMESH;
  149. typedef interface ID3DXTextureGutterHelper *LPD3DXTEXTUREGUTTERHELPER;
  150. typedef interface ID3DXPRTBuffer *LPD3DXPRTBUFFER;
  151.  
  152.  
  153. typedef struct _D3DXATTRIBUTERANGE
  154. {
  155.     DWORD AttribId;
  156.     DWORD FaceStart;
  157.     DWORD FaceCount;
  158.     DWORD VertexStart;
  159.     DWORD VertexCount;
  160. } D3DXATTRIBUTERANGE;
  161.  
  162. typedef D3DXATTRIBUTERANGE* LPD3DXATTRIBUTERANGE;
  163.  
  164. typedef struct _D3DXMATERIAL
  165. {
  166.     D3DMATERIAL9  MatD3D;
  167.     LPSTR         pTextureFilename;
  168. } D3DXMATERIAL;
  169. typedef D3DXMATERIAL *LPD3DXMATERIAL;
  170.  
  171. typedef enum _D3DXEFFECTDEFAULTTYPE
  172. {
  173.     D3DXEDT_STRING = 0x1,       // pValue points to a null terminated ASCII string
  174.     D3DXEDT_FLOATS = 0x2,       // pValue points to an array of floats - number of floats is NumBytes / sizeof(float)
  175.     D3DXEDT_DWORD  = 0x3,       // pValue points to a DWORD
  176.  
  177.     D3DXEDT_FORCEDWORD = 0x7fffffff
  178. } D3DXEFFECTDEFAULTTYPE;
  179.  
  180. typedef struct _D3DXEFFECTDEFAULT
  181. {
  182.     LPSTR                 pParamName;
  183.     D3DXEFFECTDEFAULTTYPE Type;           // type of the data pointed to by pValue
  184.     DWORD                 NumBytes;       // size in bytes of the data pointed to by pValue
  185.     LPVOID                pValue;         // data for the default of the effect
  186. } D3DXEFFECTDEFAULT, *LPD3DXEFFECTDEFAULT;
  187.  
  188. typedef struct _D3DXEFFECTINSTANCE
  189. {
  190.     LPSTR               pEffectFilename;
  191.     DWORD               NumDefaults;
  192.     LPD3DXEFFECTDEFAULT pDefaults;
  193. } D3DXEFFECTINSTANCE, *LPD3DXEFFECTINSTANCE;
  194.  
  195. typedef struct _D3DXATTRIBUTEWEIGHTS
  196. {
  197.     FLOAT Position;
  198.     FLOAT Boundary;
  199.     FLOAT Normal;
  200.     FLOAT Diffuse;
  201.     FLOAT Specular;
  202.     FLOAT Texcoord[8];
  203.     FLOAT Tangent;
  204.     FLOAT Binormal;
  205. } D3DXATTRIBUTEWEIGHTS, *LPD3DXATTRIBUTEWEIGHTS;
  206.  
  207. enum _D3DXWELDEPSILONSFLAGS
  208. {
  209.     D3DXWELDEPSILONS_WELDALL             = 0x1,  // weld all vertices marked by adjacency as being overlapping
  210.  
  211.     D3DXWELDEPSILONS_WELDPARTIALMATCHES  = 0x2,  // if a given vertex component is within epsilon, modify partial matched
  212.                                                     // vertices so that both components identical AND if all components "equal"
  213.                                                     // remove one of the vertices
  214.     D3DXWELDEPSILONS_DONOTREMOVEVERTICES = 0x4,  // instructs weld to only allow modifications to vertices and not removal
  215.                                                     // ONLY valid if D3DXWELDEPSILONS_WELDPARTIALMATCHES is set
  216.                                                     // useful to modify vertices to be equal, but not allow vertices to be removed
  217.  
  218.     D3DXWELDEPSILONS_DONOTSPLIT          = 0x8,  // instructs weld to specify the D3DXMESHOPT_DONOTSPLIT flag when doing an Optimize(ATTR_SORT)
  219.                                                     // if this flag is not set, all vertices that are in separate attribute groups
  220.                                                     // will remain split and not welded.  Setting this flag can slow down software vertex processing
  221.  
  222. };
  223.  
  224. typedef struct _D3DXWELDEPSILONS
  225. {
  226.     FLOAT Position;                 // NOTE: This does NOT replace the epsilon in GenerateAdjacency
  227.                                             // in general, it should be the same value or greater than the one passed to GeneratedAdjacency
  228.     FLOAT BlendWeights;
  229.     FLOAT Normal;
  230.     FLOAT PSize;
  231.     FLOAT Specular;
  232.     FLOAT Diffuse;
  233.     FLOAT Texcoord[8];
  234.     FLOAT Tangent;
  235.     FLOAT Binormal;
  236.     FLOAT TessFactor;
  237. } D3DXWELDEPSILONS;
  238.  
  239. typedef D3DXWELDEPSILONS* LPD3DXWELDEPSILONS;
  240.  
  241.  
  242. #undef INTERFACE
  243. #define INTERFACE ID3DXBaseMesh
  244.  
  245. DECLARE_INTERFACE_(ID3DXBaseMesh, IUnknown)
  246. {
  247.     // IUnknown
  248.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  249.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  250.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  251.  
  252.     // ID3DXBaseMesh
  253.     STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE;
  254.     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE;
  255.     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE;
  256.     STDMETHOD_(DWORD, GetFVF)(THIS) PURE;
  257.     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE;
  258.     STDMETHOD_(DWORD, GetNumBytesPerVertex)(THIS) PURE;
  259.     STDMETHOD_(DWORD, GetOptions)(THIS) PURE;
  260.     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9* ppDevice) PURE;
  261.     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options,
  262.                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  263.     STDMETHOD(CloneMesh)(THIS_ DWORD Options,
  264.                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  265.     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER9* ppVB) PURE;
  266.     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER9* ppIB) PURE;
  267.     STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE;
  268.     STDMETHOD(UnlockVertexBuffer)(THIS) PURE;
  269.     STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE;
  270.     STDMETHOD(UnlockIndexBuffer)(THIS) PURE;
  271.     STDMETHOD(GetAttributeTable)(
  272.                 THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE;
  273.  
  274.     STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE;
  275.     STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE;
  276.     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE;
  277.  
  278.     STDMETHOD(UpdateSemantics)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE;
  279. };
  280.  
  281.  
  282. #undef INTERFACE
  283. #define INTERFACE ID3DXMesh
  284.  
  285. DECLARE_INTERFACE_(ID3DXMesh, ID3DXBaseMesh)
  286. {
  287.     // IUnknown
  288.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  289.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  290.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  291.  
  292.     // ID3DXBaseMesh
  293.     STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE;
  294.     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE;
  295.     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE;
  296.     STDMETHOD_(DWORD, GetFVF)(THIS) PURE;
  297.     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE;
  298.     STDMETHOD_(DWORD, GetNumBytesPerVertex)(THIS) PURE;
  299.     STDMETHOD_(DWORD, GetOptions)(THIS) PURE;
  300.     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9* ppDevice) PURE;
  301.     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options,
  302.                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  303.     STDMETHOD(CloneMesh)(THIS_ DWORD Options,
  304.                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  305.     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER9* ppVB) PURE;
  306.     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER9* ppIB) PURE;
  307.     STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE;
  308.     STDMETHOD(UnlockVertexBuffer)(THIS) PURE;
  309.     STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE;
  310.     STDMETHOD(UnlockIndexBuffer)(THIS) PURE;
  311.     STDMETHOD(GetAttributeTable)(
  312.                 THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE;
  313.  
  314.     STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE;
  315.     STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE;
  316.     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE;
  317.  
  318.     STDMETHOD(UpdateSemantics)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE;
  319.  
  320.     // ID3DXMesh
  321.     STDMETHOD(LockAttributeBuffer)(THIS_ DWORD Flags, DWORD** ppData) PURE;
  322.     STDMETHOD(UnlockAttributeBuffer)(THIS) PURE;
  323.     STDMETHOD(Optimize)(THIS_ DWORD Flags, CONST DWORD* pAdjacencyIn, DWORD* pAdjacencyOut,
  324.                      DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap,  
  325.                      LPD3DXMESH* ppOptMesh) PURE;
  326.     STDMETHOD(OptimizeInplace)(THIS_ DWORD Flags, CONST DWORD* pAdjacencyIn, DWORD* pAdjacencyOut,
  327.                      DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap) PURE;
  328.     STDMETHOD(SetAttributeTable)(THIS_ CONST D3DXATTRIBUTERANGE *pAttribTable, DWORD cAttribTableSize) PURE;
  329. };
  330.  
  331.  
  332. #undef INTERFACE
  333. #define INTERFACE ID3DXPMesh
  334.  
  335. DECLARE_INTERFACE_(ID3DXPMesh, ID3DXBaseMesh)
  336. {
  337.     // IUnknown
  338.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  339.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  340.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  341.  
  342.     // ID3DXBaseMesh
  343.     STDMETHOD(DrawSubset)(THIS_ DWORD AttribId) PURE;
  344.     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE;
  345.     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE;
  346.     STDMETHOD_(DWORD, GetFVF)(THIS) PURE;
  347.     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE;
  348.     STDMETHOD_(DWORD, GetNumBytesPerVertex)(THIS) PURE;
  349.     STDMETHOD_(DWORD, GetOptions)(THIS) PURE;
  350.     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9* ppDevice) PURE;
  351.     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options,
  352.                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  353.     STDMETHOD(CloneMesh)(THIS_ DWORD Options,
  354.                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXMESH* ppCloneMesh) PURE;
  355.     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER9* ppVB) PURE;
  356.     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER9* ppIB) PURE;
  357.     STDMETHOD(LockVertexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE;
  358.     STDMETHOD(UnlockVertexBuffer)(THIS) PURE;
  359.     STDMETHOD(LockIndexBuffer)(THIS_ DWORD Flags, LPVOID *ppData) PURE;
  360.     STDMETHOD(UnlockIndexBuffer)(THIS) PURE;
  361.     STDMETHOD(GetAttributeTable)(
  362.                 THIS_ D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) PURE;
  363.  
  364.     STDMETHOD(ConvertPointRepsToAdjacency)(THIS_ CONST DWORD* pPRep, DWORD* pAdjacency) PURE;
  365.     STDMETHOD(ConvertAdjacencyToPointReps)(THIS_ CONST DWORD* pAdjacency, DWORD* pPRep) PURE;
  366.     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Epsilon, DWORD* pAdjacency) PURE;
  367.  
  368.     STDMETHOD(UpdateSemantics)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE;
  369.  
  370.     // ID3DXPMesh
  371.     STDMETHOD(ClonePMeshFVF)(THIS_ DWORD Options,
  372.                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXPMESH* ppCloneMesh) PURE;
  373.     STDMETHOD(ClonePMesh)(THIS_ DWORD Options,
  374.                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXPMESH* ppCloneMesh) PURE;
  375.     STDMETHOD(SetNumFaces)(THIS_ DWORD Faces) PURE;
  376.     STDMETHOD(SetNumVertices)(THIS_ DWORD Vertices) PURE;
  377.     STDMETHOD_(DWORD, GetMaxFaces)(THIS) PURE;
  378.     STDMETHOD_(DWORD, GetMinFaces)(THIS) PURE;
  379.     STDMETHOD_(DWORD, GetMaxVertices)(THIS) PURE;
  380.     STDMETHOD_(DWORD, GetMinVertices)(THIS) PURE;
  381.     STDMETHOD(Save)(THIS_ IStream *pStream, CONST D3DXMATERIAL* pMaterials, CONST D3DXEFFECTINSTANCE* pEffectInstances, DWORD NumMaterials) PURE;
  382.  
  383.     STDMETHOD(Optimize)(THIS_ DWORD Flags, DWORD* pAdjacencyOut,
  384.                      DWORD* pFaceRemap, LPD3DXBUFFER *ppVertexRemap,  
  385.                      LPD3DXMESH* ppOptMesh) PURE;
  386.  
  387.     STDMETHOD(OptimizeBaseLOD)(THIS_ DWORD Flags, DWORD* pFaceRemap) PURE;
  388.     STDMETHOD(TrimByFaces)(THIS_ DWORD NewFacesMin, DWORD NewFacesMax, DWORD *rgiFaceRemap, DWORD *rgiVertRemap) PURE;
  389.     STDMETHOD(TrimByVertices)(THIS_ DWORD NewVerticesMin, DWORD NewVerticesMax, DWORD *rgiFaceRemap, DWORD *rgiVertRemap) PURE;
  390.  
  391.     STDMETHOD(GetAdjacency)(THIS_ DWORD* pAdjacency) PURE;
  392.  
  393.     //  Used to generate the immediate "ancestor" for each vertex when it is removed by a vsplit.  Allows generation of geomorphs
  394.     //     Vertex buffer must be equal to or greater than the maximum number of vertices in the pmesh
  395.     STDMETHOD(GenerateVertexHistory)(THIS_ DWORD* pVertexHistory) PURE;
  396. };
  397.  
  398.  
  399. #undef INTERFACE
  400. #define INTERFACE ID3DXSPMesh
  401.  
  402. DECLARE_INTERFACE_(ID3DXSPMesh, IUnknown)
  403. {
  404.     // IUnknown
  405.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  406.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  407.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  408.  
  409.     // ID3DXSPMesh
  410.     STDMETHOD_(DWORD, GetNumFaces)(THIS) PURE;
  411.     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE;
  412.     STDMETHOD_(DWORD, GetFVF)(THIS) PURE;
  413.     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE;
  414.     STDMETHOD_(DWORD, GetOptions)(THIS) PURE;
  415.     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9* ppDevice) PURE;
  416.     STDMETHOD(CloneMeshFVF)(THIS_ DWORD Options,
  417.                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, DWORD *pAdjacencyOut, DWORD *pVertexRemapOut, LPD3DXMESH* ppCloneMesh) PURE;
  418.     STDMETHOD(CloneMesh)(THIS_ DWORD Options,
  419.                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, DWORD *pAdjacencyOut, DWORD *pVertexRemapOut, LPD3DXMESH* ppCloneMesh) PURE;
  420.     STDMETHOD(ClonePMeshFVF)(THIS_ DWORD Options,
  421.                 DWORD FVF, LPDIRECT3DDEVICE9 pD3DDevice, DWORD *pVertexRemapOut, FLOAT *pErrorsByFace, LPD3DXPMESH* ppCloneMesh) PURE;
  422.     STDMETHOD(ClonePMesh)(THIS_ DWORD Options,
  423.                 CONST D3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pD3DDevice, DWORD *pVertexRemapOut, FLOAT *pErrorsbyFace, LPD3DXPMESH* ppCloneMesh) PURE;
  424.     STDMETHOD(ReduceFaces)(THIS_ DWORD Faces) PURE;
  425.     STDMETHOD(ReduceVertices)(THIS_ DWORD Vertices) PURE;
  426.     STDMETHOD_(DWORD, GetMaxFaces)(THIS) PURE;
  427.     STDMETHOD_(DWORD, GetMaxVertices)(THIS) PURE;
  428.     STDMETHOD(GetVertexAttributeWeights)(THIS_ LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights) PURE;
  429.     STDMETHOD(GetVertexWeights)(THIS_ FLOAT *pVertexWeights) PURE;
  430. };
  431.  
  432. #define UNUSED16 (0xffff)
  433. #define UNUSED32 (0xffffffff)
  434.  
  435. // ID3DXMesh::Optimize options - upper byte only, lower 3 bytes used from _D3DXMESH option flags
  436. enum _D3DXMESHOPT {
  437.     D3DXMESHOPT_COMPACT       = 0x01000000,
  438.     D3DXMESHOPT_ATTRSORT      = 0x02000000,
  439.     D3DXMESHOPT_VERTEXCACHE   = 0x04000000,
  440.     D3DXMESHOPT_STRIPREORDER  = 0x08000000,
  441.     D3DXMESHOPT_IGNOREVERTS   = 0x10000000,  // optimize faces only, don't touch vertices
  442.     D3DXMESHOPT_DONOTSPLIT    = 0x20000000,  // do not split vertices shared between attribute groups when attribute sorting
  443.     D3DXMESHOPT_DEVICEINDEPENDENT = 0x00400000,  // Only affects VCache.  uses a static known good cache size for all cards
  444.                            
  445.     // D3DXMESHOPT_SHAREVB has been removed, please use D3DXMESH_VB_SHARE instead
  446.  
  447. };
  448.  
  449. // Subset of the mesh that has the same attribute and bone combination.
  450. // This subset can be rendered in a single draw call
  451. typedef struct _D3DXBONECOMBINATION
  452. {
  453.     DWORD AttribId;
  454.     DWORD FaceStart;
  455.     DWORD FaceCount;
  456.     DWORD VertexStart;
  457.     DWORD VertexCount;
  458.     DWORD* BoneId;
  459. } D3DXBONECOMBINATION, *LPD3DXBONECOMBINATION;
  460.  
  461. // The following types of patch combinations are supported:
  462. // Patch type   Basis       Degree
  463. // Rect         Bezier      2,3,5
  464. // Rect         B-Spline    2,3,5
  465. // Rect         Catmull-Rom 3
  466. // Tri          Bezier      2,3,5
  467. // N-Patch      N/A         3
  468.  
  469. typedef struct _D3DXPATCHINFO
  470. {
  471.     D3DXPATCHMESHTYPE PatchType;
  472.     D3DDEGREETYPE Degree;
  473.     D3DBASISTYPE Basis;
  474. } D3DXPATCHINFO, *LPD3DXPATCHINFO;
  475.  
  476. #undef INTERFACE
  477. #define INTERFACE ID3DXPatchMesh
  478.  
  479. DECLARE_INTERFACE_(ID3DXPatchMesh, IUnknown)
  480. {
  481.     // IUnknown
  482.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  483.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  484.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  485.  
  486.     // ID3DXPatchMesh
  487.  
  488.     // Return creation parameters
  489.     STDMETHOD_(DWORD, GetNumPatches)(THIS) PURE;
  490.     STDMETHOD_(DWORD, GetNumVertices)(THIS) PURE;
  491.     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE;
  492.     STDMETHOD_(DWORD, GetControlVerticesPerPatch)(THIS) PURE;
  493.     STDMETHOD_(DWORD, GetOptions)(THIS) PURE;
  494.     STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9 *ppDevice) PURE;
  495.     STDMETHOD(GetPatchInfo)(THIS_ LPD3DXPATCHINFO PatchInfo) PURE;
  496.  
  497.     // Control mesh access    
  498.     STDMETHOD(GetVertexBuffer)(THIS_ LPDIRECT3DVERTEXBUFFER9* ppVB) PURE;
  499.     STDMETHOD(GetIndexBuffer)(THIS_ LPDIRECT3DINDEXBUFFER9* ppIB) PURE;
  500.     STDMETHOD(LockVertexBuffer)(THIS_ DWORD flags, LPVOID *ppData) PURE;
  501.     STDMETHOD(UnlockVertexBuffer)(THIS) PURE;
  502.     STDMETHOD(LockIndexBuffer)(THIS_ DWORD flags, LPVOID *ppData) PURE;
  503.     STDMETHOD(UnlockIndexBuffer)(THIS) PURE;
  504.     STDMETHOD(LockAttributeBuffer)(THIS_ DWORD flags, DWORD** ppData) PURE;
  505.     STDMETHOD(UnlockAttributeBuffer)(THIS) PURE;
  506.  
  507.     // This function returns the size of the tessellated mesh given a tessellation level.
  508.     // This assumes uniform tessellation. For adaptive tessellation the Adaptive parameter must
  509.     // be set to TRUE and TessellationLevel should be the max tessellation.
  510.     // This will result in the max mesh size necessary for adaptive tessellation.    
  511.     STDMETHOD(GetTessSize)(THIS_ FLOAT fTessLevel,DWORD Adaptive, DWORD *NumTriangles,DWORD *NumVertices) PURE;
  512.    
  513.     //GenerateAdjacency determines which patches are adjacent with provided tolerance
  514.     //this information is used internally to optimize tessellation
  515.     STDMETHOD(GenerateAdjacency)(THIS_ FLOAT Tolerance) PURE;
  516.    
  517.     //CloneMesh Creates a new patchmesh with the specified decl, and converts the vertex buffer
  518.     //to the new decl. Entries in the new decl which are new are set to 0. If the current mesh
  519.     //has adjacency, the new mesh will also have adjacency
  520.     STDMETHOD(CloneMesh)(THIS_ DWORD Options, CONST D3DVERTEXELEMENT9 *pDecl, LPD3DXPATCHMESH *pMesh) PURE;
  521.    
  522.     // Optimizes the patchmesh for efficient tessellation. This function is designed
  523.     // to perform one time optimization for patch meshes that need to be tessellated
  524.     // repeatedly by calling the Tessellate() method. The optimization performed is
  525.     // independent of the actual tessellation level used.
  526.     // Currently Flags is unused.
  527.     // If vertices are changed, Optimize must be called again
  528.     STDMETHOD(Optimize)(THIS_ DWORD flags) PURE;
  529.  
  530.     //gets and sets displacement parameters
  531.     //displacement maps can only be 2D textures MIP-MAPPING is ignored for non adapative tessellation
  532.     STDMETHOD(SetDisplaceParam)(THIS_ LPDIRECT3DBASETEXTURE9 Texture,
  533.                               D3DTEXTUREFILTERTYPE MinFilter,
  534.                               D3DTEXTUREFILTERTYPE MagFilter,
  535.                               D3DTEXTUREFILTERTYPE MipFilter,
  536.                               D3DTEXTUREADDRESS Wrap,
  537.                               DWORD dwLODBias) PURE;
  538.  
  539.     STDMETHOD(GetDisplaceParam)(THIS_ LPDIRECT3DBASETEXTURE9 *Texture,
  540.                                 D3DTEXTUREFILTERTYPE *MinFilter,
  541.                                 D3DTEXTUREFILTERTYPE *MagFilter,
  542.                                 D3DTEXTUREFILTERTYPE *MipFilter,
  543.                                 D3DTEXTUREADDRESS *Wrap,
  544.                                 DWORD *dwLODBias) PURE;
  545.        
  546.     // Performs the uniform tessellation based on the tessellation level.
  547.     // This function will perform more efficiently if the patch mesh has been optimized using the Optimize() call.
  548.     STDMETHOD(Tessellate)(THIS_ FLOAT fTessLevel,LPD3DXMESH pMesh) PURE;
  549.  
  550.     // Performs adaptive tessellation based on the Z based adaptive tessellation criterion.
  551.     // pTrans specifies a 4D vector that is dotted with the vertices to get the per vertex
  552.     // adaptive tessellation amount. Each edge is tessellated to the average of the criterion
  553.     // at the 2 vertices it connects.
  554.     // MaxTessLevel specifies the upper limit for adaptive tesselation.
  555.     // This function will perform more efficiently if the patch mesh has been optimized using the Optimize() call.
  556.     STDMETHOD(TessellateAdaptive)(THIS_
  557.         CONST D3DXVECTOR4 *pTrans,
  558.         DWORD dwMaxTessLevel,
  559.         DWORD dwMinTessLevel,
  560.         LPD3DXMESH pMesh) PURE;
  561.  
  562. };
  563.  
  564. #undef INTERFACE
  565. #define INTERFACE ID3DXSkinInfo
  566.  
  567. DECLARE_INTERFACE_(ID3DXSkinInfo, IUnknown)
  568. {
  569.     // IUnknown
  570.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  571.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  572.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  573.  
  574.     // Specify the which vertices do each bones influence and by how much
  575.     STDMETHOD(SetBoneInfluence)(THIS_ DWORD bone, DWORD numInfluences, CONST DWORD* vertices, CONST FLOAT* weights) PURE;
  576.         STDMETHOD(SetBoneVertexInfluence)(THIS_ DWORD boneNum, DWORD influenceNum, float weight) PURE;
  577.     STDMETHOD_(DWORD, GetNumBoneInfluences)(THIS_ DWORD bone) PURE;
  578.         STDMETHOD(GetBoneInfluence)(THIS_ DWORD bone, DWORD* vertices, FLOAT* weights) PURE;
  579.         STDMETHOD(GetBoneVertexInfluence)(THIS_ DWORD boneNum, DWORD influenceNum, float *pWeight, DWORD *pVertexNum) PURE;
  580.     STDMETHOD(GetMaxVertexInfluences)(THIS_ DWORD* maxVertexInfluences) PURE;
  581.     STDMETHOD_(DWORD, GetNumBones)(THIS) PURE;
  582.         STDMETHOD(FindBoneVertexInfluenceIndex)(THIS_ DWORD boneNum, DWORD vertexNum, DWORD *pInfluenceIndex) PURE;
  583.  
  584.     // This gets the max face influences based on a triangle mesh with the specified index buffer
  585.     STDMETHOD(GetMaxFaceInfluences)(THIS_ LPDIRECT3DINDEXBUFFER9 pIB, DWORD NumFaces, DWORD* maxFaceInfluences) PURE;
  586.    
  587.     // Set min bone influence. Bone influences that are smaller than this are ignored
  588.     STDMETHOD(SetMinBoneInfluence)(THIS_ FLOAT MinInfl) PURE;
  589.     // Get min bone influence.
  590.     STDMETHOD_(FLOAT, GetMinBoneInfluence)(THIS) PURE;
  591.    
  592.     // Bone names are returned by D3DXLoadSkinMeshFromXof. They are not used by any other method of this object
  593.     STDMETHOD(SetBoneName)(THIS_ DWORD Bone, LPCSTR pName) PURE; // pName is copied to an internal string buffer
  594.     STDMETHOD_(LPCSTR, GetBoneName)(THIS_ DWORD Bone) PURE; // A pointer to an internal string buffer is returned. Do not free this.
  595.    
  596.     // Bone offset matrices are returned by D3DXLoadSkinMeshFromXof. They are not used by any other method of this object
  597.     STDMETHOD(SetBoneOffsetMatrix)(THIS_ DWORD Bone, CONST D3DXMATRIX *pBoneTransform) PURE; // pBoneTransform is copied to an internal buffer
  598.     STDMETHOD_(LPD3DXMATRIX, GetBoneOffsetMatrix)(THIS_ DWORD Bone) PURE; // A pointer to an internal matrix is returned. Do not free this.
  599.    
  600.     // Clone a skin info object
  601.     STDMETHOD(Clone)(THIS_ LPD3DXSKININFO* ppSkinInfo) PURE;
  602.    
  603.     // Update bone influence information to match vertices after they are reordered. This should be called
  604.     // if the target vertex buffer has been reordered externally.
  605.     STDMETHOD(Remap)(THIS_ DWORD NumVertices, DWORD* pVertexRemap) PURE;
  606.  
  607.     // These methods enable the modification of the vertex layout of the vertices that will be skinned
  608.     STDMETHOD(SetFVF)(THIS_ DWORD FVF) PURE;
  609.     STDMETHOD(SetDeclaration)(THIS_ CONST D3DVERTEXELEMENT9 *pDeclaration) PURE;
  610.     STDMETHOD_(DWORD, GetFVF)(THIS) PURE;
  611.     STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE;
  612.  
  613.     // Apply SW skinning based on current pose matrices to the target vertices.
  614.     STDMETHOD(UpdateSkinnedMesh)(THIS_
  615.         CONST D3DXMATRIX* pBoneTransforms,
  616.         CONST D3DXMATRIX* pBoneInvTransposeTransforms,
  617.         LPCVOID pVerticesSrc,
  618.         PVOID pVerticesDst) PURE;
  619.  
  620.     // Takes a mesh and returns a new mesh with per vertex blend weights and a bone combination
  621.     // table that describes which bones affect which subsets of the mesh
  622.     STDMETHOD(ConvertToBlendedMesh)(THIS_
  623.         LPD3DXMESH pMesh,
  624.         DWORD Options,
  625.         CONST DWORD *pAdjacencyIn,
  626.         LPDWORD pAdjacencyOut,
  627.         DWORD* pFaceRemap,
  628.         LPD3DXBUFFER *ppVertexRemap,
  629.         DWORD* pMaxFaceInfl,
  630.         DWORD* pNumBoneCombinations,
  631.         LPD3DXBUFFER* ppBoneCombinationTable,
  632.         LPD3DXMESH* ppMesh) PURE;
  633.  
  634.     // Takes a mesh and returns a new mesh with per vertex blend weights and indices
  635.     // and a bone combination table that describes which bones palettes affect which subsets of the mesh
  636.     STDMETHOD(ConvertToIndexedBlendedMesh)(THIS_
  637.         LPD3DXMESH pMesh,
  638.         DWORD Options,
  639.         DWORD paletteSize,
  640.         CONST DWORD *pAdjacencyIn,
  641.         LPDWORD pAdjacencyOut,
  642.         DWORD* pFaceRemap,
  643.         LPD3DXBUFFER *ppVertexRemap,
  644.         DWORD* pMaxVertexInfl,
  645.         DWORD* pNumBoneCombinations,
  646.         LPD3DXBUFFER* ppBoneCombinationTable,
  647.         LPD3DXMESH* ppMesh) PURE;
  648. };
  649.  
  650. #ifdef __cplusplus
  651. extern "C" {
  652. #endif //__cplusplus
  653.  
  654.  
  655. HRESULT WINAPI
  656.     D3DXCreateMesh(
  657.         DWORD NumFaces,
  658.         DWORD NumVertices,
  659.         DWORD Options,
  660.         CONST D3DVERTEXELEMENT9 *pDeclaration,
  661.         LPDIRECT3DDEVICE9 pD3DDevice,
  662.         LPD3DXMESH* ppMesh);
  663.  
  664. HRESULT WINAPI
  665.     D3DXCreateMeshFVF(
  666.         DWORD NumFaces,
  667.         DWORD NumVertices,
  668.         DWORD Options,
  669.         DWORD FVF,
  670.         LPDIRECT3DDEVICE9 pD3DDevice,
  671.         LPD3DXMESH* ppMesh);
  672.  
  673. HRESULT WINAPI
  674.     D3DXCreateSPMesh(
  675.         LPD3DXMESH pMesh,
  676.         CONST DWORD* pAdjacency,
  677.         CONST D3DXATTRIBUTEWEIGHTS *pVertexAttributeWeights,
  678.         CONST FLOAT *pVertexWeights,
  679.         LPD3DXSPMESH* ppSMesh);
  680.  
  681. // clean a mesh up for simplification, try to make manifold
  682. HRESULT WINAPI
  683.     D3DXCleanMesh(
  684.     D3DXCLEANTYPE CleanType,
  685.     LPD3DXMESH pMeshIn,
  686.     CONST DWORD* pAdjacencyIn,
  687.     LPD3DXMESH* ppMeshOut,
  688.     DWORD* pAdjacencyOut,
  689.     LPD3DXBUFFER* ppErrorsAndWarnings);
  690.  
  691. HRESULT WINAPI
  692.     D3DXValidMesh(
  693.     LPD3DXMESH pMeshIn,
  694.     CONST DWORD* pAdjacency,
  695.     LPD3DXBUFFER* ppErrorsAndWarnings);
  696.  
  697. HRESULT WINAPI
  698.     D3DXGeneratePMesh(
  699.         LPD3DXMESH pMesh,
  700.         CONST DWORD* pAdjacency,
  701.         CONST D3DXATTRIBUTEWEIGHTS *pVertexAttributeWeights,
  702.         CONST FLOAT *pVertexWeights,
  703.         DWORD MinValue,
  704.         DWORD Options,
  705.         LPD3DXPMESH* ppPMesh);
  706.  
  707. HRESULT WINAPI
  708.     D3DXSimplifyMesh(
  709.         LPD3DXMESH pMesh,
  710.         CONST DWORD* pAdjacency,
  711.         CONST D3DXATTRIBUTEWEIGHTS *pVertexAttributeWeights,
  712.         CONST FLOAT *pVertexWeights,
  713.         DWORD MinValue,
  714.         DWORD Options,
  715.         LPD3DXMESH* ppMesh);
  716.  
  717. HRESULT WINAPI
  718.     D3DXComputeBoundingSphere(
  719.         CONST D3DXVECTOR3 *pFirstPosition,  // pointer to first position
  720.         DWORD NumVertices,
  721.         DWORD dwStride,                     // count in bytes to subsequent position vectors
  722.         D3DXVECTOR3 *pCenter,
  723.         FLOAT *pRadius);
  724.  
  725. HRESULT WINAPI
  726.     D3DXComputeBoundingBox(
  727.         CONST D3DXVECTOR3 *pFirstPosition,  // pointer to first position
  728.         DWORD NumVertices,
  729.         DWORD dwStride,                     // count in bytes to subsequent position vectors
  730.         D3DXVECTOR3 *pMin,
  731.         D3DXVECTOR3 *pMax);
  732.  
  733. HRESULT WINAPI
  734.     D3DXComputeNormals(
  735.         LPD3DXBASEMESH pMesh,
  736.         CONST DWORD *pAdjacency);
  737.  
  738. HRESULT WINAPI
  739.     D3DXCreateBuffer(
  740.         DWORD NumBytes,
  741.         LPD3DXBUFFER *ppBuffer);
  742.  
  743.  
  744. HRESULT WINAPI
  745.     D3DXLoadMeshFromXA(
  746.         LPCSTR pFilename,
  747.         DWORD Options,
  748.         LPDIRECT3DDEVICE9 pD3DDevice,
  749.         LPD3DXBUFFER *ppAdjacency,
  750.         LPD3DXBUFFER *ppMaterials,
  751.         LPD3DXBUFFER *ppEffectInstances,
  752.         DWORD *pNumMaterials,
  753.         LPD3DXMESH *ppMesh);
  754.  
  755. HRESULT WINAPI
  756.     D3DXLoadMeshFromXW(
  757.         LPCWSTR pFilename,
  758.         DWORD Options,
  759.         LPDIRECT3DDEVICE9 pD3DDevice,
  760.         LPD3DXBUFFER *ppAdjacency,
  761.         LPD3DXBUFFER *ppMaterials,
  762.         LPD3DXBUFFER *ppEffectInstances,
  763.         DWORD *pNumMaterials,
  764.         LPD3DXMESH *ppMesh);
  765.  
  766. #ifdef UNICODE
  767. #define D3DXLoadMeshFromX D3DXLoadMeshFromXW
  768. #else
  769. #define D3DXLoadMeshFromX D3DXLoadMeshFromXA
  770. #endif
  771.  
  772. HRESULT WINAPI
  773.     D3DXLoadMeshFromXInMemory(
  774.         LPCVOID Memory,
  775.         DWORD SizeOfMemory,
  776.         DWORD Options,
  777.         LPDIRECT3DDEVICE9 pD3DDevice,
  778.         LPD3DXBUFFER *ppAdjacency,
  779.         LPD3DXBUFFER *ppMaterials,
  780.         LPD3DXBUFFER *ppEffectInstances,
  781.         DWORD *pNumMaterials,
  782.         LPD3DXMESH *ppMesh);
  783.  
  784. HRESULT WINAPI
  785.     D3DXLoadMeshFromXResource(
  786.         HMODULE Module,
  787.         LPCSTR Name,
  788.         LPCSTR Type,
  789.         DWORD Options,
  790.         LPDIRECT3DDEVICE9 pD3DDevice,
  791.         LPD3DXBUFFER *ppAdjacency,
  792.         LPD3DXBUFFER *ppMaterials,
  793.         LPD3DXBUFFER *ppEffectInstances,
  794.         DWORD *pNumMaterials,
  795.         LPD3DXMESH *ppMesh);
  796.  
  797. HRESULT WINAPI
  798.     D3DXSaveMeshToXA(
  799.         LPCSTR pFilename,
  800.         LPD3DXMESH pMesh,
  801.         CONST DWORD* pAdjacency,
  802.         CONST D3DXMATERIAL* pMaterials,
  803.         CONST D3DXEFFECTINSTANCE* pEffectInstances,
  804.         DWORD NumMaterials,
  805.         DWORD Format
  806.         );
  807.  
  808. HRESULT WINAPI
  809.     D3DXSaveMeshToXW(
  810.         LPCWSTR pFilename,
  811.         LPD3DXMESH pMesh,
  812.         CONST DWORD* pAdjacency,
  813.         CONST D3DXMATERIAL* pMaterials,
  814.         CONST D3DXEFFECTINSTANCE* pEffectInstances,
  815.         DWORD NumMaterials,
  816.         DWORD Format
  817.         );
  818.        
  819. #ifdef UNICODE
  820. #define D3DXSaveMeshToX D3DXSaveMeshToXW
  821. #else
  822. #define D3DXSaveMeshToX D3DXSaveMeshToXA
  823. #endif
  824.        
  825.  
  826. HRESULT WINAPI
  827.     D3DXCreatePMeshFromStream(
  828.         IStream *pStream,
  829.         DWORD Options,
  830.         LPDIRECT3DDEVICE9 pD3DDevice,
  831.         LPD3DXBUFFER *ppMaterials,
  832.         LPD3DXBUFFER *ppEffectInstances,
  833.         DWORD* pNumMaterials,
  834.         LPD3DXPMESH *ppPMesh);
  835.  
  836. // 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
  837. // The bone names and initial bone transforms are not filled in the skin info object by this method.
  838. HRESULT WINAPI
  839.     D3DXCreateSkinInfo(
  840.         DWORD NumVertices,
  841.         CONST D3DVERTEXELEMENT9 *pDeclaration,
  842.         DWORD NumBones,
  843.         LPD3DXSKININFO* ppSkinInfo);
  844.        
  845. // 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
  846. // The bone names and initial bone transforms are not filled in the skin info object by this method.
  847. HRESULT WINAPI
  848.     D3DXCreateSkinInfoFVF(
  849.         DWORD NumVertices,
  850.         DWORD FVF,
  851.         DWORD NumBones,
  852.         LPD3DXSKININFO* ppSkinInfo);
  853.        
  854. #ifdef __cplusplus
  855. }
  856.  
  857. extern "C" {
  858. #endif //__cplusplus
  859.  
  860. HRESULT WINAPI
  861.     D3DXLoadMeshFromXof(
  862.         LPD3DXFILEDATA pxofMesh,
  863.         DWORD Options,
  864.         LPDIRECT3DDEVICE9 pD3DDevice,
  865.         LPD3DXBUFFER *ppAdjacency,
  866.         LPD3DXBUFFER *ppMaterials,
  867.         LPD3DXBUFFER *ppEffectInstances,
  868.         DWORD *pNumMaterials,
  869.         LPD3DXMESH *ppMesh);
  870.  
  871. // This similar to D3DXLoadMeshFromXof, except also returns skinning info if present in the file
  872. // If skinning info is not present, ppSkinInfo will be NULL    
  873. HRESULT WINAPI
  874.     D3DXLoadSkinMeshFromXof(
  875.         LPD3DXFILEDATA pxofMesh,
  876.         DWORD Options,
  877.         LPDIRECT3DDEVICE9 pD3DDevice,
  878.         LPD3DXBUFFER* ppAdjacency,
  879.         LPD3DXBUFFER* ppMaterials,
  880.         LPD3DXBUFFER *ppEffectInstances,
  881.         DWORD *pMatOut,
  882.         LPD3DXSKININFO* ppSkinInfo,
  883.         LPD3DXMESH* ppMesh);
  884.  
  885.  
  886. // The inverse of D3DXConvertTo{Indexed}BlendedMesh() functions. It figures out the skinning info from
  887. // the mesh and the bone combination table and populates a skin info object with that data. The bone
  888. // names and initial bone transforms are not filled in the skin info object by this method. This works
  889. // with either a non-indexed or indexed blended mesh. It examines the FVF or declarator of the mesh to
  890. // determine what type it is.
  891. HRESULT WINAPI
  892.     D3DXCreateSkinInfoFromBlendedMesh(
  893.         LPD3DXBASEMESH pMesh,
  894.         DWORD NumBones,
  895.         CONST D3DXBONECOMBINATION *pBoneCombinationTable,
  896.         LPD3DXSKININFO* ppSkinInfo);
  897.        
  898. HRESULT WINAPI
  899.     D3DXTessellateNPatches(
  900.         LPD3DXMESH pMeshIn,            
  901.         CONST DWORD* pAdjacencyIn,            
  902.         FLOAT NumSegs,                    
  903.         BOOL  QuadraticInterpNormals,     // if false use linear intrep for normals, if true use quadratic
  904.         LPD3DXMESH *ppMeshOut,
  905.         LPD3DXBUFFER *ppAdjacencyOut);
  906.  
  907.  
  908. //generates implied outputdecl from input decl
  909. //the decl generated from this should be used to generate the output decl for
  910. //the tessellator subroutines.
  911.  
  912. HRESULT WINAPI
  913.     D3DXGenerateOutputDecl(
  914.         D3DVERTEXELEMENT9 *pOutput,
  915.         CONST D3DVERTEXELEMENT9 *pInput);
  916.  
  917. //loads patches from an XFileData
  918. //since an X file can have up to 6 different patch meshes in it,
  919. //returns them in an array - pNumPatches will contain the number of
  920. //meshes in the actual file.
  921. HRESULT WINAPI
  922.     D3DXLoadPatchMeshFromXof(
  923.         LPD3DXFILEDATA pXofObjMesh,
  924.         DWORD Options,
  925.         LPDIRECT3DDEVICE9 pD3DDevice,
  926.         LPD3DXBUFFER *ppMaterials,
  927.         LPD3DXBUFFER *ppEffectInstances,
  928.         PDWORD pNumMaterials,
  929.         LPD3DXPATCHMESH *ppMesh);
  930.  
  931. //computes the size a single rect patch.
  932. HRESULT WINAPI
  933.     D3DXRectPatchSize(
  934.         CONST FLOAT *pfNumSegs, //segments for each edge (4)
  935.         DWORD *pdwTriangles,    //output number of triangles
  936.         DWORD *pdwVertices);    //output number of vertices
  937.  
  938. //computes the size of a single triangle patch      
  939. HRESULT WINAPI
  940.     D3DXTriPatchSize(
  941.         CONST FLOAT *pfNumSegs, //segments for each edge (3)    
  942.         DWORD *pdwTriangles,    //output number of triangles
  943.         DWORD *pdwVertices);    //output number of vertices
  944.  
  945.  
  946. //tessellates a patch into a created mesh
  947. //similar to D3D RT patch
  948. HRESULT WINAPI
  949.     D3DXTessellateRectPatch(
  950.         LPDIRECT3DVERTEXBUFFER9 pVB,
  951.         CONST FLOAT *pNumSegs,
  952.         CONST D3DVERTEXELEMENT9 *pdwInDecl,
  953.         CONST D3DRECTPATCH_INFO *pRectPatchInfo,
  954.         LPD3DXMESH pMesh);
  955.  
  956.  
  957. HRESULT WINAPI
  958.     D3DXTessellateTriPatch(
  959.       LPDIRECT3DVERTEXBUFFER9 pVB,
  960.       CONST FLOAT *pNumSegs,
  961.       CONST D3DVERTEXELEMENT9 *pInDecl,
  962.       CONST D3DTRIPATCH_INFO *pTriPatchInfo,
  963.       LPD3DXMESH pMesh);
  964.  
  965.  
  966.  
  967. //creates an NPatch PatchMesh from a D3DXMESH
  968. HRESULT WINAPI
  969.     D3DXCreateNPatchMesh(
  970.         LPD3DXMESH pMeshSysMem,
  971.         LPD3DXPATCHMESH *pPatchMesh);
  972.  
  973.      
  974. //creates a patch mesh
  975. HRESULT WINAPI
  976.     D3DXCreatePatchMesh(
  977.         CONST D3DXPATCHINFO *pInfo,     //patch type
  978.         DWORD dwNumPatches,             //number of patches
  979.         DWORD dwNumVertices,            //number of control vertices
  980.         DWORD dwOptions,                //options
  981.         CONST D3DVERTEXELEMENT9 *pDecl, //format of control vertices
  982.         LPDIRECT3DDEVICE9 pD3DDevice,
  983.         LPD3DXPATCHMESH *pPatchMesh);
  984.  
  985.        
  986. //returns the number of degenerates in a patch mesh -
  987. //text output put in string.
  988. HRESULT WINAPI
  989.     D3DXValidPatchMesh(LPD3DXPATCHMESH pMesh,
  990.                         DWORD *dwcDegenerateVertices,
  991.                         DWORD *dwcDegeneratePatches,
  992.                         LPD3DXBUFFER *ppErrorsAndWarnings);
  993.  
  994. UINT WINAPI
  995.     D3DXGetFVFVertexSize(DWORD FVF);
  996.  
  997. UINT WINAPI
  998.     D3DXGetDeclVertexSize(CONST D3DVERTEXELEMENT9 *pDecl,DWORD Stream);
  999.  
  1000. UINT WINAPI
  1001.     D3DXGetDeclLength(CONST D3DVERTEXELEMENT9 *pDecl);
  1002.  
  1003. HRESULT WINAPI
  1004.     D3DXDeclaratorFromFVF(
  1005.         DWORD FVF,
  1006.         D3DVERTEXELEMENT9 pDeclarator[MAX_FVF_DECL_SIZE]);
  1007.  
  1008. HRESULT WINAPI
  1009.     D3DXFVFFromDeclarator(
  1010.         CONST D3DVERTEXELEMENT9 *pDeclarator,
  1011.         DWORD *pFVF);
  1012.  
  1013. HRESULT WINAPI
  1014.     D3DXWeldVertices(
  1015.         LPD3DXMESH pMesh,        
  1016.         DWORD Flags,
  1017.         CONST D3DXWELDEPSILONS *pEpsilons,                
  1018.         CONST DWORD *pAdjacencyIn,
  1019.         DWORD *pAdjacencyOut,
  1020.         DWORD *pFaceRemap,
  1021.         LPD3DXBUFFER *ppVertexRemap);
  1022.  
  1023. typedef struct _D3DXINTERSECTINFO
  1024. {
  1025.     DWORD FaceIndex;                // index of face intersected
  1026.     FLOAT U;                        // Barycentric Hit Coordinates    
  1027.     FLOAT V;                        // Barycentric Hit Coordinates
  1028.     FLOAT Dist;                     // Ray-Intersection Parameter Distance
  1029. } D3DXINTERSECTINFO, *LPD3DXINTERSECTINFO;
  1030.  
  1031.  
  1032. HRESULT WINAPI
  1033.     D3DXIntersect(
  1034.         LPD3DXBASEMESH pMesh,
  1035.         CONST D3DXVECTOR3 *pRayPos,
  1036.         CONST D3DXVECTOR3 *pRayDir,
  1037.         BOOL    *pHit,              // True if any faces were intersected
  1038.         DWORD   *pFaceIndex,        // index of closest face intersected
  1039.         FLOAT   *pU,                // Barycentric Hit Coordinates    
  1040.         FLOAT   *pV,                // Barycentric Hit Coordinates
  1041.         FLOAT   *pDist,             // Ray-Intersection Parameter Distance
  1042.         LPD3DXBUFFER *ppAllHits,    // Array of D3DXINTERSECTINFOs for all hits (not just closest)
  1043.         DWORD   *pCountOfHits);     // Number of entries in AllHits array
  1044.  
  1045. HRESULT WINAPI
  1046.     D3DXIntersectSubset(
  1047.         LPD3DXBASEMESH pMesh,
  1048.         DWORD AttribId,
  1049.         CONST D3DXVECTOR3 *pRayPos,
  1050.         CONST D3DXVECTOR3 *pRayDir,
  1051.         BOOL    *pHit,              // True if any faces were intersected
  1052.         DWORD   *pFaceIndex,        // index of closest face intersected
  1053.         FLOAT   *pU,                // Barycentric Hit Coordinates    
  1054.         FLOAT   *pV,                // Barycentric Hit Coordinates
  1055.         FLOAT   *pDist,             // Ray-Intersection Parameter Distance
  1056.         LPD3DXBUFFER *ppAllHits,    // Array of D3DXINTERSECTINFOs for all hits (not just closest)
  1057.         DWORD   *pCountOfHits);     // Number of entries in AllHits array
  1058.  
  1059.  
  1060. HRESULT WINAPI D3DXSplitMesh
  1061.     (
  1062.     LPD3DXMESH pMeshIn,        
  1063.     CONST DWORD *pAdjacencyIn,
  1064.     CONST DWORD MaxSize,
  1065.     CONST DWORD Options,
  1066.     DWORD *pMeshesOut,
  1067.     LPD3DXBUFFER *ppMeshArrayOut,
  1068.     LPD3DXBUFFER *ppAdjacencyArrayOut,
  1069.     LPD3DXBUFFER *ppFaceRemapArrayOut,
  1070.     LPD3DXBUFFER *ppVertRemapArrayOut
  1071.     );
  1072.  
  1073. BOOL WINAPI D3DXIntersectTri
  1074. (
  1075.     CONST D3DXVECTOR3 *p0,           // Triangle vertex 0 position
  1076.     CONST D3DXVECTOR3 *p1,           // Triangle vertex 1 position
  1077.     CONST D3DXVECTOR3 *p2,           // Triangle vertex 2 position
  1078.     CONST D3DXVECTOR3 *pRayPos,      // Ray origin
  1079.     CONST D3DXVECTOR3 *pRayDir,      // Ray direction
  1080.     FLOAT *pU,                       // Barycentric Hit Coordinates
  1081.     FLOAT *pV,                       // Barycentric Hit Coordinates
  1082.     FLOAT *pDist);                   // Ray-Intersection Parameter Distance
  1083.  
  1084. BOOL WINAPI
  1085.     D3DXSphereBoundProbe(
  1086.         CONST D3DXVECTOR3 *pCenter,
  1087.         FLOAT Radius,
  1088.         CONST D3DXVECTOR3 *pRayPosition,
  1089.         CONST D3DXVECTOR3 *pRayDirection);
  1090.  
  1091. BOOL WINAPI
  1092.     D3DXBoxBoundProbe(
  1093.         CONST D3DXVECTOR3 *pMin,
  1094.         CONST D3DXVECTOR3 *pMax,
  1095.         CONST D3DXVECTOR3 *pRayPosition,
  1096.         CONST D3DXVECTOR3 *pRayDirection);
  1097.  
  1098.  
  1099. HRESULT WINAPI D3DXComputeTangentFrame(ID3DXMesh *pMesh,
  1100.                                        DWORD dwOptions);
  1101.  
  1102. HRESULT WINAPI D3DXComputeTangentFrameEx(ID3DXMesh *pMesh,
  1103.                                          DWORD dwTextureInSemantic,
  1104.                                          DWORD dwTextureInIndex,
  1105.                                          DWORD dwUPartialOutSemantic,
  1106.                                          DWORD dwUPartialOutIndex,
  1107.                                          DWORD dwVPartialOutSemantic,
  1108.                                          DWORD dwVPartialOutIndex,
  1109.                                          DWORD dwNormalOutSemantic,
  1110.                                          DWORD dwNormalOutIndex,
  1111.                                          DWORD dwOptions,
  1112.                                          CONST DWORD *pdwAdjacency,
  1113.                                          FLOAT fPartialEdgeThreshold,
  1114.                                          FLOAT fSingularPointThreshold,
  1115.                                          FLOAT fNormalEdgeThreshold,
  1116.                                          ID3DXMesh **ppMeshOut,
  1117.                                          ID3DXBuffer **ppVertexMapping);
  1118.  
  1119.  
  1120. //D3DXComputeTangent
  1121. //
  1122. //Computes the Tangent vectors for the TexStage texture coordinates
  1123. //and places the results in the TANGENT[TangentIndex] specified in the meshes' DECL
  1124. //puts the binorm in BINORM[BinormIndex] also specified in the decl.
  1125. //
  1126. //If neither the binorm or the tangnet are in the meshes declaration,
  1127. //the function will fail.
  1128. //
  1129. //If a tangent or Binorm field is in the Decl, but the user does not
  1130. //wish D3DXComputeTangent to replace them, then D3DX_DEFAULT specified
  1131. //in the TangentIndex or BinormIndex will cause it to ignore the specified
  1132. //semantic.
  1133. //
  1134. //Wrap should be specified if the texture coordinates wrap.
  1135.  
  1136. HRESULT WINAPI D3DXComputeTangent(LPD3DXMESH Mesh,
  1137.                                  DWORD TexStage,
  1138.                                  DWORD TangentIndex,
  1139.                                  DWORD BinormIndex,
  1140.                                  DWORD Wrap,
  1141.                                  CONST DWORD *pAdjacency);
  1142.  
  1143. //============================================================================
  1144. //
  1145. // UVAtlas apis
  1146. //
  1147. //============================================================================
  1148. typedef HRESULT (WINAPI *LPD3DXUVATLASCB)(FLOAT fPercentDone,  LPVOID lpUserContext);
  1149.  
  1150. // This function creates atlases for meshes. There are two modes of operation,
  1151. // either based on the number of charts, or the maximum allowed stretch. If the
  1152. // maximum allowed stretch is 0, then each triangle will likely be in its own
  1153. // chart.
  1154.  
  1155. //
  1156. // The parameters are as follows:
  1157. //  pMesh - Input mesh to calculate an atlas for. This must have a position
  1158. //          channel and at least a 2-d texture channel.
  1159. //  uMaxChartNumber - The maximum number of charts required for the atlas.
  1160. //                    If this is 0, it will be parameterized based solely on
  1161. //                    stretch.
  1162. //  fMaxStretch - The maximum amount of stretch, if 0, no stretching is allowed,
  1163. //                if 1, then any amount of stretching is allowed.
  1164. //  uWidth - The width of the texture the atlas will be used on.
  1165. //  uHeight - The height of the texture the atlas will be used on.
  1166. //  fGutter - The minimum distance, in texels between two charts on the atlas.
  1167. //            this gets scaled by the width, so if fGutter is 2.5, and it is
  1168. //            used on a 512x512 texture, then the minimum distance will be
  1169. //            2.5 / 512 in u-v space.
  1170. //  dwTextureIndex - Specifies which texture coordinate to write to in the
  1171. //                   output mesh (which is cloned from the input mesh). Useful
  1172. //                   if your vertex has multiple texture coordinates.
  1173. //  pdwAdjacency - a pointer to an array with 3 DWORDs per face, indicating
  1174. //                 which triangles are adjacent to each other.
  1175. //  pdwFalseEdgeAdjacency - a pointer to an array with 3 DWORDS per face, indicating
  1176. //                          at each face, whether an edge is a false edge or not (using
  1177. //                          the same ordering as the adjacency data structure). If this
  1178. //                          is NULL, then it is assumed that there are no false edges. If
  1179. //                          not NULL, then a non-false edge is indicated by -1 and a false
  1180. //                          edge is indicated by any other value (it is not required, but
  1181. //                          it may be useful for the caller to use the original adjacency
  1182. //                          value). This allows you to parameterize a mesh of quads, and
  1183. //                          the edges down the middle of each quad will not be cut when
  1184. //                          parameterizing the mesh.
  1185. //  pfIMTArray - a pointer to an array with 3 FLOATs per face, describing the
  1186. //               integrated metric tensor for that face. This lets you control
  1187. //               the way this triangle may be stretched in the atlas. The IMT
  1188. //               passed in will be 3 floats (a,b,c) and specify a symmetric
  1189. //               matrix (a b) that, given a vector (s,t), specifies the
  1190. //                      (b c)
  1191. //               distance between a vector v1 and a vector v2 = v1 + (s,t) as
  1192. //               sqrt((s, t) * M * (s, t)^T).
  1193. //               In other words, this lets one specify the magnitude of the
  1194. //               stretch in an arbitrary direction in u-v space. For example
  1195. //               if a = b = c = 1, then this scales the vector (1,1) by 2, and
  1196. //               the vector (1,-1) by 0. Note that this is multiplying the edge
  1197. //               length by the square of the matrix, so if you want the face to
  1198. //               stretch to twice its
  1199. //               size with no shearing, the IMT value should be (2, 0, 2), which
  1200. //               is just the identity matrix times 2.
  1201. //               Note that this assumes you have an orientation for the triangle
  1202. //               in some 2-D space. For D3DXUVAtlas, this space is created by
  1203. //               letting S be the direction from the first to the second
  1204. //               vertex, and T be the cross product between the normal and S.
  1205. //              
  1206. //  pStatusCallback - Since the atlas creation process can be very CPU intensive,
  1207. //                    this allows the programmer to specify a function to be called
  1208. //                    periodically, similarly to how it is done in the PRT simulation
  1209. //                    engine.
  1210. //  fCallbackFrequency - This lets you specify how often the callback will be
  1211. //                       called. A decent default should be 0.0001f.
  1212. //  pUserContext - a void pointer to be passed back to the callback function
  1213. //  dwOptions - A combination of flags in the D3DXUVATLAS enum
  1214. //  ppMeshOut - A pointer to a location to store a pointer for the newly created
  1215. //              mesh.
  1216. //  ppFacePartitioning - A pointer to a location to store a pointer for an array,
  1217. //                       one DWORD per face, giving the final partitioning
  1218. //                       created by the atlasing algorithm.
  1219. //  ppVertexRemapArray - A pointer to a location to store a pointer for an array,
  1220. //                       one DWORD per vertex, giving the vertex it was copied
  1221. //                       from, if any vertices needed to be split.
  1222. //  pfMaxStretchOut - A location to store the maximum stretch resulting from the
  1223. //                    atlasing algorithm.
  1224. //  puNumChartsOut - A location to store the number of charts created, or if the
  1225. //                   maximum number of charts was too low, this gives the minimum
  1226. //                    number of charts needed to create an atlas.
  1227.  
  1228. HRESULT WINAPI D3DXUVAtlasCreate(LPD3DXMESH pMesh,
  1229.                                  UINT uMaxChartNumber,
  1230.                                  FLOAT fMaxStretch,
  1231.                                  UINT uWidth,
  1232.                                  UINT uHeight,
  1233.                                  FLOAT fGutter,
  1234.                                  DWORD dwTextureIndex,
  1235.                                  CONST DWORD *pdwAdjacency,
  1236.                                  CONST DWORD *pdwFalseEdgeAdjacency,
  1237.                                  CONST FLOAT *pfIMTArray,
  1238.                                  LPD3DXUVATLASCB pStatusCallback,
  1239.                                  FLOAT fCallbackFrequency,
  1240.                                  LPVOID pUserContext,
  1241.                                  DWORD dwOptions,
  1242.                                  LPD3DXMESH *ppMeshOut,
  1243.                                  LPD3DXBUFFER *ppFacePartitioning,
  1244.                                  LPD3DXBUFFER *ppVertexRemapArray,
  1245.                                  FLOAT *pfMaxStretchOut,
  1246.                                  UINT *puNumChartsOut);
  1247.  
  1248. // This has the same exact arguments as Create, except that it does not perform the
  1249. // final packing step. This method allows one to get a partitioning out, and possibly
  1250. // modify it before sending it to be repacked. Note that if you change the
  1251. // partitioning, you'll also need to calculate new texture coordinates for any faces
  1252. // that have switched charts.
  1253. //
  1254. // The partition result adjacency output parameter is meant to be passed to the
  1255. // UVAtlasPack function, this adjacency cuts edges that are between adjacent
  1256. // charts, and also can include cuts inside of a chart in order to make it
  1257. // equivalent to a disc. For example:
  1258. //
  1259. // _______
  1260. // | ___ |
  1261. // | |_| |
  1262. // |_____|
  1263. //
  1264. // In order to make this equivalent to a disc, we would need to add a cut, and it
  1265. // Would end up looking like:
  1266. // _______
  1267. // | ___ |
  1268. // | |_|_|
  1269. // |_____|
  1270. //
  1271. // The resulting partition adjacency parameter cannot be NULL, because it is
  1272. // required for the packing step.
  1273.  
  1274.  
  1275.  
  1276. HRESULT WINAPI D3DXUVAtlasPartition(LPD3DXMESH pMesh,
  1277.                                     UINT uMaxChartNumber,
  1278.                                     FLOAT fMaxStretch,
  1279.                                     DWORD dwTextureIndex,
  1280.                                     CONST DWORD *pdwAdjacency,
  1281.                                     CONST DWORD *pdwFalseEdgeAdjacency,
  1282.                                     CONST FLOAT *pfIMTArray,
  1283.                                     LPD3DXUVATLASCB pStatusCallback,
  1284.                                     FLOAT fCallbackFrequency,
  1285.                                     LPVOID pUserContext,
  1286.                                     DWORD dwOptions,
  1287.                                     LPD3DXMESH *ppMeshOut,
  1288.                                     LPD3DXBUFFER *ppFacePartitioning,
  1289.                                     LPD3DXBUFFER *ppVertexRemapArray,
  1290.                                     LPD3DXBUFFER *ppPartitionResultAdjacency,
  1291.                                     FLOAT *pfMaxStretchOut,
  1292.                                     UINT *puNumChartsOut);
  1293.  
  1294. // This takes the face partitioning result from Partition and packs it into an
  1295. // atlas of the given size. pdwPartitionResultAdjacency should be derived from
  1296. // the adjacency returned from the partition step. This value cannot be NULL
  1297. // because Pack needs to know where charts were cut in the partition step in
  1298. // order to find the edges of each chart.
  1299. // The options parameter is currently reserved.
  1300. HRESULT WINAPI D3DXUVAtlasPack(ID3DXMesh *pMesh,
  1301.                                UINT uWidth,
  1302.                                UINT uHeight,
  1303.                                FLOAT fGutter,
  1304.                                DWORD dwTextureIndex,
  1305.                                CONST DWORD *pdwPartitionResultAdjacency,
  1306.                                LPD3DXUVATLASCB pStatusCallback,
  1307.                                FLOAT fCallbackFrequency,
  1308.                                LPVOID pUserContext,
  1309.                                DWORD dwOptions,
  1310.                                LPD3DXBUFFER pFacePartitioning);
  1311.  
  1312.  
  1313. //============================================================================
  1314. //
  1315. // IMT Calculation apis
  1316. //
  1317. // These functions all compute the Integrated Metric Tensor for use in the
  1318. // UVAtlas API. They all calculate the IMT with respect to the canonical
  1319. // triangle, where the coordinate system is set up so that the u axis goes
  1320. // from vertex 0 to 1 and the v axis is N x u. So, for example, the second
  1321. // vertex's canonical uv coordinates are (d,0) where d is the distance between
  1322. // vertices 0 and 1. This way the IMT does not depend on the parameterization
  1323. // of the mesh, and if the signal over the surface doesn't change, then
  1324. // the IMT doesn't need to be recalculated.
  1325. //============================================================================
  1326.  
  1327. // This callback is used by D3DXComputeIMTFromSignal.
  1328. //
  1329. // uv               - The texture coordinate for the vertex.
  1330. // uPrimitiveID     - Face ID of the triangle on which to compute the signal.
  1331. // uSignalDimension - The number of floats to store in pfSignalOut.
  1332. // pUserData        - The pUserData pointer passed in to ComputeIMTFromSignal.
  1333. // pfSignalOut      - A pointer to where to store the signal data.
  1334. typedef HRESULT (WINAPI* LPD3DXIMTSIGNALCALLBACK)
  1335.     (CONST D3DXVECTOR2 *uv,
  1336.      UINT uPrimitiveID,
  1337.      UINT uSignalDimension,
  1338.      VOID *pUserData,
  1339.      FLOAT *pfSignalOut);
  1340.  
  1341. // This function is used to calculate the IMT from per vertex data. It sets
  1342. // up a linear system over the triangle, solves for the jacobian J, then
  1343. // constructs the IMT from that (J^TJ).
  1344. // This function allows you to calculate the IMT based off of any value in a
  1345. // mesh (color, normal, etc) by specifying the correct stride of the array.
  1346. // The IMT computed will cause areas of the mesh that have similar values to
  1347. // take up less space in the texture.
  1348. //
  1349. // pMesh            - The mesh to calculate the IMT for.
  1350. // pVertexSignal    - A float array of size uSignalStride * v, where v is the
  1351. //                    number of vertices in the mesh.
  1352. // uSignalDimension - How many floats per vertex to use in calculating the IMT.
  1353. // uSignalStride    - The number of bytes per vertex in the array. This must be
  1354. //                    a multiple of sizeof(float)
  1355. // ppIMTData        - Where to store the buffer holding the IMT data
  1356.  
  1357. HRESULT WINAPI D3DXComputeIMTFromPerVertexSignal (
  1358.     LPD3DXMESH pMesh,
  1359.     CONST FLOAT *pfVertexSignal, // uSignalDimension floats per vertex
  1360.     UINT uSignalDimension,
  1361.     UINT uSignalStride,         // stride of signal in bytes
  1362.     DWORD dwOptions,            // reserved for future use
  1363.     LPD3DXUVATLASCB pStatusCallback,
  1364.     LPVOID pUserContext,
  1365.     LPD3DXBUFFER *ppIMTData);
  1366.  
  1367. // This function is used to calculate the IMT from data that varies over the
  1368. // surface of the mesh (generally at a higher frequency than vertex data).
  1369. // This function requires the mesh to already be parameterized (so it already
  1370. // has texture coordinates). It allows the user to define a signal arbitrarily
  1371. // over the surface of the mesh.
  1372. //
  1373. // pMesh            - The mesh to calculate the IMT for.
  1374. // dwTextureIndex   - This describes which set of texture coordinates in the
  1375. //                    mesh to use.
  1376. // uSignalDimension - How many components there are in the signal.
  1377. // fMaxUVDistance   - The subdivision will continue until the distance between
  1378. //                    all vertices is at most fMaxUVDistance.
  1379. // dwOptions        - reserved for future use
  1380. // pSignalCallback  - The callback to use to get the signal.
  1381. // pUserData        - A pointer that will be passed in to the callback.
  1382. // ppIMTData        - Where to store the buffer holding the IMT data
  1383. HRESULT WINAPI D3DXComputeIMTFromSignal(
  1384.     LPD3DXMESH pMesh,
  1385.     DWORD dwTextureIndex,
  1386.     UINT uSignalDimension,
  1387.     FLOAT fMaxUVDistance,
  1388.     DWORD dwOptions, // reserved for future use
  1389.     LPD3DXIMTSIGNALCALLBACK pSignalCallback,
  1390.     VOID *pUserData,
  1391.     LPD3DXUVATLASCB pStatusCallback,
  1392.     LPVOID pUserContext,
  1393.     LPD3DXBUFFER *ppIMTData);
  1394.  
  1395. // This function is used to calculate the IMT from texture data. Given a texture
  1396. // that maps over the surface of the mesh, the algorithm computes the IMT for
  1397. // each face. This will cause large areas that are very similar to take up less
  1398. // room when parameterized with UVAtlas. The texture is assumed to be
  1399. // interpolated over the mesh bilinearly.
  1400. //
  1401. // pMesh            - The mesh to calculate the IMT for.
  1402. // pTexture         - The texture to load data from.
  1403. // dwTextureIndex   - This describes which set of texture coordinates in the
  1404. //                    mesh to use.
  1405. // dwOptions        - Combination of one or more D3DXIMT flags.
  1406. // ppIMTData        - Where to store the buffer holding the IMT data
  1407. HRESULT WINAPI D3DXComputeIMTFromTexture (
  1408.     LPD3DXMESH pMesh,
  1409.     LPDIRECT3DTEXTURE9 pTexture,
  1410.     DWORD dwTextureIndex,
  1411.     DWORD dwOptions,
  1412.     LPD3DXUVATLASCB pStatusCallback,
  1413.     LPVOID pUserContext,
  1414.     LPD3DXBUFFER *ppIMTData);
  1415.  
  1416. // This function is very similar to ComputeIMTFromTexture, but it uses a
  1417. // float array to pass in the data, and it can calculate higher dimensional
  1418. // values than 4.
  1419. //
  1420. // pMesh            - The mesh to calculate the IMT for.
  1421. // dwTextureIndex   - This describes which set of texture coordinates in the
  1422. //                    mesh to use.
  1423. // pfFloatArray     - a pointer to a float array of size
  1424. //                    uWidth*uHeight*uComponents
  1425. // uWidth           - The width of the texture
  1426. // uHeight          - The height of the texture
  1427. // uSignalDimension - The number of floats per texel in the signal
  1428. // uComponents      - The number of floats in each texel
  1429. // dwOptions        - Combination of one or more D3DXIMT flags
  1430. // ppIMTData        - Where to store the buffer holding the IMT data
  1431. HRESULT WINAPI D3DXComputeIMTFromPerTexelSignal(
  1432.     LPD3DXMESH pMesh,
  1433.     DWORD dwTextureIndex,
  1434.     FLOAT *pfTexelSignal,
  1435.     UINT uWidth,
  1436.     UINT uHeight,
  1437.     UINT uSignalDimension,
  1438.     UINT uComponents,
  1439.     DWORD dwOptions,
  1440.     LPD3DXUVATLASCB pStatusCallback,
  1441.     LPVOID pUserContext,
  1442.     LPD3DXBUFFER *ppIMTData);
  1443.  
  1444. HRESULT WINAPI
  1445.     D3DXConvertMeshSubsetToSingleStrip(
  1446.         LPD3DXBASEMESH MeshIn,
  1447.         DWORD AttribId,
  1448.         DWORD IBOptions,
  1449.         LPDIRECT3DINDEXBUFFER9 *ppIndexBuffer,
  1450.         DWORD *pNumIndices);
  1451.  
  1452. HRESULT WINAPI
  1453.     D3DXConvertMeshSubsetToStrips(
  1454.         LPD3DXBASEMESH MeshIn,
  1455.         DWORD AttribId,
  1456.         DWORD IBOptions,
  1457.         LPDIRECT3DINDEXBUFFER9 *ppIndexBuffer,
  1458.         DWORD *pNumIndices,
  1459.         LPD3DXBUFFER *ppStripLengths,
  1460.         DWORD *pNumStrips);
  1461.  
  1462.        
  1463. //============================================================================
  1464. //
  1465. //  D3DXOptimizeFaces:
  1466. //  --------------------
  1467. //  Generate a face remapping for a triangle list that more effectively utilizes
  1468. //    vertex caches.  This optimization is identical to the one provided
  1469. //    by ID3DXMesh::Optimize with the hardware independent option enabled.
  1470. //
  1471. //  Parameters:
  1472. //   pbIndices
  1473. //      Triangle list indices to use for generating a vertex ordering
  1474. //   NumFaces
  1475. //      Number of faces in the triangle list
  1476. //   NumVertices
  1477. //      Number of vertices referenced by the triangle list
  1478. //   b32BitIndices
  1479. //      TRUE if indices are 32 bit, FALSE if indices are 16 bit
  1480. //   pFaceRemap
  1481. //      Destination buffer to store face ordering
  1482. //      The number stored for a given element is where in the new ordering
  1483. //        the face will have come from.  See ID3DXMesh::Optimize for more info.
  1484. //
  1485. //============================================================================
  1486. HRESULT WINAPI
  1487.     D3DXOptimizeFaces(
  1488.         LPCVOID pbIndices,
  1489.         UINT cFaces,
  1490.         UINT cVertices,
  1491.         BOOL b32BitIndices,
  1492.         DWORD* pFaceRemap);
  1493.        
  1494. //============================================================================
  1495. //
  1496. //  D3DXOptimizeVertices:
  1497. //  --------------------
  1498. //  Generate a vertex remapping to optimize for in order use of vertices for
  1499. //    a given set of indices.  This is commonly used after applying the face
  1500. //    remap generated by D3DXOptimizeFaces
  1501. //
  1502. //  Parameters:
  1503. //   pbIndices
  1504. //      Triangle list indices to use for generating a vertex ordering
  1505. //   NumFaces
  1506. //      Number of faces in the triangle list
  1507. //   NumVertices
  1508. //      Number of vertices referenced by the triangle list
  1509. //   b32BitIndices
  1510. //      TRUE if indices are 32 bit, FALSE if indices are 16 bit
  1511. //   pVertexRemap
  1512. //      Destination buffer to store vertex ordering
  1513. //      The number stored for a given element is where in the new ordering
  1514. //        the vertex will have come from.  See ID3DXMesh::Optimize for more info.
  1515. //
  1516. //============================================================================
  1517. HRESULT WINAPI
  1518.     D3DXOptimizeVertices(
  1519.         LPCVOID pbIndices,
  1520.         UINT cFaces,
  1521.         UINT cVertices,
  1522.         BOOL b32BitIndices,
  1523.         DWORD* pVertexRemap);
  1524.  
  1525. #ifdef __cplusplus
  1526. }
  1527. #endif //__cplusplus
  1528.  
  1529.  
  1530. //===========================================================================
  1531. //
  1532. //  Data structures for Spherical Harmonic Precomputation
  1533. //
  1534. //
  1535. //============================================================================
  1536.  
  1537. typedef enum _D3DXSHCOMPRESSQUALITYTYPE {
  1538.     D3DXSHCQUAL_FASTLOWQUALITY  = 1,
  1539.     D3DXSHCQUAL_SLOWHIGHQUALITY = 2,
  1540.     D3DXSHCQUAL_FORCE_DWORD     = 0x7fffffff
  1541. } D3DXSHCOMPRESSQUALITYTYPE;
  1542.  
  1543. typedef enum _D3DXSHGPUSIMOPT {
  1544.     D3DXSHGPUSIMOPT_SHADOWRES256  = 1,
  1545.     D3DXSHGPUSIMOPT_SHADOWRES512  = 0,
  1546.     D3DXSHGPUSIMOPT_SHADOWRES1024 = 2,
  1547.     D3DXSHGPUSIMOPT_SHADOWRES2048 = 3,
  1548.  
  1549.     D3DXSHGPUSIMOPT_HIGHQUALITY = 4,    
  1550.    
  1551.     D3DXSHGPUSIMOPT_FORCE_DWORD = 0x7fffffff
  1552. } D3DXSHGPUSIMOPT;
  1553.  
  1554. // for all properties that are colors the luminance is computed
  1555. // if the simulator is run with a single channel using the following
  1556. // formula:  R * 0.2125 + G * 0.7154 + B * 0.0721
  1557.  
  1558. typedef struct _D3DXSHMATERIAL {
  1559.     D3DCOLORVALUE Diffuse;  // Diffuse albedo of the surface.  (Ignored if object is a Mirror)
  1560.     BOOL          bMirror;  // Must be set to FALSE.  bMirror == TRUE not currently supported
  1561.     BOOL          bSubSurf; // true if the object does subsurface scattering - can't do this and be a mirror
  1562.  
  1563.     // subsurface scattering parameters
  1564.     FLOAT         RelativeIndexOfRefraction;
  1565.     D3DCOLORVALUE Absorption;
  1566.     D3DCOLORVALUE ReducedScattering;
  1567.  
  1568. } D3DXSHMATERIAL;
  1569.  
  1570. // allocated in D3DXSHPRTCompSplitMeshSC
  1571. // vertices are duplicated into multiple super clusters but
  1572. // only have a valid status in one super cluster (fill in the rest)
  1573.  
  1574. typedef struct _D3DXSHPRTSPLITMESHVERTDATA {
  1575.     UINT  uVertRemap;   // vertex in original mesh this corresponds to
  1576.     UINT  uSubCluster;  // cluster index relative to super cluster
  1577.     UCHAR ucVertStatus; // 1 if vertex has valid data, 0 if it is "fill"
  1578. } D3DXSHPRTSPLITMESHVERTDATA;
  1579.  
  1580. // used in D3DXSHPRTCompSplitMeshSC
  1581. // information for each super cluster that maps into face/vert arrays
  1582.  
  1583. typedef struct _D3DXSHPRTSPLITMESHCLUSTERDATA {
  1584.     UINT uVertStart;     // initial index into remapped vertex array
  1585.     UINT uVertLength;    // number of vertices in this super cluster
  1586.    
  1587.     UINT uFaceStart;     // initial index into face array
  1588.     UINT uFaceLength;    // number of faces in this super cluster
  1589.    
  1590.     UINT uClusterStart;  // initial index into cluster array
  1591.     UINT uClusterLength; // number of clusters in this super cluster
  1592. } D3DXSHPRTSPLITMESHCLUSTERDATA;
  1593.  
  1594. // call back function for simulator
  1595. // return S_OK to keep running the simulator - anything else represents
  1596. // failure and the simulator will abort.
  1597.  
  1598. typedef HRESULT (WINAPI *LPD3DXSHPRTSIMCB)(float fPercentDone,  LPVOID lpUserContext);
  1599.  
  1600. // interfaces for PRT buffers/simulator
  1601.  
  1602. // GUIDs
  1603. // {F1827E47-00A8-49cd-908C-9D11955F8728}
  1604. DEFINE_GUID(IID_ID3DXPRTBuffer,
  1605. 0xf1827e47, 0xa8, 0x49cd, 0x90, 0x8c, 0x9d, 0x11, 0x95, 0x5f, 0x87, 0x28);
  1606.  
  1607. // {A758D465-FE8D-45ad-9CF0-D01E56266A07}
  1608. DEFINE_GUID(IID_ID3DXPRTCompBuffer,
  1609. 0xa758d465, 0xfe8d, 0x45ad, 0x9c, 0xf0, 0xd0, 0x1e, 0x56, 0x26, 0x6a, 0x7);
  1610.  
  1611. // {838F01EC-9729-4527-AADB-DF70ADE7FEA9}
  1612. DEFINE_GUID(IID_ID3DXTextureGutterHelper,
  1613. 0x838f01ec, 0x9729, 0x4527, 0xaa, 0xdb, 0xdf, 0x70, 0xad, 0xe7, 0xfe, 0xa9);
  1614.  
  1615. // {683A4278-CD5F-4d24-90AD-C4E1B6855D53}
  1616. DEFINE_GUID(IID_ID3DXPRTEngine,
  1617. 0x683a4278, 0xcd5f, 0x4d24, 0x90, 0xad, 0xc4, 0xe1, 0xb6, 0x85, 0x5d, 0x53);
  1618.  
  1619. // interface defenitions
  1620.  
  1621. typedef interface ID3DXTextureGutterHelper ID3DXTextureGutterHelper;
  1622. typedef interface ID3DXPRTBuffer ID3DXPRTBuffer;
  1623.  
  1624. #undef INTERFACE
  1625. #define INTERFACE ID3DXPRTBuffer
  1626.  
  1627. // Buffer interface - contains "NumSamples" samples
  1628. // each sample in memory is stored as NumCoeffs scalars per channel (1 or 3)
  1629. // Same interface is used for both Vertex and Pixel PRT buffers
  1630.  
  1631. DECLARE_INTERFACE_(ID3DXPRTBuffer, IUnknown)
  1632. {
  1633.     // IUnknown
  1634.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  1635.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  1636.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  1637.  
  1638.     // ID3DXPRTBuffer
  1639.     STDMETHOD_(UINT, GetNumSamples)(THIS) PURE;
  1640.     STDMETHOD_(UINT, GetNumCoeffs)(THIS) PURE;
  1641.     STDMETHOD_(UINT, GetNumChannels)(THIS) PURE;
  1642.  
  1643.     STDMETHOD_(BOOL, IsTexture)(THIS) PURE;
  1644.     STDMETHOD_(UINT, GetWidth)(THIS) PURE;
  1645.     STDMETHOD_(UINT, GetHeight)(THIS) PURE;
  1646.  
  1647.     // changes the number of samples allocated in the buffer
  1648.     STDMETHOD(Resize)(THIS_ UINT NewSize) PURE;
  1649.  
  1650.     // ppData will point to the memory location where sample Start begins
  1651.     // pointer is valid for at least NumSamples samples
  1652.     STDMETHOD(LockBuffer)(THIS_ UINT Start, UINT NumSamples, FLOAT **ppData) PURE;
  1653.     STDMETHOD(UnlockBuffer)(THIS) PURE;
  1654.  
  1655.     // every scalar in buffer is multiplied by Scale
  1656.     STDMETHOD(ScaleBuffer)(THIS_ FLOAT Scale) PURE;
  1657.    
  1658.     // every scalar contains the sum of this and pBuffers values
  1659.     // pBuffer must have the same storage class/dimensions
  1660.     STDMETHOD(AddBuffer)(THIS_ LPD3DXPRTBUFFER pBuffer) PURE;
  1661.  
  1662.     // GutterHelper (described below) will fill in the gutter
  1663.     // regions of a texture by interpolating "internal" values
  1664.     STDMETHOD(AttachGH)(THIS_ LPD3DXTEXTUREGUTTERHELPER) PURE;
  1665.     STDMETHOD(ReleaseGH)(THIS) PURE;
  1666.    
  1667.     // Evaluates attached gutter helper on the contents of this buffer
  1668.     STDMETHOD(EvalGH)(THIS) PURE;
  1669.  
  1670.     // extracts a given channel into texture pTexture
  1671.     // NumCoefficients starting from StartCoefficient are copied
  1672.     STDMETHOD(ExtractTexture)(THIS_ UINT Channel, UINT StartCoefficient,
  1673.                               UINT NumCoefficients, LPDIRECT3DTEXTURE9 pTexture) PURE;
  1674.  
  1675.     // extracts NumCoefficients coefficients into mesh - only applicable on single channel
  1676.     // buffers, otherwise just lockbuffer and copy data.  With SHPRT data NumCoefficients
  1677.     // should be Order^2
  1678.     STDMETHOD(ExtractToMesh)(THIS_ UINT NumCoefficients, D3DDECLUSAGE Usage, UINT UsageIndexStart,
  1679.                              LPD3DXMESH pScene) PURE;
  1680.  
  1681. };
  1682.  
  1683. typedef interface ID3DXPRTCompBuffer ID3DXPRTCompBuffer;
  1684. typedef interface ID3DXPRTCompBuffer *LPD3DXPRTCOMPBUFFER;
  1685.  
  1686. #undef INTERFACE
  1687. #define INTERFACE ID3DXPRTCompBuffer
  1688.  
  1689. // compressed buffers stored a compressed version of a PRTBuffer
  1690.  
  1691. DECLARE_INTERFACE_(ID3DXPRTCompBuffer, IUnknown)
  1692. {
  1693.     // IUnknown
  1694.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  1695.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  1696.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  1697.  
  1698.     // ID3DPRTCompBuffer
  1699.  
  1700.     // NumCoeffs and NumChannels are properties of input buffer
  1701.     STDMETHOD_(UINT, GetNumSamples)(THIS) PURE;
  1702.     STDMETHOD_(UINT, GetNumCoeffs)(THIS) PURE;
  1703.     STDMETHOD_(UINT, GetNumChannels)(THIS) PURE;
  1704.  
  1705.     STDMETHOD_(BOOL, IsTexture)(THIS) PURE;
  1706.     STDMETHOD_(UINT, GetWidth)(THIS) PURE;
  1707.     STDMETHOD_(UINT, GetHeight)(THIS) PURE;
  1708.  
  1709.     // number of clusters, and PCA vectors per-cluster
  1710.     STDMETHOD_(UINT, GetNumClusters)(THIS) PURE;
  1711.     STDMETHOD_(UINT, GetNumPCA)(THIS) PURE;
  1712.  
  1713.     // normalizes PCA weights so that they are between [-1,1]
  1714.     // basis vectors are modified to reflect this
  1715.     STDMETHOD(NormalizeData)(THIS) PURE;
  1716.  
  1717.     // copies basis vectors for cluster "Cluster" into pClusterBasis
  1718.     // (NumPCA+1)*NumCoeffs*NumChannels floats
  1719.     STDMETHOD(ExtractBasis)(THIS_ UINT Cluster, FLOAT *pClusterBasis) PURE;
  1720.    
  1721.     // UINT per sample - which cluster it belongs to
  1722.     STDMETHOD(ExtractClusterIDs)(THIS_ UINT *pClusterIDs) PURE;
  1723.    
  1724.     // copies NumExtract PCA projection coefficients starting at StartPCA
  1725.     // into pPCACoefficients - NumSamples*NumExtract floats copied
  1726.     STDMETHOD(ExtractPCA)(THIS_ UINT StartPCA, UINT NumExtract, FLOAT *pPCACoefficients) PURE;
  1727.  
  1728.     // copies NumPCA projection coefficients starting at StartPCA
  1729.     // into pTexture - should be able to cope with signed formats
  1730.     STDMETHOD(ExtractTexture)(THIS_ UINT StartPCA, UINT NumpPCA,
  1731.                               LPDIRECT3DTEXTURE9 pTexture) PURE;
  1732.                              
  1733.     // copies NumPCA projection coefficients into mesh pScene
  1734.     // Usage is D3DDECLUSAGE where coefficients are to be stored
  1735.     // UsageIndexStart is starting index
  1736.     STDMETHOD(ExtractToMesh)(THIS_ UINT NumPCA, D3DDECLUSAGE Usage, UINT UsageIndexStart,
  1737.                              LPD3DXMESH pScene) PURE;
  1738. };
  1739.  
  1740.  
  1741. #undef INTERFACE
  1742. #define INTERFACE ID3DXTextureGutterHelper
  1743.  
  1744. // ID3DXTextureGutterHelper will build and manage
  1745. // "gutter" regions in a texture - this will allow for
  1746. // bi-linear interpolation to not have artifacts when rendering
  1747. // It generates a map (in texture space) where each texel
  1748. // is in one of 3 states:
  1749. //   0  Invalid - not used at all
  1750. //   1  Inside triangle
  1751. //   2  Gutter texel
  1752. //   4  represents a gutter texel that will be computed during PRT
  1753. // For each Inside/Gutter texel it stores the face it
  1754. // belongs to and barycentric coordinates for the 1st two
  1755. // vertices of that face.  Gutter vertices are assigned to
  1756. // the closest edge in texture space.
  1757. //
  1758. // When used with PRT this requires a unique parameterization
  1759. // of the model - every texel must correspond to a single point
  1760. // on the surface of the model and vice versa
  1761.  
  1762. DECLARE_INTERFACE_(ID3DXTextureGutterHelper, IUnknown)
  1763. {
  1764.     // IUnknown
  1765.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  1766.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  1767.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  1768.  
  1769.     // ID3DXTextureGutterHelper
  1770.    
  1771.     // dimensions of texture this is bound too
  1772.     STDMETHOD_(UINT, GetWidth)(THIS) PURE;
  1773.     STDMETHOD_(UINT, GetHeight)(THIS) PURE;
  1774.  
  1775.  
  1776.     // Applying gutters recomputes all of the gutter texels of class "2"
  1777.     // based on texels of class "1" or "4"
  1778.    
  1779.     // Applies gutters to a raw float buffer - each texel is NumCoeffs floats
  1780.     // Width and Height must match GutterHelper
  1781.     STDMETHOD(ApplyGuttersFloat)(THIS_ FLOAT *pDataIn, UINT NumCoeffs, UINT Width, UINT Height);
  1782.    
  1783.     // Applies gutters to pTexture
  1784.     // Dimensions must match GutterHelper
  1785.     STDMETHOD(ApplyGuttersTex)(THIS_ LPDIRECT3DTEXTURE9 pTexture);
  1786.    
  1787.     // Applies gutters to a D3DXPRTBuffer
  1788.     // Dimensions must match GutterHelper
  1789.     STDMETHOD(ApplyGuttersPRT)(THIS_ LPD3DXPRTBUFFER pBuffer);
  1790.        
  1791.     // Resamples a texture from a mesh onto this gutterhelpers
  1792.     // parameterization.  It is assumed that the UV coordinates
  1793.     // for this gutter helper are in TEXTURE 0 (usage/usage index)
  1794.     // and the texture coordinates should all be within [0,1] for
  1795.     // both sets.
  1796.     //
  1797.     // pTextureIn - texture represented using parameterization in pMeshIn
  1798.     // pMeshIn    - Mesh with texture coordinates that represent pTextureIn
  1799.     //              pTextureOut texture coordinates are assumed to be in
  1800.     //              TEXTURE 0
  1801.     // Usage      - field in DECL for pMeshIn that stores texture coordinates
  1802.     //              for pTextureIn
  1803.     // UsageIndex - which index for Usage above for pTextureIn
  1804.     // pTextureOut- Resampled texture
  1805.     //
  1806.     // Usage would generally be D3DDECLUSAGE_TEXCOORD  and UsageIndex other than zero
  1807.     STDMETHOD(ResampleTex)(THIS_ LPDIRECT3DTEXTURE9 pTextureIn,
  1808.                                  LPD3DXMESH pMeshIn,
  1809.                                  D3DDECLUSAGE Usage, UINT UsageIndex,
  1810.                                  LPDIRECT3DTEXTURE9 pTextureOut);    
  1811.    
  1812.     // the routines below provide access to the data structures
  1813.     // used by the Apply functions
  1814.  
  1815.     // face map is a UINT per texel that represents the
  1816.     // face of the mesh that texel belongs too -
  1817.     // only valid if same texel is valid in pGutterData
  1818.     // pFaceData must be allocated by the user
  1819.     STDMETHOD(GetFaceMap)(THIS_ UINT *pFaceData) PURE;
  1820.    
  1821.     // BaryMap is a D3DXVECTOR2 per texel
  1822.     // the 1st two barycentric coordinates for the corresponding
  1823.     // face (3rd weight is always 1-sum of first two)
  1824.     // only valid if same texel is valid in pGutterData
  1825.     // pBaryData must be allocated by the user
  1826.     STDMETHOD(GetBaryMap)(THIS_ D3DXVECTOR2 *pBaryData) PURE;
  1827.    
  1828.     // TexelMap is a D3DXVECTOR2 per texel that
  1829.     // stores the location in pixel coordinates where the
  1830.     // corresponding texel is mapped
  1831.     // pTexelData must be allocated by the user
  1832.     STDMETHOD(GetTexelMap)(THIS_ D3DXVECTOR2 *pTexelData) PURE;
  1833.    
  1834.     // GutterMap is a BYTE per texel
  1835.     // 0/1/2 for Invalid/Internal/Gutter texels
  1836.     // 4 represents a gutter texel that will be computed
  1837.     // during PRT
  1838.     // pGutterData must be allocated by the user
  1839.     STDMETHOD(GetGutterMap)(THIS_ BYTE *pGutterData) PURE;
  1840.    
  1841.     // face map is a UINT per texel that represents the
  1842.     // face of the mesh that texel belongs too -
  1843.     // only valid if same texel is valid in pGutterData
  1844.     STDMETHOD(SetFaceMap)(THIS_ UINT *pFaceData) PURE;
  1845.    
  1846.     // BaryMap is a D3DXVECTOR2 per texel
  1847.     // the 1st two barycentric coordinates for the corresponding
  1848.     // face (3rd weight is always 1-sum of first two)
  1849.     // only valid if same texel is valid in pGutterData
  1850.     STDMETHOD(SetBaryMap)(THIS_ D3DXVECTOR2 *pBaryData) PURE;
  1851.    
  1852.     // TexelMap is a D3DXVECTOR2 per texel that
  1853.     // stores the location in pixel coordinates where the
  1854.     // corresponding texel is mapped
  1855.     STDMETHOD(SetTexelMap)(THIS_ D3DXVECTOR2 *pTexelData) PURE;
  1856.    
  1857.     // GutterMap is a BYTE per texel
  1858.     // 0/1/2 for Invalid/Internal/Gutter texels
  1859.     // 4 represents a gutter texel that will be computed
  1860.     // during PRT
  1861.     STDMETHOD(SetGutterMap)(THIS_ BYTE *pGutterData) PURE;    
  1862. };
  1863.  
  1864.  
  1865. typedef interface ID3DXPRTEngine ID3DXPRTEngine;
  1866. typedef interface ID3DXPRTEngine *LPD3DXPRTENGINE;
  1867.  
  1868. #undef INTERFACE
  1869. #define INTERFACE ID3DXPRTEngine
  1870.  
  1871. // ID3DXPRTEngine is used to compute a PRT simulation
  1872. // Use the following steps to compute PRT for SH
  1873. // (1) create an interface (which includes a scene)
  1874. // (2) call SetSamplingInfo
  1875. // (3) [optional] Set MeshMaterials/albedo's (required if doing bounces)
  1876. // (4) call ComputeDirectLightingSH
  1877. // (5) [optional] call ComputeBounce
  1878. // repeat step 5 for as many bounces as wanted.
  1879. // if you want to model subsurface scattering you
  1880. // need to call ComputeSS after direct lighting and
  1881. // each bounce.
  1882. // If you want to bake the albedo into the PRT signal, you
  1883. // must call MutliplyAlbedo, otherwise the user has to multiply
  1884. // the albedo themselves.  Not multiplying the albedo allows you
  1885. // to model albedo variation at a finer scale then illumination, and
  1886. // can result in better compression results.
  1887. // Luminance values are computed from RGB values using the following
  1888. // formula:  R * 0.2125 + G * 0.7154 + B * 0.0721
  1889.  
  1890. DECLARE_INTERFACE_(ID3DXPRTEngine, IUnknown)
  1891. {
  1892.     // IUnknown
  1893.     STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
  1894.     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
  1895.     STDMETHOD_(ULONG, Release)(THIS) PURE;
  1896.  
  1897.     // ID3DXPRTEngine
  1898.    
  1899.     // This sets a material per attribute in the scene mesh and it is
  1900.     // the only way to specify subsurface scattering parameters.  if
  1901.     // bSetAlbedo is FALSE, NumChannels must match the current
  1902.     // configuration of the PRTEngine.  If you intend to change
  1903.     // NumChannels (through some other SetAlbedo function) it must
  1904.     // happen before SetMeshMaterials is called.
  1905.     //
  1906.     // NumChannels 1 implies "grayscale" materials, set this to 3 to enable
  1907.     //  color bleeding effects
  1908.     // bSetAlbedo sets albedo from material if TRUE - which clobbers per texel/vertex
  1909.     //  albedo that might have been set before.  FALSE won't clobber.
  1910.     // fLengthScale is used for subsurface scattering - scene is mapped into a 1mm unit cube
  1911.     //  and scaled by this amount
  1912.     STDMETHOD(SetMeshMaterials)(THIS_ CONST D3DXSHMATERIAL **ppMaterials, UINT NumMeshes,
  1913.                                 UINT NumChannels, BOOL bSetAlbedo, FLOAT fLengthScale) PURE;
  1914.    
  1915.     // setting albedo per-vertex or per-texel over rides the albedos stored per mesh
  1916.     // but it does not over ride any other settings
  1917.    
  1918.     // sets an albedo to be used per vertex - the albedo is represented as a float
  1919.     // pDataIn input pointer (pointint to albedo of 1st sample)
  1920.     // NumChannels 1 implies "grayscale" materials, set this to 3 to enable
  1921.     //  color bleeding effects
  1922.     // Stride - stride in bytes to get to next samples albedo
  1923.     STDMETHOD(SetPerVertexAlbedo)(THIS_ CONST VOID *pDataIn, UINT NumChannels, UINT Stride) PURE;
  1924.    
  1925.     // represents the albedo per-texel instead of per-vertex (even if per-vertex PRT is used)
  1926.     // pAlbedoTexture - texture that stores the albedo (dimension arbitrary)
  1927.     // NumChannels 1 implies "grayscale" materials, set this to 3 to enable
  1928.     //  color bleeding effects
  1929.     // pGH - optional gutter helper, otherwise one is constructed in computation routines and
  1930.     //  destroyed (if not attached to buffers)
  1931.     STDMETHOD(SetPerTexelAlbedo)(THIS_ LPDIRECT3DTEXTURE9 pAlbedoTexture,
  1932.                                  UINT NumChannels,
  1933.                                  LPD3DXTEXTUREGUTTERHELPER pGH) PURE;
  1934.                                  
  1935.     // gets the per-vertex albedo
  1936.     STDMETHOD(GetVertexAlbedo)(THIS_ D3DXCOLOR *pVertColors, UINT NumVerts) PURE;                                
  1937.                                  
  1938.     // If pixel PRT is being computed normals default to ones that are interpolated
  1939.     // from the vertex normals.  This specifies a texture that stores an object
  1940.     // space normal map instead (must use a texture format that can represent signed values)
  1941.     // pNormalTexture - normal map, must be same dimensions as PRTBuffers, signed                                
  1942.     STDMETHOD(SetPerTexelNormal)(THIS_ LPDIRECT3DTEXTURE9 pNormalTexture) PURE;
  1943.                                  
  1944.     // Copies per-vertex albedo from mesh
  1945.     // pMesh - mesh that represents the scene.  It must have the same
  1946.     //  properties as the mesh used to create the PRTEngine
  1947.     // Usage - D3DDECLUSAGE to extract albedos from
  1948.     // NumChannels 1 implies "grayscale" materials, set this to 3 to enable
  1949.     //  color bleeding effects
  1950.     STDMETHOD(ExtractPerVertexAlbedo)(THIS_ LPD3DXMESH pMesh,
  1951.                                       D3DDECLUSAGE Usage,
  1952.                                       UINT NumChannels) PURE;
  1953.  
  1954.     // Resamples the input buffer into the output buffer
  1955.     // can be used to move between per-vertex and per-texel buffers.  This can also be used
  1956.     // to convert single channel buffers to 3-channel buffers and vice-versa.
  1957.     STDMETHOD(ResampleBuffer)(THIS_ LPD3DXPRTBUFFER pBufferIn, LPD3DXPRTBUFFER pBufferOut) PURE;
  1958.    
  1959.     // Returns the scene mesh - including modifications from adaptive spatial sampling
  1960.     // The returned mesh only has positions, normals and texture coordinates (if defined)
  1961.     // pD3DDevice - d3d device that will be used to allocate the mesh
  1962.     // pFaceRemap - each face has a pointer back to the face on the original mesh that it comes from
  1963.     //  if the face hasn't been subdivided this will be an identity mapping
  1964.     // pVertRemap - each vertex contains 3 vertices that this is a linear combination of
  1965.     // pVertWeights - weights for each of above indices (sum to 1.0f)
  1966.     // ppMesh - mesh that will be allocated and filled
  1967.     STDMETHOD(GetAdaptedMesh)(THIS_ LPDIRECT3DDEVICE9 pD3DDevice,UINT *pFaceRemap, UINT *pVertRemap, FLOAT *pfVertWeights, LPD3DXMESH *ppMesh) PURE;
  1968.  
  1969.     // Number of vertices currently allocated (includes new vertices from adaptive sampling)
  1970.     STDMETHOD_(UINT, GetNumVerts)(THIS) PURE;
  1971.     // Number of faces currently allocated (includes new faces)
  1972.     STDMETHOD_(UINT, GetNumFaces)(THIS) PURE;
  1973.  
  1974.     // Sets the Minimum/Maximum intersection distances, this can be used to control
  1975.     // maximum distance that objects can shadow/reflect light, and help with "bad"
  1976.     // art that might have near features that you don't want to shadow.  This does not
  1977.     // apply for GPU simulations.
  1978.     //  fMin - minimum intersection distance, must be positive and less than fMax
  1979.     //  fMax - maximum intersection distance, if 0.0f use the previous value, otherwise
  1980.     //      must be strictly greater than fMin
  1981.     STDMETHOD(SetMinMaxIntersection)(THIS_ FLOAT fMin, FLOAT fMax) PURE;
  1982.  
  1983.     // This will subdivide faces on a mesh so that adaptively simulations can
  1984.     // use a more conservative threshold (it won't miss features.)
  1985.     // MinEdgeLength - minimum edge length that will be generated, if 0.0f a
  1986.     //  reasonable default will be used
  1987.     // MaxSubdiv - maximum level of subdivision, if 0 is specified a default
  1988.     //  value will be used (5)
  1989.     STDMETHOD(RobustMeshRefine)(THIS_ FLOAT MinEdgeLength, UINT MaxSubdiv) PURE;
  1990.  
  1991.     // This sets to sampling information used by the simulator.  Adaptive sampling
  1992.     // parameters are currently ignored.
  1993.     // NumRays - number of rays to shoot per sample
  1994.     // UseSphere - if TRUE uses spherical samples, otherwise samples over
  1995.     //  the hemisphere.  Should only be used with GPU and Vol computations
  1996.     // UseCosine - if TRUE uses a cosine weighting - not used for Vol computations
  1997.     //  or if only the visiblity function is desired
  1998.     // Adaptive - if TRUE adaptive sampling (angular) is used
  1999.     // AdaptiveThresh - threshold used to terminate adaptive angular sampling
  2000.     //  ignored if adaptive sampling is not set
  2001.     STDMETHOD(SetSamplingInfo)(THIS_ UINT NumRays,
  2002.                                BOOL UseSphere,
  2003.                                BOOL UseCosine,
  2004.                                BOOL Adaptive,
  2005.                                FLOAT AdaptiveThresh) PURE;
  2006.  
  2007.     // Methods that compute the direct lighting contribution for objects
  2008.     // always represente light using spherical harmonics (SH)
  2009.     // the albedo is not multiplied by the signal - it just integrates
  2010.     // incoming light.  If NumChannels is not 1 the vector is replicated
  2011.     //
  2012.     // SHOrder - order of SH to use
  2013.     // pDataOut - PRT buffer that is generated.  Can be single channel
  2014.     STDMETHOD(ComputeDirectLightingSH)(THIS_ UINT SHOrder,
  2015.                                        LPD3DXPRTBUFFER pDataOut) PURE;
  2016.                                        
  2017.     // Adaptive variant of above function.  This will refine the mesh
  2018.     // generating new vertices/faces to approximate the PRT signal
  2019.     // more faithfully.
  2020.     // SHOrder - order of SH to use
  2021.     // AdaptiveThresh - threshold for adaptive subdivision (in PRT vector error)
  2022.     //  if value is less then 1e-6f, 1e-6f is specified
  2023.     // MinEdgeLength - minimum edge length that will be generated
  2024.     //  if value is too small a fairly conservative model dependent value
  2025.     //  is used
  2026.     // MaxSubdiv - maximum subdivision level, if 0 is specified it
  2027.     //  will default to 4
  2028.     // pDataOut - PRT buffer that is generated.  Can be single channel.
  2029.     STDMETHOD(ComputeDirectLightingSHAdaptive)(THIS_ UINT SHOrder,
  2030.                                                FLOAT AdaptiveThresh,
  2031.                                                FLOAT MinEdgeLength,
  2032.                                                UINT MaxSubdiv,
  2033.                                                LPD3DXPRTBUFFER pDataOut) PURE;
  2034.                                        
  2035.     // Function that computes the direct lighting contribution for objects
  2036.     // light is always represented using spherical harmonics (SH)
  2037.     // This is done on the GPU and is much faster then using the CPU.
  2038.     // The albedo is not multiplied by the signal - it just integrates
  2039.     // incoming light.  If NumChannels is not 1 the vector is replicated.
  2040.     // ZBias/ZAngleBias are akin to parameters used with shadow zbuffers.
  2041.     // A reasonable default for both values is 0.005, but the user should
  2042.     // experiment (ZAngleBias can be zero, ZBias should not be.)
  2043.     // Callbacks should not use the Direct3D9Device the simulator is using.
  2044.     // SetSamplingInfo must be called with TRUE for UseSphere and
  2045.     // FALSE for UseCosine before this method is called.
  2046.     //
  2047.     // pD3DDevice - device used to run GPU simulator - must support PS2.0
  2048.     //  and FP render targets
  2049.     // Flags - parameters for the GPU simulator, combination of one or more
  2050.     //  D3DXSHGPUSIMOPT flags.  Only one SHADOWRES setting should be set and
  2051.     //  the defaults is 512
  2052.     // SHOrder - order of SH to use
  2053.     // ZBias - bias in normal direction (for depth test)
  2054.     // ZAngleBias - scaled by one minus cosine of angle with light (offset in depth)
  2055.     // pDataOut - PRT buffer that is filled in.  Can be single channel
  2056.     STDMETHOD(ComputeDirectLightingSHGPU)(THIS_ LPDIRECT3DDEVICE9 pD3DDevice,
  2057.                                           UINT Flags,
  2058.                                           UINT SHOrder,
  2059.                                           FLOAT ZBias,
  2060.                                           FLOAT ZAngleBias,
  2061.                                           LPD3DXPRTBUFFER pDataOut) PURE;
  2062.  
  2063.  
  2064.     // Functions that computes subsurface scattering (using material properties)
  2065.     // Albedo is not multiplied by result.  This only works for per-vertex data
  2066.     // use ResampleBuffer to move per-vertex data into a texture and back.
  2067.     //
  2068.     // pDataIn - input data (previous bounce)
  2069.     // pDataOut - result of subsurface scattering simulation
  2070.     // pDataTotal - [optional] results can be summed into this buffer
  2071.     STDMETHOD(ComputeSS)(THIS_ LPD3DXPRTBUFFER pDataIn,
  2072.                          LPD3DXPRTBUFFER pDataOut, LPD3DXPRTBUFFER pDataTotal) PURE;
  2073.  
  2074.     // Adaptive version of ComputeSS.
  2075.     //
  2076.     // pDataIn - input data (previous bounce)
  2077.     // AdaptiveThresh - threshold for adaptive subdivision (in PRT vector error)
  2078.     //  if value is less then 1e-6f, 1e-6f is specified
  2079.     // MinEdgeLength - minimum edge length that will be generated
  2080.     //  if value is too small a fairly conservative model dependent value
  2081.     //  is used
  2082.     // MaxSubdiv - maximum subdivision level, if 0 is specified it
  2083.     //  will default to 4    
  2084.     // pDataOut - result of subsurface scattering simulation
  2085.     // pDataTotal - [optional] results can be summed into this buffer
  2086.     STDMETHOD(ComputeSSAdaptive)(THIS_ LPD3DXPRTBUFFER pDataIn,
  2087.                                  FLOAT AdaptiveThresh,
  2088.                                  FLOAT MinEdgeLength,
  2089.                                  UINT MaxSubdiv,
  2090.                                  LPD3DXPRTBUFFER pDataOut, LPD3DXPRTBUFFER pDataTotal) PURE;
  2091.  
  2092.     // computes a single bounce of inter-reflected light
  2093.     // works for SH based PRT or generic lighting
  2094.     // Albedo is not multiplied by result
  2095.     //
  2096.     // pDataIn - previous bounces data
  2097.     // pDataOut - PRT buffer that is generated
  2098.     // pDataTotal - [optional] can be used to keep a running sum
  2099.     STDMETHOD(ComputeBounce)(THIS_ LPD3DXPRTBUFFER pDataIn,
  2100.                              LPD3DXPRTBUFFER pDataOut,
  2101.                              LPD3DXPRTBUFFER pDataTotal) PURE;
  2102.  
  2103.     // Adaptive version of above function.
  2104.     //
  2105.     // pDataIn - previous bounces data, can be single channel
  2106.     // AdaptiveThresh - threshold for adaptive subdivision (in PRT vector error)
  2107.     //  if value is less then 1e-6f, 1e-6f is specified
  2108.     // MinEdgeLength - minimum edge length that will be generated
  2109.     //  if value is too small a fairly conservative model dependent value
  2110.     //  is used
  2111.     // MaxSubdiv - maximum subdivision level, if 0 is specified it
  2112.     //  will default to 4
  2113.     // pDataOut - PRT buffer that is generated
  2114.     // pDataTotal - [optional] can be used to keep a running sum    
  2115.     STDMETHOD(ComputeBounceAdaptive)(THIS_ LPD3DXPRTBUFFER pDataIn,
  2116.                                      FLOAT AdaptiveThresh,
  2117.                                      FLOAT MinEdgeLength,
  2118.                                      UINT MaxSubdiv,
  2119.                                      LPD3DXPRTBUFFER pDataOut,
  2120.                                      LPD3DXPRTBUFFER pDataTotal) PURE;
  2121.  
  2122.     // Computes projection of distant SH radiance into a local SH radiance
  2123.     // function.  This models how direct lighting is attenuated by the
  2124.     // scene and is a form of "neighborhood transfer."  The result is
  2125.     // a linear operator (matrix) at every sample point, if you multiply
  2126.     // this matrix by the distant SH lighting coefficients you get an
  2127.     // approximation of the local incident radiance function from
  2128.     // direct lighting.  These resulting lighting coefficients can
  2129.     // than be projected into another basis or used with any rendering
  2130.     // technique that uses spherical harmonics as input.
  2131.     // SetSamplingInfo must be called with TRUE for UseSphere and
  2132.     // FALSE for UseCosine before this method is called.  
  2133.     // Generates SHOrderIn*SHOrderIn*SHOrderOut*SHOrderOut scalars
  2134.     // per channel at each sample location.
  2135.     //
  2136.     // SHOrderIn  - Order of the SH representation of distant lighting
  2137.     // SHOrderOut - Order of the SH representation of local lighting
  2138.     // NumVolSamples  - Number of sample locations
  2139.     // pSampleLocs    - position of sample locations
  2140.     // pDataOut       - PRT Buffer that will store output results    
  2141.     STDMETHOD(ComputeVolumeSamplesDirectSH)(THIS_ UINT SHOrderIn,
  2142.                                             UINT SHOrderOut,
  2143.                                             UINT NumVolSamples,
  2144.                                             CONST D3DXVECTOR3 *pSampleLocs,
  2145.                                             LPD3DXPRTBUFFER pDataOut) PURE;
  2146.                                    
  2147.     // At each sample location computes a linear operator (matrix) that maps
  2148.     // the representation of source radiance (NumCoeffs in pSurfDataIn)
  2149.     // into a local incident radiance function approximated with spherical
  2150.     // harmonics.  For example if a light map data is specified in pSurfDataIn
  2151.     // the result is an SH representation of the flow of light at each sample
  2152.     // point.  If PRT data for an outdoor scene is used, each sample point
  2153.     // contains a matrix that models how distant lighting bounces of the objects
  2154.     // in the scene and arrives at the given sample point.  Combined with
  2155.     // ComputeVolumeSamplesDirectSH this gives the complete representation for
  2156.     // how light arrives at each sample point parameterized by distant lighting.
  2157.     // SetSamplingInfo must be called with TRUE for UseSphere and
  2158.     // FALSE for UseCosine before this method is called.    
  2159.     // Generates pSurfDataIn->NumCoeffs()*SHOrder*SHOrder scalars
  2160.     // per channel at each sample location.
  2161.     //
  2162.     // pSurfDataIn    - previous bounce data
  2163.     // SHOrder        - order of SH to generate projection with
  2164.     // NumVolSamples  - Number of sample locations
  2165.     // pSampleLocs    - position of sample locations
  2166.     // pDataOut       - PRT Buffer that will store output results
  2167.     STDMETHOD(ComputeVolumeSamples)(THIS_ LPD3DXPRTBUFFER pSurfDataIn,
  2168.                                     UINT SHOrder,
  2169.                                     UINT NumVolSamples,
  2170.                                     CONST D3DXVECTOR3 *pSampleLocs,
  2171.                                     LPD3DXPRTBUFFER pDataOut) PURE;
  2172.  
  2173.     // Computes direct lighting (SH) for a point not on the mesh
  2174.     // with a given normal - cannot use texture buffers.
  2175.     //
  2176.     // SHOrder      - order of SH to use
  2177.     // NumSamples   - number of sample locations
  2178.     // pSampleLocs  - position for each sample
  2179.     // pSampleNorms - normal for each sample
  2180.     // pDataOut     - PRT Buffer that will store output results
  2181.     STDMETHOD(ComputeSurfSamplesDirectSH)(THIS_ UINT SHOrder,
  2182.                                           UINT NumSamples,
  2183.                                           CONST D3DXVECTOR3 *pSampleLocs,
  2184.                                           CONST D3DXVECTOR3 *pSampleNorms,
  2185.                                           LPD3DXPRTBUFFER pDataOut) PURE;
  2186.  
  2187.  
  2188.     // given the solution for PRT or light maps, computes transfer vector at arbitrary
  2189.     // position/normal pairs in space
  2190.     //
  2191.     // pSurfDataIn  - input data
  2192.     // NumSamples   - number of sample locations
  2193.     // pSampleLocs  - position for each sample
  2194.     // pSampleNorms - normal for each sample
  2195.     // pDataOut     - PRT Buffer that will store output results
  2196.     // pDataTotal   - optional buffer to sum results into - can be NULL
  2197.     STDMETHOD(ComputeSurfSamplesBounce)(THIS_ LPD3DXPRTBUFFER pSurfDataIn,
  2198.                                         UINT NumSamples,
  2199.                                         CONST D3DXVECTOR3 *pSampleLocs,
  2200.                                         CONST D3DXVECTOR3 *pSampleNorms,
  2201.                                         LPD3DXPRTBUFFER pDataOut,
  2202.                                         LPD3DXPRTBUFFER pDataTotal) PURE;
  2203.  
  2204.     // Frees temporary data structures that can be created for subsurface scattering
  2205.     // this data is freed when the PRTComputeEngine is freed and is lazily created
  2206.     STDMETHOD(FreeSSData)(THIS) PURE;
  2207.    
  2208.     // Frees temporary data structures that can be created for bounce simulations
  2209.     // this data is freed when the PRTComputeEngine is freed and is lazily created
  2210.     STDMETHOD(FreeBounceData)(THIS) PURE;
  2211.  
  2212.     // This computes the Local Deformable PRT (LDPRT) coefficients relative to the
  2213.     // per sample normals that minimize error in a least squares sense with respect
  2214.     // to the input PRT data set.  These coefficients can be used with skinned/transformed
  2215.     // normals to model global effects with dynamic objects.  Shading normals can
  2216.     // optionally be solved for - these normals (along with the LDPRT coefficients) can
  2217.     // more accurately represent the PRT signal.  The coefficients are for zonal
  2218.     // harmonics oriented in the normal/shading normal direction.
  2219.     //
  2220.     // pDataIn  - SH PRT dataset that is input
  2221.     // SHOrder  - Order of SH to compute conv coefficients for
  2222.     // pNormOut - Optional array of vectors (passed in) that will be filled with
  2223.     //             "shading normals", LDPRT coefficients are optimized for
  2224.     //             these normals.  This array must be the same size as the number of
  2225.     //             samples in pDataIn
  2226.     // pDataOut - Output buffer (SHOrder zonal harmonic coefficients per channel per sample)
  2227.     STDMETHOD(ComputeLDPRTCoeffs)(THIS_ LPD3DXPRTBUFFER pDataIn,
  2228.                                   UINT SHOrder,
  2229.                                   D3DXVECTOR3 *pNormOut,
  2230.                                   LPD3DXPRTBUFFER pDataOut) PURE;
  2231.  
  2232.     // scales all the samples associated with a given sub mesh
  2233.     // can be useful when using subsurface scattering
  2234.     // fScale - value to scale each vector in submesh by
  2235.     STDMETHOD(ScaleMeshChunk)(THIS_ UINT uMeshChunk, FLOAT fScale, LPD3DXPRTBUFFER pDataOut) PURE;
  2236.    
  2237.     // mutliplies each PRT vector by the albedo - can be used if you want to have the albedo
  2238.     // burned into the dataset, often better not to do this.  If this is not done the user
  2239.     // must mutliply the albedo themselves when rendering - just multiply the albedo times
  2240.     // the result of the PRT dot product.
  2241.     // If pDataOut is a texture simulation result and there is an albedo texture it
  2242.     // must be represented at the same resolution as the simulation buffer.  You can use
  2243.     // LoadSurfaceFromSurface and set a new albedo texture if this is an issue - but must
  2244.     // be careful about how the gutters are handled.
  2245.     //
  2246.     // pDataOut - dataset that will get albedo pushed into it
  2247.     STDMETHOD(MultiplyAlbedo)(THIS_ LPD3DXPRTBUFFER pDataOut) PURE;
  2248.    
  2249.     // Sets a pointer to an optional call back function that reports back to the
  2250.     // user percentage done and gives them the option of quitting
  2251.     // pCB - pointer to call back function, return S_OK for the simulation
  2252.     //  to continue
  2253.     // Frequency - 1/Frequency is roughly the number of times the call back
  2254.     //  will be invoked
  2255.     // lpUserContext - will be passed back to the users call back
  2256.     STDMETHOD(SetCallBack)(THIS_ LPD3DXSHPRTSIMCB pCB, FLOAT Frequency,  LPVOID lpUserContext) PURE;
  2257.    
  2258.     // Returns TRUE if the ray intersects the mesh, FALSE if it does not.  This function
  2259.     // takes into account settings from SetMinMaxIntersection.  If the closest intersection
  2260.     // is not needed this function is more efficient compared to the ClosestRayIntersection
  2261.     // method.
  2262.     // pRayPos - origin of ray
  2263.     // pRayDir - normalized ray direction (normalization required for SetMinMax to be meaningful)
  2264.    
  2265.     STDMETHOD_(BOOL, ShadowRayIntersects)(THIS_ CONST D3DXVECTOR3 *pRayPos, CONST D3DXVECTOR3 *pRayDir) PURE;
  2266.    
  2267.     // Returns TRUE if the ray intersects the mesh, FALSE if it does not.  If there is an
  2268.     // intersection the closest face that was intersected and its first two barycentric coordinates
  2269.     // are returned.  This function takes into account settings from SetMinMaxIntersection.
  2270.     // This is a slower function compared to ShadowRayIntersects and should only be used where
  2271.     // needed.  The third vertices barycentric coordinates will be 1 - pU - pV.
  2272.     // pRayPos     - origin of ray
  2273.     // pRayDir     - normalized ray direction (normalization required for SetMinMax to be meaningful)
  2274.     // pFaceIndex  - Closest face that intersects.  This index is based on stacking the pBlockerMesh
  2275.     //  faces before the faces from pMesh
  2276.     // pU          - Barycentric coordinate for vertex 0
  2277.     // pV          - Barycentric coordinate for vertex 1
  2278.     // pDist       - Distance along ray where the intersection occured
  2279.    
  2280.     STDMETHOD_(BOOL, ClosestRayIntersects)(THIS_ CONST D3DXVECTOR3 *pRayPos, CONST D3DXVECTOR3 *pRayDir,
  2281.                                            DWORD *pFaceIndex, FLOAT *pU, FLOAT *pV, FLOAT *pDist) PURE;
  2282. };
  2283.  
  2284.  
  2285. // API functions for creating interfaces
  2286.  
  2287. #ifdef __cplusplus
  2288. extern "C" {
  2289. #endif //__cplusplus
  2290.  
  2291. //============================================================================
  2292. //
  2293. //  D3DXCreatePRTBuffer:
  2294. //  --------------------
  2295. //  Generates a PRT Buffer that can be compressed or filled by a simulator
  2296. //  This function should be used to create per-vertex or volume buffers.
  2297. //  When buffers are created all values are initialized to zero.
  2298. //
  2299. //  Parameters:
  2300. //    NumSamples
  2301. //      Number of sample locations represented
  2302. //    NumCoeffs
  2303. //      Number of coefficients per sample location (order^2 for SH)
  2304. //    NumChannels
  2305. //      Number of color channels to represent (1 or 3)
  2306. //    ppBuffer
  2307. //      Buffer that will be allocated
  2308. //
  2309. //============================================================================
  2310.  
  2311. HRESULT WINAPI
  2312.     D3DXCreatePRTBuffer(
  2313.         UINT NumSamples,
  2314.         UINT NumCoeffs,
  2315.         UINT NumChannels,
  2316.         LPD3DXPRTBUFFER* ppBuffer);
  2317.  
  2318. //============================================================================
  2319. //
  2320. //  D3DXCreatePRTBufferTex:
  2321. //  --------------------
  2322. //  Generates a PRT Buffer that can be compressed or filled by a simulator
  2323. //  This function should be used to create per-pixel buffers.
  2324. //  When buffers are created all values are initialized to zero.
  2325. //
  2326. //  Parameters:
  2327. //    Width
  2328. //      Width of texture
  2329. //    Height
  2330. //      Height of texture
  2331. //    NumCoeffs
  2332. //      Number of coefficients per sample location (order^2 for SH)
  2333. //    NumChannels
  2334. //      Number of color channels to represent (1 or 3)
  2335. //    ppBuffer
  2336. //      Buffer that will be allocated
  2337. //
  2338. //============================================================================
  2339.  
  2340. HRESULT WINAPI
  2341.     D3DXCreatePRTBufferTex(
  2342.         UINT Width,
  2343.         UINT Height,
  2344.         UINT NumCoeffs,
  2345.         UINT NumChannels,
  2346.         LPD3DXPRTBUFFER* ppBuffer);
  2347.  
  2348. //============================================================================
  2349. //
  2350. //  D3DXLoadPRTBufferFromFile:
  2351. //  --------------------
  2352. //  Loads a PRT buffer that has been saved to disk.
  2353. //
  2354. //  Parameters:
  2355. //    pFilename
  2356. //      Name of the file to load
  2357. //    ppBuffer
  2358. //      Buffer that will be allocated
  2359. //
  2360. //============================================================================
  2361.  
  2362. HRESULT WINAPI
  2363.     D3DXLoadPRTBufferFromFileA(
  2364.         LPCSTR pFilename,
  2365.         LPD3DXPRTBUFFER*       ppBuffer);
  2366.        
  2367. HRESULT WINAPI
  2368.     D3DXLoadPRTBufferFromFileW(
  2369.         LPCWSTR pFilename,
  2370.         LPD3DXPRTBUFFER*       ppBuffer);
  2371.  
  2372. #ifdef UNICODE
  2373. #define D3DXLoadPRTBufferFromFile D3DXLoadPRTBufferFromFileW
  2374. #else
  2375. #define D3DXLoadPRTBufferFromFile D3DXLoadPRTBufferFromFileA
  2376. #endif
  2377.  
  2378.  
  2379. //============================================================================
  2380. //
  2381. //  D3DXSavePRTBufferToFile:
  2382. //  --------------------
  2383. //  Saves a PRTBuffer to disk.
  2384. //
  2385. //  Parameters:
  2386. //    pFilename
  2387. //      Name of the file to save
  2388. //    pBuffer
  2389. //      Buffer that will be saved
  2390. //
  2391. //============================================================================
  2392.  
  2393. HRESULT WINAPI
  2394.     D3DXSavePRTBufferToFileA(
  2395.         LPCSTR pFileName,
  2396.         LPD3DXPRTBUFFER pBuffer);
  2397.        
  2398. HRESULT WINAPI
  2399.     D3DXSavePRTBufferToFileW(
  2400.         LPCWSTR pFileName,
  2401.         LPD3DXPRTBUFFER pBuffer);
  2402.  
  2403. #ifdef UNICODE
  2404. #define D3DXSavePRTBufferToFile D3DXSavePRTBufferToFileW
  2405. #else
  2406. #define D3DXSavePRTBufferToFile D3DXSavePRTBufferToFileA
  2407. #endif                
  2408.  
  2409.  
  2410. //============================================================================
  2411. //
  2412. //  D3DXLoadPRTCompBufferFromFile:
  2413. //  --------------------
  2414. //  Loads a PRTComp buffer that has been saved to disk.
  2415. //
  2416. //  Parameters:
  2417. //    pFilename
  2418. //      Name of the file to load
  2419. //    ppBuffer
  2420. //      Buffer that will be allocated
  2421. //
  2422. //============================================================================
  2423.  
  2424. HRESULT WINAPI
  2425.     D3DXLoadPRTCompBufferFromFileA(
  2426.         LPCSTR pFilename,
  2427.         LPD3DXPRTCOMPBUFFER*       ppBuffer);
  2428.        
  2429. HRESULT WINAPI
  2430.     D3DXLoadPRTCompBufferFromFileW(
  2431.         LPCWSTR pFilename,
  2432.         LPD3DXPRTCOMPBUFFER*       ppBuffer);
  2433.  
  2434. #ifdef UNICODE
  2435. #define D3DXLoadPRTCompBufferFromFile D3DXLoadPRTCompBufferFromFileW
  2436. #else
  2437. #define D3DXLoadPRTCompBufferFromFile D3DXLoadPRTCompBufferFromFileA
  2438. #endif
  2439.  
  2440. //============================================================================
  2441. //
  2442. //  D3DXSavePRTCompBufferToFile:
  2443. //  --------------------
  2444. //  Saves a PRTCompBuffer to disk.
  2445. //
  2446. //  Parameters:
  2447. //    pFilename
  2448. //      Name of the file to save
  2449. //    pBuffer
  2450. //      Buffer that will be saved
  2451. //
  2452. //============================================================================
  2453.  
  2454. HRESULT WINAPI
  2455.     D3DXSavePRTCompBufferToFileA(
  2456.         LPCSTR pFileName,
  2457.         LPD3DXPRTCOMPBUFFER pBuffer);
  2458.        
  2459. HRESULT WINAPI
  2460.     D3DXSavePRTCompBufferToFileW(
  2461.         LPCWSTR pFileName,
  2462.         LPD3DXPRTCOMPBUFFER pBuffer);
  2463.  
  2464. #ifdef UNICODE
  2465. #define D3DXSavePRTCompBufferToFile D3DXSavePRTCompBufferToFileW
  2466. #else
  2467. #define D3DXSavePRTCompBufferToFile D3DXSavePRTCompBufferToFileA
  2468. #endif
  2469.  
  2470. //============================================================================
  2471. //
  2472. //  D3DXCreatePRTCompBuffer:
  2473. //  --------------------
  2474. //  Compresses a PRT buffer (vertex or texel)
  2475. //
  2476. //  Parameters:
  2477. //    D3DXSHCOMPRESSQUALITYTYPE
  2478. //      Quality of compression - low is faster (computes PCA per voronoi cluster)
  2479. //      high is slower but better quality (clusters based on distance to affine subspace)
  2480. //    NumClusters
  2481. //      Number of clusters to compute
  2482. //    NumPCA
  2483. //      Number of basis vectors to compute
  2484. //    pCB
  2485. //      Optional Callback function
  2486. //    lpUserContext
  2487. //      Optional user context
  2488. //    pBufferIn
  2489. //      Buffer that will be compressed
  2490. //    ppBufferOut
  2491. //      Compressed buffer that will be created
  2492. //
  2493. //============================================================================
  2494.  
  2495.  
  2496. HRESULT WINAPI
  2497.     D3DXCreatePRTCompBuffer(
  2498.         D3DXSHCOMPRESSQUALITYTYPE Quality,
  2499.         UINT NumClusters,
  2500.         UINT NumPCA,
  2501.         LPD3DXSHPRTSIMCB pCB,
  2502.         LPVOID lpUserContext,        
  2503.         LPD3DXPRTBUFFER  pBufferIn,
  2504.         LPD3DXPRTCOMPBUFFER *ppBufferOut
  2505.     );
  2506.  
  2507. //============================================================================
  2508. //
  2509. //  D3DXCreateTextureGutterHelper:
  2510. //  --------------------
  2511. //  Generates a "GutterHelper" for a given set of meshes and texture
  2512. //  resolution
  2513. //
  2514. //  Parameters:
  2515. //    Width
  2516. //      Width of texture
  2517. //    Height
  2518. //      Height of texture
  2519. //    pMesh
  2520. //      Mesh that represents the scene
  2521. //    GutterSize
  2522. //      Number of texels to over rasterize in texture space
  2523. //      this should be at least 1.0
  2524. //    ppBuffer
  2525. //      GutterHelper that will be created
  2526. //
  2527. //============================================================================
  2528.  
  2529.  
  2530. HRESULT WINAPI
  2531.     D3DXCreateTextureGutterHelper(
  2532.         UINT Width,
  2533.         UINT Height,
  2534.         LPD3DXMESH pMesh,
  2535.         FLOAT GutterSize,
  2536.         LPD3DXTEXTUREGUTTERHELPER* ppBuffer);
  2537.  
  2538.  
  2539. //============================================================================
  2540. //
  2541. //  D3DXCreatePRTEngine:
  2542. //  --------------------
  2543. //  Computes a PRTEngine which can efficiently generate PRT simulations
  2544. //  of a scene
  2545. //
  2546. //  Parameters:
  2547. //    pMesh
  2548. //      Mesh that represents the scene - must have an AttributeTable
  2549. //      where vertices are in a unique attribute.
  2550. //    pAdjacency
  2551. //      Optional adjacency information
  2552. //    ExtractUVs
  2553. //      Set this to true if textures are going to be used for albedos
  2554. //      or to store PRT vectors
  2555. //    pBlockerMesh
  2556. //      Optional mesh that just blocks the scene
  2557. //    ppEngine
  2558. //      PRTEngine that will be created
  2559. //
  2560. //============================================================================
  2561.  
  2562.  
  2563. HRESULT WINAPI
  2564.     D3DXCreatePRTEngine(
  2565.         LPD3DXMESH pMesh,
  2566.         DWORD *pAdjacency,
  2567.         BOOL ExtractUVs,
  2568.         LPD3DXMESH pBlockerMesh,
  2569.         LPD3DXPRTENGINE* ppEngine);
  2570.  
  2571. //============================================================================
  2572. //
  2573. //  D3DXConcatenateMeshes:
  2574. //  --------------------
  2575. //  Concatenates a group of meshes into one common mesh.  This can optionaly transform
  2576. //  each sub mesh or its texture coordinates.  If no DECL is given it will
  2577. //  generate a union of all of the DECL's of the sub meshes, promoting channels
  2578. //  and types if neccesary.  It will create an AttributeTable if possible, one can
  2579. //  call OptimizeMesh with attribute sort and compacting enabled to ensure this.
  2580. //
  2581. //  Parameters:
  2582. //    ppMeshes
  2583. //      Array of pointers to meshes that can store PRT vectors
  2584. //    NumMeshes
  2585. //      Number of meshes
  2586. //    Options
  2587. //      Passed through to D3DXCreateMesh
  2588. //    pGeomXForms
  2589. //      [optional] Each sub mesh is transformed by the corresponding
  2590. //      matrix if this array is supplied
  2591. //    pTextureXForms
  2592. //      [optional] UV coordinates for each sub mesh are transformed
  2593. //      by corresponding matrix if supplied
  2594. //    pDecl
  2595. //      [optional] Only information in this DECL is used when merging
  2596. //      data
  2597. //    pD3DDevice
  2598. //      D3D device that is used to create the new mesh
  2599. //    ppMeshOut
  2600. //      Mesh that will be created
  2601. //
  2602. //============================================================================
  2603.  
  2604.  
  2605. HRESULT WINAPI
  2606.     D3DXConcatenateMeshes(
  2607.         LPD3DXMESH *ppMeshes,
  2608.         UINT NumMeshes,
  2609.         DWORD Options,
  2610.         CONST D3DXMATRIX *pGeomXForms,
  2611.         CONST D3DXMATRIX *pTextureXForms,
  2612.         CONST D3DVERTEXELEMENT9 *pDecl,
  2613.         LPDIRECT3DDEVICE9 pD3DDevice,
  2614.         LPD3DXMESH *ppMeshOut);
  2615.  
  2616. //============================================================================
  2617. //
  2618. //  D3DXSHPRTCompSuperCluster:
  2619. //  --------------------------
  2620. //  Used with compressed results of D3DXSHPRTSimulation.
  2621. //  Generates "super clusters" - groups of clusters that can be drawn in
  2622. //  the same draw call.  A greedy algorithm that minimizes overdraw is used
  2623. //  to group the clusters.
  2624. //
  2625. //  Parameters:
  2626. //   pClusterIDs
  2627. //      NumVerts cluster ID's (extracted from a compressed buffer)
  2628. //   pScene
  2629. //      Mesh that represents composite scene passed to the simulator
  2630. //   MaxNumClusters
  2631. //      Maximum number of clusters allocated per super cluster
  2632. //   NumClusters
  2633. //      Number of clusters computed in the simulator
  2634. //   pSuperClusterIDs
  2635. //      Array of length NumClusters, contains index of super cluster
  2636. //      that corresponding cluster was assigned to
  2637. //   pNumSuperClusters
  2638. //      Returns the number of super clusters allocated
  2639. //      
  2640. //============================================================================
  2641.  
  2642. HRESULT WINAPI
  2643.     D3DXSHPRTCompSuperCluster(
  2644.         UINT *pClusterIDs,
  2645.         LPD3DXMESH pScene,
  2646.         UINT MaxNumClusters,
  2647.         UINT NumClusters,
  2648.         UINT *pSuperClusterIDs,
  2649.         UINT *pNumSuperClusters);
  2650.  
  2651. //============================================================================
  2652. //
  2653. //  D3DXSHPRTCompSplitMeshSC:
  2654. //  -------------------------
  2655. //  Used with compressed results of the vertex version of the PRT simulator.
  2656. //  After D3DXSHRTCompSuperCluster has been called this function can be used
  2657. //  to split the mesh into a group of faces/vertices per super cluster.
  2658. //  Each super cluster contains all of the faces that contain any vertex
  2659. //  classified in one of its clusters.  All of the vertices connected to this
  2660. //  set of faces are also included with the returned array ppVertStatus
  2661. //  indicating whether or not the vertex belongs to the supercluster.
  2662. //
  2663. //  Parameters:
  2664. //   pClusterIDs
  2665. //      NumVerts cluster ID's (extracted from a compressed buffer)
  2666. //   NumVertices
  2667. //      Number of vertices in original mesh
  2668. //   NumClusters
  2669. //      Number of clusters (input parameter to compression)
  2670. //   pSuperClusterIDs
  2671. //      Array of size NumClusters that will contain super cluster ID's (from
  2672. //      D3DXSHCompSuerCluster)
  2673. //   NumSuperClusters
  2674. //      Number of superclusters allocated in D3DXSHCompSuerCluster
  2675. //   pInputIB
  2676. //      Raw index buffer for mesh - format depends on bInputIBIs32Bit
  2677. //   InputIBIs32Bit
  2678. //      Indicates whether the input index buffer is 32-bit (otherwise 16-bit
  2679. //      is assumed)
  2680. //   NumFaces
  2681. //      Number of faces in the original mesh (pInputIB is 3 times this length)
  2682. //   ppIBData
  2683. //      LPD3DXBUFFER holds raw index buffer that will contain the resulting split faces.  
  2684. //      Format determined by bIBIs32Bit.  Allocated by function
  2685. //   pIBDataLength
  2686. //      Length of ppIBData, assigned in function
  2687. //   OutputIBIs32Bit
  2688. //      Indicates whether the output index buffer is to be 32-bit (otherwise
  2689. //      16-bit is assumed)
  2690. //   ppFaceRemap
  2691. //      LPD3DXBUFFER mapping of each face in ppIBData to original faces.  Length is
  2692. //      *pIBDataLength/3.  Optional paramter, allocated in function
  2693. //   ppVertData
  2694. //      LPD3DXBUFFER contains new vertex data structure.  Size of pVertDataLength
  2695. //   pVertDataLength
  2696. //      Number of new vertices in split mesh.  Assigned in function
  2697. //   pSCClusterList
  2698. //      Array of length NumClusters which pSCData indexes into (Cluster* fields)
  2699. //      for each SC, contains clusters sorted by super cluster
  2700. //   pSCData
  2701. //      Structure per super cluster - contains indices into ppIBData,
  2702. //      pSCClusterList and ppVertData
  2703. //
  2704. //============================================================================
  2705.  
  2706. HRESULT WINAPI
  2707.     D3DXSHPRTCompSplitMeshSC(
  2708.         UINT *pClusterIDs,
  2709.         UINT NumVertices,
  2710.         UINT NumClusters,
  2711.         UINT *pSuperClusterIDs,
  2712.         UINT NumSuperClusters,
  2713.         LPVOID pInputIB,
  2714.         BOOL InputIBIs32Bit,
  2715.         UINT NumFaces,
  2716.         LPD3DXBUFFER *ppIBData,
  2717.         UINT *pIBDataLength,
  2718.         BOOL OutputIBIs32Bit,
  2719.         LPD3DXBUFFER *ppFaceRemap,
  2720.         LPD3DXBUFFER *ppVertData,
  2721.         UINT *pVertDataLength,
  2722.         UINT *pSCClusterList,
  2723.         D3DXSHPRTSPLITMESHCLUSTERDATA *pSCData);
  2724.        
  2725.        
  2726. #ifdef __cplusplus
  2727. }
  2728. #endif //__cplusplus
  2729.  
  2730. //////////////////////////////////////////////////////////////////////////////
  2731. //
  2732. //  Definitions of .X file templates used by mesh load/save functions
  2733. //    that are not RM standard
  2734. //
  2735. //////////////////////////////////////////////////////////////////////////////
  2736.  
  2737. // {3CF169CE-FF7C-44ab-93C0-F78F62D172E2}
  2738. DEFINE_GUID(DXFILEOBJ_XSkinMeshHeader,
  2739. 0x3cf169ce, 0xff7c, 0x44ab, 0x93, 0xc0, 0xf7, 0x8f, 0x62, 0xd1, 0x72, 0xe2);
  2740.  
  2741. // {B8D65549-D7C9-4995-89CF-53A9A8B031E3}
  2742. DEFINE_GUID(DXFILEOBJ_VertexDuplicationIndices,
  2743. 0xb8d65549, 0xd7c9, 0x4995, 0x89, 0xcf, 0x53, 0xa9, 0xa8, 0xb0, 0x31, 0xe3);
  2744.  
  2745. // {A64C844A-E282-4756-8B80-250CDE04398C}
  2746. DEFINE_GUID(DXFILEOBJ_FaceAdjacency,
  2747. 0xa64c844a, 0xe282, 0x4756, 0x8b, 0x80, 0x25, 0xc, 0xde, 0x4, 0x39, 0x8c);
  2748.  
  2749. // {6F0D123B-BAD2-4167-A0D0-80224F25FABB}
  2750. DEFINE_GUID(DXFILEOBJ_SkinWeights,
  2751. 0x6f0d123b, 0xbad2, 0x4167, 0xa0, 0xd0, 0x80, 0x22, 0x4f, 0x25, 0xfa, 0xbb);
  2752.  
  2753. // {A3EB5D44-FC22-429d-9AFB-3221CB9719A6}
  2754. DEFINE_GUID(DXFILEOBJ_Patch,
  2755. 0xa3eb5d44, 0xfc22, 0x429d, 0x9a, 0xfb, 0x32, 0x21, 0xcb, 0x97, 0x19, 0xa6);
  2756.  
  2757. // {D02C95CC-EDBA-4305-9B5D-1820D7704BBF}
  2758. DEFINE_GUID(DXFILEOBJ_PatchMesh,
  2759. 0xd02c95cc, 0xedba, 0x4305, 0x9b, 0x5d, 0x18, 0x20, 0xd7, 0x70, 0x4b, 0xbf);
  2760.  
  2761. // {B9EC94E1-B9A6-4251-BA18-94893F02C0EA}
  2762. DEFINE_GUID(DXFILEOBJ_PatchMesh9,
  2763. 0xb9ec94e1, 0xb9a6, 0x4251, 0xba, 0x18, 0x94, 0x89, 0x3f, 0x2, 0xc0, 0xea);
  2764.  
  2765. // {B6C3E656-EC8B-4b92-9B62-681659522947}
  2766. DEFINE_GUID(DXFILEOBJ_PMInfo,
  2767. 0xb6c3e656, 0xec8b, 0x4b92, 0x9b, 0x62, 0x68, 0x16, 0x59, 0x52, 0x29, 0x47);
  2768.  
  2769. // {917E0427-C61E-4a14-9C64-AFE65F9E9844}
  2770. DEFINE_GUID(DXFILEOBJ_PMAttributeRange,
  2771. 0x917e0427, 0xc61e, 0x4a14, 0x9c, 0x64, 0xaf, 0xe6, 0x5f, 0x9e, 0x98, 0x44);
  2772.  
  2773. // {574CCC14-F0B3-4333-822D-93E8A8A08E4C}
  2774. DEFINE_GUID(DXFILEOBJ_PMVSplitRecord,
  2775. 0x574ccc14, 0xf0b3, 0x4333, 0x82, 0x2d, 0x93, 0xe8, 0xa8, 0xa0, 0x8e, 0x4c);
  2776.  
  2777. // {B6E70A0E-8EF9-4e83-94AD-ECC8B0C04897}
  2778. DEFINE_GUID(DXFILEOBJ_FVFData,
  2779. 0xb6e70a0e, 0x8ef9, 0x4e83, 0x94, 0xad, 0xec, 0xc8, 0xb0, 0xc0, 0x48, 0x97);
  2780.  
  2781. // {F752461C-1E23-48f6-B9F8-8350850F336F}
  2782. DEFINE_GUID(DXFILEOBJ_VertexElement,
  2783. 0xf752461c, 0x1e23, 0x48f6, 0xb9, 0xf8, 0x83, 0x50, 0x85, 0xf, 0x33, 0x6f);
  2784.  
  2785. // {BF22E553-292C-4781-9FEA-62BD554BDD93}
  2786. DEFINE_GUID(DXFILEOBJ_DeclData,
  2787. 0xbf22e553, 0x292c, 0x4781, 0x9f, 0xea, 0x62, 0xbd, 0x55, 0x4b, 0xdd, 0x93);
  2788.  
  2789. // {F1CFE2B3-0DE3-4e28-AFA1-155A750A282D}
  2790. DEFINE_GUID(DXFILEOBJ_EffectFloats,
  2791. 0xf1cfe2b3, 0xde3, 0x4e28, 0xaf, 0xa1, 0x15, 0x5a, 0x75, 0xa, 0x28, 0x2d);
  2792.  
  2793. // {D55B097E-BDB6-4c52-B03D-6051C89D0E42}
  2794. DEFINE_GUID(DXFILEOBJ_EffectString,
  2795. 0xd55b097e, 0xbdb6, 0x4c52, 0xb0, 0x3d, 0x60, 0x51, 0xc8, 0x9d, 0xe, 0x42);
  2796.  
  2797. // {622C0ED0-956E-4da9-908A-2AF94F3CE716}
  2798. DEFINE_GUID(DXFILEOBJ_EffectDWord,
  2799. 0x622c0ed0, 0x956e, 0x4da9, 0x90, 0x8a, 0x2a, 0xf9, 0x4f, 0x3c, 0xe7, 0x16);
  2800.  
  2801. // {3014B9A0-62F5-478c-9B86-E4AC9F4E418B}
  2802. DEFINE_GUID(DXFILEOBJ_EffectParamFloats,
  2803. 0x3014b9a0, 0x62f5, 0x478c, 0x9b, 0x86, 0xe4, 0xac, 0x9f, 0x4e, 0x41, 0x8b);
  2804.  
  2805. // {1DBC4C88-94C1-46ee-9076-2C28818C9481}
  2806. DEFINE_GUID(DXFILEOBJ_EffectParamString,
  2807. 0x1dbc4c88, 0x94c1, 0x46ee, 0x90, 0x76, 0x2c, 0x28, 0x81, 0x8c, 0x94, 0x81);
  2808.  
  2809. // {E13963BC-AE51-4c5d-B00F-CFA3A9D97CE5}
  2810. DEFINE_GUID(DXFILEOBJ_EffectParamDWord,
  2811. 0xe13963bc, 0xae51, 0x4c5d, 0xb0, 0xf, 0xcf, 0xa3, 0xa9, 0xd9, 0x7c, 0xe5);
  2812.  
  2813. // {E331F7E4-0559-4cc2-8E99-1CEC1657928F}
  2814. DEFINE_GUID(DXFILEOBJ_EffectInstance,
  2815. 0xe331f7e4, 0x559, 0x4cc2, 0x8e, 0x99, 0x1c, 0xec, 0x16, 0x57, 0x92, 0x8f);
  2816.  
  2817. // {9E415A43-7BA6-4a73-8743-B73D47E88476}
  2818. DEFINE_GUID(DXFILEOBJ_AnimTicksPerSecond,
  2819. 0x9e415a43, 0x7ba6, 0x4a73, 0x87, 0x43, 0xb7, 0x3d, 0x47, 0xe8, 0x84, 0x76);
  2820.  
  2821. // {7F9B00B3-F125-4890-876E-1CFFBF697C4D}
  2822. DEFINE_GUID(DXFILEOBJ_CompressedAnimationSet,
  2823. 0x7f9b00b3, 0xf125, 0x4890, 0x87, 0x6e, 0x1c, 0x42, 0xbf, 0x69, 0x7c, 0x4d);
  2824.  
  2825. #pragma pack(push, 1)
  2826. typedef struct _XFILECOMPRESSEDANIMATIONSET
  2827. {
  2828.     DWORD CompressedBlockSize;
  2829.     FLOAT TicksPerSec;
  2830.     DWORD PlaybackType;
  2831.     DWORD BufferLength;
  2832. } XFILECOMPRESSEDANIMATIONSET;
  2833. #pragma pack(pop)
  2834.  
  2835. #define XSKINEXP_TEMPLATES \
  2836.         "xof 0303txt 0032\
  2837.         template XSkinMeshHeader \
  2838.         { \
  2839.             <3CF169CE-FF7C-44ab-93C0-F78F62D172E2> \
  2840.             WORD nMaxSkinWeightsPerVertex; \
  2841.             WORD nMaxSkinWeightsPerFace; \
  2842.             WORD nBones; \
  2843.         } \
  2844.         template VertexDuplicationIndices \
  2845.         { \
  2846.             <B8D65549-D7C9-4995-89CF-53A9A8B031E3> \
  2847.             DWORD nIndices; \
  2848.             DWORD nOriginalVertices; \
  2849.             array DWORD indices[nIndices]; \
  2850.         } \
  2851.         template FaceAdjacency \
  2852.         { \
  2853.             <A64C844A-E282-4756-8B80-250CDE04398C> \
  2854.             DWORD nIndices; \
  2855.             array DWORD indices[nIndices]; \
  2856.         } \
  2857.         template SkinWeights \
  2858.         { \
  2859.             <6F0D123B-BAD2-4167-A0D0-80224F25FABB> \
  2860.             STRING transformNodeName; \
  2861.             DWORD nWeights; \
  2862.             array DWORD vertexIndices[nWeights]; \
  2863.             array float weights[nWeights]; \
  2864.             Matrix4x4 matrixOffset; \
  2865.         } \
  2866.         template Patch \
  2867.         { \
  2868.             <A3EB5D44-FC22-429D-9AFB-3221CB9719A6> \
  2869.             DWORD nControlIndices; \
  2870.             array DWORD controlIndices[nControlIndices]; \
  2871.         } \
  2872.         template PatchMesh \
  2873.         { \
  2874.             <D02C95CC-EDBA-4305-9B5D-1820D7704BBF> \
  2875.             DWORD nVertices; \
  2876.             array Vector vertices[nVertices]; \
  2877.             DWORD nPatches; \
  2878.             array Patch patches[nPatches]; \
  2879.             [ ... ] \
  2880.         } \
  2881.         template PatchMesh9 \
  2882.         { \
  2883.             <B9EC94E1-B9A6-4251-BA18-94893F02C0EA> \
  2884.             DWORD Type; \
  2885.             DWORD Degree; \
  2886.             DWORD Basis; \
  2887.             DWORD nVertices; \
  2888.             array Vector vertices[nVertices]; \
  2889.             DWORD nPatches; \
  2890.             array Patch patches[nPatches]; \
  2891.             [ ... ] \
  2892.         } " \
  2893.         "template EffectFloats \
  2894.         { \
  2895.             <F1CFE2B3-0DE3-4e28-AFA1-155A750A282D> \
  2896.             DWORD nFloats; \
  2897.             array float Floats[nFloats]; \
  2898.         } \
  2899.         template EffectString \
  2900.         { \
  2901.             <D55B097E-BDB6-4c52-B03D-6051C89D0E42> \
  2902.             STRING Value; \
  2903.         } \
  2904.         template EffectDWord \
  2905.         { \
  2906.             <622C0ED0-956E-4da9-908A-2AF94F3CE716> \
  2907.             DWORD Value; \
  2908.         } " \
  2909.         "template EffectParamFloats \
  2910.         { \
  2911.             <3014B9A0-62F5-478c-9B86-E4AC9F4E418B> \
  2912.             STRING ParamName; \
  2913.             DWORD nFloats; \
  2914.             array float Floats[nFloats]; \
  2915.         } " \
  2916.         "template EffectParamString \
  2917.         { \
  2918.             <1DBC4C88-94C1-46ee-9076-2C28818C9481> \
  2919.             STRING ParamName; \
  2920.             STRING Value; \
  2921.         } \
  2922.         template EffectParamDWord \
  2923.         { \
  2924.             <E13963BC-AE51-4c5d-B00F-CFA3A9D97CE5> \
  2925.             STRING ParamName; \
  2926.             DWORD Value; \
  2927.         } \
  2928.         template EffectInstance \
  2929.         { \
  2930.             <E331F7E4-0559-4cc2-8E99-1CEC1657928F> \
  2931.             STRING EffectFilename; \
  2932.             [ ... ] \
  2933.         } " \
  2934.         "template AnimTicksPerSecond \
  2935.         { \
  2936.             <9E415A43-7BA6-4a73-8743-B73D47E88476> \
  2937.             DWORD AnimTicksPerSecond; \
  2938.         } \
  2939.         template CompressedAnimationSet \
  2940.         { \
  2941.             <7F9B00B3-F125-4890-876E-1C42BF697C4D> \
  2942.             DWORD CompressedBlockSize; \
  2943.             FLOAT TicksPerSec; \
  2944.             DWORD PlaybackType; \
  2945.             DWORD BufferLength; \
  2946.             array DWORD CompressedData[BufferLength]; \
  2947.         } "
  2948.  
  2949. #define XEXTENSIONS_TEMPLATES \
  2950.         "xof 0303txt 0032\
  2951.         template FVFData \
  2952.         { \
  2953.             <B6E70A0E-8EF9-4e83-94AD-ECC8B0C04897> \
  2954.             DWORD dwFVF; \
  2955.             DWORD nDWords; \
  2956.             array DWORD data[nDWords]; \
  2957.         } \
  2958.         template VertexElement \
  2959.         { \
  2960.             <F752461C-1E23-48f6-B9F8-8350850F336F> \
  2961.             DWORD Type; \
  2962.             DWORD Method; \
  2963.             DWORD Usage; \
  2964.             DWORD UsageIndex; \
  2965.         } \
  2966.         template DeclData \
  2967.         { \
  2968.             <BF22E553-292C-4781-9FEA-62BD554BDD93> \
  2969.             DWORD nElements; \
  2970.             array VertexElement Elements[nElements]; \
  2971.             DWORD nDWords; \
  2972.             array DWORD data[nDWords]; \
  2973.         } \
  2974.         template PMAttributeRange \
  2975.         { \
  2976.             <917E0427-C61E-4a14-9C64-AFE65F9E9844> \
  2977.             DWORD iFaceOffset; \
  2978.             DWORD nFacesMin; \
  2979.             DWORD nFacesMax; \
  2980.             DWORD iVertexOffset; \
  2981.             DWORD nVerticesMin; \
  2982.             DWORD nVerticesMax; \
  2983.         } \
  2984.         template PMVSplitRecord \
  2985.         { \
  2986.             <574CCC14-F0B3-4333-822D-93E8A8A08E4C> \
  2987.             DWORD iFaceCLW; \
  2988.             DWORD iVlrOffset; \
  2989.             DWORD iCode; \
  2990.         } \
  2991.         template PMInfo \
  2992.         { \
  2993.             <B6C3E656-EC8B-4b92-9B62-681659522947> \
  2994.             DWORD nAttributes; \
  2995.             array PMAttributeRange attributeRanges[nAttributes]; \
  2996.             DWORD nMaxValence; \
  2997.             DWORD nMinLogicalVertices; \
  2998.             DWORD nMaxLogicalVertices; \
  2999.             DWORD nVSplits; \
  3000.             array PMVSplitRecord splitRecords[nVSplits]; \
  3001.             DWORD nAttributeMispredicts; \
  3002.             array DWORD attributeMispredicts[nAttributeMispredicts]; \
  3003.         } "
  3004.        
  3005. #endif //__D3DX9MESH_H__
  3006.  
  3007.  
  3008.