summaryrefslogtreecommitdiffstats
path: root/rwsdk/include/d3d8/rphanim.h
diff options
context:
space:
mode:
Diffstat (limited to 'rwsdk/include/d3d8/rphanim.h')
-rw-r--r--rwsdk/include/d3d8/rphanim.h873
1 files changed, 873 insertions, 0 deletions
diff --git a/rwsdk/include/d3d8/rphanim.h b/rwsdk/include/d3d8/rphanim.h
new file mode 100644
index 00000000..a9b0438a
--- /dev/null
+++ b/rwsdk/include/d3d8/rphanim.h
@@ -0,0 +1,873 @@
+/******************************************
+ * *
+ * RenderWare(TM) Graphics Library *
+ * *
+ ******************************************/
+
+/*
+ * This file is a product of Criterion Software Ltd.
+ *
+ * This file is provided as is with no warranties of any kind and is
+ * provided without any obligation on Criterion Software Ltd.
+ * or Canon Inc. to assist in its use or modification.
+ *
+ * Criterion Software Ltd. and Canon Inc. will not, under any
+ * circumstances, be liable for any lost revenue or other damages
+ * arising from the use of this file.
+ *
+ * Copyright (c) 1998. Criterion Software Ltd.
+ * All Rights Reserved.
+ */
+
+/***************************************************************************
+ * *
+ * Module : rpanim.h *
+ * *
+ * Purpose : Hierarchical animation *
+ * *
+ **************************************************************************/
+
+#ifndef RPHANIM_H
+#define RPHANIM_H
+
+/**
+ * Hierarchal animation plugin
+ */
+
+/* Doxygen plugin groups. */
+
+/**
+ * \defgroup rphanim RpHAnim
+ * \ingroup rpplugin
+ *
+ * Hierarchical Animation Plugin for RenderWare Graphics.
+ */
+
+/**
+ * \defgroup rphanimchanges RpHAnim Changes
+ * \ingroup rphanim
+ *
+ */
+
+/****************************************************************************
+ Includes
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <rwcore.h>
+#include <rpworld.h>
+
+#include <rpcriter.h> /* Note: each vendor can choose their own method for
+ * allocation of unique ID's. This file defines
+ * the ID's used by Criterion.
+ */
+#include <rphanim.rpe> /* automatically generated header file */
+#include <rtquat.h>
+
+#define rpHANIMSTREAMCURRENTVERSION 0x100
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimAtomicGlobalVars typedef for struct RpHAnimAtomicGlobalVars
+ */
+typedef struct RpHAnimAtomicGlobalVars RpHAnimAtomicGlobalVars;
+
+/**
+ * \ingroup rphanim
+ * \struct RpHAnimAtomicGlobalVars
+ */
+struct RpHAnimAtomicGlobalVars
+{
+ RwInt32 engineOffset ; /* Offset into global data */
+ RwFreeList *HAnimFreeList;
+ RwFreeList *HAnimAnimationFreeList;
+};
+
+extern RpHAnimAtomicGlobalVars RpHAnimAtomicGlobals;
+
+#define rpHANIMSTDKEYFRAMESIZE sizeof(RpHAnimStdKeyFrame)
+#define rpHANIMSTDKEYFRAMETYPEID 0x1
+
+#define RwAnimMalloc() \
+ RwFreeListAlloc(RpHAnimAtomicGlobals.HAnimFreeList)
+
+#define RwAnimFree(_anim) \
+ RwFreeListFree(RpHAnimAtomicGlobals.HAnimFreeList, (_anim))
+
+#define RwAnimAnimationMalloc() \
+ RwFreeListAlloc(RpHAnimAtomicGlobals.HAnimAnimationFreeList)
+
+#define RwAnimAnimationFree(_animAnimation) \
+ RwFreeListFree(RpHAnimAtomicGlobals.HAnimAnimationFreeList, \
+ (_animAnimation))
+
+#define RpV3dInterpolate(o, a, s, b) \
+MACRO_START \
+{ \
+ (o)->x = (((a)->x) + ((s)) * (((b)->x) - ((a)->x))); \
+ (o)->y = (((a)->y) + ((s)) * (((b)->y) - ((a)->y))); \
+ (o)->z = (((a)->z) + ((s)) * (((b)->z) - ((a)->z))); \
+} \
+MACRO_STOP
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimHierarchy typedef for struct RpHAnimHierarchy
+ */
+typedef struct RpHAnimHierarchy RpHAnimHierarchy;
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimAnimation typedef for struct RpHAnimAnimation
+ */
+typedef struct RpHAnimAnimation RpHAnimAnimation;
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimHierarchyCallBack
+ * This typedef defines a callback function for use with the
+ * \ref RpHAnimHierarchySetAnimCallBack and
+ * \ref RpHAnimHierarchySetAnimLoopCallBack functions.
+ *
+ * \param hierarchy
+ * A pointer to the AnimHierarchy structure.
+ *
+ * \param data User-defined data.
+ * You can use this to pass your own data
+ * structure(s) to the callback function.
+ *
+ * \see RpHAnimHierarchySetAnimCallBack
+ * \see RpHAnimHierarchySetAnimLoopCallBack
+ *
+ */
+
+typedef RpHAnimHierarchy * (*RpHAnimHierarchyCallBack) (RpHAnimHierarchy *hierarchy,
+ void *data);
+
+/*
+ * The following CallBacks are needed for each overloaded interpolation
+ * scheme. See RpHAnimInterpolatorInfo.
+ */
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimKeyFrameToMatrixCallBack
+ * This typedef defines a callback function for converting
+ * an animation keyframe into a modeling matrix. The output matrix will be
+ * used to construct the array of world or local space matrices for the
+ * hierarchy as obtained with \ref RpHAnimHierarchyGetMatrixArray, and
+ * possibly used for updating an external \ref RwFrame hierarchy.
+ *
+ * \param matrix This is the matrix to store the output of the conversion
+ * \param voidIFrame This is a void pointer to the keyframe and should be cast
+ * to the keyframe type this callback is for.
+ */
+typedef void (*RpHAnimKeyFrameToMatrixCallBack) (RwMatrix *matrix, void *voidIFrame);
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimKeyFrameBlendCallBack
+ * This typedef defines a callback function for blending between two animation
+ * keyframes by the given blend factor.
+ *
+ * \param voidOut This is the void pointer for the output of the blend
+ * \param voidIn1 First input keyframe
+ * \param voidIn2 Second input keyframe
+ * \param alpha Blend factor
+ */
+typedef void (*RpHAnimKeyFrameBlendCallBack) (void *voidOut, void *voidIn1,
+ void *voidIn2, RwReal alpha);
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimKeyFrameInterpolateCallBack
+ * This typedef defines a callback function for interpolating between two
+ * animation keyframes according to the given time.
+ *
+ * \param voidOut This is the void pointer for the output of the
+ * interpolation
+ * \param voidIn1 First input keyframe
+ * \param voidIn2 Second input keyframe
+ * \param time Time at which to interpolate
+ */
+typedef void (*RpHAnimKeyFrameInterpolateCallBack) (void *voidOut, void *voidIn1,
+ void *voidIn2, RwReal time);
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimKeyFrameAddCallBack
+ * This typedef defines a callback function for adding together two animation
+ * keyframes. One of the keyframes would usually be a delta.
+ *
+ * \param voidOut This is the void pointer for the output summed keyframe
+ * \param voidIn1 First input keyframe
+ * \param voidIn2 Second input keyframe
+ */
+typedef void (*RpHAnimKeyFrameAddCallBack) (void *voidOut, void *voidIn1,
+ void *voidIn2);
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimKeyFrameMulRecipCallBack
+ * This typedef defines a callback function for multiplying a keyframe
+ * by the inverse of another keyframe
+ *
+ * \param voidFrame This is the void pointer for the keyframe to be modified
+ * \param voidStart First start keyframe to take the reciprocal of.
+ */
+typedef void (*RpHAnimKeyFrameMulRecipCallBack) (void *voidFrame, void *voidStart);
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimKeyFrameStreamReadCallBack
+ * This typedef defines a callback function for reading in keyframes
+ * from an \ref RwStream for the given animation.
+ *
+ * \param stream The stream to read the keyframes from
+ * \param animation The animation to read the keyframes into
+ *
+ * \return Pointer to the animation.
+ */
+typedef RpHAnimAnimation * (*RpHAnimKeyFrameStreamReadCallBack) (RwStream *stream, RpHAnimAnimation *animation);
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimKeyFrameStreamWriteCallBack
+ * This typedef defines a callback function for writing keyframes from the
+ * given animation to an \ref RwStream.
+ *
+ * \param animation The animation to write out from
+ * \param stream The stream to write the keyframes to
+ *
+ * \return TRUE if successful.
+ */
+typedef RwBool (*RpHAnimKeyFrameStreamWriteCallBack) (RpHAnimAnimation *animation, RwStream *stream);
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimKeyFrameStreamGetSizeCallBack
+ * This typedef defines a callback function for calculating the binary stream
+ * size of keyframe data within an animation.
+ *
+ * \param animation The animation to calculate sizes of
+ *
+ * \return Size in bytes of the keyframe data.
+ */
+typedef RwInt32 (*RpHAnimKeyFrameStreamGetSizeCallBack) (RpHAnimAnimation *animation);
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimInterpolatorInfo
+ * typedef for struct \ref RpHAnimInterpolatorInfo
+ */
+typedef struct RpHAnimInterpolatorInfo RpHAnimInterpolatorInfo;
+
+/**
+ * \ingroup rphanim
+ * \struct RpHAnimInterpolatorInfo
+ * This is used to hold information for a keyframe interpolation scheme.
+ *
+ * \see RpHAnimRegisterInterpolationScheme
+ * \see RpHAnimGetInterpolatorInfo
+ */
+struct RpHAnimInterpolatorInfo
+{
+ RwInt32 typeID; /**< The ID of the interpolation scheme */
+ RwInt32 keyFrameSize; /**< Size in bytes of the keyframe structure */
+ RpHAnimKeyFrameToMatrixCallBack keyFrameToMatrixCB; /**< Pointer to a function that converts a keyframe to a matrix */
+ RpHAnimKeyFrameBlendCallBack keyFrameBlendCB; /**< Pointer to a function that blends between a pair of keyframes for a given delta value */
+ RpHAnimKeyFrameInterpolateCallBack keyFrameInterpolateCB; /**< Pointer to a function that interpolates between two keyframes for a given time in between */
+ RpHAnimKeyFrameAddCallBack keyFrameAddCB; /**< Pointer to a function that adds two keyframes (one of which may be a delta) */
+ RpHAnimKeyFrameMulRecipCallBack keyFrameMulRecipCB; /**< Pointer to a function that multiplies a keyframe by the reciprocal of another */
+ RpHAnimKeyFrameStreamReadCallBack keyFrameStreamReadCB; /**< Pointer to a function that reads the keyframes from a stream for a given animation */
+ RpHAnimKeyFrameStreamWriteCallBack keyFrameStreamWriteCB; /**< Pointer to a function that writes the keyframes to a stream for a given animation */
+ RpHAnimKeyFrameStreamGetSizeCallBack keyFrameStreamGetSizeCB; /**< Pointer to a function that returns the binary stream size of the keyframes for a given animation */
+};
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimKeyFrameHeader
+ * typedef for struct RpHAnimKeyFrameHeader
+ */
+typedef struct RpHAnimKeyFrameHeader RpHAnimKeyFrameHeader;
+
+/**
+ * \ingroup rphanim
+ * \struct RpHAnimKeyFrameHeader
+ * Holds header information for a keyframe. All keyframe structures used with
+ * the overloadable interpolation system should start with this data.
+ *
+ * \see RpHAnimStdKeyFrame
+ * \see RpHAnimRegisterInterpolationScheme
+ */
+struct RpHAnimKeyFrameHeader
+{
+ void *prevFrame; /**< Previous keyframe for particular hierarchy node */
+ RwReal time; /**< Time at keyframe */
+};
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimStdKeyFrame
+ * typedef for struct RpHAnimStdKeyFrame
+ */
+typedef struct RpHAnimStdKeyFrame RpHAnimStdKeyFrame;
+
+/**
+ * \ingroup rphanim
+ * \struct RpHAnimStdKeyFrame
+ * A structure representing the standard keyframe data. Sequences of
+ * such keyframes in an \ref RpHAnimAnimation defines the animation of each
+ * node in a hierarchy.
+ */
+struct RpHAnimStdKeyFrame
+{
+ RpHAnimStdKeyFrame *prevFrame; /**< Previous keyframe for particular hierarchy node */
+ RwReal time; /**< Time at keyframe */
+ RtQuat q; /**< Quaternion rotation at keyframe */
+ RwV3d t; /**< Translation at keyframe */
+};
+
+/* Flags for FrameInfos */
+
+#define rpHANIMPOPPARENTMATRIX 0x01
+#define rpHANIMPUSHPARENTMATRIX 0x02
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimNodeInfo
+ * typedef for struct RpHAnimNodeInfo
+ */
+typedef struct RpHAnimNodeInfo RpHAnimNodeInfo;
+
+/**
+ * \ingroup rphanim
+ * \struct RpHAnimNodeInfo
+ *
+ */
+struct RpHAnimNodeInfo
+{
+ RwInt32 nodeID; /**< User defined ID for this node */
+ RwInt32 nodeIndex; /**< Array index of node */
+ RwInt32 flags; /**< Matrix push/pop flags */
+ RwFrame * pFrame; /**< Pointer to an attached RwFrame (see \ref RpHAnimHierarchyAttach) */
+};
+
+/**
+ * \ingroup rphanim
+ * \struct RpHAnimAnimation
+ * A hierarchical animation consists of an array of keyframe structures,
+ * along with some flags and a duration.
+ *
+ * The keyframes should be presented in the order they are needed
+ * to animate forwards through time. Pointers link all of the keyframes
+ * for a particular node backwards through time in a list.
+ *
+ * For example, a 3 node animation, with keyframes at the following times:
+ *
+ * Node 1: 0.0, 1.0, 2.0, 3.0
+ * Node 2: 0.0, 3.0
+ * Node 3: 0.0, 2.0, 2.5, 3.0
+ *
+ * should be formatted in an RpHAnimAnimation animation like this:
+ *
+ * B1,0.0 B2,0.0 B3,0.0 B1,1.0, B2,3.0, B3,2.0, B1,2.0, B1,3.0, B3,2.5 B3,3.0
+ *
+ * Each node MUST start at time = 0.0, and each node must terminate with a keyframe
+ * at time = duration of animation.
+ *
+ * \see RpHAnimAnimationCreate
+ */
+struct RpHAnimAnimation
+{
+ RpHAnimInterpolatorInfo *interpInfo; /**< Pointer to interpolation scheme information */
+ RwInt32 numFrames; /**< Number of keyframes in the animation */
+ RwInt32 flags; /**< Specifies details about animation, relative translation modes etc */
+ RwReal duration; /**< Duration of animation in seconds */
+ void *pFrames; /**< Pointer to the animation keyframes */
+};
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimHierarchyFlag defines type and update modes in HAnimHierarchies
+ *
+ * \see RpAnimHierarchyFlag
+ */
+enum RpHAnimHierarchyFlag
+{
+ /* creation flags */
+ rpHANIMHIERARCHYSUBHIERARCHY = 0x01, /**< This hierarchy is a sub-hierarchy */
+ rpHANIMHIERARCHYNOMATRICES = 0x02, /**< This hierarchy has no local matrices */
+
+ /* update flags */
+ rpHANIMHIERARCHYUPDATEMODELLINGMATRICES = 0x1000, /**< This hierarchy updates modeling matrices */
+ rpHANIMHIERARCHYUPDATELTMS = 0x2000, /**< This hierarchy updates LTMs */
+ rpHANIMHIERARCHYLOCALSPACEMATRICES = 0x4000, /**< This hierarchy calculates matrices in a space
+ relative to its root */
+
+ rpHANIMHIERARCHYFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+
+/**
+ * \ingroup rphanim
+ * \typedef RpHAnimHierarchyFlag
+ * These flags are used to control the creation and
+ * update status of the hierarchy
+ */
+typedef enum RpHAnimHierarchyFlag RpHAnimHierarchyFlag;
+
+/**
+ * \ingroup rphanim
+ * \struct RpHAnimHierarchy
+ * An RpHAnimHierarchy is used to "play back" an animation - it holds the
+ * interpolated keyframe data for the current state of an animation
+ * concatenated on the end of the structure.
+ *
+ * The rpHANIMHIERARCHYGETINTERPFRAME() macro can be used to access the current
+ * interpolated data, for the current time or to write to this data to override
+ * it with procedural animation.
+ *
+ * The structure of a hierarchy is defined by an array
+ * of \ref RpHAnimNodeInfo structures.
+ *
+ * The hierarchy is defined by running through the node array in order,
+ * pushing the parent-node's matrix whenever a child is reached that has
+ * more than one sibling, and popping the parent matrix when a "leaf"
+ * node is encountered.
+ *
+ */
+struct RpHAnimHierarchy
+{
+ RwInt32 flags; /**< Flags for the hierarchy */
+ RwInt32 numNodes; /**< Number of nodes in the hierarchy */
+ RpHAnimAnimation *pCurrentAnim; /**< Current animation applied to hierarchy */
+ RwReal currentTime; /**< Current animation time */
+ void *pNextFrame; /**< Next animation keyframe to be played */
+ RpHAnimHierarchyCallBack pAnimCallBack; /**< Animation callback function pointer */
+ void *pAnimCallBackData; /**< Animation callback function user data */
+ RwReal animCallBackTime; /**< Trigger time for callback function */
+ RpHAnimHierarchyCallBack pAnimLoopCallBack; /**< Animation loop callback function pointer */
+ void *pAnimLoopCallBackData; /**< Animation loop callback function data */
+ RwMatrix *pMatrixArray; /**< Pointer to node matrices*/
+ void *pMatrixArrayUnaligned; /**< Pointer to memory used for node matrices
+ * from which the aligned pMatrixArray is allocated */
+ RpHAnimNodeInfo *pNodeInfo; /**< Array of node information (push/pop flags etc) */
+ RwFrame *parentFrame; /**< Pointer to the Root RwFrame of the hierarchy this
+ * RpHAnimHierarchy represents */
+ RwInt32 maxKeyFrameSize; /**< Maximum size of keyframes usable on this hierarhcy
+ * (set at creation time) */
+ RwInt32 currentKeyFrameSize; /**< Size of keyframes in the current animation */
+ RpHAnimKeyFrameToMatrixCallBack keyFrameToMatrixCB; /**< Internal use */
+ RpHAnimKeyFrameBlendCallBack keyFrameBlendCB; /**< Internal use */
+ RpHAnimKeyFrameInterpolateCallBack keyFrameInterpolateCB; /**< Internal use */
+ RpHAnimKeyFrameAddCallBack keyFrameAddCB; /**< Internal use */
+ RpHAnimHierarchy *parentHierarchy; /**< Internal use */
+ RwInt32 offsetInParent; /**< Internal use */
+ RwInt32 rootParentOffset; /**< Internal use */
+};
+
+#define rpHANIMHIERARCHYGETINTERPFRAME( hierarchy, nodeIndex ) \
+ ( (void *)( ( (RwUInt8 *)&(hierarchy[1]) + \
+ ((nodeIndex) * \
+ hierarchy->currentKeyFrameSize) ) ) )
+
+#define rpHANIMHIERARCHYGETINTERPFRAME1( hierarchy, nodeIndex ) \
+ ( (void *)( ( (RwUInt8 *)&(hierarchy[1]) + \
+ ((hierarchy->numNodes + \
+ (nodeIndex)) * \
+ hierarchy->currentKeyFrameSize) ) ) )
+
+#define rpHANIMHIERARCHYGETINTERPFRAME2( hierarchy, nodeIndex ) \
+ ( (void *)( ( (RwUInt8 *)&(hierarchy[1]) + \
+ ((hierarchy->numNodes * 2 + \
+ (nodeIndex)) * \
+ hierarchy->currentKeyFrameSize) ) ) )
+
+/**
+ * \ingroup rphanim
+ * \ref RpHAnimFrameExtension typedef for struct RpHAnimFrameExtension
+ */
+
+typedef struct RpHAnimFrameExtension RpHAnimFrameExtension;
+
+/**
+ * \ingroup rphanim
+ * \struct RpHAnimFrameExtension
+ */
+struct RpHAnimFrameExtension
+{
+ RwInt32 id; /**< ID given to this RwFrame (default of -1) */
+ RpHAnimHierarchy *hierarchy; /**< Pointer to Animation hierarchy attached to this RwFrame */
+};
+
+/*--- Plugin API Functions ---*/
+
+#define RpHAnimHierarchySetFlagsMacro(hierarchy, _flags) \
+MACRO_START \
+{ \
+ (hierarchy)->flags = _flags; \
+} \
+MACRO_STOP
+
+#define RpHAnimHierarchyGetFlagsMacro(hierarchy) \
+ ((hierarchy)->flags)
+
+#define RpHAnimStdKeyFrameToMatrixMacro(_matrix, _voidIFrame) \
+MACRO_START \
+{ \
+ RpHAnimStdKeyFrame * iFrame = (RpHAnimStdKeyFrame *)(_voidIFrame); \
+ \
+ /* \
+ * RpHAnim uses the same types of quaternion as RtQuat \
+ * hence no conjugate call as in RpSkin \
+ */ \
+ \
+ RtQuatUnitConvertToMatrix(&iFrame->q, (_matrix)); \
+ \
+ (_matrix)->pos.x = iFrame->t.x; \
+ (_matrix)->pos.y = iFrame->t.y; \
+ (_matrix)->pos.z = iFrame->t.z; \
+} \
+MACRO_STOP
+
+
+#if (! defined(RWDEBUG))
+
+#define RpHAnimHierarchySetFlags(hierarchy, _flags) \
+ RpHAnimHierarchySetFlagsMacro(hierarchy, _flags)
+
+#define RpHAnimHierarchyGetFlags(hierarchy) \
+ (RpHAnimHierarchyFlag)RpHAnimHierarchyGetFlagsMacro(hierarchy)
+
+#endif /* (! defined(RWDEBUG)) */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#if (defined(RWDEBUG))
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchySetFlags(RpHAnimHierarchy *hierarchy,
+ RpHAnimHierarchyFlag flags);
+
+extern RpHAnimHierarchyFlag
+RpHAnimHierarchyGetFlags(RpHAnimHierarchy *hierarchy);
+
+#endif /* (defined(RWDEBUG)) */
+
+/* Keyframe Interpolator Types */
+
+extern RwBool
+RpHAnimRegisterInterpolationScheme(RpHAnimInterpolatorInfo *interpolatorInfo);
+
+extern RpHAnimInterpolatorInfo *
+RpHAnimGetInterpolatorInfo(RwInt32 typeID);
+
+/* Animation hierarchy creation */
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchyCreate(RwInt32 numNodes,
+ RwUInt32 *nodeFlags,
+ RwInt32 *nodeIDs,
+ RpHAnimHierarchyFlag flags,
+ RwInt32 maxKeyFrameSize);
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchyCreateFromHierarchy(RpHAnimHierarchy *hierarchy,
+ RpHAnimHierarchyFlag flags,
+ RwInt32 maxKeyFrameSize);
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchyDestroy(RpHAnimHierarchy *hierarchy);
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchyCreateSubHierarchy(RpHAnimHierarchy *parentHierarchy,
+ RwInt32 startNode,
+ RpHAnimHierarchyFlag flags,
+ RwInt32 maxKeyFrameSize);
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchyAttach(RpHAnimHierarchy *hierarchy);
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchyDetach(RpHAnimHierarchy *hierarchy);
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchyAttachFrameIndex(RpHAnimHierarchy *hierarchy,
+ RwInt32 nodeIndex);
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchyDetachFrameIndex(RpHAnimHierarchy *hierarchy,
+ RwInt32 nodeIndex);
+
+extern RwBool
+RpHAnimFrameSetHierarchy(RwFrame *frame,
+ RpHAnimHierarchy *hierarchy);
+
+extern RpHAnimHierarchy *
+RpHAnimFrameGetHierarchy(RwFrame *frame);
+
+/* Macros for legacy support of old function names */
+#define RpHAnimSetHierarchy(frame, hierarchy) \
+ RpHAnimFrameSetHierarchy(frame, hierarchy)
+#define RpHAnimGetHierarchy(frame) RpHAnimFrameGetHierarchy(frame)
+
+extern RwBool
+RpHAnimHierarchySetKeyFrameCallBacks(RpHAnimHierarchy *hierarchy,
+ RwInt32 keyFrameTypeID);
+
+extern RwBool
+RpHAnimHierarchySetCurrentAnim(RpHAnimHierarchy *hierarchy,
+ RpHAnimAnimation *anim);
+
+extern RwBool
+RpHAnimHierarchySetCurrentAnimTime(RpHAnimHierarchy *hierarchy,
+ RwReal time);
+
+extern RwBool
+RpHAnimHierarchySubAnimTime(RpHAnimHierarchy *hierarchy,
+ RwReal time);
+
+extern RwBool
+RpHAnimHierarchyStdKeyFrameAddAnimTime(RpHAnimHierarchy *hierarchy,
+ RwReal time);
+
+extern RwBool
+RpHAnimHierarchyAddAnimTime(RpHAnimHierarchy *hierarchy,
+ RwReal time);
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchySetAnimCallBack(RpHAnimHierarchy *hierarchy,
+ RpHAnimHierarchyCallBack callBack,
+ RwReal time,
+ void *data );
+
+extern RpHAnimHierarchy *
+RpHAnimHierarchySetAnimLoopCallBack(RpHAnimHierarchy *hierarchy,
+ RpHAnimHierarchyCallBack callBack,
+ void *data );
+
+extern RwMatrix *
+RpHAnimHierarchyGetMatrixArray(RpHAnimHierarchy *hierarchy);
+
+extern RwBool
+RpHAnimHierarchyUpdateMatrices(RpHAnimHierarchy *hierarchy);
+
+/* Macro for legacy support of old function name */
+#define RpHAnimUpdateHierarchyMatrices RpHAnimHierarchyUpdateMatrices
+
+extern RwInt32
+RpHAnimIDGetIndex(RpHAnimHierarchy *hierarchy,
+ RwInt32 ID);
+
+/* Animations */
+
+extern RpHAnimAnimation *
+RpHAnimAnimationCreate(RwInt32 typeID,
+ RwInt32 numFrames,
+ RwInt32 flags,
+ RwReal duration);
+
+extern RpHAnimAnimation *
+RpHAnimAnimationDestroy(RpHAnimAnimation *animation);
+
+#ifdef RWDEBUG
+
+extern RwInt32
+RpHAnimAnimationGetTypeID(RpHAnimAnimation *animation);
+
+#else /* RWDEBUG */
+
+#define RpHAnimAnimationGetTypeID(animation) \
+ (animation->interpInfo->typeID)
+
+#endif /* RWDEBUG */
+
+extern RpHAnimAnimation *
+RpHAnimAnimationRead(const RwChar * filename);
+
+extern RwBool
+RpHAnimAnimationWrite(RpHAnimAnimation *animation,
+ const RwChar * filename);
+
+extern RpHAnimAnimation *
+RpHAnimAnimationStreamRead(RwStream *stream);
+
+extern RwBool
+RpHAnimAnimationStreamWrite(RpHAnimAnimation *animation,
+ RwStream *stream);
+
+extern RwInt32
+RpHAnimAnimationStreamGetSize(RpHAnimAnimation *animation);
+
+extern RwBool
+RpHAnimAnimationMakeDelta(RpHAnimAnimation *animation,
+ RwInt32 numNodes,
+ RwReal time);
+
+/* Plugin support */
+
+extern RwBool
+RpHAnimPluginAttach(void);
+
+/* Overloadable keyframe functions */
+
+#define RpHAnimFrameToMatrixMacro(hierarchy, matrix, iFrame) \
+MACRO_START \
+{ \
+ const RpHAnimKeyFrameToMatrixCallBack keyFrameToMatrixCB = \
+ (hierarchy)->keyFrameToMatrixCB; \
+ \
+ if (RpHAnimStdKeyFrameToMatrix == keyFrameToMatrixCB) \
+ { \
+ RpHAnimStdKeyFrameToMatrixMacro((matrix), (iFrame)); \
+ } \
+ else \
+ { \
+ keyFrameToMatrixCB((matrix), (iFrame)); \
+ } \
+} \
+MACRO_STOP
+
+#define RpHAnimFrameInterpolateMacro(hierarchy, out, in1, in2, time) \
+MACRO_START \
+{ \
+ (hierarchy)->keyFrameInterpolateCB((out), (in1), (in2), (time)); \
+} \
+MACRO_STOP
+
+#define RpHAnimFrameBlendMacro(hierarchy, out, in1, in2, fAlpha) \
+MACRO_START \
+{ \
+ (hierarchy)->keyFrameBlendCB((out), (in1), (in2), (fAlpha)); \
+} \
+MACRO_STOP
+
+#define RpHAnimFrameAddTogetherMacro(hierarchy, out, in1, in2) \
+MACRO_START \
+{ \
+ (hierarchy)->keyFrameAddCB((out), (in1), (in2)); \
+} \
+MACRO_STOP
+
+#ifdef RWDEBUG
+void
+RpHAnimFrameInterpolate(RpHAnimHierarchy *hierarchy,
+ void *out, void *in1,
+ void *in2, RwReal time);
+
+void
+RpHAnimFrameBlend(RpHAnimHierarchy *hierarchy,
+ void *out,
+ void *in1,
+ void *in2,
+ RwReal alpha);
+
+void
+RpHAnimFrameToMatrix(RpHAnimHierarchy *hierarchy,
+ RwMatrix *matrix, void *iFrame);
+
+void
+RpHAnimFrameAddTogether(RpHAnimHierarchy *hierarchy,
+ void *out, void *in1, void *in2);
+
+#else /* RWDEBUG */
+
+#define RpHAnimFrameToMatrix(hierarchy, matrix, iFrame) \
+ RpHAnimFrameToMatrixMacro(hierarchy, matrix, iFrame)
+
+#define RpHAnimFrameInterpolate(hierarchy, out, in1, in2, time) \
+ RpHAnimFrameInterpolateMacro(hierarchy, out, in1, in2, time)
+
+#define RpHAnimFrameBlend(hierarchy, out, in1, in2, alpha) \
+ RpHAnimFrameBlendMacro(hierarchy, out, in1, in2, alpha)
+
+#define RpHAnimFrameAddTogether(hierarchy, out, in1, in2) \
+ RpHAnimFrameAddTogetherMacro(hierarchy, out, in1, in2)
+
+#endif /* RWDEBUG */
+
+/* Standard keyframe functions */
+
+extern void
+RpHAnimStdKeyFrameToMatrix(RwMatrix *matrix,
+ void * voidIFrame);
+
+extern void
+RpHAnimStdKeyFrameBlend(void *voidOut,
+ void *voidIn1,
+ void *voidIn2,
+ RwReal alpha);
+
+extern void
+RpHAnimStdKeyFrameInterpolate(void *voidOut,
+ void *voidIn1,
+ void *voidIn2,
+ RwReal time);
+
+extern void
+RpHAnimStdKeyFrameAdd(void *voidOut,
+ void *voidIn1,
+ void *voidIn2);
+
+extern void
+RpHAnimStdKeyFrameMulRecip(void *voidFrame,
+ void *voidStart);
+
+extern RpHAnimAnimation *
+RpHAnimStdKeyFrameStreamRead(RwStream *stream,
+ RpHAnimAnimation *animation);
+
+extern RwBool
+RpHAnimStdKeyFrameStreamWrite(RpHAnimAnimation *animation,
+ RwStream *stream);
+
+extern RwInt32
+RpHAnimStdKeyFrameStreamGetSize(RpHAnimAnimation *animation);
+
+/* Hierarchy blending/combination functions */
+
+extern RwBool
+RpHAnimHierarchyBlend(RpHAnimHierarchy *outHierarchy,
+ RpHAnimHierarchy *inHierarchy1,
+ RpHAnimHierarchy *inHierarchy2,
+ RwReal alpha);
+extern RwBool
+RpHAnimHierarchyAddTogether(RpHAnimHierarchy *outHierarchy,
+ RpHAnimHierarchy *inHierarchy1,
+ RpHAnimHierarchy *inHierarchy2);
+
+extern RwBool
+RpHAnimHierarchyBlendSubHierarchy(RpHAnimHierarchy *outHierarchy,
+ RpHAnimHierarchy *inHierarchy1,
+ RpHAnimHierarchy *inHierarchy2,
+ RwReal alpha);
+extern RwBool
+RpHAnimHierarchyAddSubHierarchy(RpHAnimHierarchy *outHierarchy,
+ RpHAnimHierarchy *mainHierarchy,
+ RpHAnimHierarchy *subHierarchy);
+
+extern RwBool
+RpHAnimHierarchyCopy(RpHAnimHierarchy *outHierarchy,
+ RpHAnimHierarchy *inHierarchy);
+
+/* Access to RwFrame ID's */
+
+extern RwBool
+RpHAnimFrameSetID(RwFrame *frame,
+ RwInt32 id);
+
+extern RwInt32
+RpHAnimFrameGetID(RwFrame *frame);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* RPHANIM_H */