////////////////////////////////////////////////////////////////////////////// // // Copyright (C) Microsoft Corporation. All Rights Reserved. // // File: d3dx9anim.h // Content: D3DX mesh types and functions // ////////////////////////////////////////////////////////////////////////////// #ifndef __D3DX9ANIM_H__ #define __D3DX9ANIM_H__ // {ADE2C06D-3747-4b9f-A514-3440B8284980} DEFINE_GUID(IID_ID3DXInterpolator, 0xade2c06d, 0x3747, 0x4b9f, 0xa5, 0x14, 0x34, 0x40, 0xb8, 0x28, 0x49, 0x80); // {6CAA71F8-0972-4cdb-A55B-43B968997515} DEFINE_GUID(IID_ID3DXKeyFrameInterpolator, 0x6caa71f8, 0x972, 0x4cdb, 0xa5, 0x5b, 0x43, 0xb9, 0x68, 0x99, 0x75, 0x15); // {54B569AC-0AEF-473e-9704-3FEF317F64AB} DEFINE_GUID(IID_ID3DXAnimationSet, 0x54b569ac, 0xaef, 0x473e, 0x97, 0x4, 0x3f, 0xef, 0x31, 0x7f, 0x64, 0xab); // {3A714D34-FF61-421e-909F-639F38356708} DEFINE_GUID(IID_ID3DXAnimationController, 0x3a714d34, 0xff61, 0x421e, 0x90, 0x9f, 0x63, 0x9f, 0x38, 0x35, 0x67, 0x8); typedef struct ID3DXInterpolator *LPD3DXINTERPOLATOR; typedef struct ID3DXKeyFrameInterpolator *LPD3DXKEYFRAMEINTERPOLATOR; typedef struct ID3DXAnimationSet *LPD3DXANIMATIONSET; typedef struct ID3DXAnimationController *LPD3DXANIMATIONCONTROLLER; typedef struct ID3DXAllocateHierarchy *LPD3DXALLOCATEHIERARCHY; typedef struct ID3DXLoadUserData *LPD3DXLOADUSERDATA; typedef struct ID3DXSaveUserData *LPD3DXSAVEUSERDATA; //---------------------------------------------------------------------------- // This enum defines the type of mesh data present in a MeshData structure //---------------------------------------------------------------------------- typedef enum _D3DXMESHDATATYPE { D3DXMESHTYPE_MESH = 0x001, // normal ID3DXMesh data D3DXMESHTYPE_PMESH = 0x002, // Progressive Mesh - ID3DXPMesh D3DXMESHTYPE_PATCHMESH = 0x003, // Patch MEsh - ID3DXPatchMesh D3DXMESHTYPE_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ } D3DXMESHDATATYPE; //---------------------------------------------------------------------------- // This struct encapsulates a the mesh data that can be present in a mesh // container. The supported mesh types are pMesh, pPMesh, pPatchMesh // The valid way to access this is determined by the MeshType enum //---------------------------------------------------------------------------- typedef struct _D3DXMESHDATA { D3DXMESHDATATYPE Type; // current mesh data interface union { LPD3DXMESH pMesh; LPD3DXPMESH pPMesh; LPD3DXPATCHMESH pPatchMesh; }; } D3DXMESHDATA, *LPD3DXMESHDATA; //---------------------------------------------------------------------------- // This struct encapsulates a mesh object in a transformation frame // hierarchy. The app can derive from this structure to add other app specific // data to this //---------------------------------------------------------------------------- typedef struct _D3DXMESHCONTAINER { LPSTR Name; D3DXMESHDATA MeshData; LPD3DXMATERIAL pMaterials; LPD3DXEFFECTINSTANCE pEffects; DWORD NumMaterials; DWORD *pAdjacency; LPD3DXSKININFO pSkinInfo; struct _D3DXMESHCONTAINER *pNextMeshContainer; } D3DXMESHCONTAINER, *LPD3DXMESHCONTAINER; //---------------------------------------------------------------------------- // This struct is the encapsulates a transform frame in a transformation frame // hierarchy. The app can derive from this structure to add other app specific // data to this //---------------------------------------------------------------------------- typedef struct _D3DXFRAME { LPSTR Name; D3DXMATRIX TransformationMatrix; LPD3DXMESHCONTAINER pMeshContainer; struct _D3DXFRAME *pFrameSibling; struct _D3DXFRAME *pFrameFirstChild; } D3DXFRAME, *LPD3DXFRAME; #undef INTERFACE #define INTERFACE ID3DXAllocateHierarchy //---------------------------------------------------------------------------- // This interface is implemented by the application to allocate/free frame and // mesh container objects. Methods on this are called during loading and // destroying frame hierarchies //---------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////// // ID3DXAllocateHierarchy //////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DECLARE_INTERFACE(ID3DXAllocateHierarchy) { // ID3DXAllocateHierarchy //------------------------------------------------------------------------ // CreateFrame: // ------------ // Requests allocation of a frame object. // // Parameters: // Name // Name of the frame to be created // ppNewFrame // Returns returns the created frame object // //------------------------------------------------------------------------ STDMETHOD(CreateFrame)(THIS_ LPCSTR Name, LPD3DXFRAME *ppNewFrame) PURE; //------------------------------------------------------------------------ // CreateMeshContainer: // -------------------- // Requests allocation of a mesh container object. // // Parameters: // Name // Name of the mesh // pMesh // Pointer to the mesh object if basic polygon data found // pPMesh // Pointer to the progressive mesh object if progressive mesh data found // pPatchMesh // Pointer to the patch mesh object if patch data found // pMaterials // Array of materials used in the mesh // pEffectInstances // Array of effect instances used in the mesh // NumMaterials // Num elements in the pMaterials array // pAdjacency // Adjacency array for the mesh // pSkinInfo // Pointer to the skininfo object if the mesh is skinned // pBoneNames // Array of names, one for each bone in the skinned mesh. // The numberof bones can be found from the pSkinMesh object // pBoneOffsetMatrices // Array of matrices, one for each bone in the skinned mesh. // //------------------------------------------------------------------------ STDMETHOD(CreateMeshContainer)(THIS_ LPCSTR Name, LPD3DXMESHDATA pMeshData, LPD3DXMATERIAL pMaterials, LPD3DXEFFECTINSTANCE pEffectInstances, DWORD NumMaterials, DWORD *pAdjacency, LPD3DXSKININFO pSkinInfo, LPD3DXMESHCONTAINER *ppNewMeshContainer) PURE; //------------------------------------------------------------------------ // DestroyFrame: // ------------- // Requests de-allocation of a frame object. // // Parameters: // pFrameToFree // Pointer to the frame to be de-allocated // //------------------------------------------------------------------------ STDMETHOD(DestroyFrame)(THIS_ LPD3DXFRAME pFrameToFree) PURE; //------------------------------------------------------------------------ // DestroyMeshContainer: // --------------------- // Requests de-allocation of a mesh container object. // // Parameters: // pMeshContainerToFree // Pointer to the mesh container object to be de-allocated // //------------------------------------------------------------------------ STDMETHOD(DestroyMeshContainer)(THIS_ LPD3DXMESHCONTAINER pMeshContainerToFree) PURE; }; //---------------------------------------------------------------------------- // This interface is implemented by the application to load user data in a .X file // When user data is found, these callbacks will be used to allow the application // to load the data //---------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////// // ID3DXLoadUserData //////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DECLARE_INTERFACE(ID3DXLoadUserData) { STDMETHOD(LoadTopLevelData)(LPDIRECTXFILEDATA pXofChildData) PURE; STDMETHOD(LoadFrameChildData)(LPD3DXFRAME pFrame, LPDIRECTXFILEDATA pXofChildData) PURE; STDMETHOD(LoadMeshChildData)(LPD3DXMESHCONTAINER pMeshContainer, LPDIRECTXFILEDATA pXofChildData) PURE; }; //---------------------------------------------------------------------------- // This interface is implemented by the application to save user data in a .X file // The callbacks are called for all data saved. The user can then add any // child data objects to the object provided to the callback //---------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////// // ID3DXSaveUserData ///////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DECLARE_INTERFACE(ID3DXSaveUserData) { STDMETHOD(AddFrameChildData)(LPD3DXFRAME pFrame, LPDIRECTXFILESAVEOBJECT pXofSave, LPDIRECTXFILEDATA pXofFrameData) PURE; STDMETHOD(AddMeshChildData)(LPD3DXMESHCONTAINER pMeshContainer, LPDIRECTXFILESAVEOBJECT pXofSave, LPDIRECTXFILEDATA pXofMeshData) PURE; // NOTE: this is called once per Save. All top level objects should be added using the // provided interface. One call adds objects before the frame hierarchy, the other after STDMETHOD(AddTopLevelDataObjectsPre)(LPDIRECTXFILESAVEOBJECT pXofSave) PURE; STDMETHOD(AddTopLevelDataObjectsPost)(LPDIRECTXFILESAVEOBJECT pXofSave) PURE; // callbacks for the user to register and then save templates to the XFile STDMETHOD(RegisterTemplates)(LPDIRECTXFILE pXFileApi) PURE; STDMETHOD(SaveTemplates)(LPDIRECTXFILESAVEOBJECT pXofSave) PURE; }; #ifdef __cplusplus extern "C" { #endif //__cplusplus //---------------------------------------------------------------------------- // D3DXLoadMeshHierarchyFromX: // --------------------------- // Loads the first frame hierarchy in a .X file. // // Parameters: // Filename // Name of the .X file // MeshOptions // Mesh creation options for meshes in the file (see d3dx9mesh.h) // pD3DDevice // D3D9 device on which meshes in the file are created in // pAlloc // Allocation interface used to allocate nodes of the frame hierarchy // pUserDataLoader // Application provided interface to allow loading of user data // ppFrameHierarchy // Returns root node pointer of the loaded frame hierarchy // ppAnimController // Returns pointer to an animation controller corresponding to animation // in the .X file. This is created with default max tracks and events // //---------------------------------------------------------------------------- HRESULT WINAPI D3DXLoadMeshHierarchyFromXA( LPCSTR Filename, DWORD MeshOptions, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXALLOCATEHIERARCHY pAlloc, LPD3DXLOADUSERDATA pUserDataLoader, LPD3DXFRAME *ppFrameHierarchy, LPD3DXANIMATIONCONTROLLER *ppAnimController ); HRESULT WINAPI D3DXLoadMeshHierarchyFromXW( LPCWSTR Filename, DWORD MeshOptions, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXALLOCATEHIERARCHY pAlloc, LPD3DXLOADUSERDATA pUserDataLoader, LPD3DXFRAME *ppFrameHierarchy, LPD3DXANIMATIONCONTROLLER *ppAnimController ); #ifdef UNICODE #define D3DXLoadMeshHierarchyFromX D3DXLoadMeshHierarchyFromXW #else #define D3DXLoadMeshHierarchyFromX D3DXLoadMeshHierarchyFromXA #endif HRESULT WINAPI D3DXLoadMeshHierarchyFromXInMemory( LPCVOID Memory, DWORD SizeOfMemory, DWORD MeshOptions, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXALLOCATEHIERARCHY pAlloc, LPD3DXLOADUSERDATA pUserDataLoader, LPD3DXFRAME *ppFrameHierarchy, LPD3DXANIMATIONCONTROLLER *ppAnimController ); //---------------------------------------------------------------------------- // D3DXSaveMeshHierarchyToFile: // --------------------------- // Creates a .X file and saves the mesh hierarchy and corresponding animations // in it // // Parameters: // Filename // Name of the .X file // XFormat // Format of the .X file (text or binary, compressed or not, etc) // pFrameRoot // Root node of the hierarchy to be saved // pAnimController // The animation mixer whose animation sets are to be stored // pUserDataSaver // Application provided interface to allow adding of user data to // data objects saved to .X file // //---------------------------------------------------------------------------- HRESULT WINAPI D3DXSaveMeshHierarchyToFileA( LPCSTR Filename, DWORD XFormat, LPD3DXFRAME pFrameRoot, LPD3DXANIMATIONCONTROLLER pAnimMixer, LPD3DXSAVEUSERDATA pUserDataSaver ); HRESULT WINAPI D3DXSaveMeshHierarchyToFileW( LPCWSTR Filename, DWORD XFormat, LPD3DXFRAME pFrameRoot, LPD3DXANIMATIONCONTROLLER pAnimMixer, LPD3DXSAVEUSERDATA pUserDataSaver ); #ifdef UNICODE #define D3DXSaveMeshHierarchyToFile D3DXSaveMeshHierarchyToFileW #else #define D3DXSaveMeshHierarchyToFile D3DXSaveMeshHierarchyToFileA #endif //---------------------------------------------------------------------------- // D3DXFrameDestroy: // ----------------- // Destroys the subtree of frames under the root, including the root // // Parameters: // pFrameRoot // Pointer to the root node // pAlloc // Allocation interface used to de-allocate nodes of the frame hierarchy // //---------------------------------------------------------------------------- HRESULT WINAPI D3DXFrameDestroy( LPD3DXFRAME pFrameRoot, LPD3DXALLOCATEHIERARCHY pAlloc ); //---------------------------------------------------------------------------- // D3DXFrameAppendChild: // --------------------- // Add a child frame to a frame // // Parameters: // pFrameParent // Pointer to the parent node // pFrameChild // Pointer to the child node // //---------------------------------------------------------------------------- HRESULT WINAPI D3DXFrameAppendChild( LPD3DXFRAME pFrameParent, LPD3DXFRAME pFrameChild ); //---------------------------------------------------------------------------- // D3DXFrameFind: // -------------- // Finds a frame with the given name. Returns NULL if no frame found. // // Parameters: // pFrameRoot // Pointer to the root node // Name // Name of frame to find // //---------------------------------------------------------------------------- LPD3DXFRAME WINAPI D3DXFrameFind( LPD3DXFRAME pFrameRoot, LPCSTR Name ); //---------------------------------------------------------------------------- // D3DXFrameRegisterNamedMatrices: // -------------------------- // Finds all frames that have non-null names and registers each of those frame // matrices to the given animation mixer // // Parameters: // pFrameRoot // Pointer to the root node // pAnimMixer // Pointer to the animation mixer where the matrices are registered // //---------------------------------------------------------------------------- HRESULT WINAPI D3DXFrameRegisterNamedMatrices( LPD3DXFRAME pFrameRoot, LPD3DXANIMATIONCONTROLLER pAnimMixer ); //---------------------------------------------------------------------------- // D3DXFrameNumNamedMatrices: // -------------------------- // Counts number of frames in a subtree that have non-null names // // Parameters: // pFrameRoot // Pointer to the root node of the subtree // Return Value: // Count of frames // //---------------------------------------------------------------------------- UINT WINAPI D3DXFrameNumNamedMatrices( LPD3DXFRAME pFrameRoot ); //---------------------------------------------------------------------------- // D3DXFrameCalculateBoundingSphere: // --------------------------------- // Computes the bounding sphere of all the meshes in the frame hierarchy // // Parameters: // pFrameRoot // Pointer to the root node // pObjectCenter // Returns the center of the bounding sphere // pObjectRadius // Returns the radius of the bounding sphere // //---------------------------------------------------------------------------- HRESULT WINAPI D3DXFrameCalculateBoundingSphere( LPD3DXFRAME pFrameRoot, LPD3DXVECTOR3 pObjectCenter, FLOAT *pObjectRadius ); #ifdef __cplusplus } #endif //__cplusplus #undef INTERFACE #define INTERFACE ID3DXInterpolator //---------------------------------------------------------------------------- // This interface defines a SRT (scale/rotate/translate) interpolator. This // is an abstract interface. ID3DXKeyFrameInterpolator inherits from this. // An application can implement this for custom SRT interpolator //---------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////// // ID3DXInterpolator ///////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DECLARE_INTERFACE_(ID3DXInterpolator, IUnknown) { // IUnknown STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; // ID3DXInterpolator STDMETHOD_(LPCSTR, GetName)(THIS) PURE; STDMETHOD_(DOUBLE, GetPeriod)(THIS) PURE; //---------------------------------------------------------------------------- // GetSRT: // ------- // Returns the scale, rotation and translation at a given time // // Parameters: // Time // Time at which the interpolator should be queried // pScale // Returns the scale vector // pRotate // Returns the rotation qaternion // pTranslate // Returns the translate vector // //---------------------------------------------------------------------------- STDMETHOD(GetSRT)(THIS_ DOUBLE Time, D3DXVECTOR3 *pScale, D3DXQUATERNION *pRotate, D3DXVECTOR3 *pTranslate) PURE; STDMETHOD(GetLastSRT)(THIS_ D3DXVECTOR3 *pScale, D3DXQUATERNION *pRotate, D3DXVECTOR3 *pTranslate) PURE; }; //---------------------------------------------------------------------------- // This structure describes a vector key for use in keyframe animation. // It specifies a vector Value at a given Time. This is used for scale and // translation keys //---------------------------------------------------------------------------- typedef struct _D3DXKEY_VECTOR3 { FLOAT Time; D3DXVECTOR3 Value; } D3DXKEY_VECTOR3, *LPD3DXKEY_VECTOR3; //---------------------------------------------------------------------------- // This structure describes a quaternion key for use in keyframe animation. // It specifies a quaternion Value at a given Time. This is used for rotation // keys //---------------------------------------------------------------------------- typedef struct _D3DXKEY_QUATERNION { FLOAT Time; D3DXQUATERNION Value; } D3DXKEY_QUATERNION, *LPD3DXKEY_QUATERNION; #undef INTERFACE #define INTERFACE ID3DXKeyFrameInterpolator //---------------------------------------------------------------------------- // This interface implements an SRT (scale/rotate/translate) interpolator // It takes a scattered set of keys and interpolates the transform for any // given time //---------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////// // ID3DXKeyFrameInterpolator ///////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DECLARE_INTERFACE_(ID3DXKeyFrameInterpolator, ID3DXInterpolator) { // IUnknown STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; // ID3DXInterpolator STDMETHOD_(LPCSTR, GetName)(THIS) PURE; STDMETHOD_(DOUBLE, GetPeriod)(THIS) PURE; STDMETHOD(GetSRT)(THIS_ DOUBLE Time, D3DXVECTOR3 *pScale, D3DXQUATERNION *pRotate, D3DXVECTOR3 *pTranslate) PURE; STDMETHOD(GetLastSRT)(THIS_ D3DXVECTOR3 *pScale, D3DXQUATERNION *pRotate, D3DXVECTOR3 *pTranslate) PURE; // ID3DXKeyFrameInterpolator STDMETHOD_(UINT, GetNumScaleKeys)(THIS) PURE; STDMETHOD(GetScaleKeys)(THIS_ LPD3DXKEY_VECTOR3 pKeys) PURE; STDMETHOD_(UINT, GetNumRotationKeys)(THIS) PURE; STDMETHOD(GetRotationKeys)(THIS_ LPD3DXKEY_QUATERNION pKeys) PURE; STDMETHOD_(UINT, GetNumTranslationKeys)(THIS) PURE; STDMETHOD(GetTranslationKeys)(THIS_ LPD3DXKEY_VECTOR3 pKeys) PURE; // the value passed to D3DXCreateKeyFrameInterpolator to scale from the times in LPD3DXKEY_VECTOR3 to global/anim time. STDMETHOD_(DOUBLE, GetSourceTicksPerSecond)(THIS) PURE; }; //---------------------------------------------------------------------------- // This interface implements an set of interpolators. The set consists of // interpolators for many nodes for the same animation. //---------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////// // ID3DXAnimationSet ///////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DECLARE_INTERFACE_(ID3DXAnimationSet, IUnknown) { // IUnknown STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; // ID3DXAnimationSet STDMETHOD_(LPCSTR, GetName)(THIS) PURE; STDMETHOD_(DOUBLE, GetPeriod)(THIS) PURE; STDMETHOD_(UINT, GetNumInterpolators)(THIS) PURE; STDMETHOD(GetInterpolatorByIndex)(THIS_ UINT Index, LPD3DXINTERPOLATOR *ppInterpolator) PURE; STDMETHOD(GetInterpolatorByName)(THIS_ LPCSTR pName, LPD3DXINTERPOLATOR *ppInterpolator) PURE; }; //---------------------------------------------------------------------------- // This structure describes an animation track. A track is a combination // of an animation set (stored separately) and mixing information. // the mixing information consists of the current position, speed, and blending // weight for the track. The Flags field also specifies whether the track // is low or high priority. Tracks with the same priority are blended together // and then the two resulting values are blended using the priority blend factor. //---------------------------------------------------------------------------- typedef struct _D3DXTRACK_DESC { DWORD Flags; FLOAT Weight; FLOAT Speed; BOOL Enable; DOUBLE AnimTime; } D3DXTRACK_DESC, *LPD3DXTRACK_DESC; //---------------------------------------------------------------------------- // This enum defines the type of transtion performed on a event that transitions from one value to another //---------------------------------------------------------------------------- typedef enum _D3DXTRACKFLAG { D3DXTF_LOWPRIORITY = 0x000, // This track should be blended with all low priority tracks before mixed with the high priority result D3DXTF_HIGHPRIORITY = 0x001, // This track should be blended with all high priority tracks before mixed with the low priority result D3DXTF_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ } D3DXTRACKFLAG; //---------------------------------------------------------------------------- // This interface implements the main animation functionality. It connects // animation sets with the transform frames that are being animated. Allows // mixing multiple animations for blended animations or for transistions // It adds also has methods to modify blending parameters over time to // enable smooth transistions and other effects. //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // This enum defines the type of transtion performed on a event that transitions from one value to another //---------------------------------------------------------------------------- typedef enum _D3DXTRANSITIONTYPE { D3DXTRANSITION_LINEAR = 0x000, // Linear transition from one value to the next D3DXTRANSITION_EASEINEASEOUT = 0x001, // Ease-In Ease-Out spline transtion from one value to the next D3DXTRANSITION_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ } D3DXTRANSITIONTYPE; ////////////////////////////////////////////////////////////////////////////// // ID3DXAnimationController ////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DECLARE_INTERFACE_(ID3DXAnimationController, IUnknown) { // IUnknown STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; // mixing functionality // register outputs of SetTime STDMETHOD(RegisterMatrix)(THIS_ LPCSTR Name, D3DXMATRIX *pMatrix) PURE; // AnimationSets STDMETHOD_(UINT, GetNumAnimationSets)(THIS) PURE; STDMETHOD(GetAnimationSet)(THIS_ DWORD iAnimationSet, LPD3DXANIMATIONSET *ppAnimSet) PURE; STDMETHOD(RegisterAnimationSet)(THIS_ LPD3DXANIMATIONSET pAnimSet) PURE; STDMETHOD(UnregisterAnimationSet)(THIS_ LPD3DXANIMATIONSET pAnimSet) PURE; // Tracks STDMETHOD_(UINT, GetMaxNumTracks)(THIS) PURE; STDMETHOD(GetTrackDesc)(THIS_ DWORD Track, D3DXTRACK_DESC *pDesc) PURE; STDMETHOD(SetTrackDesc)(THIS_ DWORD Track, D3DXTRACK_DESC *pDesc) PURE; STDMETHOD(GetTrackAnimationSet)(THIS_ DWORD Track, LPD3DXANIMATIONSET *ppAnimSet) PURE; STDMETHOD(SetTrackAnimationSet)(THIS_ DWORD Track, LPD3DXANIMATIONSET pAnimSet) PURE; // Individual track field access STDMETHOD(SetTrackSpeed)(THIS_ DWORD Track, FLOAT Speed) PURE; STDMETHOD(SetTrackWeight)(THIS_ DWORD Track, FLOAT Weight) PURE; STDMETHOD(SetTrackAnimTime)(THIS_ DWORD Track, DOUBLE AnimTime) PURE; STDMETHOD(SetTrackEnable)(THIS_ DWORD Track, BOOL Enable) PURE; // Time STDMETHOD_(DOUBLE, GetTime)(THIS) PURE; STDMETHOD(SetTime)(THIS_ DOUBLE Time) PURE; STDMETHOD(CloneAnimationController)(THIS_ UINT MaxNumMatrices, UINT MaxNumAnimationSets, UINT MaxNumTracks, UINT MaxNumEvents, LPD3DXANIMATIONCONTROLLER *ppAnimController) PURE; STDMETHOD_(UINT, GetMaxNumMatrices)(THIS) PURE; STDMETHOD_(UINT, GetMaxNumEvents)(THIS) PURE; STDMETHOD_(UINT, GetMaxNumAnimationSets)(THIS) PURE; // Sequencing abilities STDMETHOD(KeyTrackSpeed)(THIS_ DWORD Track, FLOAT NewSpeed, DOUBLE StartTime, DOUBLE Duration, DWORD Method) PURE; STDMETHOD(KeyTrackWeight)(THIS_ DWORD Track, FLOAT NewWeight, DOUBLE StartTime, DOUBLE Duration, DWORD Method) PURE; STDMETHOD(KeyTrackAnimTime)(THIS_ DWORD Track, DOUBLE NewAnimTime, DOUBLE StartTime) PURE; STDMETHOD(KeyTrackEnable)(THIS_ DWORD Track, BOOL NewEnable, DOUBLE StartTime) PURE; // this functions sets the blend weight to be used to blend high and low priority tracks together. // NOTE: this has no effect unless there are active animations on tracks for a given matrix that have both high and low results STDMETHOD_(FLOAT, GetPriorityBlend)(THIS) PURE; STDMETHOD(SetPriorityBlend)(THIS_ FLOAT BlendWeight) PURE; STDMETHOD(KeyPriorityBlend)(THIS_ FLOAT NewBlendWeight, DOUBLE StartTime, DOUBLE Duration, DWORD Method) PURE; }; #ifdef __cplusplus extern "C" { #endif //__cplusplus //---------------------------------------------------------------------------- // D3DXCreateKeyFrameInterpolator: // ------------------------------- // Creates a SRT key frame interpolator object from the given set of keys // // Parameters: // ScaleKeys // Array of scale key vectors // NumScaleKeys // Num elements in ScaleKeys array // RotationKeys // Array of rotation key quternions // NumRotationKeys // Num elements in RotationKeys array // TranslateKeys // Array of translation key vectors // NumTranslateKeys // Num elements in TranslateKeys array // ScaleInputTimeBy // All key times are scaled by this factor // ppNewInterpolator // Returns the keyframe interpolator interface // //---------------------------------------------------------------------------- HRESULT WINAPI D3DXCreateKeyFrameInterpolator(LPCSTR Name, LPD3DXKEY_VECTOR3 ScaleKeys, UINT NumScaleKeys, LPD3DXKEY_QUATERNION RotationKeys, UINT NumRotationKeys, LPD3DXKEY_VECTOR3 TranslateKeys, UINT NumTranslateKeys, DOUBLE ScaleInputTimeBy, LPD3DXKEYFRAMEINTERPOLATOR *ppNewInterpolator); //---------------------------------------------------------------------------- // D3DXCreateAnimationSet: // ----------------------- // Creates an animtions set interface given a set of interpolators // // Parameters: // Name // Name of the animation set // pInterpolators // Array of interpolators // NumInterpolators // Num elements in the pInterpolators array // ppAnimSet // Returns the animation set interface // //----------------------------------------------------------------------------- HRESULT WINAPI D3DXCreateAnimationSet(LPCSTR Name, LPD3DXINTERPOLATOR *ppInterpolators, UINT NumInterpolators, LPD3DXANIMATIONSET *ppAnimSet); //---------------------------------------------------------------------------- // D3DXCreateAnimationController: // ------------------------- // Creates an animtion mixer object // // Parameters: // MaxNumMatrices // The upper limit for the number of matrices that can be animated by the // the object // MaxNumAnimationSets // The upper limit of the number of animation sets that can be played by // the object // MaxNumTracks // The upper limit of the number of animation sets that can be blended at // any time. // MaxNumEvents // The upper limit of the number of outstanding events that can be // scheduled at once. // ppAnimController // Returns the animation controller interface // //----------------------------------------------------------------------------- HRESULT WINAPI D3DXCreateAnimationController(UINT MaxNumMatrices, UINT MaxNumAnimationSets, UINT MaxNumTracks, UINT MaxNumEvents, LPD3DXANIMATIONCONTROLLER *ppAnimController); #ifdef __cplusplus } #endif //__cplusplus #endif //__D3DX9ANIM_H__