00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00020 #ifndef _FCD_ANIMATED_H_
00021 #define _FCD_ANIMATED_H_
00022
00023 #ifndef __FCD_OBJECT_H_
00024 #include "FCDocument/FCDObject.h"
00025 #endif // __FCD_OBJECT_H_
00026
00027 class FCDocument;
00028 class FCDAnimated;
00029 class FCDAnimationCurve;
00030 class FCDAnimationChannel;
00031 class FCDAnimationMultiCurve;
00032
00033 typedef fm::pvector<float> FloatPtrList;
00034 typedef fm::pvector<FCDAnimationCurve> FCDAnimationCurveList;
00035 typedef FUTrackedList<FCDAnimationCurve> FCDAnimationCurveTrackList;
00036 typedef fm::vector<FCDAnimationCurveTrackList> FCDAnimationCurveListList;
00037 typedef fm::pvector<FCDAnimationChannel> FCDAnimationChannelList;
00038 typedef fm::pvector<FCDAnimated> FCDAnimatedList;
00055 class FCOLLADA_EXPORT FCDAnimated : public FCDObject, FUTracker
00056 {
00057 private:
00058 DeclareObjectType(FCDObject);
00059
00060 protected:
00062 FloatPtrList values;
00063
00066 StringList qualifiers;
00067
00071 FCDAnimationCurveListList curves;
00072
00074 FCDObject* target;
00075
00080 int32 arrayElement;
00081
00082 public:
00083 DeclareFlag(RelativeAnimation, 0);
00084 DeclareFlagCount(1);
00086 public:
00093 FCDAnimated(FCDObject* object, size_t valueCount, const char** qualifiers, float** values);
00094
00101 FCDAnimated(FCDocument* document, size_t valueCount, const char** qualifiers, float** values);
00102
00104 virtual ~FCDAnimated();
00105
00108 inline size_t GetValueCount() const { return values.size(); }
00109
00113 inline size_t GetCurveCount(size_t index) const { FUAssert(index < GetValueCount(), return 0); return curves[index].size(); }
00114
00121 inline FCDAnimationCurve* GetCurve(size_t index, size_t curveIndex = 0) { FUAssert(index < GetValueCount(), return NULL); return curveIndex < curves.at(index).size() ? curves.at(index).at(curveIndex) : NULL; }
00122 inline const FCDAnimationCurve* GetCurve(size_t index, size_t curveIndex = 0) const { FUAssert(index < GetValueCount(), return NULL); return curveIndex < curves.at(index).size() ? curves.at(index).at(curveIndex) : NULL; }
00127 inline FCDAnimationCurveListList& GetCurves() { return curves; }
00128 inline const FCDAnimationCurveListList& GetCurves() const { return curves; }
00136 bool AddCurve(size_t index, FCDAnimationCurve* curve);
00137 bool AddCurve(size_t index, FCDAnimationCurveList& curve);
00143 bool RemoveCurve(size_t index);
00144
00149 inline float* GetValue(size_t index) { FUAssert(index < GetValueCount(), return NULL); return values.at(index); }
00150 inline const float* GetValue(size_t index) const { FUAssert(index < GetValueCount(), return NULL); return values.at(index); }
00156 inline void SetValue(size_t index, float* value) { FUAssert(index < GetValueCount(), return); values.at(index) = value; }
00157
00162 const fm::string& GetQualifier(size_t index) const;
00163
00167 StringList& GetQualifiers(){ return qualifiers; }
00168
00173 float* FindValue(const fm::string& qualifier);
00174 const float* FindValue(const fm::string& qualifier) const;
00181 inline FCDAnimationCurve* FindCurve(const char* qualifier) { size_t index = FindQualifier(qualifier); return index < GetValueCount() ? GetCurve(index) : NULL; }
00182 inline FCDAnimationCurve* FindCurve(const fm::string& qualifier) { return FindCurve(qualifier.c_str()); }
00183 inline const FCDAnimationCurve* FindCurve(const char* qualifier) const { size_t index = FindQualifier(qualifier); return index < GetValueCount() ? GetCurve(index) : NULL; }
00184 inline const FCDAnimationCurve* FindCurve(const fm::string& qualifier) const { return FindCurve(qualifier.c_str()); }
00191 inline FCDAnimationCurve* FindCurve(const float* value) { size_t index = FindValue(value); return index < GetValueCount() ? GetCurve(index) : NULL; }
00192 inline const FCDAnimationCurve* FindCurve(const float* value) const { size_t index = FindValue(value); return index < GetValueCount() ? GetCurve(index) : NULL; }
00198 size_t FindQualifier(const char* qualifier) const;
00199 inline size_t FindQualifier(const fm::string& qualifier) const { return FindQualifier(qualifier.c_str()); }
00205 size_t FindValue(const float* value) const;
00206
00209 void SetTargetObject(FCDObject* _target);
00210
00213 FCDObject* GetTargetObject() { return target; }
00214
00220 inline int32 GetArrayElement() const { return arrayElement; }
00221
00227 inline void SetArrayElement(int32 index) { arrayElement = index; SetDirtyFlag(); }
00228
00232 bool HasCurve() const;
00233
00238 FCDAnimationMultiCurve* CreateMultiCurve() const;
00239
00247 static FCDAnimationMultiCurve* CreateMultiCurve(const FCDAnimatedList& toMerge);
00248
00253 void Evaluate(float time);
00254
00258 FCDAnimated* Clone(FCDocument* document) const;
00259
00263 FCDAnimated* Clone(FCDAnimated* clone) const;
00264
00267 virtual void OnObjectReleased(FUTrackable* object);
00268 };
00269
00274 class FCOLLADA_EXPORT FCDAnimatedCustom : public FCDAnimated
00275 {
00276 private:
00277 DeclareObjectType(FCDAnimated);
00278 float dummy;
00279
00280 bool Link(xmlNode* node);
00281
00282 public:
00286 FCDAnimatedCustom(FCDObject* object);
00287
00292 void Copy(const FCDAnimated* copy);
00293
00296 float& GetDummy() { return dummy; }
00297 const float& GetDummy() const { return dummy; }
00304 void Resize(size_t count, const char** qualifiers = NULL, bool prependDot = true);
00305
00309 void Resize(const StringList& qualifiers = NULL, bool prependDot = true);
00310 };
00311
00313 namespace FCDAnimatedStandardQualifiers
00314 {
00317 FCOLLADA_EXPORT extern const char* EMPTY[1];
00318 FCOLLADA_EXPORT extern const char* XYZW[4];
00319 FCOLLADA_EXPORT extern const char* RGBA[4];
00321 FCOLLADA_EXPORT extern const char* ROTATE_AXIS[4];
00322 FCOLLADA_EXPORT extern const char* SKEW[7];
00323 FCOLLADA_EXPORT extern const char* MATRIX[16];
00324 FCOLLADA_EXPORT extern const char* LOOKAT[9];
00325 };
00326
00327 #endif // _FCD_ANIMATED_H_
00328