Files
bullet3/Extras/FCollada/FCDocument/FCDAnimationCurve.h
2006-05-25 19:18:29 +00:00

263 lines
12 KiB
C++

/*
Copyright (C) 2005-2006 Feeling Software Inc.
MIT License: http://www.opensource.org/licenses/mit-license.php
*/
/*
Based on the FS Import classes:
Copyright (C) 2005-2006 Feeling Software Inc
Copyright (C) 2005-2006 Autodesk Media Entertainment
MIT License: http://www.opensource.org/licenses/mit-license.php
*/
/**
@file FCDAnimationCurve.h
This file contains the FCDAnimationCurve class.
*/
#ifndef _FCD_ANIMATION_CURVE_H_
#define _FCD_ANIMATION_CURVE_H_
#include "FUtils/FUDaeEnum.h"
#include "FCDocument/FCDObject.h"
class FCDAnimationClip;
class FCDAnimationChannel;
typedef vector<FCDAnimationClip*> FCDAnimationClipList; /**< A dynamically-sized array of animation clips. */
typedef float (*FCDConversionFunction)(float v); /**< A simple conversion function. */
/**
A COLLADA single-dimensional animation curve.
An animation curve holds the keyframes necessary
to animate an animatable floating-point value.
There are multiple interpolation mechanisms supported by COLLADA.
FCollada supports the CONSTANT, LINEAR and BEZIER interpolations.
@see FUDaeInterpolation FUDaeInfinity
@ingroup FCDocument
*/
class FCOLLADA_EXPORT FCDAnimationCurve : public FCDObject
{
private:
FCDAnimationChannel* parent;
// Targeting information
int32 targetElement;
string targetQualifier;
// Input information
FloatList keys, keyValues;
FloatList inTangents, outTangents;
FloatList inTangentWeights, outTangentWeights;
bool isWeightedCurve;
FUDaeInfinity::Infinity preInfinity;
FUDaeInfinity::Infinity postInfinity;
// Driver information
const float* inputDriver;
string driverPointer;
// The interpolation values follow the FUDaeInterpolation enum (FUDaeEnum.h)
UInt32List interpolations;
// Animation clips that depend on this curve
FCDAnimationClipList clips;
public:
/** Constructor: do not use directly.
Instead, use the FCDAnimationChannel::AddCurve function.
You should also attach the new curve to an animated
element using the FCDAnimated::SetCurve function.
@param document The COLLADA document that owns the animation curve.
@param parent The animation channel that contains the curve. */
FCDAnimationCurve(FCDocument* document, FCDAnimationChannel* parent);
/** Destructor: do not release directly.
Instead, use the FCDAnimationChannel::ReleaseCurve function. */
virtual ~FCDAnimationCurve();
/** Retrieves the animation channel that contains this animation curve.
@return The parent animation channel. */
inline FCDAnimationChannel* GetParent() { return parent; }
inline const FCDAnimationChannel* GetParent() const { return parent; } /**< See above. */
/** Retrieves the list of key inputs for the animation curve.
@return The list of key inputs. */
inline FloatList& GetKeys() { return keys; }
inline const FloatList& GetKeys() const { return keys; } /**< See above. */
/** Retrieves the list of key outputs for the animation curve.
@return The list of key outputs. */
inline FloatList& GetKeyValues() { return keyValues; }
inline const FloatList& GetKeyValues() const { return keyValues; } /**< See above. */
/** Retrieves the list of interpolation type for the segments of the animation curve.
There is always one interpolation type for each key in the curve. The interpolation type
of a segment of the curve is set at the key at which begins the segment.
@see FUDaeInterpolation
@return The list of interpolation types. */
inline UInt32List& GetInterpolations() { return interpolations; }
inline const UInt32List& GetInterpolations() const { return interpolations; } /**< See above. */
/** Retrieves the list of key in-tangent values for the animation curve.
This list has data only for curves that include segments with the bezier interpolation.
@return The list of in-tangent values. */
inline FloatList& GetInTangents() { return inTangents; }
inline const FloatList& GetInTangents() const { return inTangents; } /**< See above. */
/** Retrieves the list of key out-tangent values for the animation curve.
This list has data only for curves that include segments with the bezier interpolation.
@return The list of out-tangent values. */
inline FloatList& GetOutTangents() { return outTangents; }
inline const FloatList& GetOutTangents() const { return outTangents; } /**< See above. */
/** Retrieves the list of key in-tangent weights for the animation curve.
This list has data only for curves that are weighted
and include segments with the bezier interpolation.
@see IsWeightedCurve
@return The list of in-tangent weights. */
inline FloatList& GetInTangentWeights() { return inTangentWeights; }
inline const FloatList& GetInTangentWeights() const { return inTangentWeights; } /**< See above. */
/** Retrieves the list of key out-tangent weights for the animation curve.
This list has data only for curves that are weighted
and include segments with the bezier interpolation.
@see IsWeightedCurve
@return The list of out-tangent weights. */
inline FloatList& GetOutTangentWeights() { return outTangentWeights; }
inline const FloatList& GetOutTangentWeights() const { return outTangentWeights; } /**< See above. */
/** Retrieves whether this curve has weighted tangents. Tangent weights
give you access to 2D tangents by providing the length of the tangent.
@return Whether this curve has weighted tangents. */
inline bool IsWeightedCurve() const { return isWeightedCurve; }
/** Sets whether this curve has weighted tangents. Tangent weights
give you access to 2D tangents by providing the length of the tangent.
@param _isWeightedCurve Whether this curve has weighted tangents. */
inline void SetWeightedCurveFlag(bool _isWeightedCurve) { isWeightedCurve = _isWeightedCurve; }
/** Retrieves the type of behavior for the curve if the input value is
outside the input interval defined by the curve keys and less than any key input value.
@see FUDaeInfinity
@return The pre-infinity behavior of the curve. */
inline FUDaeInfinity::Infinity GetPreInfinity() const { return preInfinity; }
/** Sets the behavior of the curve if the input value is
outside the input interval defined by the curve keys and less than any key input value.
@see FUDaeInfinity
@param infinity The pre-infinity behavior of the curve. */
inline void SetPreInfinity(FUDaeInfinity::Infinity infinity) { preInfinity = infinity; }
/** Retrieves the type of behavior for the curve if the input value is
outside the input interval defined by the curve keys and greater than any key input value.
@see FUDaeInfinity
@return The post-infinity behavior of the curve. */
inline FUDaeInfinity::Infinity GetPostInfinity() const { return postInfinity; }
/** Sets the behavior of the curve if the input value is
outside the input interval defined by the curve keys and greater than any key input value.
@see FUDaeInfinity
@param infinity The post-infinity behavior of the curve. */
inline void SetPostInfinity(FUDaeInfinity::Infinity infinity) { postInfinity = infinity; }
/** Retrieves the value pointer that drives this animation curve.
@return The driver value pointer. This pointer will be NULL to indicate
that time drives the animation curve. */
inline const float* GetDriver() const { return inputDriver; }
/** Sets the value pointer that drives the animation curve.
@param driver The driver value pointer. Set this pointer to NULL
to indicate that time drives the animation curve. */
inline void SetDriver(const float* driver) { inputDriver = driver; }
/** Retrieves the list of animation clips that use this animation curve.
@return The list of animation clips. */
inline FCDAnimationClipList& GetClips() { return clips; }
inline const FCDAnimationClipList& GetClips() const { return clips; } /**< See above. */
/** Readies this curve for evaluation.
This will create the tangents and the tangent weights, if necessary. */
void Ready();
/** Clones the animation curve.
@return The cloned animation curve. */
FCDAnimationCurve* Clone();
/** Applies a conversion function to the keys output values of the animation curve.
@param valueConversion The conversion function to use on the key outputs.
@param tangentConversion The conversion function to use on the key tangents. */
void ConvertValues(FCDConversionFunction valueConversion, FCDConversionFunction tangentConversion);
/** Applies a conversion function to the keys input values of the animation curve.
@param timeConversion The conversion function to use on the key inputs.
@param tangentWeightConversion The conversion function to use on the key tangent weights. */
void ConvertInputs(FCDConversionFunction timeConversion, FCDConversionFunction tangentWeightConversion);
/** Evaluates the animation curve.
@param input An input value.
@return The sampled value of the curve at the given input value. */
float Evaluate(float input) const;
/** [INTERNAL] Adds an animation clip to the list of animation clips that use this curve.
@param clip An animation clip. */
inline void RegisterAnimationClip(FCDAnimationClip* clip) { clips.push_back(clip); }
/** [INTERNAL] Writes out the data sources necessary to import the animation curve
to a given XML tree node.
@param parentNode The XML tree node in which to create the data sources.
@param baseId A COLLADA Id prefix to use when generating the source ids. */
void WriteSourceToXML(xmlNode* parentNode, const string& baseId) const;
/** [INTERNAL] Writes out the sampler that puts together the data sources
and generates a sampling function.
@param parentNode The XML tree node in which to create the sampler.
@param baseId The COLLADA id prefix used when generating the source ids.
This prefix is also used to generate the sampler COLLADA id.
@return The created XML tree node. */
xmlNode* WriteSamplerToXML(xmlNode* parentNode, const string& baseId) const;
/** [INTERNAL] Writes out the animation channel that attaches the sampling function
to the animatable value.
@param parentNode The XML tree node in which to create the sampler.
@param baseId The COLLADA Id prefix used when generating the source ids
and the sampler id.
@param targetPointer The target pointer prefix for the targeted animated element.
@return The created XML tree node. */
xmlNode* WriteChannelToXML(xmlNode* parentNode, const string& baseId, const char* targetPointer) const;
/** [INTERNAL] Retrieves the target element suffix for the curve.
This will be -1 if the animated element does not belong to an
animated element list.
@return The target element suffix. */
inline int32 GetTargetElement() const { return targetElement; }
/** [INTERNAL] Retrieves the target qualifier for the curve.
This will be the empty string if that the curve affects
a one-dimensional animated element.
@return The target qualifier. */
inline const string& GetTargetQualifier() const { return targetQualifier; }
/** [INTERNAL] Sets the target element suffix for the curve.
@param e The target element suffix. Set to value to -1
if the animated element does not belong to an animated element list. */
inline void SetTargetElement(int32 e) { targetElement = e; }
/** [INTERNAL] Sets the target qualifier for the curve.
@param q The target qualifier. You may sets this string to the empty string
only if that the curve affects a one-dimensional animated element. */
inline void SetTargetQualifier(const string& q) { targetQualifier = q; }
/** [INTERNAL] Retrieves the target pointer prefix of the driver.
@return The driver's target pointer prefix. */
inline const string& GetDriverPointer() const { return driverPointer; }
/** [INTERNAL] Sets the target pointer prefix of the driver.
@param p The driver's target pointer prefix. Set this string to the
empty string if the input of the animation curve is the time. */
inline void SetDriverPointer(const string& p) { driverPointer = p; }
};
#endif // _FCD_ANIMATION_CURVE_H_