//////////////////////////////////////////////////////////////////////////////
 
//
 
//  Copyright (C) Microsoft Corporation.  All Rights Reserved.
 
//
 
//  File:       d3dx9anim.h
 
//  Content:    D3DX mesh types and functions
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
#ifndef __D3DX9ANIM_H__
 
#define __D3DX9ANIM_H__
 
 
 
// {698CFB3F-9289-4d95-9A57-33A94B5A65F9}
 
DEFINE_GUID(IID_ID3DXAnimationSet, 
 
0x698cfb3f, 0x9289, 0x4d95, 0x9a, 0x57, 0x33, 0xa9, 0x4b, 0x5a, 0x65, 0xf9);
 
 
 
// {FA4E8E3A-9786-407d-8B4C-5995893764AF}
 
DEFINE_GUID(IID_ID3DXKeyframedAnimationSet, 
 
0xfa4e8e3a, 0x9786, 0x407d, 0x8b, 0x4c, 0x59, 0x95, 0x89, 0x37, 0x64, 0xaf);
 
 
 
// {6CC2480D-3808-4739-9F88-DE49FACD8D4C}
 
DEFINE_GUID(IID_ID3DXCompressedAnimationSet, 
 
0x6cc2480d, 0x3808, 0x4739, 0x9f, 0x88, 0xde, 0x49, 0xfa, 0xcd, 0x8d, 0x4c);
 
 
 
// {AC8948EC-F86D-43e2-96DE-31FC35F96D9E}
 
DEFINE_GUID(IID_ID3DXAnimationController, 
 
0xac8948ec, 0xf86d, 0x43e2, 0x96, 0xde, 0x31, 0xfc, 0x35, 0xf9, 0x6d, 0x9e);
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXMESHDATATYPE:
 
// -----------------
 
// 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;
 
 
 
//----------------------------------------------------------------------------
 
// D3DXMESHDATA:
 
// -------------
 
// 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 Type enum.
 
//----------------------------------------------------------------------------
 
typedef struct _D3DXMESHDATA
 
{
 
    D3DXMESHDATATYPE Type;
 
 
 
    // current mesh data interface
 
    union
 
    {
 
        LPD3DXMESH              pMesh;
 
        LPD3DXPMESH             pPMesh;
 
        LPD3DXPATCHMESH         pPatchMesh;
 
    };
 
} D3DXMESHDATA, *LPD3DXMESHDATA;
 
 
 
//----------------------------------------------------------------------------
 
// D3DXMESHCONTAINER:
 
// ------------------
 
// 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;
 
 
 
//----------------------------------------------------------------------------
 
// D3DXFRAME:
 
// ----------
 
// 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;
 
 
 
 
 
//----------------------------------------------------------------------------
 
// 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
 
//----------------------------------------------------------------------------
 
typedef interface ID3DXAllocateHierarchy ID3DXAllocateHierarchy;
 
typedef interface ID3DXAllocateHierarchy *LPD3DXALLOCATEHIERARCHY;
 
 
 
#undef INTERFACE
 
#define INTERFACE ID3DXAllocateHierarchy
 
 
 
DECLARE_INTERFACE(ID3DXAllocateHierarchy)
 
{
 
    // ID3DXAllocateHierarchy
 
 
 
        //------------------------------------------------------------------------
 
        // CreateFrame:
 
        // ------------
 
        // Requests allocation of a frame object.
 
        //
 
        // Parameters:
 
        //  Name
 
        //              Name of the frame to be created
 
        //      ppNewFrame
 
        //              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, 
 
        CONST D3DXMESHDATA *pMeshData, 
 
        CONST D3DXMATERIAL *pMaterials, 
 
        CONST D3DXEFFECTINSTANCE *pEffectInstances, 
 
        DWORD NumMaterials, 
 
        CONST 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; 
 
};
 
 
 
//----------------------------------------------------------------------------
 
// ID3DXLoadUserData:
 
// ------------------
 
// 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.
 
//----------------------------------------------------------------------------
 
typedef interface ID3DXLoadUserData ID3DXLoadUserData;
 
typedef interface ID3DXLoadUserData *LPD3DXLOADUSERDATA;
 
 
 
#undef INTERFACE
 
#define INTERFACE ID3DXLoadUserData
 
 
 
DECLARE_INTERFACE(ID3DXLoadUserData)
 
{
 
    STDMETHOD(LoadTopLevelData)(LPD3DXFILEDATA pXofChildData) PURE;
 
                            
 
    STDMETHOD(LoadFrameChildData)(LPD3DXFRAME pFrame, 
 
                            LPD3DXFILEDATA pXofChildData) PURE;
 
                            
 
    STDMETHOD(LoadMeshChildData)(LPD3DXMESHCONTAINER pMeshContainer, 
 
                            LPD3DXFILEDATA pXofChildData) PURE;                            
 
};
 
 
 
//----------------------------------------------------------------------------
 
// ID3DXSaveUserData:
 
// ------------------
 
// 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.
 
//----------------------------------------------------------------------------
 
typedef interface ID3DXSaveUserData ID3DXSaveUserData;
 
typedef interface ID3DXSaveUserData *LPD3DXSAVEUSERDATA;
 
 
 
#undef INTERFACE
 
#define INTERFACE ID3DXSaveUserData
 
 
 
DECLARE_INTERFACE(ID3DXSaveUserData)
 
{
 
    STDMETHOD(AddFrameChildData)(CONST D3DXFRAME *pFrame, 
 
                            LPD3DXFILESAVEOBJECT pXofSave, 
 
                            LPD3DXFILESAVEDATA pXofFrameData) PURE;
 
                            
 
    STDMETHOD(AddMeshChildData)(CONST D3DXMESHCONTAINER *pMeshContainer, 
 
                            LPD3DXFILESAVEOBJECT pXofSave, 
 
                            LPD3DXFILESAVEDATA 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)(LPD3DXFILESAVEOBJECT pXofSave) PURE; 
 
    STDMETHOD(AddTopLevelDataObjectsPost)(LPD3DXFILESAVEOBJECT pXofSave) PURE;                             
 
 
 
    // callbacks for the user to register and then save templates to the XFile
 
    STDMETHOD(RegisterTemplates)(LPD3DXFILE pXFileApi) PURE;                             
 
    STDMETHOD(SaveTemplates)(LPD3DXFILESAVEOBJECT pXofSave) PURE;                             
 
};
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXCALLBACK_SEARCH_FLAGS:
 
// --------------------------
 
// Flags that can be passed into ID3DXAnimationSet::GetCallback. 
 
//----------------------------------------------------------------------------
 
typedef enum _D3DXCALLBACK_SEARCH_FLAGS
 
{
 
    D3DXCALLBACK_SEARCH_EXCLUDING_INITIAL_POSITION = 0x01,  // exclude callbacks at the initial position from the search
 
    D3DXCALLBACK_SEARCH_BEHIND_INITIAL_POSITION    = 0x02,  // reverse the callback search direction
 
 
 
    D3DXCALLBACK_SEARCH_FORCE_DWORD                = 0x7fffffff,
 
} D3DXCALLBACK_SEARCH_FLAGS;
 
 
 
//----------------------------------------------------------------------------
 
// ID3DXAnimationSet:
 
// ------------------
 
// This interface implements an animation set.
 
//----------------------------------------------------------------------------
 
typedef interface ID3DXAnimationSet ID3DXAnimationSet;
 
typedef interface ID3DXAnimationSet *LPD3DXANIMATIONSET;
 
 
 
#undef INTERFACE
 
#define INTERFACE ID3DXAnimationSet
 
 
 
DECLARE_INTERFACE_(ID3DXAnimationSet, IUnknown)
 
{
 
    // IUnknown
 
    STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
 
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
 
    STDMETHOD_(ULONG, Release)(THIS) PURE;
 
 
 
    // Name
 
    STDMETHOD_(LPCSTR, GetName)(THIS) PURE;
 
 
 
    // Period
 
    STDMETHOD_(DOUBLE, GetPeriod)(THIS) PURE;
 
    STDMETHOD_(DOUBLE, GetPeriodicPosition)(THIS_ DOUBLE Position) PURE;    // Maps position into animation period
 
 
 
    // Animation names
 
    STDMETHOD_(UINT, GetNumAnimations)(THIS) PURE;
 
    STDMETHOD(GetAnimationNameByIndex)(THIS_ UINT Index, LPCSTR *ppName) PURE;
 
    STDMETHOD(GetAnimationIndexByName)(THIS_ LPCSTR pName, UINT *pIndex) PURE;
 
 
 
    // SRT
 
    STDMETHOD(GetSRT)(THIS_ 
 
        DOUBLE PeriodicPosition,            // Position mapped to period (use GetPeriodicPosition)
 
        UINT Animation,                     // Animation index
 
        D3DXVECTOR3 *pScale,                // Returns the scale
 
        D3DXQUATERNION *pRotation,          // Returns the rotation as a quaternion
 
        D3DXVECTOR3 *pTranslation) PURE;    // Returns the translation
 
 
 
    // Callbacks
 
    STDMETHOD(GetCallback)(THIS_ 
 
        DOUBLE Position,                    // Position from which to find callbacks
 
        DWORD Flags,                        // Callback search flags
 
        DOUBLE *pCallbackPosition,          // Returns the position of the callback
 
        LPVOID *ppCallbackData) PURE;       // Returns the callback data pointer
 
};
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXPLAYBACK_TYPE:
 
// ------------------
 
// This enum defines the type of animation set loop modes.
 
//----------------------------------------------------------------------------
 
typedef enum _D3DXPLAYBACK_TYPE
 
{
 
    D3DXPLAY_LOOP          = 0,
 
    D3DXPLAY_ONCE          = 1,
 
    D3DXPLAY_PINGPONG      = 2,
 
 
 
    D3DXPLAY_FORCE_DWORD   = 0x7fffffff, /* force 32-bit size enum */
 
} D3DXPLAYBACK_TYPE;
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXKEY_VECTOR3:
 
// ----------------
 
// 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;
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXKEY_QUATERNION:
 
// -------------------
 
// 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;
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXKEY_CALLBACK:
 
// -----------------
 
// This structure describes an callback key for use in keyframe animation.
 
// It specifies a pointer to user data at a given Time. 
 
//----------------------------------------------------------------------------
 
typedef struct _D3DXKEY_CALLBACK
 
{
 
    FLOAT Time;
 
    LPVOID pCallbackData;
 
} D3DXKEY_CALLBACK, *LPD3DXKEY_CALLBACK;
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXCOMPRESSION_FLAGS:
 
// ----------------------
 
// Flags that can be passed into ID3DXKeyframedAnimationSet::Compress. 
 
//----------------------------------------------------------------------------
 
typedef enum _D3DXCOMPRESSION_FLAGS
 
{
 
    D3DXCOMPRESS_DEFAULT     = 0x00,
 
 
 
    D3DXCOMPRESS_FORCE_DWORD = 0x7fffffff,
 
} D3DXCOMPRESSION_FLAGS;
 
 
 
 
 
//----------------------------------------------------------------------------
 
// ID3DXKeyframedAnimationSet:
 
// ---------------------------
 
// This interface implements a compressable keyframed animation set.
 
//----------------------------------------------------------------------------
 
typedef interface ID3DXKeyframedAnimationSet ID3DXKeyframedAnimationSet;
 
typedef interface ID3DXKeyframedAnimationSet *LPD3DXKEYFRAMEDANIMATIONSET;
 
 
 
#undef INTERFACE
 
#define INTERFACE ID3DXKeyframedAnimationSet
 
 
 
DECLARE_INTERFACE_(ID3DXKeyframedAnimationSet, ID3DXAnimationSet)
 
{
 
    // ID3DXAnimationSet
 
    STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
 
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
 
    STDMETHOD_(ULONG, Release)(THIS) PURE;
 
 
 
    // Name
 
    STDMETHOD_(LPCSTR, GetName)(THIS) PURE;
 
 
 
    // Period
 
    STDMETHOD_(DOUBLE, GetPeriod)(THIS) PURE;
 
    STDMETHOD_(DOUBLE, GetPeriodicPosition)(THIS_ DOUBLE Position) PURE;    // Maps position into animation period
 
 
 
    // Animation names
 
    STDMETHOD_(UINT, GetNumAnimations)(THIS) PURE;
 
    STDMETHOD(GetAnimationNameByIndex)(THIS_ UINT Index, LPCSTR *ppName) PURE;
 
    STDMETHOD(GetAnimationIndexByName)(THIS_ LPCSTR pName, UINT *pIndex) PURE;
 
 
 
    // SRT
 
    STDMETHOD(GetSRT)(THIS_ 
 
        DOUBLE PeriodicPosition,            // Position mapped to period (use GetPeriodicPosition)
 
        UINT Animation,                     // Animation index
 
        D3DXVECTOR3 *pScale,                // Returns the scale
 
        D3DXQUATERNION *pRotation,          // Returns the rotation as a quaternion
 
        D3DXVECTOR3 *pTranslation) PURE;    // Returns the translation
 
 
 
    // Callbacks
 
    STDMETHOD(GetCallback)(THIS_ 
 
        DOUBLE Position,                    // Position from which to find callbacks
 
        DWORD Flags,                        // Callback search flags
 
        DOUBLE *pCallbackPosition,          // Returns the position of the callback
 
        LPVOID *ppCallbackData) PURE;       // Returns the callback data pointer
 
 
 
    // Playback
 
    STDMETHOD_(D3DXPLAYBACK_TYPE, GetPlaybackType)(THIS) PURE;
 
    STDMETHOD_(DOUBLE, GetSourceTicksPerSecond)(THIS) PURE;
 
 
 
    // Scale keys
 
    STDMETHOD_(UINT, GetNumScaleKeys)(THIS_ UINT Animation) PURE;
 
        STDMETHOD(GetScaleKeys)(THIS_ UINT Animation, LPD3DXKEY_VECTOR3 pScaleKeys) PURE;
 
        STDMETHOD(GetScaleKey)(THIS_ UINT Animation, UINT Key, LPD3DXKEY_VECTOR3 pScaleKey) PURE;
 
        STDMETHOD(SetScaleKey)(THIS_ UINT Animation, UINT Key, LPD3DXKEY_VECTOR3 pScaleKey) PURE;
 
 
 
    // Rotation keys
 
    STDMETHOD_(UINT, GetNumRotationKeys)(THIS_ UINT Animation) PURE;
 
        STDMETHOD(GetRotationKeys)(THIS_ UINT Animation, LPD3DXKEY_QUATERNION pRotationKeys) PURE;
 
        STDMETHOD(GetRotationKey)(THIS_ UINT Animation, UINT Key, LPD3DXKEY_QUATERNION pRotationKey) PURE;
 
        STDMETHOD(SetRotationKey)(THIS_ UINT Animation, UINT Key, LPD3DXKEY_QUATERNION pRotationKey) PURE;
 
 
 
    // Translation keys
 
    STDMETHOD_(UINT, GetNumTranslationKeys)(THIS_ UINT Animation) PURE;
 
        STDMETHOD(GetTranslationKeys)(THIS_ UINT Animation, LPD3DXKEY_VECTOR3 pTranslationKeys) PURE;
 
        STDMETHOD(GetTranslationKey)(THIS_ UINT Animation, UINT Key, LPD3DXKEY_VECTOR3 pTranslationKey) PURE;
 
        STDMETHOD(SetTranslationKey)(THIS_ UINT Animation, UINT Key, LPD3DXKEY_VECTOR3 pTranslationKey) PURE;
 
 
 
    // Callback keys
 
    STDMETHOD_(UINT, GetNumCallbackKeys)(THIS) PURE;
 
        STDMETHOD(GetCallbackKeys)(THIS_ LPD3DXKEY_CALLBACK pCallbackKeys) PURE;
 
        STDMETHOD(GetCallbackKey)(THIS_ UINT Key, LPD3DXKEY_CALLBACK pCallbackKey) PURE;
 
        STDMETHOD(SetCallbackKey)(THIS_ UINT Key, LPD3DXKEY_CALLBACK pCallbackKey) PURE;
 
 
 
        // Key removal methods. These are slow, and should not be used once the animation starts playing
 
        STDMETHOD(UnregisterScaleKey)(THIS_ UINT Animation, UINT Key) PURE;
 
        STDMETHOD(UnregisterRotationKey)(THIS_ UINT Animation, UINT Key) PURE;
 
        STDMETHOD(UnregisterTranslationKey)(THIS_ UINT Animation, UINT Key) PURE;
 
 
 
    // One-time animaton SRT keyframe registration
 
    STDMETHOD(RegisterAnimationSRTKeys)(THIS_ 
 
        LPCSTR pName,                                   // Animation name
 
        UINT NumScaleKeys,                              // Number of scale keys
 
        UINT NumRotationKeys,                           // Number of rotation keys
 
        UINT NumTranslationKeys,                        // Number of translation keys
 
        CONST D3DXKEY_VECTOR3 *pScaleKeys,              // Array of scale keys
 
        CONST D3DXKEY_QUATERNION *pRotationKeys,        // Array of rotation keys
 
        CONST D3DXKEY_VECTOR3 *pTranslationKeys,                // Array of translation keys
 
                DWORD *pAnimationIndex) PURE;                                   // Returns the animation index 
 
 
 
    // Compression
 
    STDMETHOD(Compress)(THIS_ 
 
        DWORD Flags,                            // Compression flags (use D3DXCOMPRESS_STRONG for better results)
 
        FLOAT Lossiness,                        // Compression loss ratio in the [0, 1] range
 
        LPD3DXFRAME pHierarchy,                 // Frame hierarchy (optional)
 
        LPD3DXBUFFER *ppCompressedData) PURE;   // Returns the compressed animation set
 
 
 
    STDMETHOD(UnregisterAnimation)(THIS_ UINT Index) PURE;
 
};
 
 
 
 
 
//----------------------------------------------------------------------------
 
// ID3DXCompressedAnimationSet:
 
// ----------------------------
 
// This interface implements a compressed keyframed animation set.
 
//----------------------------------------------------------------------------
 
typedef interface ID3DXCompressedAnimationSet ID3DXCompressedAnimationSet;
 
typedef interface ID3DXCompressedAnimationSet *LPD3DXCOMPRESSEDANIMATIONSET;
 
 
 
#undef INTERFACE
 
#define INTERFACE ID3DXCompressedAnimationSet
 
 
 
DECLARE_INTERFACE_(ID3DXCompressedAnimationSet, ID3DXAnimationSet)
 
{
 
    // ID3DXAnimationSet
 
    STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
 
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
 
    STDMETHOD_(ULONG, Release)(THIS) PURE;
 
 
 
    // Name
 
    STDMETHOD_(LPCSTR, GetName)(THIS) PURE;
 
 
 
    // Period
 
    STDMETHOD_(DOUBLE, GetPeriod)(THIS) PURE;
 
    STDMETHOD_(DOUBLE, GetPeriodicPosition)(THIS_ DOUBLE Position) PURE;    // Maps position into animation period
 
 
 
    // Animation names
 
    STDMETHOD_(UINT, GetNumAnimations)(THIS) PURE;
 
    STDMETHOD(GetAnimationNameByIndex)(THIS_ UINT Index, LPCSTR *ppName) PURE;
 
    STDMETHOD(GetAnimationIndexByName)(THIS_ LPCSTR pName, UINT *pIndex) PURE;
 
 
 
    // SRT
 
    STDMETHOD(GetSRT)(THIS_ 
 
        DOUBLE PeriodicPosition,            // Position mapped to period (use GetPeriodicPosition)
 
        UINT Animation,                     // Animation index
 
        D3DXVECTOR3 *pScale,                // Returns the scale
 
        D3DXQUATERNION *pRotation,          // Returns the rotation as a quaternion
 
        D3DXVECTOR3 *pTranslation) PURE;    // Returns the translation
 
 
 
    // Callbacks
 
    STDMETHOD(GetCallback)(THIS_ 
 
        DOUBLE Position,                    // Position from which to find callbacks
 
        DWORD Flags,                        // Callback search flags
 
        DOUBLE *pCallbackPosition,          // Returns the position of the callback
 
        LPVOID *ppCallbackData) PURE;       // Returns the callback data pointer
 
 
 
    // Playback
 
    STDMETHOD_(D3DXPLAYBACK_TYPE, GetPlaybackType)(THIS) PURE;
 
    STDMETHOD_(DOUBLE, GetSourceTicksPerSecond)(THIS) PURE;
 
 
 
    // Scale keys
 
    STDMETHOD(GetCompressedData)(THIS_ LPD3DXBUFFER *ppCompressedData) PURE;
 
 
 
    // Callback keys
 
    STDMETHOD_(UINT, GetNumCallbackKeys)(THIS) PURE;
 
    STDMETHOD(GetCallbackKeys)(THIS_ LPD3DXKEY_CALLBACK pCallbackKeys) PURE;
 
};
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXPRIORITY_TYPE:
 
// ------------------
 
// This enum defines the type of priority group that a track can be assigned to.
 
//----------------------------------------------------------------------------
 
typedef enum _D3DXPRIORITY_TYPE {
 
    D3DXPRIORITY_LOW         = 0,           // This track should be blended with all low priority tracks before mixed with the high priority result
 
    D3DXPRIORITY_HIGH        = 1,           // This track should be blended with all high priority tracks before mixed with the low priority result
 
 
 
    D3DXPRIORITY_FORCE_DWORD = 0x7fffffff,  /* force 32-bit size enum */
 
} D3DXPRIORITY_TYPE;
 
 
 
//----------------------------------------------------------------------------
 
// D3DXTRACK_DESC:
 
// ---------------
 
// This structure describes the mixing information of an animation track. 
 
// 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.
 
// A track also has an animation set (stored separately) associated with it.  
 
//----------------------------------------------------------------------------
 
typedef struct _D3DXTRACK_DESC
 
{
 
    D3DXPRIORITY_TYPE   Priority;
 
    FLOAT               Weight;
 
    FLOAT               Speed;
 
    DOUBLE              Position;
 
    BOOL                Enable;
 
} D3DXTRACK_DESC, *LPD3DXTRACK_DESC;
 
 
 
//----------------------------------------------------------------------------
 
// D3DXEVENT_TYPE:
 
// ---------------
 
// This enum defines the type of events keyable via the animation controller.
 
//----------------------------------------------------------------------------
 
typedef enum _D3DXEVENT_TYPE
 
{
 
    D3DXEVENT_TRACKSPEED    = 0,
 
    D3DXEVENT_TRACKWEIGHT   = 1,
 
    D3DXEVENT_TRACKPOSITION = 2,
 
    D3DXEVENT_TRACKENABLE   = 3,
 
    D3DXEVENT_PRIORITYBLEND = 4,
 
 
 
    D3DXEVENT_FORCE_DWORD   = 0x7fffffff, /* force 32-bit size enum */
 
} D3DXEVENT_TYPE;
 
 
 
//----------------------------------------------------------------------------
 
// D3DXTRANSITION_TYPE:
 
// --------------------
 
// This enum defines the type of transtion performed on a event that 
 
// transitions from one value to another.
 
//----------------------------------------------------------------------------
 
typedef enum _D3DXTRANSITION_TYPE {
 
    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 */
 
} D3DXTRANSITION_TYPE;
 
 
 
//----------------------------------------------------------------------------
 
// D3DXEVENT_DESC:
 
// ---------------
 
// This structure describes a animation controller event.
 
// It gives the event's type, track (if the event is a track event), global 
 
// start time, duration, transition method, and target value.
 
//----------------------------------------------------------------------------
 
typedef struct _D3DXEVENT_DESC
 
{
 
    D3DXEVENT_TYPE      Type;
 
    UINT                Track;
 
    DOUBLE              StartTime;
 
    DOUBLE              Duration;
 
    D3DXTRANSITION_TYPE Transition;
 
    union
 
    {
 
        FLOAT           Weight;
 
        FLOAT           Speed;
 
        DOUBLE          Position;
 
        BOOL            Enable;
 
    };
 
} D3DXEVENT_DESC, *LPD3DXEVENT_DESC;
 
 
 
//----------------------------------------------------------------------------
 
// D3DXEVENTHANDLE:
 
// ----------------
 
// Handle values used to efficiently reference animation controller events.
 
//----------------------------------------------------------------------------
 
typedef DWORD D3DXEVENTHANDLE;
 
typedef D3DXEVENTHANDLE *LPD3DXEVENTHANDLE;
 
 
 
 
 
//----------------------------------------------------------------------------
 
// ID3DXAnimationCallbackHandler:
 
// ------------------------------
 
// This interface is intended to be implemented by the application, and can
 
// be used to handle callbacks in animation sets generated when 
 
// ID3DXAnimationController::AdvanceTime() is called.  
 
//----------------------------------------------------------------------------
 
typedef interface ID3DXAnimationCallbackHandler ID3DXAnimationCallbackHandler;
 
typedef interface ID3DXAnimationCallbackHandler *LPD3DXANIMATIONCALLBACKHANDLER;
 
 
 
#undef INTERFACE
 
#define INTERFACE ID3DXAnimationCallbackHandler
 
 
 
DECLARE_INTERFACE(ID3DXAnimationCallbackHandler)
 
{
 
    //----------------------------------------------------------------------------
 
    // ID3DXAnimationCallbackHandler::HandleCallback:
 
    // ----------------------------------------------
 
    // This method gets called when a callback occurs for an animation set in one
 
    // of the tracks during the ID3DXAnimationController::AdvanceTime() call.  
 
    //
 
    // Parameters:
 
    //  Track
 
    //      Index of the track on which the callback occured.
 
    //  pCallbackData
 
    //      Pointer to user owned callback data.
 
    //
 
    //----------------------------------------------------------------------------
 
    STDMETHOD(HandleCallback)(THIS_ UINT Track, LPVOID pCallbackData) PURE; 
 
};
 
 
 
 
 
//----------------------------------------------------------------------------
 
// ID3DXAnimationController:
 
// -------------------------
 
// 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.
 
//----------------------------------------------------------------------------
 
typedef interface ID3DXAnimationController ID3DXAnimationController;
 
typedef interface ID3DXAnimationController *LPD3DXANIMATIONCONTROLLER;
 
 
 
#undef INTERFACE
 
#define INTERFACE ID3DXAnimationController
 
 
 
DECLARE_INTERFACE_(ID3DXAnimationController, IUnknown)
 
{
 
    // IUnknown
 
    STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
 
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
 
    STDMETHOD_(ULONG, Release)(THIS) PURE;
 
 
 
    // Max sizes
 
    STDMETHOD_(UINT, GetMaxNumAnimationOutputs)(THIS) PURE;
 
    STDMETHOD_(UINT, GetMaxNumAnimationSets)(THIS) PURE;
 
    STDMETHOD_(UINT, GetMaxNumTracks)(THIS) PURE;
 
    STDMETHOD_(UINT, GetMaxNumEvents)(THIS) PURE;
 
 
 
    // Animation output registration
 
    STDMETHOD(RegisterAnimationOutput)(THIS_ 
 
        LPCSTR pName, 
 
        D3DXMATRIX *pMatrix, 
 
        D3DXVECTOR3 *pScale, 
 
        D3DXQUATERNION *pRotation, 
 
        D3DXVECTOR3 *pTranslation) PURE;
 
 
 
    // Animation set registration
 
    STDMETHOD(RegisterAnimationSet)(THIS_ LPD3DXANIMATIONSET pAnimSet) PURE;
 
    STDMETHOD(UnregisterAnimationSet)(THIS_ LPD3DXANIMATIONSET pAnimSet) PURE;
 
 
 
    STDMETHOD_(UINT, GetNumAnimationSets)(THIS) PURE;
 
    STDMETHOD(GetAnimationSet)(THIS_ UINT Index, LPD3DXANIMATIONSET *ppAnimationSet) PURE;
 
    STDMETHOD(GetAnimationSetByName)(THIS_ LPCSTR szName, LPD3DXANIMATIONSET *ppAnimationSet) PURE;
 
 
 
    // Global time
 
    STDMETHOD(AdvanceTime)(THIS_ DOUBLE TimeDelta, LPD3DXANIMATIONCALLBACKHANDLER pCallbackHandler) PURE;
 
    STDMETHOD(ResetTime)(THIS) PURE;
 
    STDMETHOD_(DOUBLE, GetTime)(THIS) PURE;
 
 
 
    // Tracks
 
    STDMETHOD(SetTrackAnimationSet)(THIS_ UINT Track, LPD3DXANIMATIONSET pAnimSet) PURE;
 
    STDMETHOD(GetTrackAnimationSet)(THIS_ UINT Track, LPD3DXANIMATIONSET *ppAnimSet) PURE;
 
 
 
    STDMETHOD(SetTrackPriority)(THIS_ UINT Track, D3DXPRIORITY_TYPE Priority) PURE;
 
 
 
    STDMETHOD(SetTrackSpeed)(THIS_ UINT Track, FLOAT Speed) PURE;
 
    STDMETHOD(SetTrackWeight)(THIS_ UINT Track, FLOAT Weight) PURE;
 
    STDMETHOD(SetTrackPosition)(THIS_ UINT Track, DOUBLE Position) PURE;
 
    STDMETHOD(SetTrackEnable)(THIS_ UINT Track, BOOL Enable) PURE;
 
 
 
    STDMETHOD(SetTrackDesc)(THIS_ UINT Track, LPD3DXTRACK_DESC pDesc) PURE;
 
    STDMETHOD(GetTrackDesc)(THIS_ UINT Track, LPD3DXTRACK_DESC pDesc) PURE;
 
 
 
    // Priority blending
 
    STDMETHOD(SetPriorityBlend)(THIS_ FLOAT BlendWeight) PURE;
 
    STDMETHOD_(FLOAT, GetPriorityBlend)(THIS) PURE;
 
 
 
    // Event keying
 
    STDMETHOD_(D3DXEVENTHANDLE, KeyTrackSpeed)(THIS_ UINT Track, FLOAT NewSpeed, DOUBLE StartTime, DOUBLE Duration, D3DXTRANSITION_TYPE Transition) PURE;
 
    STDMETHOD_(D3DXEVENTHANDLE, KeyTrackWeight)(THIS_ UINT Track, FLOAT NewWeight, DOUBLE StartTime, DOUBLE Duration, D3DXTRANSITION_TYPE Transition) PURE;
 
    STDMETHOD_(D3DXEVENTHANDLE, KeyTrackPosition)(THIS_ UINT Track, DOUBLE NewPosition, DOUBLE StartTime) PURE;
 
    STDMETHOD_(D3DXEVENTHANDLE, KeyTrackEnable)(THIS_ UINT Track, BOOL NewEnable, DOUBLE StartTime) PURE;
 
 
 
    STDMETHOD_(D3DXEVENTHANDLE, KeyPriorityBlend)(THIS_ FLOAT NewBlendWeight, DOUBLE StartTime, DOUBLE Duration, D3DXTRANSITION_TYPE Transition) PURE;
 
 
 
    // Event unkeying
 
    STDMETHOD(UnkeyEvent)(THIS_ D3DXEVENTHANDLE hEvent) PURE;
 
 
 
    STDMETHOD(UnkeyAllTrackEvents)(THIS_ UINT Track) PURE;
 
    STDMETHOD(UnkeyAllPriorityBlends)(THIS) PURE;
 
 
 
    // Event enumeration
 
    STDMETHOD_(D3DXEVENTHANDLE, GetCurrentTrackEvent)(THIS_ UINT Track, D3DXEVENT_TYPE EventType) PURE;
 
    STDMETHOD_(D3DXEVENTHANDLE, GetCurrentPriorityBlend)(THIS) PURE;
 
 
 
    STDMETHOD_(D3DXEVENTHANDLE, GetUpcomingTrackEvent)(THIS_ UINT Track, D3DXEVENTHANDLE hEvent) PURE;
 
    STDMETHOD_(D3DXEVENTHANDLE, GetUpcomingPriorityBlend)(THIS_ D3DXEVENTHANDLE hEvent) PURE;
 
 
 
    STDMETHOD(ValidateEvent)(THIS_ D3DXEVENTHANDLE hEvent) PURE;
 
 
 
    STDMETHOD(GetEventDesc)(THIS_ D3DXEVENTHANDLE hEvent, LPD3DXEVENT_DESC pDesc) PURE;
 
 
 
    // Cloning
 
    STDMETHOD(CloneAnimationController)(THIS_ 
 
        UINT MaxNumAnimationOutputs, 
 
        UINT MaxNumAnimationSets, 
 
        UINT MaxNumTracks, 
 
        UINT MaxNumEvents, 
 
        LPD3DXANIMATIONCONTROLLER *ppAnimController) 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 controller 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,
 
    CONST D3DXFRAME *pFrameRoot, 
 
    LPD3DXANIMATIONCONTROLLER pAnimcontroller,
 
    LPD3DXSAVEUSERDATA pUserDataSaver
 
    );
 
 
 
HRESULT WINAPI 
 
D3DXSaveMeshHierarchyToFileW
 
    (
 
    LPCWSTR Filename,
 
    DWORD XFormat,
 
    CONST D3DXFRAME *pFrameRoot, 
 
    LPD3DXANIMATIONCONTROLLER pAnimController,
 
    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,
 
    CONST D3DXFRAME *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
 
    (
 
    CONST D3DXFRAME *pFrameRoot,
 
    LPCSTR Name
 
    );
 
 
 
//----------------------------------------------------------------------------
 
// D3DXFrameRegisterNamedMatrices:
 
// -------------------------------
 
// Finds all frames that have non-null names and registers each of those frame
 
// matrices to the given animation controller
 
//
 
// Parameters:
 
//      pFrameRoot
 
//              Pointer to the root node
 
//      pAnimController
 
//              Pointer to the animation controller where the matrices are registered
 
//
 
//----------------------------------------------------------------------------
 
HRESULT WINAPI
 
D3DXFrameRegisterNamedMatrices
 
    (
 
    LPD3DXFRAME pFrameRoot,
 
    LPD3DXANIMATIONCONTROLLER pAnimController
 
    );
 
 
 
//----------------------------------------------------------------------------
 
// 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
 
    (
 
    CONST D3DXFRAME *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
 
    (
 
    CONST D3DXFRAME *pFrameRoot,       
 
    LPD3DXVECTOR3 pObjectCenter,  
 
    FLOAT *pObjectRadius          
 
    );
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXCreateKeyframedAnimationSet:
 
// --------------------------------
 
// This function creates a compressable keyframed animations set interface.
 
// 
 
// Parameters:
 
//  pName
 
//      Name of the animation set
 
//  TicksPerSecond
 
//      Number of keyframe ticks that elapse per second
 
//  Playback
 
//      Playback mode of keyframe looping
 
//  NumAnimations
 
//      Number of SRT animations
 
//  NumCallbackKeys
 
//      Number of callback keys
 
//  pCallbackKeys
 
//      Array of callback keys
 
//  ppAnimationSet
 
//      Returns the animation set interface
 
// 
 
//-----------------------------------------------------------------------------         
 
HRESULT WINAPI
 
D3DXCreateKeyframedAnimationSet
 
    (
 
    LPCSTR pName,                               
 
    DOUBLE TicksPerSecond,
 
    D3DXPLAYBACK_TYPE Playback,
 
    UINT NumAnimations,                         
 
    UINT NumCallbackKeys,                       
 
    CONST D3DXKEY_CALLBACK *pCallbackKeys,           
 
    LPD3DXKEYFRAMEDANIMATIONSET *ppAnimationSet 
 
    );
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXCreateCompressedAnimationSet:
 
// --------------------------------
 
// This function creates a compressed animations set interface from 
 
// compressed data.
 
// 
 
// Parameters:
 
//  pName
 
//      Name of the animation set
 
//  TicksPerSecond
 
//      Number of keyframe ticks that elapse per second
 
//  Playback
 
//      Playback mode of keyframe looping
 
//  pCompressedData
 
//      Compressed animation SRT data
 
//  NumCallbackKeys
 
//      Number of callback keys
 
//  pCallbackKeys
 
//      Array of callback keys
 
//  ppAnimationSet
 
//      Returns the animation set interface
 
// 
 
//-----------------------------------------------------------------------------         
 
HRESULT WINAPI
 
D3DXCreateCompressedAnimationSet
 
    (
 
    LPCSTR pName,                               
 
    DOUBLE TicksPerSecond,
 
    D3DXPLAYBACK_TYPE Playback,
 
    LPD3DXBUFFER pCompressedData,                         
 
    UINT NumCallbackKeys,                       
 
    CONST D3DXKEY_CALLBACK *pCallbackKeys,           
 
    LPD3DXCOMPRESSEDANIMATIONSET *ppAnimationSet 
 
    );
 
 
 
 
 
//----------------------------------------------------------------------------
 
// D3DXCreateAnimationController:
 
// ------------------------------
 
// This function creates an animation controller object.
 
//
 
// Parameters:
 
//  MaxNumMatrices
 
//      Maximum number of matrices that can be animated
 
//  MaxNumAnimationSets
 
//      Maximum number of animation sets that can be played
 
//  MaxNumTracks
 
//      Maximum number of animation sets that can be blended
 
//  MaxNumEvents
 
//      Maximum number of outstanding events that can be scheduled at any given time
 
//  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__