summaryrefslogtreecommitdiffstats
path: root/sdk/rwsdk/include/d3d8/rtanim.h
diff options
context:
space:
mode:
Diffstat (limited to 'sdk/rwsdk/include/d3d8/rtanim.h')
-rw-r--r--sdk/rwsdk/include/d3d8/rtanim.h638
1 files changed, 638 insertions, 0 deletions
diff --git a/sdk/rwsdk/include/d3d8/rtanim.h b/sdk/rwsdk/include/d3d8/rtanim.h
new file mode 100644
index 00000000..4def7f1f
--- /dev/null
+++ b/sdk/rwsdk/include/d3d8/rtanim.h
@@ -0,0 +1,638 @@
+#ifndef RTANIM_H
+#define RTANIM_H
+
+#include <rtanim.rpe> /* automatically generated header file */
+
+#define rtANIMSTREAMCURRENTVERSION 0x100
+
+/* Doxygen plugin groups. */
+
+/**
+ * \defgroup rtanim RtAnim
+ * \ingroup animtools
+ *
+ * Animation Toolkit for RenderWare Graphics.
+ */
+
+/**
+ * \ingroup rtanim
+ * Typedef for struct \ref RtAnimAnimation.
+ */
+typedef struct RtAnimAnimation RtAnimAnimation;
+
+/*
+ * The following CallBacks are needed for each interpolation scheme.
+ * See RtAnimInterpolatorInfo.
+ */
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimKeyFrameApplyCallBack
+ * defines a callback function for converting
+ * an interpolated animation keyframe into the required result.
+ *
+ * \param result Void pointer to store the output of the conversion.
+ * \param voidIFrame Void pointer to the keyframe and should be cast
+ * to the interpolated keyframe type this callback
+ * is for.
+ */
+typedef void (*RtAnimKeyFrameApplyCallBack) (void *result, void *voidIFrame);
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimKeyFrameBlendCallBack
+ * defines a callback function for blending between two
+ * interpolated keyframes by the given blend factor. This is used for
+ * blending the states of two different \ref RtAnimInterpolator objects.
+ * The \ref RtAnimKeyFrameInterpolateCallBack is used for interpolating
+ * actual animation keyframes into an interpolated frame.
+ *
+ * \param voidOut Void pointer to store the output of the blend.
+ * \param voidIn1 Void pointer containing the first input
+ * interpolated keyframe.
+ * \param voidIn2 Void pointer containing the second input
+ * interpolated keyframe.
+ * \param alpha \ref RwReal containing the blend factor.
+ */
+typedef void (*RtAnimKeyFrameBlendCallBack) (void *voidOut, void *voidIn1,
+ void *voidIn2, RwReal alpha);
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimKeyFrameInterpolateCallBack
+ * defines a callback function for interpolating between two
+ * animation keyframes according to the given time. The output is
+ * an interpolated frame object residing in an \ref RtAnimInterpolator
+ * and will usually have the same structure as the keyframe apart from
+ * the header data (\ref RtAnimInterpFrameHeader).
+ *
+ * \param voidOut Void pointer for the output of the interpolation.
+ * \param voidIn1 Void pointer containing the first input keyframe.
+ * \param voidIn2 Void pointer containing the second input keyframe.
+ * \param time \ref RwReal containing the time at which to interpolate.
+ */
+typedef void (*RtAnimKeyFrameInterpolateCallBack) (void *voidOut, void *voidIn1,
+ void *voidIn2, RwReal time);
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimKeyFrameAddCallBack
+ * defines a callback function for adding two interpolated
+ * keyframes together. This is used when adding the states of two
+ * \ref RtAnimInterpolator objects, such as when adding a delta animation
+ * to a base animation.
+ *
+ * \param voidOut Void pointer for the output interpolated frame.
+ * \param voidIn1 Void pointer containing the first input
+ * interpoalted keyframe.
+ * \param voidIn2 Void pointer containing the second input
+ * interpolated keyframe.
+ */
+typedef void (*RtAnimKeyFrameAddCallBack) (void *voidOut, void *voidIn1,
+ void *voidIn2);
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimKeyFrameMulRecipCallBack
+ * defines a callback function for multiplying a keyframe
+ * by the inverse of another keyframe. This is used for creating delta
+ * animations.
+ *
+ * \param voidFrame Void pointer for the keyframe to be modified.
+ * \param voidStart Void pointer for the start keyframe to take the reciprocal of.
+ */
+typedef void (*RtAnimKeyFrameMulRecipCallBack)
+ (void *voidFrame, void *voidStart);
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimKeyFrameStreamReadCallBack
+ * defines a callback function for reading in keyframes
+ * from an \ref RwStream for the given animation.
+ *
+ * \param stream Pointer to the \ref RwStream to read the keyframes from.
+ * \param animation Pointer to the \ref RtAnimAnimation to read the keyframes into.
+ *
+ * \return Pointer to the \ref RtAnimAnimation.
+ */
+typedef RtAnimAnimation * (*RtAnimKeyFrameStreamReadCallBack)
+ (RwStream *stream, RtAnimAnimation *animation);
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimKeyFrameStreamWriteCallBack
+ * defines a callback function for writing keyframes from the
+ * given animation to an \ref RwStream.
+ *
+ * \param animation Pointer to the \ref RtAnimAnimation to write out from.
+ * \param stream Pointer to the \ref RwStream to write the keyframes to.
+ *
+ * \return \ref RwBool, TRUE if successful.
+ */
+typedef RwBool (*RtAnimKeyFrameStreamWriteCallBack)
+ (RtAnimAnimation *animation, RwStream *stream);
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimKeyFrameStreamGetSizeCallBack
+ * defines a callback function for calculating the binary stream
+ * size of keyframe data within an animation.
+ *
+ * \param animation Pointer to the \ref RtAnimAnimation to calculate sizes from.
+ *
+ * \return \ref RwInt32 containing the size, in bytes, of the keyframe data.
+ */
+typedef RwInt32 (*RtAnimKeyFrameStreamGetSizeCallBack)
+ (RtAnimAnimation *animation);
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimInterpolatorInfo
+ * Typedef for struct \ref RtAnimInterpolatorInfo
+ */
+typedef struct RtAnimInterpolatorInfo RtAnimInterpolatorInfo;
+
+/**
+ * \ingroup rtanim
+ * \struct RtAnimInterpolatorInfo
+ * This structure is used to hold information for a keyframe interpolation scheme.
+ *
+ * \see RtAnimRegisterInterpolationScheme
+ * \see RtAnimGetInterpolatorInfo
+ */
+struct RtAnimInterpolatorInfo
+{
+ RwInt32 typeID;
+ /**< The ID of the interpolation scheme. */
+ RwInt32 keyFrameSize;
+ /**< Size, in bytes, of the keyframe structure. */
+ RtAnimKeyFrameApplyCallBack keyFrameApplyCB;
+ /**< Pointer to a function that converts a keyframe to the needed
+ * format. This function is never called from the \ref rtanim
+ * toolkit (as the toolit doesn't know the data layout of the
+ * results) but is stored to ease the creation of overloaded
+ * interpolators. */
+ RtAnimKeyFrameBlendCallBack keyFrameBlendCB;
+ /**< Pointer to a function that blends between two
+ * interpolated keyframes, for the purpose of blending
+ * between the states of two \ref RtAnimInterpolator objects. */
+ RtAnimKeyFrameInterpolateCallBack keyFrameInterpolateCB;
+ /**< Pointer to a function that interpolates between two keyframes
+ * for a given time in between. */
+ RtAnimKeyFrameAddCallBack keyFrameAddCB;
+ /**< Pointer to a function that adds two interpolated keyframes
+ * for the purpose of adding the states of two
+ * \ref RtAnimInterpolator objects. */
+ RtAnimKeyFrameMulRecipCallBack keyFrameMulRecipCB;
+ /**< Pointer to a function that multiplies a keyframe by the
+ * reciprocal of another. */
+ RtAnimKeyFrameStreamReadCallBack keyFrameStreamReadCB;
+ /**< Pointer to a function that reads the keyframes from a stream
+ * for a given animation. */
+ RtAnimKeyFrameStreamWriteCallBack keyFrameStreamWriteCB;
+ /**< Pointer to a function that writes the keyframes to a stream for
+ * a given animation. */
+ RtAnimKeyFrameStreamGetSizeCallBack keyFrameStreamGetSizeCB;
+ /**< Pointer to a function that returns the binary stream size of
+ * the keyframes for a given animation. */
+};
+
+
+/**
+ * \ingroup rtanim
+ * \struct RtAnimAnimation
+ * A keyframed 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. That is, the next keyframe
+ * at some point in the sequence should correspond to the node whose
+ * previous two keyframes are next to expire as an interpolation
+ * pair.
+ *
+ * Put another way, the correct ordering can be achieved by sorting
+ * an unordered keyframe array using the following primary and secondary
+ * sort keys:-
+ *
+ * - time of previous keyframe for node
+ * - node index
+ *
+ * An example is shown in the following diagram, where each vertical bar
+ * indicates a keyframe point in time. The position of the keyframe
+ * within the animation sequence is shown by an index to the left of
+ * each bar.
+ *
+ * \verbatim
+
+ t=0 t=duration
+ node 0 kf0..| kf3.......| kf8....| kf10....|
+ node 1 kf1..| kf4...| kf6........| kf11....|
+ node 2 kf2..| kf5.....| kf7..| kf9.........|
+
+ \endverbatim
+ *
+ * Each node MUST have an initial keyframe at time = 0.0, and a terminal
+ * keyframe at time = duration of the animation.
+ *
+ * Pointers link all of the keyframes for a particular node backwards
+ * through time in a list.
+ *
+ * \see RtAnimAnimationCreate
+ */
+struct RtAnimAnimation
+{
+ RtAnimInterpolatorInfo *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 rtanim
+ * \ref RtAnimKeyFrameHeader
+ * Typedef for struct RtAnimKeyFrameHeader
+ */
+typedef struct RtAnimKeyFrameHeader RtAnimKeyFrameHeader;
+
+/**
+ * \ingroup rtanim
+ * \struct RtAnimKeyFrameHeader
+ * holds header information for a keyframe. All keyframe structures used with
+ * the overloadable interpolation system should start with this data.
+ *
+ * \see RtAnimRegisterInterpolationScheme
+ */
+struct RtAnimKeyFrameHeader
+{
+ void *prevFrame;
+ /**< Previous keyframe for particular hierarchy node */
+ RwReal time;
+ /**< Time at keyframe */
+};
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimInterpFrameHeader
+ * Typedef for struct RtAnimInterpFrameHeader
+ */
+typedef struct RtAnimInterpFrameHeader RtAnimInterpFrameHeader;
+
+/**
+ * \ingroup rtanim
+ * \struct RtAnimInterpFrameHeader
+ * is the header for an interpolated animation frame, intermediate
+ * between a keyframe pair. This structure is intentionally the same size as an
+ * \ref RtAnimKeyFrameHeader, so that an interpolated frame and key frame data
+ * block can be otherwise identical. It relies on the
+ * fact that the prevFrame and time fields of a keyframe header are not
+ * relevant to an interpolated frame. These fields should therefore not be
+ * be modified by a custom keyframe interpolator.
+ *
+ * \see RtAnimRegisterInterpolationScheme
+ */
+struct RtAnimInterpFrameHeader
+{
+ RtAnimKeyFrameHeader *keyFrame1;
+ /**< Pointer to the first of the current pair of keyframes in
+ the associated \ref RtAnimAnimation */
+ RtAnimKeyFrameHeader *keyFrame2;
+ /**< Pointer to the second of the current pair of keyframes in
+ the associated \ref RtAnimAnimation */
+};
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimInterpolator
+ * Typedef for struct \ref RtAnimInterpolator
+ */
+typedef struct RtAnimInterpolator RtAnimInterpolator;
+
+/**
+ * \ingroup rtanim
+ * \ref RtAnimCallBack
+ * defines a callback function for use with the
+ * \ref RtAnimInterpolatorSetAnimCallBack and
+ * \ref RtAnimInterpolatorSetAnimLoopCallBack functions.
+ *
+ * \param animInstance
+ * A pointer to the \ref RtAnimInterpolator structure.
+ *
+ * \param data Void pointer for user-defined data.
+ * You can use this to pass your own data
+ * structure(s) to the callback function.
+ *
+ * \see RtAnimInterpolatorSetAnimCallBack
+ * \see RtAnimInterpolatorSetAnimLoopCallBack
+ *
+ */
+
+typedef RtAnimInterpolator * (*RtAnimCallBack)
+ (RtAnimInterpolator *animInstance,
+ void *data);
+
+/**
+ * \ingroup rtanim
+ * \struct RtAnimInterpolator
+ * holds the current state for a particular instance of an animation,
+ * corresponding to a specific point in time.
+ *
+ * The current interpolated keyframes are stored in an array after the
+ * end of this structure. For advanced use, these may be accessed
+ * using the macro rtANIMGETINTERPFRAME(interpolator, nodeIndex)
+ * which takes a pointer to the interpolator and the node index
+ * for the interpolated keyframe required.
+ *
+ * \see \ref RtAnimInterpolatorCreate
+ * \see \ref RtAnimInterpolatorDestroy
+ * \see \ref RtAnimInterpolatorSetCurrentAnim
+ * \see \ref RtAnimInterpolatorGetCurrentAnim
+ * \see \ref RtAnimInterpolatorSetKeyFrameCallBacks
+ * \see \ref RtAnimInterpolatorSetAnimLoopCallBack
+ * \see \ref RtAnimInterpolatorSetAnimCallBack
+ * \see \ref RtAnimInterpolatorCopy
+ * \see \ref RtAnimInterpolatorSubAnimTime
+ * \see \ref RtAnimInterpolatorAddAnimTime
+ * \see \ref RtAnimInterpolatorSetCurrentTime
+ * \see \ref RtAnimCallBack
+ */
+struct RtAnimInterpolator
+{
+ RtAnimAnimation *pCurrentAnim;
+ /**< Current \ref RtAnimAnimation applied */
+ RwReal currentTime;
+ /**< Current animation time */
+ void *pNextFrame;
+ /**< Next animation keyframe to be played */
+ RtAnimCallBack pAnimCallBack;
+ /**< Animation callback function pointer */
+ void *pAnimCallBackData;
+ /**< Animation callback function user data */
+ RwReal animCallBackTime;
+ /**< Trigger time for callback function */
+ RtAnimCallBack pAnimLoopCallBack;
+ /**< Animation loop callback function pointer */
+ void *pAnimLoopCallBackData;
+ /**< Animation loop callback function data */
+ RwInt32 maxKeyFrameSize;
+ /**< Maximum size of keyframes usable on
+ * this animation (set at creation time) */
+ RwInt32 currentKeyFrameSize;
+ /**< Size of keyframes in the current
+ * animation */
+ RwInt32 numNodes;
+ /**< Number of nodes driven by the animation */
+ RwBool isSubInterpolator;
+ /**< Internal use */
+ RwInt32 offsetInParent;
+ /**< Internal use */
+ RtAnimInterpolator *parentAnimation;
+ /**< Internal use */
+
+ RtAnimKeyFrameApplyCallBack keyFrameApplyCB;
+ /**< Internal use */
+ RtAnimKeyFrameBlendCallBack keyFrameBlendCB;
+ /**< Internal use */
+ RtAnimKeyFrameInterpolateCallBack keyFrameInterpolateCB;
+ /**< Internal use */
+ RtAnimKeyFrameAddCallBack keyFrameAddCB;
+ /**< Internal use */
+};
+
+/* Access to array of interpolated frames occupying a block of memory
+ * after the end of the RtAnimInterpolator structure.
+ */
+#define rtANIMGETINTERPFRAME( anim, nodeIndex ) \
+ ( (void *)( ( (RwUInt8 *)&(anim[1]) + \
+ ((nodeIndex) * \
+ anim->currentKeyFrameSize) ) ) )
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+
+/* Engine functions */
+extern void
+RtAnimAnimationFreeListCreateParams( RwInt32 blockSize, RwInt32 numBlocksToPrealloc );
+
+extern RwBool
+RtAnimInitialize(void);
+
+extern RwBool
+RtAnimRegisterInterpolationScheme(RtAnimInterpolatorInfo *interpolatorInfo);
+
+extern RtAnimInterpolatorInfo *
+RtAnimGetInterpolatorInfo(RwInt32 typeID);
+
+/* RtAnimAnimation */
+extern RtAnimAnimation *
+RtAnimAnimationCreate(RwInt32 typeID,
+ RwInt32 numFrames,
+ RwInt32 flags,
+ RwReal duration);
+
+extern RtAnimAnimation *
+RtAnimAnimationDestroy(RtAnimAnimation *animation);
+
+extern RtAnimAnimation *
+RtAnimAnimationRead(const RwChar * filename);
+
+extern RwBool
+RtAnimAnimationWrite(RtAnimAnimation *animation,
+ const RwChar * filename);
+
+extern RtAnimAnimation *
+RtAnimAnimationStreamRead(RwStream *stream);
+
+extern RwBool
+RtAnimAnimationStreamWrite(RtAnimAnimation *animation,
+ RwStream *stream);
+
+extern RwInt32
+RtAnimAnimationStreamGetSize(RtAnimAnimation *animation);
+
+extern RwUInt32
+RtAnimAnimationGetNumNodes(RtAnimAnimation *animation);
+
+#ifdef RWDEBUG
+
+extern RwInt32
+RtAnimAnimationGetTypeID(RtAnimAnimation *animation);
+
+#else /* RWDEBUG */
+
+#define RtAnimAnimationGetTypeID(animation) \
+ (animation->interpInfo->typeID)
+
+#endif /* RWDEBUG */
+
+/* RtAnimInterpolator */
+extern RtAnimInterpolator *
+RtAnimInterpolatorCreate(RwInt32 numNodes,
+ RwInt32 maxKeyFrameSize);
+
+extern void
+RtAnimInterpolatorDestroy(RtAnimInterpolator *anim);
+
+extern RwBool
+RtAnimInterpolatorSetCurrentAnim(RtAnimInterpolator *animI,
+ RtAnimAnimation *anim);
+
+
+#ifdef RWDEBUG
+
+extern RtAnimAnimation *
+RtAnimInterpolatorGetCurrentAnim(RtAnimInterpolator *animI);
+
+#else /* RWDEBUG */
+
+#define RtAnimInterpolatorGetCurrentAnim(animI) \
+ (animI->pCurrentAnim)
+
+#endif /* RWDEBUG */
+
+
+extern RwBool
+RtAnimInterpolatorSetKeyFrameCallBacks(RtAnimInterpolator *anim,
+ RwInt32 keyFrameTypeID);
+
+
+extern void
+RtAnimInterpolatorSetAnimLoopCallBack(RtAnimInterpolator *anim,
+ RtAnimCallBack callBack,
+ void *data );
+
+extern void
+RtAnimInterpolatorSetAnimCallBack(RtAnimInterpolator *anim,
+ RtAnimCallBack callBack,
+ RwReal time,
+ void *data );
+
+extern RwBool
+RtAnimInterpolatorCopy(RtAnimInterpolator *outAnim,
+ RtAnimInterpolator *inAnim);
+
+extern RwBool
+RtAnimInterpolatorSubAnimTime(RtAnimInterpolator *anim,
+ RwReal time);
+
+extern RwBool
+RtAnimInterpolatorAddAnimTime(RtAnimInterpolator *anim,
+ RwReal time);
+
+extern RwBool
+RtAnimInterpolatorSetCurrentTime(RtAnimInterpolator *anim,
+ RwReal time);
+
+extern RwBool
+RtAnimAnimationMakeDelta(RtAnimAnimation *animation,
+ RwInt32 numNodes,
+ RwReal time);
+
+
+extern RwBool
+RtAnimInterpolatorBlend(RtAnimInterpolator *outAnim,
+ RtAnimInterpolator *inAnim1,
+ RtAnimInterpolator *inAnim2,
+ RwReal alpha);
+
+extern RwBool
+RtAnimInterpolatorAddTogether(RtAnimInterpolator *outAnim,
+ RtAnimInterpolator *inAnim1,
+ RtAnimInterpolator *inAnim2);
+
+#define RtAnimKeyFrameApplyMacro(animation, out, in) \
+MACRO_START \
+{ \
+ (anim)->keyFrameApplyCB((out), (in1), (in2), (time)); \
+} \
+MACRO_STOP
+
+
+#define RtAnimKeyFrameInterpolateMacro(anim, out, in1, in2, time) \
+MACRO_START \
+{ \
+ (anim)->keyFrameInterpolateCB((out), (in1), (in2), (time)); \
+} \
+MACRO_STOP
+
+#define RtAnimKeyFrameBlendMacro(anim, out, in1, in2, fAlpha) \
+MACRO_START \
+{ \
+ (anim)->keyFrameBlendCB((out), (in1), (in2), (fAlpha)); \
+} \
+MACRO_STOP
+
+#define RtAnimKeyFrameAddTogetherMacro(anim, out, in1, in2) \
+MACRO_START \
+{ \
+ (anim)->keyFrameAddCB((out), (in1), (in2)); \
+} \
+MACRO_STOP
+
+#ifdef RWDEBUG
+extern void
+RtAnimKeyFrameApply(RtAnimInterpolator *animation,
+ void *result, void *iFrame);
+
+extern void
+RtAnimKeyFrameInterpolate(RtAnimInterpolator *animation,
+ void *out, void *in1,
+ void *in2, RwReal time);
+
+extern void
+RtAnimKeyFrameBlend(RtAnimInterpolator *animation,
+ void *out,
+ void *in1,
+ void *in2,
+ RwReal alpha);
+
+extern void
+RtAnimKeyFrameAddTogether(RtAnimInterpolator *animation,
+ void *out, void *in1, void *in2);
+
+#else /* RWDEBUG */
+#define RtAnimKeyFrameApply(animation, out, in) \
+ RtAnimKeyFrameApplyMacro(animation, out, in)
+
+#define RtAnimKeyFrameInterpolate(animation, out, in1, in2, time) \
+ RtAnimKeyFrameInterpolateMacro(animation, out, in1, in2, time)
+
+#define RtAnimKeyFrameBlend(animation, out, in1, in2, alpha) \
+ RtAnimKeyFrameBlendMacro(animation, out, in1, in2, alpha)
+
+#define RtAnimKeyFrameAddTogether(animation, out, in1, in2) \
+ RtAnimKeyFrameAddTogetherMacro(animation, out, in1, in2)
+#endif /* RWDEBUG */
+
+extern RtAnimInterpolator *
+RtAnimInterpolatorCreateSubInterpolator(
+ RtAnimInterpolator *parentAnim,
+ RwInt32 startNode,
+ RwInt32 numNodes,
+ RwInt32 maxKeyFrameSize);
+
+extern RwBool
+RtAnimInterpolatorBlendSubInterpolator(RtAnimInterpolator *outAnim,
+ RtAnimInterpolator *inAnim1,
+ RtAnimInterpolator *inAnim2,
+ RwReal alpha);
+
+extern RwBool
+RtAnimInterpolatorAddSubInterpolator(RtAnimInterpolator *outAnim,
+ RtAnimInterpolator *mainAnim,
+ RtAnimInterpolator *subAnim);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* RTANIM_H */