1 //////////////////////////////////////////////////////////////////////////////
3 // Copyright (C) Microsoft Corporation. All Rights Reserved.
6 // Content: D3DX mesh types and functions
8 //////////////////////////////////////////////////////////////////////////////
12 #ifndef __D3DX9MESH_H__
13 #define __D3DX9MESH_H__
15 // {7ED943DD-52E8-40b5-A8D8-76685C406330}
16 DEFINE_GUID(IID_ID3DXBaseMesh
,
17 0x7ed943dd, 0x52e8, 0x40b5, 0xa8, 0xd8, 0x76, 0x68, 0x5c, 0x40, 0x63, 0x30);
19 // {4020E5C2-1403-4929-883F-E2E849FAC195}
20 DEFINE_GUID(IID_ID3DXMesh
,
21 0x4020e5c2, 0x1403, 0x4929, 0x88, 0x3f, 0xe2, 0xe8, 0x49, 0xfa, 0xc1, 0x95);
23 // {8875769A-D579-4088-AAEB-534D1AD84E96}
24 DEFINE_GUID(IID_ID3DXPMesh
,
25 0x8875769a, 0xd579, 0x4088, 0xaa, 0xeb, 0x53, 0x4d, 0x1a, 0xd8, 0x4e, 0x96);
27 // {667EA4C7-F1CD-4386-B523-7C0290B83CC5}
28 DEFINE_GUID(IID_ID3DXSPMesh
,
29 0x667ea4c7, 0xf1cd, 0x4386, 0xb5, 0x23, 0x7c, 0x2, 0x90, 0xb8, 0x3c, 0xc5);
31 // {11EAA540-F9A6-4d49-AE6A-E19221F70CC4}
32 DEFINE_GUID(IID_ID3DXSkinInfo
,
33 0x11eaa540, 0xf9a6, 0x4d49, 0xae, 0x6a, 0xe1, 0x92, 0x21, 0xf7, 0xc, 0xc4);
35 // {3CE6CC22-DBF2-44f4-894D-F9C34A337139}
36 DEFINE_GUID(IID_ID3DXPatchMesh
,
37 0x3ce6cc22, 0xdbf2, 0x44f4, 0x89, 0x4d, 0xf9, 0xc3, 0x4a, 0x33, 0x71, 0x39);
39 //patch mesh can be quads or tris
40 typedef enum _D3DXPATCHMESHTYPE
{
41 D3DXPATCHMESH_RECT
= 0x001,
42 D3DXPATCHMESH_TRI
= 0x002,
43 D3DXPATCHMESH_NPATCH
= 0x003,
45 D3DXPATCHMESH_FORCE_DWORD
= 0x7fffffff, /* force 32-bit size enum */
48 // Mesh options - lower 3 bytes only, upper byte used by _D3DXMESHOPT option flags
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.
66 D3DXMESH_VB_SHARE
= 0x1000, // Valid for Clone* calls only, forces cloned mesh/pmesh to share vertex buffer
68 D3DXMESH_USEHWONLY
= 0x2000, // Valid for ID3DXSkinInfo::ConvertToBlendedMesh
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
81 D3DXPATCHMESH_DEFAULT
= 000,
83 // option field values for specifying min value in D3DXGeneratePMesh and D3DXSimplifyMesh
86 D3DXMESHSIMP_VERTEX
= 0x1,
87 D3DXMESHSIMP_FACE
= 0x2,
91 typedef enum _D3DXCLEANTYPE
{
92 D3DXCLEAN_BACKFACING
= 0x00000001,
93 D3DXCLEAN_BOWTIES
= 0x00000002,
96 D3DXCLEAN_SKINNING
= D3DXCLEAN_BACKFACING
, // Bowtie cleaning modifies geometry and breaks skinning
97 D3DXCLEAN_OPTIMIZATION
= D3DXCLEAN_BACKFACING
,
98 D3DXCLEAN_SIMPLIFICATION
= D3DXCLEAN_BACKFACING
| D3DXCLEAN_BOWTIES
,
101 enum _MAX_FVF_DECL_SIZE
103 MAX_FVF_DECL_SIZE
= MAXD3DDECLLENGTH
+ 1 // +1 for END
106 typedef struct ID3DXBaseMesh
*LPD3DXBASEMESH
;
107 typedef struct ID3DXMesh
*LPD3DXMESH
;
108 typedef struct ID3DXPMesh
*LPD3DXPMESH
;
109 typedef struct ID3DXSPMesh
*LPD3DXSPMESH
;
110 typedef struct ID3DXSkinInfo
*LPD3DXSKININFO
;
111 typedef struct ID3DXPatchMesh
*LPD3DXPATCHMESH
;
113 typedef struct _D3DXATTRIBUTERANGE
120 } D3DXATTRIBUTERANGE
;
122 typedef D3DXATTRIBUTERANGE
* LPD3DXATTRIBUTERANGE
;
124 typedef struct _D3DXMATERIAL
127 LPSTR pTextureFilename
;
129 typedef D3DXMATERIAL
*LPD3DXMATERIAL
;
131 typedef enum _D3DXEFFECTDEFAULTTYPE
133 D3DXEDT_STRING
= 0x1, // pValue points to a null terminated ASCII string
134 D3DXEDT_FLOATS
= 0x2, // pValue points to an array of floats - number of floats is NumBytes / sizeof(float)
135 D3DXEDT_DWORD
= 0x3, // pValue points to a DWORD
137 D3DXEDT_FORCEDWORD
= 0x7fffffff
138 } D3DXEFFECTDEFAULTTYPE
;
140 typedef struct _D3DXEFFECTDEFAULT
143 D3DXEFFECTDEFAULTTYPE Type
; // type of the data pointed to by pValue
144 DWORD NumBytes
; // size in bytes of the data pointed to by pValue
145 LPVOID pValue
; // data for the default of the effect
146 } D3DXEFFECTDEFAULT
, *LPD3DXEFFECTDEFAULT
;
148 typedef struct _D3DXEFFECTINSTANCE
150 LPSTR pEffectFilename
;
152 LPD3DXEFFECTDEFAULT pDefaults
;
153 } D3DXEFFECTINSTANCE
, *LPD3DXEFFECTINSTANCE
;
155 typedef struct _D3DXATTRIBUTEWEIGHTS
165 } D3DXATTRIBUTEWEIGHTS
, *LPD3DXATTRIBUTEWEIGHTS
;
167 enum _D3DXWELDEPSILONSFLAGS
169 D3DXWELDEPSILONS_WELDALL
= 0x1, // weld all vertices marked by adjacency as being overlapping
171 D3DXWELDEPSILONS_WELDPARTIALMATCHES
= 0x2, // if a given vertex component is within epsilon, modify partial matched
172 // vertices so that both components identical AND if all components "equal"
173 // remove one of the vertices
174 D3DXWELDEPSILONS_DONOTREMOVEVERTICES
= 0x4, // instructs weld to only allow modifications to vertices and not removal
175 // ONLY valid if D3DXWELDEPSILONS_WELDPARTIALMATCHES is set
176 // useful to modify vertices to be equal, but not allow vertices to be removed
178 D3DXWELDEPSILONS_DONOTSPLIT
= 0x8, // instructs weld to specify the D3DXMESHOPT_DONOTSPLIT flag when doing an Optimize(ATTR_SORT)
179 // if this flag is not set, all vertices that are in separate attribute groups
180 // will remain split and not welded. Setting this flag can slow down software vertex processing
184 typedef struct _D3DXWELDEPSILONS
186 FLOAT Position
; // NOTE: This does NOT replace the epsilon in GenerateAdjacency
187 // in general, it should be the same value or greater than the one passed to GeneratedAdjacency
199 typedef D3DXWELDEPSILONS
* LPD3DXWELDEPSILONS
;
203 #define INTERFACE ID3DXBaseMesh
205 DECLARE_INTERFACE_(ID3DXBaseMesh
, IUnknown
)
208 STDMETHOD(QueryInterface
)(THIS_ REFIID iid
, LPVOID
*ppv
) PURE
;
209 STDMETHOD_(ULONG
, AddRef
)(THIS
) PURE
;
210 STDMETHOD_(ULONG
, Release
)(THIS
) PURE
;
213 STDMETHOD(DrawSubset
)(THIS_ DWORD AttribId
) PURE
;
214 STDMETHOD_(DWORD
, GetNumFaces
)(THIS
) PURE
;
215 STDMETHOD_(DWORD
, GetNumVertices
)(THIS
) PURE
;
216 STDMETHOD_(DWORD
, GetFVF
)(THIS
) PURE
;
217 STDMETHOD(GetDeclaration
)(THIS_ D3DVERTEXELEMENT9 Declaration
[MAX_FVF_DECL_SIZE
]) PURE
;
218 STDMETHOD_(DWORD
, GetNumBytesPerVertex
)(THIS
) PURE
;
219 STDMETHOD_(DWORD
, GetOptions
)(THIS
) PURE
;
220 STDMETHOD(GetDevice
)(THIS_ LPDIRECT3DDEVICE9
* ppDevice
) PURE
;
221 STDMETHOD(CloneMeshFVF
)(THIS_ DWORD Options
,
222 DWORD FVF
, LPDIRECT3DDEVICE9 pD3DDevice
, LPD3DXMESH
* ppCloneMesh
) PURE
;
223 STDMETHOD(CloneMesh
)(THIS_ DWORD Options
,
224 CONST D3DVERTEXELEMENT9
*pDeclaration
, LPDIRECT3DDEVICE9 pD3DDevice
, LPD3DXMESH
* ppCloneMesh
) PURE
;
225 STDMETHOD(GetVertexBuffer
)(THIS_ LPDIRECT3DVERTEXBUFFER9
* ppVB
) PURE
;
226 STDMETHOD(GetIndexBuffer
)(THIS_ LPDIRECT3DINDEXBUFFER9
* ppIB
) PURE
;
227 STDMETHOD(LockVertexBuffer
)(THIS_ DWORD Flags
, LPVOID
*ppData
) PURE
;
228 STDMETHOD(UnlockVertexBuffer
)(THIS
) PURE
;
229 STDMETHOD(LockIndexBuffer
)(THIS_ DWORD Flags
, LPVOID
*ppData
) PURE
;
230 STDMETHOD(UnlockIndexBuffer
)(THIS
) PURE
;
231 STDMETHOD(GetAttributeTable
)(
232 THIS_ D3DXATTRIBUTERANGE
*pAttribTable
, DWORD
* pAttribTableSize
) PURE
;
234 STDMETHOD(ConvertPointRepsToAdjacency
)(THIS_ CONST DWORD
* pPRep
, DWORD
* pAdjacency
) PURE
;
235 STDMETHOD(ConvertAdjacencyToPointReps
)(THIS_ CONST DWORD
* pAdjacency
, DWORD
* pPRep
) PURE
;
236 STDMETHOD(GenerateAdjacency
)(THIS_ FLOAT Epsilon
, DWORD
* pAdjacency
) PURE
;
238 STDMETHOD(UpdateSemantics
)(THIS_ D3DVERTEXELEMENT9 Declaration
[MAX_FVF_DECL_SIZE
]) PURE
;
243 #define INTERFACE ID3DXMesh
245 DECLARE_INTERFACE_(ID3DXMesh
, ID3DXBaseMesh
)
248 STDMETHOD(QueryInterface
)(THIS_ REFIID iid
, LPVOID
*ppv
) PURE
;
249 STDMETHOD_(ULONG
, AddRef
)(THIS
) PURE
;
250 STDMETHOD_(ULONG
, Release
)(THIS
) PURE
;
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
;
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
;
278 STDMETHOD(UpdateSemantics
)(THIS_ D3DVERTEXELEMENT9 Declaration
[MAX_FVF_DECL_SIZE
]) PURE
;
281 STDMETHOD(LockAttributeBuffer
)(THIS_ DWORD Flags
, DWORD
** ppData
) PURE
;
282 STDMETHOD(UnlockAttributeBuffer
)(THIS
) PURE
;
283 STDMETHOD(Optimize
)(THIS_ DWORD Flags
, CONST DWORD
* pAdjacencyIn
, DWORD
* pAdjacencyOut
,
284 DWORD
* pFaceRemap
, LPD3DXBUFFER
*ppVertexRemap
,
285 LPD3DXMESH
* ppOptMesh
) PURE
;
286 STDMETHOD(OptimizeInplace
)(THIS_ DWORD Flags
, CONST DWORD
* pAdjacencyIn
, DWORD
* pAdjacencyOut
,
287 DWORD
* pFaceRemap
, LPD3DXBUFFER
*ppVertexRemap
) PURE
;
288 STDMETHOD(SetAttributeTable
)(THIS_ CONST D3DXATTRIBUTERANGE
*pAttribTable
, DWORD cAttribTableSize
) PURE
;
293 #define INTERFACE ID3DXPMesh
295 DECLARE_INTERFACE_(ID3DXPMesh
, ID3DXBaseMesh
)
298 STDMETHOD(QueryInterface
)(THIS_ REFIID iid
, LPVOID
*ppv
) PURE
;
299 STDMETHOD_(ULONG
, AddRef
)(THIS
) PURE
;
300 STDMETHOD_(ULONG
, Release
)(THIS
) PURE
;
303 STDMETHOD(DrawSubset
)(THIS_ DWORD AttribId
) PURE
;
304 STDMETHOD_(DWORD
, GetNumFaces
)(THIS
) PURE
;
305 STDMETHOD_(DWORD
, GetNumVertices
)(THIS
) PURE
;
306 STDMETHOD_(DWORD
, GetFVF
)(THIS
) PURE
;
307 STDMETHOD(GetDeclaration
)(THIS_ D3DVERTEXELEMENT9 Declaration
[MAX_FVF_DECL_SIZE
]) PURE
;
308 STDMETHOD_(DWORD
, GetNumBytesPerVertex
)(THIS
) PURE
;
309 STDMETHOD_(DWORD
, GetOptions
)(THIS
) PURE
;
310 STDMETHOD(GetDevice
)(THIS_ LPDIRECT3DDEVICE9
* ppDevice
) PURE
;
311 STDMETHOD(CloneMeshFVF
)(THIS_ DWORD Options
,
312 DWORD FVF
, LPDIRECT3DDEVICE9 pD3DDevice
, LPD3DXMESH
* ppCloneMesh
) PURE
;
313 STDMETHOD(CloneMesh
)(THIS_ DWORD Options
,
314 CONST D3DVERTEXELEMENT9
*pDeclaration
, LPDIRECT3DDEVICE9 pD3DDevice
, LPD3DXMESH
* ppCloneMesh
) PURE
;
315 STDMETHOD(GetVertexBuffer
)(THIS_ LPDIRECT3DVERTEXBUFFER9
* ppVB
) PURE
;
316 STDMETHOD(GetIndexBuffer
)(THIS_ LPDIRECT3DINDEXBUFFER9
* ppIB
) PURE
;
317 STDMETHOD(LockVertexBuffer
)(THIS_ DWORD Flags
, LPVOID
*ppData
) PURE
;
318 STDMETHOD(UnlockVertexBuffer
)(THIS
) PURE
;
319 STDMETHOD(LockIndexBuffer
)(THIS_ DWORD Flags
, LPVOID
*ppData
) PURE
;
320 STDMETHOD(UnlockIndexBuffer
)(THIS
) PURE
;
321 STDMETHOD(GetAttributeTable
)(
322 THIS_ D3DXATTRIBUTERANGE
*pAttribTable
, DWORD
* pAttribTableSize
) PURE
;
324 STDMETHOD(ConvertPointRepsToAdjacency
)(THIS_ CONST DWORD
* pPRep
, DWORD
* pAdjacency
) PURE
;
325 STDMETHOD(ConvertAdjacencyToPointReps
)(THIS_ CONST DWORD
* pAdjacency
, DWORD
* pPRep
) PURE
;
326 STDMETHOD(GenerateAdjacency
)(THIS_ FLOAT Epsilon
, DWORD
* pAdjacency
) PURE
;
328 STDMETHOD(UpdateSemantics
)(THIS_ D3DVERTEXELEMENT9 Declaration
[MAX_FVF_DECL_SIZE
]) PURE
;
331 STDMETHOD(ClonePMeshFVF
)(THIS_ DWORD Options
,
332 DWORD FVF
, LPDIRECT3DDEVICE9 pD3DDevice
, LPD3DXPMESH
* ppCloneMesh
) PURE
;
333 STDMETHOD(ClonePMesh
)(THIS_ DWORD Options
,
334 CONST D3DVERTEXELEMENT9
*pDeclaration
, LPDIRECT3DDEVICE9 pD3DDevice
, LPD3DXPMESH
* ppCloneMesh
) PURE
;
335 STDMETHOD(SetNumFaces
)(THIS_ DWORD Faces
) PURE
;
336 STDMETHOD(SetNumVertices
)(THIS_ DWORD Vertices
) PURE
;
337 STDMETHOD_(DWORD
, GetMaxFaces
)(THIS
) PURE
;
338 STDMETHOD_(DWORD
, GetMinFaces
)(THIS
) PURE
;
339 STDMETHOD_(DWORD
, GetMaxVertices
)(THIS
) PURE
;
340 STDMETHOD_(DWORD
, GetMinVertices
)(THIS
) PURE
;
341 STDMETHOD(Save
)(THIS_ IStream
*pStream
, CONST D3DXMATERIAL
* pMaterials
, CONST D3DXEFFECTINSTANCE
* pEffectInstances
, DWORD NumMaterials
) PURE
;
343 STDMETHOD(Optimize
)(THIS_ DWORD Flags
, DWORD
* pAdjacencyOut
,
344 DWORD
* pFaceRemap
, LPD3DXBUFFER
*ppVertexRemap
,
345 LPD3DXMESH
* ppOptMesh
) PURE
;
347 STDMETHOD(OptimizeBaseLOD
)(THIS_ DWORD Flags
, DWORD
* pFaceRemap
) PURE
;
348 STDMETHOD(TrimByFaces
)(THIS_ DWORD NewFacesMin
, DWORD NewFacesMax
, DWORD
*rgiFaceRemap
, DWORD
*rgiVertRemap
) PURE
;
349 STDMETHOD(TrimByVertices
)(THIS_ DWORD NewVerticesMin
, DWORD NewVerticesMax
, DWORD
*rgiFaceRemap
, DWORD
*rgiVertRemap
) PURE
;
351 STDMETHOD(GetAdjacency
)(THIS_ DWORD
* pAdjacency
) PURE
;
353 // Used to generate the immediate "ancestor" for each vertex when it is removed by a vsplit. Allows generation of geomorphs
354 // Vertex buffer must be equal to or greater than the maximum number of vertices in the pmesh
355 STDMETHOD(GenerateVertexHistory
)(THIS_ DWORD
* pVertexHistory
) PURE
;
360 #define INTERFACE ID3DXSPMesh
362 DECLARE_INTERFACE_(ID3DXSPMesh
, IUnknown
)
365 STDMETHOD(QueryInterface
)(THIS_ REFIID iid
, LPVOID
*ppv
) PURE
;
366 STDMETHOD_(ULONG
, AddRef
)(THIS
) PURE
;
367 STDMETHOD_(ULONG
, Release
)(THIS
) PURE
;
370 STDMETHOD_(DWORD
, GetNumFaces
)(THIS
) PURE
;
371 STDMETHOD_(DWORD
, GetNumVertices
)(THIS
) PURE
;
372 STDMETHOD_(DWORD
, GetFVF
)(THIS
) PURE
;
373 STDMETHOD(GetDeclaration
)(THIS_ D3DVERTEXELEMENT9 Declaration
[MAX_FVF_DECL_SIZE
]) PURE
;
374 STDMETHOD_(DWORD
, GetOptions
)(THIS
) PURE
;
375 STDMETHOD(GetDevice
)(THIS_ LPDIRECT3DDEVICE9
* ppDevice
) PURE
;
376 STDMETHOD(CloneMeshFVF
)(THIS_ DWORD Options
,
377 DWORD FVF
, LPDIRECT3DDEVICE9 pD3DDevice
, DWORD
*pAdjacencyOut
, DWORD
*pVertexRemapOut
, LPD3DXMESH
* ppCloneMesh
) PURE
;
378 STDMETHOD(CloneMesh
)(THIS_ DWORD Options
,
379 CONST D3DVERTEXELEMENT9
*pDeclaration
, LPDIRECT3DDEVICE9 pD3DDevice
, DWORD
*pAdjacencyOut
, DWORD
*pVertexRemapOut
, LPD3DXMESH
* ppCloneMesh
) PURE
;
380 STDMETHOD(ClonePMeshFVF
)(THIS_ DWORD Options
,
381 DWORD FVF
, LPDIRECT3DDEVICE9 pD3DDevice
, DWORD
*pVertexRemapOut
, FLOAT
*pErrorsByFace
, LPD3DXPMESH
* ppCloneMesh
) PURE
;
382 STDMETHOD(ClonePMesh
)(THIS_ DWORD Options
,
383 CONST D3DVERTEXELEMENT9
*pDeclaration
, LPDIRECT3DDEVICE9 pD3DDevice
, DWORD
*pVertexRemapOut
, FLOAT
*pErrorsbyFace
, LPD3DXPMESH
* ppCloneMesh
) PURE
;
384 STDMETHOD(ReduceFaces
)(THIS_ DWORD Faces
) PURE
;
385 STDMETHOD(ReduceVertices
)(THIS_ DWORD Vertices
) PURE
;
386 STDMETHOD_(DWORD
, GetMaxFaces
)(THIS
) PURE
;
387 STDMETHOD_(DWORD
, GetMaxVertices
)(THIS
) PURE
;
388 STDMETHOD(GetVertexAttributeWeights
)(THIS_ LPD3DXATTRIBUTEWEIGHTS pVertexAttributeWeights
) PURE
;
389 STDMETHOD(GetVertexWeights
)(THIS_ FLOAT
*pVertexWeights
) PURE
;
392 #define UNUSED16 (0xffff)
393 #define UNUSED32 (0xffffffff)
395 // ID3DXMesh::Optimize options - upper byte only, lower 3 bytes used from _D3DXMESH option flags
397 D3DXMESHOPT_COMPACT
= 0x01000000,
398 D3DXMESHOPT_ATTRSORT
= 0x02000000,
399 D3DXMESHOPT_VERTEXCACHE
= 0x04000000,
400 D3DXMESHOPT_STRIPREORDER
= 0x08000000,
401 D3DXMESHOPT_IGNOREVERTS
= 0x10000000, // optimize faces only, don't touch vertices
402 D3DXMESHOPT_DONOTSPLIT
= 0x20000000, // do not split vertices shared between attribute groups when attribute sorting
403 D3DXMESHOPT_DEVICEINDEPENDENT
= 0x00400000, // Only affects VCache. uses a static known good cache size for all cards
405 // D3DXMESHOPT_SHAREVB has been removed, please use D3DXMESH_VB_SHARE instead
409 // Subset of the mesh that has the same attribute and bone combination.
410 // This subset can be rendered in a single draw call
411 typedef struct _D3DXBONECOMBINATION
419 } D3DXBONECOMBINATION
, *LPD3DXBONECOMBINATION
;
421 // The following types of patch combinations are supported:
422 // Patch type Basis Degree
424 // Rect B-Spline 2,3,5
425 // Rect Catmull-Rom 3
429 typedef struct _D3DXPATCHINFO
431 D3DXPATCHMESHTYPE PatchType
;
432 D3DDEGREETYPE Degree
;
434 } D3DXPATCHINFO
, *LPD3DXPATCHINFO
;
437 #define INTERFACE ID3DXPatchMesh
439 DECLARE_INTERFACE_(ID3DXPatchMesh
, IUnknown
)
442 STDMETHOD(QueryInterface
)(THIS_ REFIID iid
, LPVOID
*ppv
) PURE
;
443 STDMETHOD_(ULONG
, AddRef
)(THIS
) PURE
;
444 STDMETHOD_(ULONG
, Release
)(THIS
) PURE
;
448 // Return creation parameters
449 STDMETHOD_(DWORD
, GetNumPatches
)(THIS
) PURE
;
450 STDMETHOD_(DWORD
, GetNumVertices
)(THIS
) PURE
;
451 STDMETHOD(GetDeclaration
)(THIS_ D3DVERTEXELEMENT9 Declaration
[MAX_FVF_DECL_SIZE
]) PURE
;
452 STDMETHOD_(DWORD
, GetControlVerticesPerPatch
)(THIS
) PURE
;
453 STDMETHOD_(DWORD
, GetOptions
)(THIS
) PURE
;
454 STDMETHOD(GetDevice
)(THIS_ LPDIRECT3DDEVICE9
*ppDevice
) PURE
;
455 STDMETHOD(GetPatchInfo
)(THIS_ LPD3DXPATCHINFO PatchInfo
) PURE
;
457 // Control mesh access
458 STDMETHOD(GetVertexBuffer
)(THIS_ LPDIRECT3DVERTEXBUFFER9
* ppVB
) PURE
;
459 STDMETHOD(GetIndexBuffer
)(THIS_ LPDIRECT3DINDEXBUFFER9
* ppIB
) PURE
;
460 STDMETHOD(LockVertexBuffer
)(THIS_ DWORD flags
, LPVOID
*ppData
) PURE
;
461 STDMETHOD(UnlockVertexBuffer
)(THIS
) PURE
;
462 STDMETHOD(LockIndexBuffer
)(THIS_ DWORD flags
, LPVOID
*ppData
) PURE
;
463 STDMETHOD(UnlockIndexBuffer
)(THIS
) PURE
;
464 STDMETHOD(LockAttributeBuffer
)(THIS_ DWORD flags
, DWORD
** ppData
) PURE
;
465 STDMETHOD(UnlockAttributeBuffer
)(THIS
) PURE
;
467 // This function returns the size of the tessellated mesh given a tessellation level.
468 // This assumes uniform tessellation. For adaptive tessellation the Adaptive parameter must
469 // be set to TRUE and TessellationLevel should be the max tessellation.
470 // This will result in the max mesh size necessary for adaptive tessellation.
471 STDMETHOD(GetTessSize
)(THIS_ FLOAT fTessLevel
,DWORD Adaptive
, DWORD
*NumTriangles
,DWORD
*NumVertices
) PURE
;
473 //GenerateAdjacency determines which patches are adjacent with provided tolerance
474 //this information is used internally to optimize tessellation
475 STDMETHOD(GenerateAdjacency
)(THIS_ FLOAT Tolerance
) PURE
;
477 //CloneMesh Creates a new patchmesh with the specified decl, and converts the vertex buffer
478 //to the new decl. Entries in the new decl which are new are set to 0. If the current mesh
479 //has adjacency, the new mesh will also have adjacency
480 STDMETHOD(CloneMesh
)(THIS_ DWORD Options
, CONST D3DVERTEXELEMENT9
*pDecl
, LPD3DXPATCHMESH
*pMesh
) PURE
;
482 // Optimizes the patchmesh for efficient tessellation. This function is designed
483 // to perform one time optimization for patch meshes that need to be tessellated
484 // repeatedly by calling the Tessellate() method. The optimization performed is
485 // independent of the actual tessellation level used.
486 // Currently Flags is unused.
487 // If vertices are changed, Optimize must be called again
488 STDMETHOD(Optimize
)(THIS_ DWORD flags
) PURE
;
490 //gets and sets displacement parameters
491 //displacement maps can only be 2D textures MIP-MAPPING is ignored for non adapative tessellation
492 STDMETHOD(SetDisplaceParam
)(THIS_ LPDIRECT3DBASETEXTURE9 Texture
,
493 D3DTEXTUREFILTERTYPE MinFilter
,
494 D3DTEXTUREFILTERTYPE MagFilter
,
495 D3DTEXTUREFILTERTYPE MipFilter
,
496 D3DTEXTUREADDRESS Wrap
,
497 DWORD dwLODBias
) PURE
;
499 STDMETHOD(GetDisplaceParam
)(THIS_ LPDIRECT3DBASETEXTURE9
*Texture
,
500 D3DTEXTUREFILTERTYPE
*MinFilter
,
501 D3DTEXTUREFILTERTYPE
*MagFilter
,
502 D3DTEXTUREFILTERTYPE
*MipFilter
,
503 D3DTEXTUREADDRESS
*Wrap
,
504 DWORD
*dwLODBias
) PURE
;
506 // Performs the uniform tessellation based on the tessellation level.
507 // This function will perform more efficiently if the patch mesh has been optimized using the Optimize() call.
508 STDMETHOD(Tessellate
)(THIS_ FLOAT fTessLevel
,LPD3DXMESH pMesh
) PURE
;
510 // Performs adaptive tessellation based on the Z based adaptive tessellation criterion.
511 // pTrans specifies a 4D vector that is dotted with the vertices to get the per vertex
512 // adaptive tessellation amount. Each edge is tessellated to the average of the criterion
513 // at the 2 vertices it connects.
514 // MaxTessLevel specifies the upper limit for adaptive tesselation.
515 // This function will perform more efficiently if the patch mesh has been optimized using the Optimize() call.
516 STDMETHOD(TessellateAdaptive
)(THIS_
517 CONST D3DXVECTOR4
*pTrans
,
518 DWORD dwMaxTessLevel
,
519 DWORD dwMinTessLevel
,
520 LPD3DXMESH pMesh
) PURE
;
525 #define INTERFACE ID3DXSkinInfo
527 DECLARE_INTERFACE_(ID3DXSkinInfo
, IUnknown
)
530 STDMETHOD(QueryInterface
)(THIS_ REFIID iid
, LPVOID
*ppv
) PURE
;
531 STDMETHOD_(ULONG
, AddRef
)(THIS
) PURE
;
532 STDMETHOD_(ULONG
, Release
)(THIS
) PURE
;
534 // Specify the which vertices do each bones influence and by how much
535 STDMETHOD(SetBoneInfluence
)(THIS_ DWORD bone
, DWORD numInfluences
, CONST DWORD
* vertices
, CONST FLOAT
* weights
) PURE
;
536 STDMETHOD(SetBoneVertexInfluence
)(THIS_ DWORD boneNum
, DWORD influenceNum
, float weight
) PURE
;
537 STDMETHOD_(DWORD
, GetNumBoneInfluences
)(THIS_ DWORD bone
) PURE
;
538 STDMETHOD(GetBoneInfluence
)(THIS_ DWORD bone
, DWORD
* vertices
, FLOAT
* weights
) PURE
;
539 STDMETHOD(GetBoneVertexInfluence
)(THIS_ DWORD boneNum
, DWORD influenceNum
, float *pWeight
, DWORD
*pVertexNum
) PURE
;
540 STDMETHOD(GetMaxVertexInfluences
)(THIS_ DWORD
* maxVertexInfluences
) PURE
;
541 STDMETHOD_(DWORD
, GetNumBones
)(THIS
) PURE
;
542 STDMETHOD(FindBoneVertexInfluenceIndex
)(THIS_ DWORD boneNum
, DWORD vertexNum
, DWORD
*pInfluenceIndex
) PURE
;
544 // This gets the max face influences based on a triangle mesh with the specified index buffer
545 STDMETHOD(GetMaxFaceInfluences
)(THIS_ LPDIRECT3DINDEXBUFFER9 pIB
, DWORD NumFaces
, DWORD
* maxFaceInfluences
) PURE
;
547 // Set min bone influence. Bone influences that are smaller than this are ignored
548 STDMETHOD(SetMinBoneInfluence
)(THIS_ FLOAT MinInfl
) PURE
;
549 // Get min bone influence.
550 STDMETHOD_(FLOAT
, GetMinBoneInfluence
)(THIS
) PURE
;
552 // Bone names are returned by D3DXLoadSkinMeshFromXof. They are not used by any other method of this object
553 STDMETHOD(SetBoneName
)(THIS_ DWORD Bone
, LPCSTR pName
) PURE
; // pName is copied to an internal string buffer
554 STDMETHOD_(LPCSTR
, GetBoneName
)(THIS_ DWORD Bone
) PURE
; // A pointer to an internal string buffer is returned. Do not free this.
556 // Bone offset matrices are returned by D3DXLoadSkinMeshFromXof. They are not used by any other method of this object
557 STDMETHOD(SetBoneOffsetMatrix
)(THIS_ DWORD Bone
, CONST D3DXMATRIX
*pBoneTransform
) PURE
; // pBoneTransform is copied to an internal buffer
558 STDMETHOD_(LPD3DXMATRIX
, GetBoneOffsetMatrix
)(THIS_ DWORD Bone
) PURE
; // A pointer to an internal matrix is returned. Do not free this.
560 // Clone a skin info object
561 STDMETHOD(Clone
)(THIS_ LPD3DXSKININFO
* ppSkinInfo
) PURE
;
563 // Update bone influence information to match vertices after they are reordered. This should be called
564 // if the target vertex buffer has been reordered externally.
565 STDMETHOD(Remap
)(THIS_ DWORD NumVertices
, DWORD
* pVertexRemap
) PURE
;
567 // These methods enable the modification of the vertex layout of the vertices that will be skinned
568 STDMETHOD(SetFVF
)(THIS_ DWORD FVF
) PURE
;
569 STDMETHOD(SetDeclaration
)(THIS_ CONST D3DVERTEXELEMENT9
*pDeclaration
) PURE
;
570 STDMETHOD_(DWORD
, GetFVF
)(THIS
) PURE
;
571 STDMETHOD(GetDeclaration
)(THIS_ D3DVERTEXELEMENT9 Declaration
[MAX_FVF_DECL_SIZE
]) PURE
;
573 // Apply SW skinning based on current pose matrices to the target vertices.
574 STDMETHOD(UpdateSkinnedMesh
)(THIS_
575 CONST D3DXMATRIX
* pBoneTransforms
,
576 CONST D3DXMATRIX
* pBoneInvTransposeTransforms
,
577 LPCVOID pVerticesSrc
,
578 PVOID pVerticesDst
) PURE
;
580 // Takes a mesh and returns a new mesh with per vertex blend weights and a bone combination
581 // table that describes which bones affect which subsets of the mesh
582 STDMETHOD(ConvertToBlendedMesh
)(THIS_
585 CONST DWORD
*pAdjacencyIn
,
586 LPDWORD pAdjacencyOut
,
588 LPD3DXBUFFER
*ppVertexRemap
,
590 DWORD
* pNumBoneCombinations
,
591 LPD3DXBUFFER
* ppBoneCombinationTable
,
592 LPD3DXMESH
* ppMesh
) PURE
;
594 // Takes a mesh and returns a new mesh with per vertex blend weights and indices
595 // and a bone combination table that describes which bones palettes affect which subsets of the mesh
596 STDMETHOD(ConvertToIndexedBlendedMesh
)(THIS_
600 CONST DWORD
*pAdjacencyIn
,
601 LPDWORD pAdjacencyOut
,
603 LPD3DXBUFFER
*ppVertexRemap
,
604 DWORD
* pMaxVertexInfl
,
605 DWORD
* pNumBoneCombinations
,
606 LPD3DXBUFFER
* ppBoneCombinationTable
,
607 LPD3DXMESH
* ppMesh
) PURE
;
620 CONST D3DVERTEXELEMENT9
*pDeclaration
,
621 LPDIRECT3DDEVICE9 pD3DDevice
,
630 LPDIRECT3DDEVICE9 pD3DDevice
,
636 CONST DWORD
* pAdjacency
,
637 CONST D3DXATTRIBUTEWEIGHTS
*pVertexAttributeWeights
,
638 CONST FLOAT
*pVertexWeights
,
639 LPD3DXSPMESH
* ppSMesh
);
641 // clean a mesh up for simplification, try to make manifold
644 D3DXCLEANTYPE CleanType
,
646 CONST DWORD
* pAdjacencyIn
,
647 LPD3DXMESH
* ppMeshOut
,
648 DWORD
* pAdjacencyOut
,
649 LPD3DXBUFFER
* ppErrorsAndWarnings
);
654 CONST DWORD
* pAdjacency
,
655 LPD3DXBUFFER
* ppErrorsAndWarnings
);
660 CONST DWORD
* pAdjacency
,
661 CONST D3DXATTRIBUTEWEIGHTS
*pVertexAttributeWeights
,
662 CONST FLOAT
*pVertexWeights
,
665 LPD3DXPMESH
* ppPMesh
);
670 CONST DWORD
* pAdjacency
,
671 CONST D3DXATTRIBUTEWEIGHTS
*pVertexAttributeWeights
,
672 CONST FLOAT
*pVertexWeights
,
678 D3DXComputeBoundingSphere(
679 CONST D3DXVECTOR3
*pFirstPosition
, // pointer to first position
681 DWORD dwStride
, // count in bytes to subsequent position vectors
682 D3DXVECTOR3
*pCenter
,
686 D3DXComputeBoundingBox(
687 CONST D3DXVECTOR3
*pFirstPosition
, // pointer to first position
689 DWORD dwStride
, // count in bytes to subsequent position vectors
695 LPD3DXBASEMESH pMesh
,
696 CONST DWORD
*pAdjacency
);
701 LPD3DXBUFFER
*ppBuffer
);
708 LPDIRECT3DDEVICE9 pD3DDevice
,
709 LPD3DXBUFFER
*ppAdjacency
,
710 LPD3DXBUFFER
*ppMaterials
,
711 LPD3DXBUFFER
*ppEffectInstances
,
712 DWORD
*pNumMaterials
,
719 LPDIRECT3DDEVICE9 pD3DDevice
,
720 LPD3DXBUFFER
*ppAdjacency
,
721 LPD3DXBUFFER
*ppMaterials
,
722 LPD3DXBUFFER
*ppEffectInstances
,
723 DWORD
*pNumMaterials
,
727 #define D3DXLoadMeshFromX D3DXLoadMeshFromXW
729 #define D3DXLoadMeshFromX D3DXLoadMeshFromXA
733 D3DXLoadMeshFromXInMemory(
737 LPDIRECT3DDEVICE9 pD3DDevice
,
738 LPD3DXBUFFER
*ppAdjacency
,
739 LPD3DXBUFFER
*ppMaterials
,
740 LPD3DXBUFFER
*ppEffectInstances
,
741 DWORD
*pNumMaterials
,
745 D3DXLoadMeshFromXResource(
750 LPDIRECT3DDEVICE9 pD3DDevice
,
751 LPD3DXBUFFER
*ppAdjacency
,
752 LPD3DXBUFFER
*ppMaterials
,
753 LPD3DXBUFFER
*ppEffectInstances
,
754 DWORD
*pNumMaterials
,
761 CONST DWORD
* pAdjacency
,
762 CONST D3DXMATERIAL
* pMaterials
,
763 CONST D3DXEFFECTINSTANCE
* pEffectInstances
,
772 CONST DWORD
* pAdjacency
,
773 CONST D3DXMATERIAL
* pMaterials
,
774 CONST D3DXEFFECTINSTANCE
* pEffectInstances
,
780 #define D3DXSaveMeshToX D3DXSaveMeshToXW
782 #define D3DXSaveMeshToX D3DXSaveMeshToXA
787 D3DXCreatePMeshFromStream(
790 LPDIRECT3DDEVICE9 pD3DDevice
,
791 LPD3DXBUFFER
*ppMaterials
,
792 LPD3DXBUFFER
*ppEffectInstances
,
793 DWORD
* pNumMaterials
,
794 LPD3DXPMESH
*ppPMesh
);
796 // 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
797 // The bone names and initial bone transforms are not filled in the skin info object by this method.
801 CONST D3DVERTEXELEMENT9
*pDeclaration
,
803 LPD3DXSKININFO
* ppSkinInfo
);
805 // 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
806 // The bone names and initial bone transforms are not filled in the skin info object by this method.
808 D3DXCreateSkinInfoFVF(
812 LPD3DXSKININFO
* ppSkinInfo
);
822 LPD3DXFILEDATA pxofMesh
,
824 LPDIRECT3DDEVICE9 pD3DDevice
,
825 LPD3DXBUFFER
*ppAdjacency
,
826 LPD3DXBUFFER
*ppMaterials
,
827 LPD3DXBUFFER
*ppEffectInstances
,
828 DWORD
*pNumMaterials
,
831 // This similar to D3DXLoadMeshFromXof, except also returns skinning info if present in the file
832 // If skinning info is not present, ppSkinInfo will be NULL
834 D3DXLoadSkinMeshFromXof(
835 LPD3DXFILEDATA pxofMesh
,
837 LPDIRECT3DDEVICE9 pD3DDevice
,
838 LPD3DXBUFFER
* ppAdjacency
,
839 LPD3DXBUFFER
* ppMaterials
,
840 LPD3DXBUFFER
*ppEffectInstances
,
842 LPD3DXSKININFO
* ppSkinInfo
,
846 // The inverse of D3DXConvertTo{Indexed}BlendedMesh() functions. It figures out the skinning info from
847 // the mesh and the bone combination table and populates a skin info object with that data. The bone
848 // names and initial bone transforms are not filled in the skin info object by this method. This works
849 // with either a non-indexed or indexed blended mesh. It examines the FVF or declarator of the mesh to
850 // determine what type it is.
852 D3DXCreateSkinInfoFromBlendedMesh(
853 LPD3DXBASEMESH pMesh
,
855 CONST D3DXBONECOMBINATION
*pBoneCombinationTable
,
856 LPD3DXSKININFO
* ppSkinInfo
);
859 D3DXTessellateNPatches(
861 CONST DWORD
* pAdjacencyIn
,
863 BOOL QuadraticInterpNormals
, // if false use linear intrep for normals, if true use quadratic
864 LPD3DXMESH
*ppMeshOut
,
865 LPD3DXBUFFER
*ppAdjacencyOut
);
868 //generates implied outputdecl from input decl
869 //the decl generated from this should be used to generate the output decl for
870 //the tessellator subroutines.
873 D3DXGenerateOutputDecl(
874 D3DVERTEXELEMENT9
*pOutput
,
875 CONST D3DVERTEXELEMENT9
*pInput
);
877 //loads patches from an XFileData
878 //since an X file can have up to 6 different patch meshes in it,
879 //returns them in an array - pNumPatches will contain the number of
880 //meshes in the actual file.
882 D3DXLoadPatchMeshFromXof(
883 LPD3DXFILEDATA pXofObjMesh
,
885 LPDIRECT3DDEVICE9 pD3DDevice
,
886 LPD3DXBUFFER
*ppMaterials
,
887 LPD3DXBUFFER
*ppEffectInstances
,
888 PDWORD pNumMaterials
,
889 LPD3DXPATCHMESH
*ppMesh
);
891 //computes the size a single rect patch.
894 CONST FLOAT
*pfNumSegs
, //segments for each edge (4)
895 DWORD
*pdwTriangles
, //output number of triangles
896 DWORD
*pdwVertices
); //output number of vertices
898 //computes the size of a single triangle patch
901 CONST FLOAT
*pfNumSegs
, //segments for each edge (3)
902 DWORD
*pdwTriangles
, //output number of triangles
903 DWORD
*pdwVertices
); //output number of vertices
906 //tessellates a patch into a created mesh
907 //similar to D3D RT patch
909 D3DXTessellateRectPatch(
910 LPDIRECT3DVERTEXBUFFER9 pVB
,
911 CONST FLOAT
*pNumSegs
,
912 CONST D3DVERTEXELEMENT9
*pdwInDecl
,
913 CONST D3DRECTPATCH_INFO
*pRectPatchInfo
,
918 D3DXTessellateTriPatch(
919 LPDIRECT3DVERTEXBUFFER9 pVB
,
920 CONST FLOAT
*pNumSegs
,
921 CONST D3DVERTEXELEMENT9
*pInDecl
,
922 CONST D3DTRIPATCH_INFO
*pTriPatchInfo
,
927 //creates an NPatch PatchMesh from a D3DXMESH
929 D3DXCreateNPatchMesh(
930 LPD3DXMESH pMeshSysMem
,
931 LPD3DXPATCHMESH
*pPatchMesh
);
934 //creates a patch mesh
937 CONST D3DXPATCHINFO
*pInfo
, //patch type
938 DWORD dwNumPatches
, //number of patches
939 DWORD dwNumVertices
, //number of control vertices
940 DWORD dwOptions
, //options
941 CONST D3DVERTEXELEMENT9
*pDecl
, //format of control vertices
942 LPDIRECT3DDEVICE9 pD3DDevice
,
943 LPD3DXPATCHMESH
*pPatchMesh
);
946 //returns the number of degenerates in a patch mesh -
947 //text output put in string.
949 D3DXValidPatchMesh(LPD3DXPATCHMESH pMesh
,
950 DWORD
*dwcDegenerateVertices
,
951 DWORD
*dwcDegeneratePatches
,
952 LPD3DXBUFFER
*ppErrorsAndWarnings
);
955 D3DXGetFVFVertexSize(DWORD FVF
);
958 D3DXGetDeclVertexSize(CONST D3DVERTEXELEMENT9
*pDecl
,DWORD Stream
);
961 D3DXGetDeclLength(CONST D3DVERTEXELEMENT9
*pDecl
);
964 D3DXDeclaratorFromFVF(
966 D3DVERTEXELEMENT9 pDeclarator
[MAX_FVF_DECL_SIZE
]);
969 D3DXFVFFromDeclarator(
970 CONST D3DVERTEXELEMENT9
*pDeclarator
,
977 CONST D3DXWELDEPSILONS
*pEpsilons
,
978 CONST DWORD
*pAdjacencyIn
,
979 DWORD
*pAdjacencyOut
,
981 LPD3DXBUFFER
*ppVertexRemap
);
983 typedef struct _D3DXINTERSECTINFO
985 DWORD FaceIndex
; // index of face intersected
986 FLOAT U
; // Barycentric Hit Coordinates
987 FLOAT V
; // Barycentric Hit Coordinates
988 FLOAT Dist
; // Ray-Intersection Parameter Distance
989 } D3DXINTERSECTINFO
, *LPD3DXINTERSECTINFO
;
994 LPD3DXBASEMESH pMesh
,
995 CONST D3DXVECTOR3
*pRayPos
,
996 CONST D3DXVECTOR3
*pRayDir
,
997 BOOL
*pHit
, // True if any faces were intersected
998 DWORD
*pFaceIndex
, // index of closest face intersected
999 FLOAT
*pU
, // Barycentric Hit Coordinates
1000 FLOAT
*pV
, // Barycentric Hit Coordinates
1001 FLOAT
*pDist
, // Ray-Intersection Parameter Distance
1002 LPD3DXBUFFER
*ppAllHits
, // Array of D3DXINTERSECTINFOs for all hits (not just closest)
1003 DWORD
*pCountOfHits
); // Number of entries in AllHits array
1006 D3DXIntersectSubset(
1007 LPD3DXBASEMESH pMesh
,
1009 CONST D3DXVECTOR3
*pRayPos
,
1010 CONST D3DXVECTOR3
*pRayDir
,
1011 BOOL
*pHit
, // True if any faces were intersected
1012 DWORD
*pFaceIndex
, // index of closest face intersected
1013 FLOAT
*pU
, // Barycentric Hit Coordinates
1014 FLOAT
*pV
, // Barycentric Hit Coordinates
1015 FLOAT
*pDist
, // Ray-Intersection Parameter Distance
1016 LPD3DXBUFFER
*ppAllHits
, // Array of D3DXINTERSECTINFOs for all hits (not just closest)
1017 DWORD
*pCountOfHits
); // Number of entries in AllHits array
1020 HRESULT WINAPI D3DXSplitMesh
1023 CONST DWORD
*pAdjacencyIn
,
1024 CONST DWORD MaxSize
,
1025 CONST DWORD Options
,
1027 LPD3DXBUFFER
*ppMeshArrayOut
,
1028 LPD3DXBUFFER
*ppAdjacencyArrayOut
,
1029 LPD3DXBUFFER
*ppFaceRemapArrayOut
,
1030 LPD3DXBUFFER
*ppVertRemapArrayOut
1033 BOOL WINAPI D3DXIntersectTri
1035 CONST D3DXVECTOR3
*p0
, // Triangle vertex 0 position
1036 CONST D3DXVECTOR3
*p1
, // Triangle vertex 1 position
1037 CONST D3DXVECTOR3
*p2
, // Triangle vertex 2 position
1038 CONST D3DXVECTOR3
*pRayPos
, // Ray origin
1039 CONST D3DXVECTOR3
*pRayDir
, // Ray direction
1040 FLOAT
*pU
, // Barycentric Hit Coordinates
1041 FLOAT
*pV
, // Barycentric Hit Coordinates
1042 FLOAT
*pDist
); // Ray-Intersection Parameter Distance
1045 D3DXSphereBoundProbe(
1046 CONST D3DXVECTOR3
*pCenter
,
1048 CONST D3DXVECTOR3
*pRayPosition
,
1049 CONST D3DXVECTOR3
*pRayDirection
);
1053 CONST D3DXVECTOR3
*pMin
,
1054 CONST D3DXVECTOR3
*pMax
,
1055 CONST D3DXVECTOR3
*pRayPosition
,
1056 CONST D3DXVECTOR3
*pRayDirection
);
1060 //D3DXComputeTangent
1062 //Computes the Tangent vectors for the TexStage texture coordinates
1063 //and places the results in the TANGENT[TangentIndex] specified in the meshes' DECL
1064 //puts the binorm in BINORM[BinormIndex] also specified in the decl.
1066 //If neither the binorm or the tangnet are in the meshes declaration,
1067 //the function will fail.
1069 //If a tangent or Binorm field is in the Decl, but the user does not
1070 //wish D3DXComputeTangent to replace them, then D3DX_DEFAULT specified
1071 //in the TangentIndex or BinormIndex will cause it to ignore the specified
1074 //Wrap should be specified if the texture coordinates wrap.
1076 HRESULT WINAPI
D3DXComputeTangent(LPD3DXMESH Mesh
,
1081 CONST DWORD
*pAdjacency
);
1084 D3DXConvertMeshSubsetToSingleStrip(
1085 LPD3DXBASEMESH MeshIn
,
1088 LPDIRECT3DINDEXBUFFER9
*ppIndexBuffer
,
1089 DWORD
*pNumIndices
);
1092 D3DXConvertMeshSubsetToStrips(
1093 LPD3DXBASEMESH MeshIn
,
1096 LPDIRECT3DINDEXBUFFER9
*ppIndexBuffer
,
1098 LPD3DXBUFFER
*ppStripLengths
,
1102 //============================================================================
1104 // D3DXOptimizeFaces:
1105 // --------------------
1106 // Generate a face remapping for a triangle list that more effectively utilizes
1107 // vertex caches. This optimization is identical to the one provided
1108 // by ID3DXMesh::Optimize with the hardware independent option enabled.
1112 // Triangle list indices to use for generating a vertex ordering
1114 // Number of faces in the triangle list
1116 // Number of vertices referenced by the triangle list
1118 // TRUE if indices are 32 bit, FALSE if indices are 16 bit
1120 // Destination buffer to store face ordering
1121 // The number stored for a given element is where in the new ordering
1122 // the face will have come from. See ID3DXMesh::Optimize for more info.
1124 //============================================================================
1133 //============================================================================
1135 // D3DXOptimizeVertices:
1136 // --------------------
1137 // Generate a vertex remapping to optimize for in order use of vertices for
1138 // a given set of indices. This is commonly used after applying the face
1139 // remap generated by D3DXOptimizeFaces
1143 // Triangle list indices to use for generating a vertex ordering
1145 // Number of faces in the triangle list
1147 // Number of vertices referenced by the triangle list
1149 // TRUE if indices are 32 bit, FALSE if indices are 16 bit
1151 // Destination buffer to store vertex ordering
1152 // The number stored for a given element is where in the new ordering
1153 // the vertex will have come from. See ID3DXMesh::Optimize for more info.
1155 //============================================================================
1157 D3DXOptimizeVertices(
1162 DWORD
* pVertexRemap
);
1166 #endif //__cplusplus
1169 //===========================================================================
1171 // Data structures for Spherical Harmonic Precomputation
1174 //============================================================================
1176 typedef enum _D3DXSHCOMPRESSQUALITYTYPE
{
1177 D3DXSHCQUAL_FASTLOWQUALITY
= 1,
1178 D3DXSHCQUAL_SLOWHIGHQUALITY
= 2,
1179 D3DXSHCQUAL_FORCE_DWORD
= 0x7fffffff
1180 } D3DXSHCOMPRESSQUALITYTYPE
;
1182 typedef enum _D3DXSHGPUSIMOPT
{
1183 D3DXSHGPUSIMOPT_SHADOWRES256
= 1,
1184 D3DXSHGPUSIMOPT_SHADOWRES512
= 0,
1185 D3DXSHGPUSIMOPT_SHADOWRES1024
= 2,
1186 D3DXSHGPUSIMOPT_SHADOWRES2048
= 3,
1188 D3DXSHGPUSIMOPT_HIGHQUALITY
= 4,
1190 D3DXSHGPUSIMOPT_FORCE_DWORD
= 0x7fffffff
1193 // for all properties that are colors the luminance is computed
1194 // if the simulator is run with a single channel using the following
1195 // formula: R * 0.2125 + G * 0.7154 + B * 0.0721
1197 typedef struct _D3DXSHMATERIAL
{
1198 D3DCOLORVALUE Diffuse
; // Diffuse albedo of the surface. (Ignored if object is a Mirror)
1199 BOOL bMirror
; // Must be set to FALSE. bMirror == TRUE not currently supported
1200 BOOL bSubSurf
; // true if the object does subsurface scattering - can't do this and be a mirror
1202 // subsurface scattering parameters
1203 FLOAT RelativeIndexOfRefraction
;
1204 D3DCOLORVALUE Absorption
;
1205 D3DCOLORVALUE ReducedScattering
;
1209 // allocated in D3DXSHPRTCompSplitMeshSC
1210 // vertices are duplicated into multiple super clusters but
1211 // only have a valid status in one super cluster (fill in the rest)
1213 typedef struct _D3DXSHPRTSPLITMESHVERTDATA
{
1214 UINT uVertRemap
; // vertex in original mesh this corresponds to
1215 UINT uSubCluster
; // cluster index relative to super cluster
1216 UCHAR ucVertStatus
; // 1 if vertex has valid data, 0 if it is "fill"
1217 } D3DXSHPRTSPLITMESHVERTDATA
;
1219 // used in D3DXSHPRTCompSplitMeshSC
1220 // information for each super cluster that maps into face/vert arrays
1222 typedef struct _D3DXSHPRTSPLITMESHCLUSTERDATA
{
1223 UINT uVertStart
; // initial index into remapped vertex array
1224 UINT uVertLength
; // number of vertices in this super cluster
1226 UINT uFaceStart
; // initial index into face array
1227 UINT uFaceLength
; // number of faces in this super cluster
1229 UINT uClusterStart
; // initial index into cluster array
1230 UINT uClusterLength
; // number of clusters in this super cluster
1231 } D3DXSHPRTSPLITMESHCLUSTERDATA
;
1233 // call back function for simulator
1234 // return S_OK to keep running the simulator - anything else represents
1235 // failure and the simulator will abort.
1237 typedef HRESULT (WINAPI
*LPD3DXSHPRTSIMCB
)(float fPercentDone
, LPVOID lpUserContext
);
1239 // interfaces for PRT buffers/simulator
1242 // {F1827E47-00A8-49cd-908C-9D11955F8728}
1243 DEFINE_GUID(IID_ID3DXPRTBuffer
,
1244 0xf1827e47, 0xa8, 0x49cd, 0x90, 0x8c, 0x9d, 0x11, 0x95, 0x5f, 0x87, 0x28);
1246 // {A758D465-FE8D-45ad-9CF0-D01E56266A07}
1247 DEFINE_GUID(IID_ID3DXPRTCompBuffer
,
1248 0xa758d465, 0xfe8d, 0x45ad, 0x9c, 0xf0, 0xd0, 0x1e, 0x56, 0x26, 0x6a, 0x7);
1250 // {06F57E0A-BD95-43f1-A3DA-791CF6CA297B}
1251 DEFINE_GUID(IID_ID3DXTextureGutterHelper
,
1252 0x6f57e0a, 0xbd95, 0x43f1, 0xa3, 0xda, 0x79, 0x1c, 0xf6, 0xca, 0x29, 0x7b);
1254 // {C3F4ADBF-E6D2-4b7b-BFE8-9E7208746ADF}
1255 DEFINE_GUID(IID_ID3DXPRTEngine
,
1256 0xc3f4adbf, 0xe6d2, 0x4b7b, 0xbf, 0xe8, 0x9e, 0x72, 0x8, 0x74, 0x6a, 0xdf);
1258 // interface defenitions
1261 typedef interface ID3DXTextureGutterHelper ID3DXTextureGutterHelper
;
1262 typedef interface ID3DXTextureGutterHelper
*LPD3DXTEXTUREGUTTERHELPER
;
1264 typedef interface ID3DXPRTBuffer ID3DXPRTBuffer
;
1265 typedef interface ID3DXPRTBuffer
*LPD3DXPRTBUFFER
;
1269 #define INTERFACE ID3DXPRTBuffer
1271 // Buffer interface - contains "NumSamples" samples
1272 // each sample in memory is stored as NumCoeffs scalars per channel (1 or 3)
1273 // Same interface is used for both Vertex and Pixel PRT buffers
1275 DECLARE_INTERFACE_(ID3DXPRTBuffer
, IUnknown
)
1278 STDMETHOD(QueryInterface
)(THIS_ REFIID iid
, LPVOID
*ppv
) PURE
;
1279 STDMETHOD_(ULONG
, AddRef
)(THIS
) PURE
;
1280 STDMETHOD_(ULONG
, Release
)(THIS
) PURE
;
1283 STDMETHOD_(UINT
, GetNumSamples
)(THIS
) PURE
;
1284 STDMETHOD_(UINT
, GetNumCoeffs
)(THIS
) PURE
;
1285 STDMETHOD_(UINT
, GetNumChannels
)(THIS
) PURE
;
1287 STDMETHOD_(BOOL
, IsTexture
)(THIS
) PURE
;
1288 STDMETHOD_(UINT
, GetWidth
)(THIS
) PURE
;
1289 STDMETHOD_(UINT
, GetHeight
)(THIS
) PURE
;
1291 // changes the number of samples allocated in the buffer
1292 STDMETHOD(Resize
)(THIS_ UINT NewSize
) PURE
;
1294 // ppData will point to the memory location where sample Start begins
1295 // pointer is valid for at least NumSamples samples
1296 STDMETHOD(LockBuffer
)(THIS_ UINT Start
, UINT NumSamples
, FLOAT
**ppData
) PURE
;
1297 STDMETHOD(UnlockBuffer
)(THIS
) PURE
;
1299 // every scalar in buffer is multiplied by Scale
1300 STDMETHOD(ScaleBuffer
)(THIS_ FLOAT Scale
) PURE
;
1302 // every scalar contains the sum of this and pBuffers values
1303 // pBuffer must have the same storage class/dimensions
1304 STDMETHOD(AddBuffer
)(THIS_ LPD3DXPRTBUFFER pBuffer
) PURE
;
1306 // GutterHelper (described below) will fill in the gutter
1307 // regions of a texture by interpolating "internal" values
1308 STDMETHOD(AttachGH
)(THIS_ LPD3DXTEXTUREGUTTERHELPER
) PURE
;
1309 STDMETHOD(ReleaseGH
)(THIS
) PURE
;
1311 // Evaluates attached gutter helper on the contents of this buffer
1312 STDMETHOD(EvalGH
)(THIS
) PURE
;
1314 // extracts a given channel into texture pTexture
1315 // NumCoefficients starting from StartCoefficient are copied
1316 STDMETHOD(ExtractTexture
)(THIS_ UINT Channel
, UINT StartCoefficient
,
1317 UINT NumCoefficients
, LPDIRECT3DTEXTURE9 pTexture
) PURE
;
1319 // extracts NumCoefficients coefficients into mesh - only applicable on single channel
1320 // buffers, otherwise just lockbuffer and copy data. With SHPRT data NumCoefficients
1321 // should be Order^2
1322 STDMETHOD(ExtractToMesh
)(THIS_ UINT NumCoefficients
, D3DDECLUSAGE Usage
, UINT UsageIndexStart
,
1323 LPD3DXMESH pScene
) PURE
;
1327 typedef interface ID3DXPRTCompBuffer ID3DXPRTCompBuffer
;
1328 typedef interface ID3DXPRTCompBuffer
*LPD3DXPRTCOMPBUFFER
;
1331 #define INTERFACE ID3DXPRTCompBuffer
1333 // compressed buffers stored a compressed version of a PRTBuffer
1335 DECLARE_INTERFACE_(ID3DXPRTCompBuffer
, IUnknown
)
1338 STDMETHOD(QueryInterface
)(THIS_ REFIID iid
, LPVOID
*ppv
) PURE
;
1339 STDMETHOD_(ULONG
, AddRef
)(THIS
) PURE
;
1340 STDMETHOD_(ULONG
, Release
)(THIS
) PURE
;
1342 // ID3DPRTCompBuffer
1344 // NumCoeffs and NumChannels are properties of input buffer
1345 STDMETHOD_(UINT
, GetNumSamples
)(THIS
) PURE
;
1346 STDMETHOD_(UINT
, GetNumCoeffs
)(THIS
) PURE
;
1347 STDMETHOD_(UINT
, GetNumChannels
)(THIS
) PURE
;
1349 STDMETHOD_(BOOL
, IsTexture
)(THIS
) PURE
;
1350 STDMETHOD_(UINT
, GetWidth
)(THIS
) PURE
;
1351 STDMETHOD_(UINT
, GetHeight
)(THIS
) PURE
;
1353 // number of clusters, and PCA vectors per-cluster
1354 STDMETHOD_(UINT
, GetNumClusters
)(THIS
) PURE
;
1355 STDMETHOD_(UINT
, GetNumPCA
)(THIS
) PURE
;
1357 // normalizes PCA weights so that they are between [-1,1]
1358 // basis vectors are modified to reflect this
1359 STDMETHOD(NormalizeData
)(THIS
) PURE
;
1361 // copies basis vectors for cluster "Cluster" into pClusterBasis
1362 // (NumPCA+1)*NumCoeffs*NumChannels floats
1363 STDMETHOD(ExtractBasis
)(THIS_ UINT Cluster
, FLOAT
*pClusterBasis
) PURE
;
1365 // UINT per sample - which cluster it belongs to
1366 STDMETHOD(ExtractClusterIDs
)(THIS_ UINT
*pClusterIDs
) PURE
;
1368 // copies NumExtract PCA projection coefficients starting at StartPCA
1369 // into pPCACoefficients - NumSamples*NumExtract floats copied
1370 STDMETHOD(ExtractPCA
)(THIS_ UINT StartPCA
, UINT NumExtract
, FLOAT
*pPCACoefficients
) PURE
;
1372 // copies NumPCA projection coefficients starting at StartPCA
1373 // into pTexture - should be able to cope with signed formats
1374 STDMETHOD(ExtractTexture
)(THIS_ UINT StartPCA
, UINT NumpPCA
,
1375 LPDIRECT3DTEXTURE9 pTexture
) PURE
;
1377 // copies NumPCA projection coefficients into mesh pScene
1378 // Usage is D3DDECLUSAGE where coefficients are to be stored
1379 // UsageIndexStart is starting index
1380 STDMETHOD(ExtractToMesh
)(THIS_ UINT NumPCA
, D3DDECLUSAGE Usage
, UINT UsageIndexStart
,
1381 LPD3DXMESH pScene
) PURE
;
1386 #define INTERFACE ID3DXTextureGutterHelper
1388 // ID3DXTextureGutterHelper will build and manage
1389 // "gutter" regions in a texture - this will allow for
1390 // bi-linear interpolation to not have artifacts when rendering
1391 // It generates a map (in texture space) where each texel
1392 // is in one of 3 states:
1393 // 0 Invalid - not used at all
1394 // 1 Inside triangle
1396 // 4 represents a gutter texel that will be computed during PRT
1397 // For each Inside/Gutter texel it stores the face it
1398 // belongs to and barycentric coordinates for the 1st two
1399 // vertices of that face. Gutter vertices are assigned to
1400 // the closest edge in texture space.
1402 // When used with PRT this requires a unique parameterization
1403 // of the model - every texel must correspond to a single point
1404 // on the surface of the model and vice versa
1406 DECLARE_INTERFACE_(ID3DXTextureGutterHelper
, IUnknown
)
1409 STDMETHOD(QueryInterface
)(THIS_ REFIID iid
, LPVOID
*ppv
) PURE
;
1410 STDMETHOD_(ULONG
, AddRef
)(THIS
) PURE
;
1411 STDMETHOD_(ULONG
, Release
)(THIS
) PURE
;
1413 // ID3DXTextureGutterHelper
1415 // dimensions of texture this is bound too
1416 STDMETHOD_(UINT
, GetWidth
)(THIS
) PURE
;
1417 STDMETHOD_(UINT
, GetHeight
)(THIS
) PURE
;
1420 // Applying gutters recomputes all of the gutter texels of class "2"
1421 // based on texels of class "1" or "4"
1423 // Applies gutters to a raw float buffer - each texel is NumCoeffs floats
1424 // Width and Height must match GutterHelper
1425 STDMETHOD(ApplyGuttersFloat
)(THIS_ FLOAT
*pDataIn
, UINT NumCoeffs
, UINT Width
, UINT Height
);
1427 // Applies gutters to pTexture
1428 // Dimensions must match GutterHelper
1429 STDMETHOD(ApplyGuttersTex
)(THIS_ LPDIRECT3DTEXTURE9 pTexture
);
1431 // Applies gutters to a D3DXPRTBuffer
1432 // Dimensions must match GutterHelper
1433 STDMETHOD(ApplyGuttersPRT
)(THIS_ LPD3DXPRTBUFFER pBuffer
);
1435 // the routines below provide access to the data structures
1436 // used by the Apply functions
1438 // face map is a UINT per texel that represents the
1439 // face of the mesh that texel belongs too -
1440 // only valid if same texel is valid in pGutterData
1441 // pFaceData must be allocated by the user
1442 STDMETHOD(GetFaceMap
)(THIS_ UINT
*pFaceData
) PURE
;
1444 // BaryMap is a D3DXVECTOR2 per texel
1445 // the 1st two barycentric coordinates for the corresponding
1446 // face (3rd weight is always 1-sum of first two)
1447 // only valid if same texel is valid in pGutterData
1448 // pBaryData must be allocated by the user
1449 STDMETHOD(GetBaryMap
)(THIS_ D3DXVECTOR2
*pBaryData
) PURE
;
1451 // TexelMap is a D3DXVECTOR2 per texel that
1452 // stores the location in pixel coordinates where the
1453 // corresponding texel is mapped
1454 // pTexelData must be allocated by the user
1455 STDMETHOD(GetTexelMap
)(THIS_ D3DXVECTOR2
*pTexelData
) PURE
;
1457 // GutterMap is a BYTE per texel
1458 // 0/1/2 for Invalid/Internal/Gutter texels
1459 // 4 represents a gutter texel that will be computed
1461 // pGutterData must be allocated by the user
1462 STDMETHOD(GetGutterMap
)(THIS_ BYTE
*pGutterData
) PURE
;
1464 // face map is a UINT per texel that represents the
1465 // face of the mesh that texel belongs too -
1466 // only valid if same texel is valid in pGutterData
1467 STDMETHOD(SetFaceMap
)(THIS_ UINT
*pFaceData
) PURE
;
1469 // BaryMap is a D3DXVECTOR2 per texel
1470 // the 1st two barycentric coordinates for the corresponding
1471 // face (3rd weight is always 1-sum of first two)
1472 // only valid if same texel is valid in pGutterData
1473 STDMETHOD(SetBaryMap
)(THIS_ D3DXVECTOR2
*pBaryData
) PURE
;
1475 // TexelMap is a D3DXVECTOR2 per texel that
1476 // stores the location in pixel coordinates where the
1477 // corresponding texel is mapped
1478 STDMETHOD(SetTexelMap
)(THIS_ D3DXVECTOR2
*pTexelData
) PURE
;
1480 // GutterMap is a BYTE per texel
1481 // 0/1/2 for Invalid/Internal/Gutter texels
1482 // 4 represents a gutter texel that will be computed
1484 STDMETHOD(SetGutterMap
)(THIS_ BYTE
*pGutterData
) PURE
;
1488 typedef interface ID3DXPRTEngine ID3DXPRTEngine
;
1489 typedef interface ID3DXPRTEngine
*LPD3DXPRTENGINE
;
1492 #define INTERFACE ID3DXPRTEngine
1494 // ID3DXPRTEngine is used to compute a PRT simulation
1495 // Use the following steps to compute PRT for SH
1496 // (1) create an interface (which includes a scene)
1497 // (2) call SetSamplingInfo
1498 // (3) [optional] Set MeshMaterials/albedo's (required if doing bounces)
1499 // (4) call ComputeDirectLightingSH
1500 // (5) [optional] call ComputeBounce
1501 // repeat step 5 for as many bounces as wanted.
1502 // if you want to model subsurface scattering you
1503 // need to call ComputeSS after direct lighting and
1505 // If you want to bake the albedo into the PRT signal, you
1506 // must call MutliplyAlbedo, otherwise the user has to multiply
1507 // the albedo themselves. Not multiplying the albedo allows you
1508 // to model albedo variation at a finer scale then illumination, and
1509 // can result in better compression results.
1510 // Luminance values are computed from RGB values using the following
1511 // formula: R * 0.2125 + G * 0.7154 + B * 0.0721
1513 DECLARE_INTERFACE_(ID3DXPRTEngine
, IUnknown
)
1516 STDMETHOD(QueryInterface
)(THIS_ REFIID iid
, LPVOID
*ppv
) PURE
;
1517 STDMETHOD_(ULONG
, AddRef
)(THIS
) PURE
;
1518 STDMETHOD_(ULONG
, Release
)(THIS
) PURE
;
1522 // This sets a material per attribute in the scene mesh and it is
1523 // the only way to specify subsurface scattering parameters. if
1524 // bSetAlbedo is FALSE, NumChannels must match the current
1525 // configuration of the PRTEngine. If you intend to change
1526 // NumChannels (through some other SetAlbedo function) it must
1527 // happen before SetMeshMaterials is called.
1529 // NumChannels 1 implies "grayscale" materials, set this to 3 to enable
1530 // color bleeding effects
1531 // bSetAlbedo sets albedo from material if TRUE - which clobbers per texel/vertex
1532 // albedo that might have been set before. FALSE won't clobber.
1533 // fLengthScale is used for subsurface scattering - scene is mapped into a 1mm unit cube
1534 // and scaled by this amount
1535 STDMETHOD(SetMeshMaterials
)(THIS_ CONST D3DXSHMATERIAL
**ppMaterials
, UINT NumMeshes
,
1536 UINT NumChannels
, BOOL bSetAlbedo
, FLOAT fLengthScale
) PURE
;
1538 // setting albedo per-vertex or per-texel over rides the albedos stored per mesh
1539 // but it does not over ride any other settings
1541 // sets an albedo to be used per vertex - the albedo is represented as a float
1542 // pDataIn input pointer (pointint to albedo of 1st sample)
1543 // NumChannels 1 implies "grayscale" materials, set this to 3 to enable
1544 // color bleeding effects
1545 // Stride - stride in bytes to get to next samples albedo
1546 STDMETHOD(SetPerVertexAlbedo
)(THIS_ CONST VOID
*pDataIn
, UINT NumChannels
, UINT Stride
) PURE
;
1548 // represents the albedo per-texel instead of per-vertex (even if per-vertex PRT is used)
1549 // pAlbedoTexture - texture that stores the albedo (dimension arbitrary)
1550 // NumChannels 1 implies "grayscale" materials, set this to 3 to enable
1551 // color bleeding effects
1552 // pGH - optional gutter helper, otherwise one is constructed in computation routines and
1553 // destroyed (if not attached to buffers)
1554 STDMETHOD(SetPerTexelAlbedo
)(THIS_ LPDIRECT3DTEXTURE9 pAlbedoTexture
,
1556 LPD3DXTEXTUREGUTTERHELPER pGH
) PURE
;
1558 // gets the per-vertex albedo
1559 STDMETHOD(GetVertexAlbedo
)(THIS_ D3DXCOLOR
*pVertColors
, UINT NumVerts
) PURE
;
1561 // If pixel PRT is being computed normals default to ones that are interpolated
1562 // from the vertex normals. This specifies a texture that stores an object
1563 // space normal map instead (must use a texture format that can represent signed values)
1564 // pNormalTexture - normal map, must be same dimensions as PRTBuffers, signed
1565 STDMETHOD(SetPerTexelNormal
)(THIS_ LPDIRECT3DTEXTURE9 pNormalTexture
) PURE
;
1567 // Copies per-vertex albedo from mesh
1568 // pMesh - mesh that represents the scene. It must have the same
1569 // properties as the mesh used to create the PRTEngine
1570 // Usage - D3DDECLUSAGE to extract albedos from
1571 // NumChannels 1 implies "grayscale" materials, set this to 3 to enable
1572 // color bleeding effects
1573 STDMETHOD(ExtractPerVertexAlbedo
)(THIS_ LPD3DXMESH pMesh
,
1575 UINT NumChannels
) PURE
;
1577 // Resamples the input buffer into the output buffer
1578 // can be used to move between per-vertex and per-texel buffers. This can also be used
1579 // to convert single channel buffers to 3-channel buffers and vice-versa.
1580 STDMETHOD(ResampleBuffer
)(THIS_ LPD3DXPRTBUFFER pBufferIn
, LPD3DXPRTBUFFER pBufferOut
) PURE
;
1582 // Returns the scene mesh - including modifications from adaptive spatial sampling
1583 // The returned mesh only has positions, normals and texture coordinates (if defined)
1584 // pD3DDevice - d3d device that will be used to allocate the mesh
1585 // pFaceRemap - each face has a pointer back to the face on the original mesh that it comes from
1586 // if the face hasn't been subdivided this will be an identity mapping
1587 // pVertRemap - each vertex contains 3 vertices that this is a linear combination of
1588 // pVertWeights - weights for each of above indices (sum to 1.0f)
1589 // ppMesh - mesh that will be allocated and filled
1590 STDMETHOD(GetAdaptedMesh
)(THIS_ LPDIRECT3DDEVICE9 pD3DDevice
,UINT
*pFaceRemap
, UINT
*pVertRemap
, FLOAT
*pfVertWeights
, LPD3DXMESH
*ppMesh
) PURE
;
1592 // Number of vertices currently allocated (includes new vertices from adaptive sampling)
1593 STDMETHOD_(UINT
, GetNumVerts
)(THIS
) PURE
;
1594 // Number of faces currently allocated (includes new faces)
1595 STDMETHOD_(UINT
, GetNumFaces
)(THIS
) PURE
;
1597 // This will subdivide faces on a mesh so that adaptively simulations can
1598 // use a more conservative threshold (it won't miss features.)
1599 // MinEdgeLength - minimum edge length that will be generated, if 0.0f a
1600 // reasonable default will be used
1601 // MaxSubdiv - maximum level of subdivision, if 0 is specified a default
1602 // value will be used (5)
1603 STDMETHOD(RobustMeshRefine
)(THIS_ FLOAT MinEdgeLength
, UINT MaxSubdiv
) PURE
;
1605 // This sets to sampling information used by the simulator. Adaptive sampling
1606 // parameters are currently ignored.
1607 // NumRays - number of rays to shoot per sample
1608 // UseSphere - if TRUE uses spherical samples, otherwise samples over
1609 // the hemisphere. Should only be used with GPU and Vol computations
1610 // UseCosine - if TRUE uses a cosine weighting - not used for Vol computations
1611 // or if only the visiblity function is desired
1612 // Adaptive - if TRUE adaptive sampling (angular) is used
1613 // AdaptiveThresh - threshold used to terminate adaptive angular sampling
1614 // ignored if adaptive sampling is not set
1615 STDMETHOD(SetSamplingInfo
)(THIS_ UINT NumRays
,
1619 FLOAT AdaptiveThresh
) PURE
;
1621 // Methods that compute the direct lighting contribution for objects
1622 // always represente light using spherical harmonics (SH)
1623 // the albedo is not multiplied by the signal - it just integrates
1624 // incoming light. If NumChannels is not 1 the vector is replicated
1626 // SHOrder - order of SH to use
1627 // pDataOut - PRT buffer that is generated. Can be single channel
1628 STDMETHOD(ComputeDirectLightingSH
)(THIS_ UINT SHOrder
,
1629 LPD3DXPRTBUFFER pDataOut
) PURE
;
1631 // Adaptive variant of above function. This will refine the mesh
1632 // generating new vertices/faces to approximate the PRT signal
1634 // SHOrder - order of SH to use
1635 // AdaptiveThresh - threshold for adaptive subdivision (in PRT vector error)
1636 // if value is less then 1e-6f, 1e-6f is specified
1637 // MinEdgeLength - minimum edge length that will be generated
1638 // if value is too small a fairly conservative model dependent value
1640 // MaxSubdiv - maximum subdivision level, if 0 is specified it
1641 // will default to 4
1642 // pDataOut - PRT buffer that is generated. Can be single channel.
1643 STDMETHOD(ComputeDirectLightingSHAdaptive
)(THIS_ UINT SHOrder
,
1644 FLOAT AdaptiveThresh
,
1645 FLOAT MinEdgeLength
,
1647 LPD3DXPRTBUFFER pDataOut
) PURE
;
1649 // Function that computes the direct lighting contribution for objects
1650 // light is always represented using spherical harmonics (SH)
1651 // This is done on the GPU and is much faster then using the CPU.
1652 // The albedo is not multiplied by the signal - it just integrates
1653 // incoming light. If NumChannels is not 1 the vector is replicated.
1654 // ZBias/ZAngleBias are akin to parameters used with shadow zbuffers.
1655 // A reasonable default for both values is 0.005, but the user should
1656 // experiment (ZAngleBias can be zero, ZBias should not be.)
1657 // Callbacks should not use the Direct3D9Device the simulator is using.
1658 // SetSamplingInfo must be called with TRUE for UseSphere and
1659 // FALSE for UseCosine before this method is called.
1661 // pD3DDevice - device used to run GPU simulator - must support PS2.0
1662 // and FP render targets
1663 // Flags - parameters for the GPU simulator, combination of one or more
1664 // D3DXSHGPUSIMOPT flags. Only one SHADOWRES setting should be set and
1665 // the defaults is 512
1666 // SHOrder - order of SH to use
1667 // ZBias - bias in normal direction (for depth test)
1668 // ZAngleBias - scaled by one minus cosine of angle with light (offset in depth)
1669 // pDataOut - PRT buffer that is filled in. Can be single channel
1670 STDMETHOD(ComputeDirectLightingSHGPU
)(THIS_ LPDIRECT3DDEVICE9 pD3DDevice
,
1675 LPD3DXPRTBUFFER pDataOut
) PURE
;
1678 // Functions that computes subsurface scattering (using material properties)
1679 // Albedo is not multiplied by result. This only works for per-vertex data
1680 // use ResampleBuffer to move per-vertex data into a texture and back.
1682 // pDataIn - input data (previous bounce)
1683 // pDataOut - result of subsurface scattering simulation
1684 // pDataTotal - [optional] results can be summed into this buffer
1685 STDMETHOD(ComputeSS
)(THIS_ LPD3DXPRTBUFFER pDataIn
,
1686 LPD3DXPRTBUFFER pDataOut
, LPD3DXPRTBUFFER pDataTotal
) PURE
;
1688 // computes a single bounce of inter-reflected light
1689 // works for SH based PRT or generic lighting
1690 // Albedo is not multiplied by result
1692 // pDataIn - previous bounces data
1693 // pDataOut - PRT buffer that is generated
1694 // pDataTotal - [optional] can be used to keep a running sum
1695 STDMETHOD(ComputeBounce
)(THIS_ LPD3DXPRTBUFFER pDataIn
,
1696 LPD3DXPRTBUFFER pDataOut
,
1697 LPD3DXPRTBUFFER pDataTotal
) PURE
;
1699 // Adaptive version of above function.
1701 // pDataIn - previous bounces data, can be single channel
1702 // AdaptiveThresh - threshold for adaptive subdivision (in PRT vector error)
1703 // if value is less then 1e-6f, 1e-6f is specified
1704 // MinEdgeLength - minimum edge length that will be generated
1705 // if value is too small a fairly conservative model dependent value
1707 // MaxSubdiv - maximum subdivision level, if 0 is specified it
1708 // will default to 4
1709 // pDataOut - PRT buffer that is generated
1710 // pDataTotal - [optional] can be used to keep a running sum
1711 STDMETHOD(ComputeBounceAdaptive
)(THIS_ LPD3DXPRTBUFFER pDataIn
,
1712 FLOAT AdaptiveThresh
,
1713 FLOAT MinEdgeLength
,
1715 LPD3DXPRTBUFFER pDataOut
,
1716 LPD3DXPRTBUFFER pDataTotal
) PURE
;
1718 // Computes projection of distant SH radiance into a local SH radiance
1719 // function. This models how direct lighting is attenuated by the
1720 // scene and is a form of "neighborhood transfer." The result is
1721 // a linear operator (matrix) at every sample point, if you multiply
1722 // this matrix by the distant SH lighting coefficients you get an
1723 // approximation of the local incident radiance function from
1724 // direct lighting. These resulting lighting coefficients can
1725 // than be projected into another basis or used with any rendering
1726 // technique that uses spherical harmonics as input.
1727 // SetSamplingInfo must be called with TRUE for UseSphere and
1728 // FALSE for UseCosine before this method is called.
1729 // Generates SHOrderIn*SHOrderIn*SHOrderOut*SHOrderOut scalars
1730 // per channel at each sample location.
1732 // SHOrderIn - Order of the SH representation of distant lighting
1733 // SHOrderOut - Order of the SH representation of local lighting
1734 // NumVolSamples - Number of sample locations
1735 // pSampleLocs - position of sample locations
1736 // pDataOut - PRT Buffer that will store output results
1737 STDMETHOD(ComputeVolumeSamplesDirectSH
)(THIS_ UINT SHOrderIn
,
1740 CONST D3DXVECTOR3
*pSampleLocs
,
1741 LPD3DXPRTBUFFER pDataOut
) PURE
;
1743 // At each sample location computes a linear operator (matrix) that maps
1744 // the representation of source radiance (NumCoeffs in pSurfDataIn)
1745 // into a local incident radiance function approximated with spherical
1746 // harmonics. For example if a light map data is specified in pSurfDataIn
1747 // the result is an SH representation of the flow of light at each sample
1748 // point. If PRT data for an outdoor scene is used, each sample point
1749 // contains a matrix that models how distant lighting bounces of the objects
1750 // in the scene and arrives at the given sample point. Combined with
1751 // ComputeVolumeSamplesDirectSH this gives the complete representation for
1752 // how light arrives at each sample point parameterized by distant lighting.
1753 // SetSamplingInfo must be called with TRUE for UseSphere and
1754 // FALSE for UseCosine before this method is called.
1755 // Generates pSurfDataIn->NumCoeffs()*SHOrder*SHOrder scalars
1756 // per channel at each sample location.
1758 // pSurfDataIn - previous bounce data
1759 // SHOrder - order of SH to generate projection with
1760 // NumVolSamples - Number of sample locations
1761 // pSampleLocs - position of sample locations
1762 // pDataOut - PRT Buffer that will store output results
1763 STDMETHOD(ComputeVolumeSamples
)(THIS_ LPD3DXPRTBUFFER pSurfDataIn
,
1766 CONST D3DXVECTOR3
*pSampleLocs
,
1767 LPD3DXPRTBUFFER pDataOut
) PURE
;
1768 // Frees temporary data structures that can be created for subsurface scattering
1769 // this data is freed when the PRTComputeEngine is freed and is lazily created
1770 STDMETHOD(FreeSSData
)(THIS
) PURE
;
1772 // Frees temporary data structures that can be created for bounce simulations
1773 // this data is freed when the PRTComputeEngine is freed and is lazily created
1774 STDMETHOD(FreeBounceData
)(THIS
) PURE
;
1776 // This computes the convolution coefficients relative to the per sample normals
1777 // that minimize error in a least squares sense with respect to the input PRT
1778 // data set. These coefficients can be used with skinned/transformed normals to
1779 // model global effects with dynamic objects. Shading normals can optionaly be
1780 // solved for - these normals (along with the convolution coefficients) can more
1781 // accurately represent the PRT signal.
1783 // pDataIn - SH PRT dataset that is input
1784 // SHOrder - Order of SH to compute conv coefficients for
1785 // pNormOut - Optional array of vectors (passed in) that will be filled with
1786 // "shading normals", convolution coefficients are optimized for
1787 // these normals. This array must be the same size as the number of
1788 // samples in pDataIn
1789 // pDataOut - Output buffer (SHOrder convolution coefficients per channel per sample)
1790 STDMETHOD(ComputeConvCoeffs
)(THIS_ LPD3DXPRTBUFFER pDataIn
,
1792 D3DXVECTOR3
*pNormOut
,
1793 LPD3DXPRTBUFFER pDataOut
) PURE
;
1795 // scales all the samples associated with a given sub mesh
1796 // can be useful when using subsurface scattering
1797 // fScale - value to scale each vector in submesh by
1798 STDMETHOD(ScaleMeshChunk
)(THIS_ UINT uMeshChunk
, FLOAT fScale
, LPD3DXPRTBUFFER pDataOut
) PURE
;
1800 // mutliplies each PRT vector by the albedo - can be used if you want to have the albedo
1801 // burned into the dataset, often better not to do this. If this is not done the user
1802 // must mutliply the albedo themselves when rendering - just multiply the albedo times
1803 // the result of the PRT dot product.
1804 // If pDataOut is a texture simulation result and there is an albedo texture it
1805 // must be represented at the same resolution as the simulation buffer. You can use
1806 // LoadSurfaceFromSurface and set a new albedo texture if this is an issue - but must
1807 // be careful about how the gutters are handled.
1809 // pDataOut - dataset that will get albedo pushed into it
1810 STDMETHOD(MultiplyAlbedo
)(THIS_ LPD3DXPRTBUFFER pDataOut
) PURE
;
1812 // Sets a pointer to an optional call back function that reports back to the
1813 // user percentage done and gives them the option of quitting
1814 // pCB - pointer to call back function, return S_OK for the simulation
1816 // Frequency - 1/Frequency is roughly the number of times the call back
1818 // lpUserContext - will be passed back to the users call back
1819 STDMETHOD(SetCallBack
)(THIS_ LPD3DXSHPRTSIMCB pCB
, FLOAT Frequency
, LPVOID lpUserContext
) PURE
;
1823 // API functions for creating interfaces
1827 #endif //__cplusplus
1829 //============================================================================
1831 // D3DXCreatePRTBuffer:
1832 // --------------------
1833 // Generates a PRT Buffer that can be compressed or filled by a simulator
1834 // This function should be used to create per-vertex or volume buffers.
1835 // When buffers are created all values are initialized to zero.
1839 // Number of sample locations represented
1841 // Number of coefficients per sample location (order^2 for SH)
1843 // Number of color channels to represent (1 or 3)
1845 // Buffer that will be allocated
1847 //============================================================================
1850 D3DXCreatePRTBuffer(
1854 LPD3DXPRTBUFFER
* ppBuffer
);
1856 //============================================================================
1858 // D3DXCreatePRTBufferTex:
1859 // --------------------
1860 // Generates a PRT Buffer that can be compressed or filled by a simulator
1861 // This function should be used to create per-pixel buffers.
1862 // When buffers are created all values are initialized to zero.
1868 // Height of texture
1870 // Number of coefficients per sample location (order^2 for SH)
1872 // Number of color channels to represent (1 or 3)
1874 // Buffer that will be allocated
1876 //============================================================================
1879 D3DXCreatePRTBufferTex(
1884 LPD3DXPRTBUFFER
* ppBuffer
);
1886 //============================================================================
1888 // D3DXLoadPRTBufferFromFile:
1889 // --------------------
1890 // Loads a PRT buffer that has been saved to disk.
1894 // Name of the file to load
1896 // Buffer that will be allocated
1898 //============================================================================
1901 D3DXLoadPRTBufferFromFileA(
1903 LPD3DXPRTBUFFER
* ppBuffer
);
1906 D3DXLoadPRTBufferFromFileW(
1908 LPD3DXPRTBUFFER
* ppBuffer
);
1911 #define D3DXLoadPRTBufferFromFile D3DXLoadPRTBufferFromFileW
1913 #define D3DXLoadPRTBufferFromFile D3DXLoadPRTBufferFromFileA
1917 //============================================================================
1919 // D3DXSavePRTBufferToFile:
1920 // --------------------
1921 // Saves a PRTBuffer to disk.
1925 // Name of the file to save
1927 // Buffer that will be saved
1929 //============================================================================
1932 D3DXSavePRTBufferToFileA(
1934 LPD3DXPRTBUFFER pBuffer
);
1937 D3DXSavePRTBufferToFileW(
1939 LPD3DXPRTBUFFER pBuffer
);
1942 #define D3DXSavePRTBufferToFile D3DXSavePRTBufferToFileW
1944 #define D3DXSavePRTBufferToFile D3DXSavePRTBufferToFileA
1948 //============================================================================
1950 // D3DXLoadPRTCompBufferFromFile:
1951 // --------------------
1952 // Loads a PRTComp buffer that has been saved to disk.
1956 // Name of the file to load
1958 // Buffer that will be allocated
1960 //============================================================================
1963 D3DXLoadPRTCompBufferFromFileA(
1965 LPD3DXPRTCOMPBUFFER
* ppBuffer
);
1968 D3DXLoadPRTCompBufferFromFileW(
1970 LPD3DXPRTCOMPBUFFER
* ppBuffer
);
1973 #define D3DXLoadPRTCompBufferFromFile D3DXLoadPRTCompBufferFromFileW
1975 #define D3DXLoadPRTCompBufferFromFile D3DXLoadPRTCompBufferFromFileA
1978 //============================================================================
1980 // D3DXSavePRTCompBufferToFile:
1981 // --------------------
1982 // Saves a PRTCompBuffer to disk.
1986 // Name of the file to save
1988 // Buffer that will be saved
1990 //============================================================================
1993 D3DXSavePRTCompBufferToFileA(
1995 LPD3DXPRTCOMPBUFFER pBuffer
);
1998 D3DXSavePRTCompBufferToFileW(
2000 LPD3DXPRTCOMPBUFFER pBuffer
);
2003 #define D3DXSavePRTCompBufferToFile D3DXSavePRTCompBufferToFileW
2005 #define D3DXSavePRTCompBufferToFile D3DXSavePRTCompBufferToFileA
2008 //============================================================================
2010 // D3DXCreatePRTCompBuffer:
2011 // --------------------
2012 // Compresses a PRT buffer (vertex or texel)
2015 // D3DXSHCOMPRESSQUALITYTYPE
2016 // Quality of compression - low is faster (computes PCA per voronoi cluster)
2017 // high is slower but better quality (clusters based on distance to affine subspace)
2019 // Number of clusters to compute
2021 // Number of basis vectors to compute
2023 // Buffer that will be compressed
2025 // Compressed buffer that will be created
2027 //============================================================================
2031 D3DXCreatePRTCompBuffer(
2032 D3DXSHCOMPRESSQUALITYTYPE Quality
,
2035 LPD3DXPRTBUFFER pBufferIn
,
2036 LPD3DXPRTCOMPBUFFER
*ppBufferOut
2039 //============================================================================
2041 // D3DXCreateTextureGutterHelper:
2042 // --------------------
2043 // Generates a "GutterHelper" for a given set of meshes and texture
2050 // Height of texture
2052 // Mesh that represents the scene
2054 // Number of texels to over rasterize in texture space
2055 // this should be at least 1.0
2057 // GutterHelper that will be created
2059 //============================================================================
2063 D3DXCreateTextureGutterHelper(
2068 LPD3DXTEXTUREGUTTERHELPER
* ppBuffer
);
2071 //============================================================================
2073 // D3DXCreatePRTEngine:
2074 // --------------------
2075 // Computes a PRTEngine which can efficiently generate PRT simulations
2080 // Mesh that represents the scene - must have an AttributeTable
2081 // where vertices are in a unique attribute.
2083 // Set this to true if textures are going to be used for albedos
2084 // or to store PRT vectors
2086 // Optional mesh that just blocks the scene
2088 // PRTEngine that will be created
2090 //============================================================================
2094 D3DXCreatePRTEngine(
2097 LPD3DXMESH pBlockerMesh
,
2098 LPD3DXPRTENGINE
* ppEngine
);
2100 //============================================================================
2102 // D3DXConcatenateMeshes:
2103 // --------------------
2104 // Concatenates a group of meshes into one common mesh. This can optionaly transform
2105 // each sub mesh or its texture coordinates. If no DECL is given it will
2106 // generate a union of all of the DECL's of the sub meshes, promoting channels
2107 // and types if neccesary. It will create an AttributeTable if possible, one can
2108 // call OptimizeMesh with attribute sort and compacting enabled to ensure this.
2112 // Array of pointers to meshes that can store PRT vectors
2116 // Passed through to D3DXCreateMesh
2118 // [optional] Each sub mesh is transformed by the corresponding
2119 // matrix if this array is supplied
2121 // [optional] UV coordinates for each sub mesh are transformed
2122 // by corresponding matrix if supplied
2124 // [optional] Only information in this DECL is used when merging
2127 // D3D device that is used to create the new mesh
2129 // Mesh that will be created
2131 //============================================================================
2135 D3DXConcatenateMeshes(
2136 LPD3DXMESH
*ppMeshes
,
2139 CONST D3DXMATRIX
*pGeomXForms
,
2140 CONST D3DXMATRIX
*pTextureXForms
,
2141 CONST D3DVERTEXELEMENT9
*pDecl
,
2142 LPDIRECT3DDEVICE9 pD3DDevice
,
2143 LPD3DXMESH
*ppMeshOut
);
2145 //============================================================================
2147 // D3DXSHPRTCompSuperCluster:
2148 // --------------------------
2149 // Used with compressed results of D3DXSHPRTSimulation.
2150 // Generates "super clusters" - groups of clusters that can be drawn in
2151 // the same draw call. A greedy algorithm that minimizes overdraw is used
2152 // to group the clusters.
2156 // NumVerts cluster ID's (extracted from a compressed buffer)
2158 // Mesh that represents composite scene passed to the simulator
2160 // Maximum number of clusters allocated per super cluster
2162 // Number of clusters computed in the simulator
2164 // Array of length NumClusters, contains index of super cluster
2165 // that corresponding cluster was assigned to
2166 // pNumSuperClusters
2167 // Returns the number of super clusters allocated
2169 //============================================================================
2172 D3DXSHPRTCompSuperCluster(
2175 UINT MaxNumClusters
,
2177 UINT
*pSuperClusterIDs
,
2178 UINT
*pNumSuperClusters
);
2180 //============================================================================
2182 // D3DXSHPRTCompSplitMeshSC:
2183 // -------------------------
2184 // Used with compressed results of the vertex version of the PRT simulator.
2185 // After D3DXSHRTCompSuperCluster has been called this function can be used
2186 // to split the mesh into a group of faces/vertices per super cluster.
2187 // Each super cluster contains all of the faces that contain any vertex
2188 // classified in one of its clusters. All of the vertices connected to this
2189 // set of faces are also included with the returned array ppVertStatus
2190 // indicating whether or not the vertex belongs to the supercluster.
2194 // NumVerts cluster ID's (extracted from a compressed buffer)
2196 // Number of vertices in original mesh
2198 // Number of clusters (input parameter to compression)
2200 // Array of size NumClusters that will contain super cluster ID's (from
2201 // D3DXSHCompSuerCluster)
2203 // Number of superclusters allocated in D3DXSHCompSuerCluster
2205 // Raw index buffer for mesh - format depends on bInputIBIs32Bit
2207 // Indicates whether the input index buffer is 32-bit (otherwise 16-bit
2210 // Number of faces in the original mesh (pInputIB is 3 times this length)
2212 // LPD3DXBUFFER holds raw index buffer that will contain the resulting split faces.
2213 // Format determined by bIBIs32Bit. Allocated by function
2215 // Length of ppIBData, assigned in function
2217 // Indicates whether the output index buffer is to be 32-bit (otherwise
2218 // 16-bit is assumed)
2220 // LPD3DXBUFFER mapping of each face in ppIBData to original faces. Length is
2221 // *pIBDataLength/3. Optional paramter, allocated in function
2223 // LPD3DXBUFFER contains new vertex data structure. Size of pVertDataLength
2225 // Number of new vertices in split mesh. Assigned in function
2227 // Array of length NumClusters which pSCData indexes into (Cluster* fields)
2228 // for each SC, contains clusters sorted by super cluster
2230 // Structure per super cluster - contains indices into ppIBData,
2231 // pSCClusterList and ppVertData
2233 //============================================================================
2236 D3DXSHPRTCompSplitMeshSC(
2240 UINT
*pSuperClusterIDs
,
2241 UINT NumSuperClusters
,
2243 BOOL InputIBIs32Bit
,
2245 LPD3DXBUFFER
*ppIBData
,
2246 UINT
*pIBDataLength
,
2247 BOOL OutputIBIs32Bit
,
2248 LPD3DXBUFFER
*ppFaceRemap
,
2249 LPD3DXBUFFER
*ppVertData
,
2250 UINT
*pVertDataLength
,
2251 UINT
*pSCClusterList
,
2252 D3DXSHPRTSPLITMESHCLUSTERDATA
*pSCData
);
2257 #endif //__cplusplus
2259 //////////////////////////////////////////////////////////////////////////////
2261 // Definitions of .X file templates used by mesh load/save functions
2262 // that are not RM standard
2264 //////////////////////////////////////////////////////////////////////////////
2266 // {3CF169CE-FF7C-44ab-93C0-F78F62D172E2}
2267 DEFINE_GUID(DXFILEOBJ_XSkinMeshHeader
,
2268 0x3cf169ce, 0xff7c, 0x44ab, 0x93, 0xc0, 0xf7, 0x8f, 0x62, 0xd1, 0x72, 0xe2);
2270 // {B8D65549-D7C9-4995-89CF-53A9A8B031E3}
2271 DEFINE_GUID(DXFILEOBJ_VertexDuplicationIndices
,
2272 0xb8d65549, 0xd7c9, 0x4995, 0x89, 0xcf, 0x53, 0xa9, 0xa8, 0xb0, 0x31, 0xe3);
2274 // {A64C844A-E282-4756-8B80-250CDE04398C}
2275 DEFINE_GUID(DXFILEOBJ_FaceAdjacency
,
2276 0xa64c844a, 0xe282, 0x4756, 0x8b, 0x80, 0x25, 0xc, 0xde, 0x4, 0x39, 0x8c);
2278 // {6F0D123B-BAD2-4167-A0D0-80224F25FABB}
2279 DEFINE_GUID(DXFILEOBJ_SkinWeights
,
2280 0x6f0d123b, 0xbad2, 0x4167, 0xa0, 0xd0, 0x80, 0x22, 0x4f, 0x25, 0xfa, 0xbb);
2282 // {A3EB5D44-FC22-429d-9AFB-3221CB9719A6}
2283 DEFINE_GUID(DXFILEOBJ_Patch
,
2284 0xa3eb5d44, 0xfc22, 0x429d, 0x9a, 0xfb, 0x32, 0x21, 0xcb, 0x97, 0x19, 0xa6);
2286 // {D02C95CC-EDBA-4305-9B5D-1820D7704BBF}
2287 DEFINE_GUID(DXFILEOBJ_PatchMesh
,
2288 0xd02c95cc, 0xedba, 0x4305, 0x9b, 0x5d, 0x18, 0x20, 0xd7, 0x70, 0x4b, 0xbf);
2290 // {B9EC94E1-B9A6-4251-BA18-94893F02C0EA}
2291 DEFINE_GUID(DXFILEOBJ_PatchMesh9
,
2292 0xb9ec94e1, 0xb9a6, 0x4251, 0xba, 0x18, 0x94, 0x89, 0x3f, 0x2, 0xc0, 0xea);
2294 // {B6C3E656-EC8B-4b92-9B62-681659522947}
2295 DEFINE_GUID(DXFILEOBJ_PMInfo
,
2296 0xb6c3e656, 0xec8b, 0x4b92, 0x9b, 0x62, 0x68, 0x16, 0x59, 0x52, 0x29, 0x47);
2298 // {917E0427-C61E-4a14-9C64-AFE65F9E9844}
2299 DEFINE_GUID(DXFILEOBJ_PMAttributeRange
,
2300 0x917e0427, 0xc61e, 0x4a14, 0x9c, 0x64, 0xaf, 0xe6, 0x5f, 0x9e, 0x98, 0x44);
2302 // {574CCC14-F0B3-4333-822D-93E8A8A08E4C}
2303 DEFINE_GUID(DXFILEOBJ_PMVSplitRecord
,
2304 0x574ccc14, 0xf0b3, 0x4333, 0x82, 0x2d, 0x93, 0xe8, 0xa8, 0xa0, 0x8e, 0x4c);
2306 // {B6E70A0E-8EF9-4e83-94AD-ECC8B0C04897}
2307 DEFINE_GUID(DXFILEOBJ_FVFData
,
2308 0xb6e70a0e, 0x8ef9, 0x4e83, 0x94, 0xad, 0xec, 0xc8, 0xb0, 0xc0, 0x48, 0x97);
2310 // {F752461C-1E23-48f6-B9F8-8350850F336F}
2311 DEFINE_GUID(DXFILEOBJ_VertexElement
,
2312 0xf752461c, 0x1e23, 0x48f6, 0xb9, 0xf8, 0x83, 0x50, 0x85, 0xf, 0x33, 0x6f);
2314 // {BF22E553-292C-4781-9FEA-62BD554BDD93}
2315 DEFINE_GUID(DXFILEOBJ_DeclData
,
2316 0xbf22e553, 0x292c, 0x4781, 0x9f, 0xea, 0x62, 0xbd, 0x55, 0x4b, 0xdd, 0x93);
2318 // {F1CFE2B3-0DE3-4e28-AFA1-155A750A282D}
2319 DEFINE_GUID(DXFILEOBJ_EffectFloats
,
2320 0xf1cfe2b3, 0xde3, 0x4e28, 0xaf, 0xa1, 0x15, 0x5a, 0x75, 0xa, 0x28, 0x2d);
2322 // {D55B097E-BDB6-4c52-B03D-6051C89D0E42}
2323 DEFINE_GUID(DXFILEOBJ_EffectString
,
2324 0xd55b097e, 0xbdb6, 0x4c52, 0xb0, 0x3d, 0x60, 0x51, 0xc8, 0x9d, 0xe, 0x42);
2326 // {622C0ED0-956E-4da9-908A-2AF94F3CE716}
2327 DEFINE_GUID(DXFILEOBJ_EffectDWord
,
2328 0x622c0ed0, 0x956e, 0x4da9, 0x90, 0x8a, 0x2a, 0xf9, 0x4f, 0x3c, 0xe7, 0x16);
2330 // {3014B9A0-62F5-478c-9B86-E4AC9F4E418B}
2331 DEFINE_GUID(DXFILEOBJ_EffectParamFloats
,
2332 0x3014b9a0, 0x62f5, 0x478c, 0x9b, 0x86, 0xe4, 0xac, 0x9f, 0x4e, 0x41, 0x8b);
2334 // {1DBC4C88-94C1-46ee-9076-2C28818C9481}
2335 DEFINE_GUID(DXFILEOBJ_EffectParamString
,
2336 0x1dbc4c88, 0x94c1, 0x46ee, 0x90, 0x76, 0x2c, 0x28, 0x81, 0x8c, 0x94, 0x81);
2338 // {E13963BC-AE51-4c5d-B00F-CFA3A9D97CE5}
2339 DEFINE_GUID(DXFILEOBJ_EffectParamDWord
,
2340 0xe13963bc, 0xae51, 0x4c5d, 0xb0, 0xf, 0xcf, 0xa3, 0xa9, 0xd9, 0x7c, 0xe5);
2342 // {E331F7E4-0559-4cc2-8E99-1CEC1657928F}
2343 DEFINE_GUID(DXFILEOBJ_EffectInstance
,
2344 0xe331f7e4, 0x559, 0x4cc2, 0x8e, 0x99, 0x1c, 0xec, 0x16, 0x57, 0x92, 0x8f);
2346 // {9E415A43-7BA6-4a73-8743-B73D47E88476}
2347 DEFINE_GUID(DXFILEOBJ_AnimTicksPerSecond
,
2348 0x9e415a43, 0x7ba6, 0x4a73, 0x87, 0x43, 0xb7, 0x3d, 0x47, 0xe8, 0x84, 0x76);
2350 // {7F9B00B3-F125-4890-876E-1CFFBF697C4D}
2351 DEFINE_GUID(DXFILEOBJ_CompressedAnimationSet
,
2352 0x7f9b00b3, 0xf125, 0x4890, 0x87, 0x6e, 0x1c, 0x42, 0xbf, 0x69, 0x7c, 0x4d);
2354 #pragma pack(push, 1)
2355 typedef struct _XFILECOMPRESSEDANIMATIONSET
2357 DWORD CompressedBlockSize
;
2361 } XFILECOMPRESSEDANIMATIONSET
;
2364 #define XSKINEXP_TEMPLATES \
2366 template XSkinMeshHeader \
2368 <3CF169CE-FF7C-44ab-93C0-F78F62D172E2> \
2369 WORD nMaxSkinWeightsPerVertex; \
2370 WORD nMaxSkinWeightsPerFace; \
2373 template VertexDuplicationIndices \
2375 <B8D65549-D7C9-4995-89CF-53A9A8B031E3> \
2377 DWORD nOriginalVertices; \
2378 array DWORD indices[nIndices]; \
2380 template FaceAdjacency \
2382 <A64C844A-E282-4756-8B80-250CDE04398C> \
2384 array DWORD indices[nIndices]; \
2386 template SkinWeights \
2388 <6F0D123B-BAD2-4167-A0D0-80224F25FABB> \
2389 STRING transformNodeName; \
2391 array DWORD vertexIndices[nWeights]; \
2392 array float weights[nWeights]; \
2393 Matrix4x4 matrixOffset; \
2397 <A3EB5D44-FC22-429D-9AFB-3221CB9719A6> \
2398 DWORD nControlIndices; \
2399 array DWORD controlIndices[nControlIndices]; \
2401 template PatchMesh \
2403 <D02C95CC-EDBA-4305-9B5D-1820D7704BBF> \
2405 array Vector vertices[nVertices]; \
2407 array Patch patches[nPatches]; \
2410 template PatchMesh9 \
2412 <B9EC94E1-B9A6-4251-BA18-94893F02C0EA> \
2417 array Vector vertices[nVertices]; \
2419 array Patch patches[nPatches]; \
2422 "template EffectFloats \
2424 <F1CFE2B3-0DE3-4e28-AFA1-155A750A282D> \
2426 array float Floats[nFloats]; \
2428 template EffectString \
2430 <D55B097E-BDB6-4c52-B03D-6051C89D0E42> \
2433 template EffectDWord \
2435 <622C0ED0-956E-4da9-908A-2AF94F3CE716> \
2438 "template EffectParamFloats \
2440 <3014B9A0-62F5-478c-9B86-E4AC9F4E418B> \
2443 array float Floats[nFloats]; \
2445 "template EffectParamString \
2447 <1DBC4C88-94C1-46ee-9076-2C28818C9481> \
2451 template EffectParamDWord \
2453 <E13963BC-AE51-4c5d-B00F-CFA3A9D97CE5> \
2457 template EffectInstance \
2459 <E331F7E4-0559-4cc2-8E99-1CEC1657928F> \
2460 STRING EffectFilename; \
2463 "template AnimTicksPerSecond \
2465 <9E415A43-7BA6-4a73-8743-B73D47E88476> \
2466 DWORD AnimTicksPerSecond; \
2468 template CompressedAnimationSet \
2470 <7F9B00B3-F125-4890-876E-1C42BF697C4D> \
2471 DWORD CompressedBlockSize; \
2472 FLOAT TicksPerSec; \
2473 DWORD PlaybackType; \
2474 DWORD BufferLength; \
2475 array DWORD CompressedData[BufferLength]; \
2478 #define XEXTENSIONS_TEMPLATES \
2482 <B6E70A0E-8EF9-4e83-94AD-ECC8B0C04897> \
2485 array DWORD data[nDWords]; \
2487 template VertexElement \
2489 <F752461C-1E23-48f6-B9F8-8350850F336F> \
2497 <BF22E553-292C-4781-9FEA-62BD554BDD93> \
2499 array VertexElement Elements[nElements]; \
2501 array DWORD data[nDWords]; \
2503 template PMAttributeRange \
2505 <917E0427-C61E-4a14-9C64-AFE65F9E9844> \
2506 DWORD iFaceOffset; \
2509 DWORD iVertexOffset; \
2510 DWORD nVerticesMin; \
2511 DWORD nVerticesMax; \
2513 template PMVSplitRecord \
2515 <574CCC14-F0B3-4333-822D-93E8A8A08E4C> \
2522 <B6C3E656-EC8B-4b92-9B62-681659522947> \
2523 DWORD nAttributes; \
2524 array PMAttributeRange attributeRanges[nAttributes]; \
2525 DWORD nMaxValence; \
2526 DWORD nMinLogicalVertices; \
2527 DWORD nMaxLogicalVertices; \
2529 array PMVSplitRecord splitRecords[nVSplits]; \
2530 DWORD nAttributeMispredicts; \
2531 array DWORD attributeMispredicts[nAttributeMispredicts]; \
2534 #endif //__D3DX9MESH_H__