RetroArch/gfx/include/d3d9/d3dx9mesh.h
orbea bfc366decc Squeeze extra blank lines with cat(1).
Example:

find . -type f -iname '*.c' | while read -r i; do
  cat -s "$i" > "$i.new"
  mv "$i.new" "$i"
done
2019-01-08 11:04:58 -08:00

3053 lines
120 KiB
C

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