1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007 |
- //////////////////////////////////////////////////////////////////////////////
- //
- // 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__
|