00001
00004 #ifndef FBXFILESDK_COMPONENTS_KFCURVE_KFCURVE_H
00005 #define FBXFILESDK_COMPONENTS_KFCURVE_KFCURVE_H
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <fbxfilesdk/components/kfcurve/kfcurve_h.h>
00042
00043 #include <fbxfilesdk/components/kbaselib/klib/karrayul.h>
00044 #include <fbxfilesdk/components/kbaselib/klib/ktime.h>
00045 #include <fbxfilesdk/components/kbaselib/object/e/keventbase.h>
00046 #include <fbxfilesdk/components/kbaselib/klib/kdebug.h>
00047
00048
00049 #ifndef KFBX_PLUGIN
00050 #include <fbxfilesdk/components/kbaselib/object/i/iobject.h>
00051 #endif
00052
00053 #ifndef KFBX_PLUGIN
00054 #include <fbxfilesdk/components/kbaselib/klib/kdebug.h>
00055 #endif
00056
00057 #include <fbxfilesdk/components/kbaselib/kbaselib_forward.h>
00058
00059 #undef KFBX_FCURVE_INLINE
00060 #define KFBX_FCURVE_INLINE inline
00061
00062 #include <fbxfilesdk/fbxfilesdk_nsbegin.h>
00063
00064 #define KFCURVE_FLOAT
00065 #ifdef KFCURVE_FLOAT
00066 typedef float kFCurveDouble;
00067 #else
00068 typedef double kFCurveDouble;
00069 #endif
00070
00071
00072 KFBX_FORWARD(KFCurve);
00073
00074 #define IKFCurveID 43763635
00075
00076 typedef HKFCurve HIKFCurve;
00077 typedef class KFBX_DLL KArrayTemplate< KFCurve * > KArrayKFCurve;
00078
00079
00080 KFBX_DLL kULong GetRecordingMemory();
00081 KFBX_DLL void WatchFree(void* pPtr, kULong pSize);
00082 KFBX_DLL void* WatchMalloc(kULong pSize);
00083
00091 enum
00092 {
00093 KFCURVE_INTERPOLATION_CONSTANT = 0x00000002,
00094 KFCURVE_INTERPOLATION_LINEAR = 0x00000004,
00095 KFCURVE_INTERPOLATION_CUBIC = 0x00000008,
00096 KFCURVE_INTERPOLATION_ALL = KFCURVE_INTERPOLATION_CONSTANT|KFCURVE_INTERPOLATION_LINEAR|KFCURVE_INTERPOLATION_CUBIC,
00097 KFCURVE_INTERPOLATION_COUNT = 3
00098 };
00099
00106 enum
00107 {
00108 KFCURVE_CONSTANT_STANDARD = 0x00000000,
00109 KFCURVE_CONSTANT_NEXT = 0x00000100,
00110 KFCURVE_CONSTANT_ALL = KFCURVE_CONSTANT_STANDARD | KFCURVE_CONSTANT_NEXT,
00111 KFCURVE_CONSTANT_COUNT = 2
00112 };
00113
00126 enum
00127 {
00128 KFCURVE_TANGEANT_AUTO = 0x00000100,
00129 KFCURVE_TANGEANT_TCB = 0x00000200,
00130 KFCURVE_TANGEANT_USER = 0x00000400,
00131 KFCURVE_GENERIC_BREAK = 0x00000800,
00132 KFCURVE_GENERIC_CLAMP = 0x00001000,
00133 KFCURVE_TANGEANT_BREAK = KFCURVE_TANGEANT_USER|KFCURVE_GENERIC_BREAK,
00134 KFCURVE_TANGEANT_AUTO_BREAK = KFCURVE_TANGEANT_AUTO|KFCURVE_GENERIC_BREAK,
00135 KFCURVE_TANGEANT_ALL = KFCURVE_TANGEANT_AUTO|KFCURVE_TANGEANT_TCB|KFCURVE_TANGEANT_USER|KFCURVE_GENERIC_BREAK|KFCURVE_GENERIC_CLAMP,
00136 KFCURVE_TANGEANT_TYPE_MASK = KFCURVE_TANGEANT_AUTO|KFCURVE_TANGEANT_TCB|KFCURVE_TANGEANT_USER|KFCURVE_TANGEANT_BREAK,
00137 KFCURVE_TANGEANT_OVERRIDES_MASK = KFCURVE_GENERIC_CLAMP
00138
00139 };
00140
00147 enum
00148 {
00149 KFCURVE_SELECT_POINT = 0x00010000,
00150 KFCURVE_SELECT_LEFT = 0x00020000,
00151 KFCURVE_SELECT_RIGHT = 0x00040000,
00152 KFCURVE_SELECT_ALL = KFCURVE_SELECT_POINT|KFCURVE_SELECT_LEFT|KFCURVE_SELECT_RIGHT
00153 };
00154
00159 enum
00160 {
00161 KFCURVE_MARKED_FOR_MANIP = 0x00080000,
00162 KFCURVE_MARKED_ALL = KFCURVE_MARKED_FOR_MANIP
00163 };
00164
00171 enum
00172 {
00173 KFCURVE_TANGEANT_SHOW_NONE = 0x00000000,
00174 KFCURVE_TANGEANT_SHOW_LEFT = 0x00100000,
00175 KFCURVE_TANGEANT_SHOW_RIGHT = 0x00200000,
00176 KFCURVE_TANGEANT_SHOW_BOTH = KFCURVE_TANGEANT_SHOW_LEFT|KFCURVE_TANGEANT_SHOW_RIGHT
00177 };
00178
00185 enum
00186 {
00187 KFCURVE_CONTINUITY = 0x00000000,
00188 KFCURVE_CONTINUITY_FLAT = 0x00100000,
00189 KFCURVE_CONTINUITY_BREAK = 0x00200000,
00190 KFCURVE_CONTINUITY_INSERT = 0x00400000
00191 };
00192
00199 enum
00200 {
00201 KFCURVE_WEIGHTED_NONE = 0x00000000,
00202 KFCURVE_WEIGHTED_RIGHT = 0x01000000,
00203 KFCURVE_WEIGHTED_NEXT_LEFT = 0x02000000,
00204 KFCURVE_WEIGHTED_ALL = KFCURVE_WEIGHTED_RIGHT|KFCURVE_WEIGHTED_NEXT_LEFT
00205 };
00206
00213 enum
00214 {
00215 KFCURVE_VELOCITY_NONE = 0x00000000,
00216 KFCURVE_VELOCITY_RIGHT = 0x10000000,
00217 KFCURVE_VELOCITY_NEXT_LEFT = 0x20000000,
00218 KFCURVE_VELOCITY_ALL = KFCURVE_VELOCITY_RIGHT | KFCURVE_VELOCITY_NEXT_LEFT
00219 };
00220
00221
00222 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00223
00224 #define KFCURVE_WEIGHT_DIVIDER 9999 // precise enough and can be divided by 3 without error
00225 #define KFCURVE_DEFAULT_WEIGHT ((kFCurveDouble)(1.0/3.0))
00226 #define KFCURVE_MIN_WEIGHT ((kFCurveDouble)(1.0/KFCURVE_WEIGHT_DIVIDER))
00227 #define KFCURVE_MAX_WEIGHT ((kFCurveDouble)0.99)
00228 #define KFCURVE_DEFAULT_VELOCITY 0.0
00229
00230 #endif // DOXYGEN_SHOULD_SKIP_THIS
00231
00232
00256 enum EKFCurveDataIndex
00257 {
00258
00259 KFCURVEKEY_RIGHT_SLOPE = 0,
00260 KFCURVEKEY_NEXT_LEFT_SLOPE = 1,
00261
00262
00263 KFCURVEKEY_WEIGHTS = 2,
00264 KFCURVEKEY_RIGHT_WEIGHT = 2,
00265 KFCURVEKEY_NEXT_LEFT_WEIGHT = 3,
00266
00267
00268 KFCURVEKEY_VELOCITY = 4,
00269 KFCURVEKEY_RIGHT_VELOCITY = 4,
00270 KFCURVEKEY_NEXT_LEFT_VELOCITY = 5,
00271
00272
00273 KFCURVEKEY_TCB_TENSION = 0,
00274 KFCURVEKEY_TCB_CONTINUITY = 1,
00275 KFCURVEKEY_TCB_BIAS = 2,
00276
00277 KFCURVEKEY_RIGHT_AUTO = 0,
00278 KFCURVEKEY_NEXT_LEFT_AUTO = 1
00279 };
00280
00287 enum
00288 {
00289 KFCURVE_EXTRAPOLATION_CONST = 1,
00290 KFCURVE_EXTRAPOLATION_REPETITION = 2,
00291 KFCURVE_EXTRAPOLATION_MIRROR_REPETITION = 3,
00292 KFCURVE_EXTRAPOLATION_KEEP_SLOPE = 4
00293 };
00294
00295 enum
00296 {
00297 KFCURVE_BEZIER = 0,
00298 KFCURVE_SAMPLE = 1,
00299 KFCURVE_ISO = 2
00300 };
00301
00302 typedef kUInt kFCurveInterpolation;
00303 typedef kUInt kFCurveConstantMode;
00304 typedef kUInt kFCurveTangeantMode;
00305 typedef kUInt kFCurveTangeantWeightMode;
00306 typedef kUInt kFCurveTangeantVelocityMode;
00307 typedef kUInt kFCurveExtrapolationMode;
00308 typedef kUInt kFCurveTangeantVisibility;
00309 typedef int kFCurveIndex;
00310
00330 enum
00331 {
00332 KFCURVEEVENT_NONE =0,
00333 KFCURVEEVENT_CANDIDATE =1 << 0,
00334 KFCURVEEVENT_UNUSED1 =1 << 1,
00335 KFCURVEEVENT_UNUSED2 =1 << 2,
00336 KFCURVEEVENT_UNUSED3 =1 << 3,
00337 KFCURVEEVENT_KEY =1 << 4,
00338 KFCURVEEVENT_DEPRECATED5 =1 << 5,
00339 KFCURVEEVENT_UNUSED6 =1 << 6,
00340 KFCURVEEVENT_UNUSED7 =1 << 7,
00341 KFCURVEEVENT_SELECTION =1 << 8,
00342 KFCURVEEVENT_DESTROY =1 << 9,
00343 KFCURVEEVENT_DEPRECATED10 =1 << 10,
00344 KFCURVEEVENT_KEYADD =1 << 11,
00345 KFCURVEEVENT_KEYREMOVE =1 << 12,
00346 KFCURVEEVENT_EDITVALUE =1 << 13,
00347 KFCURVEEVENT_EDITTIME =1 << 14,
00348 KFCURVEEVENT_EDITOTHER =1 << 15,
00349 };
00350
00351
00354 class KFBX_DLL KFCurveEvent : public KEventBase
00355 {
00356 public:
00357
00358
00359
00360 int mKeyIndexStart;
00361
00362 int mKeyIndexStop;
00363
00364 int mEventCount;
00365
00368 KFBX_FCURVE_INLINE void Clear ();
00369
00374 KFBX_FCURVE_INLINE void Add (int pWhat, int pIndex);
00375 };
00376
00377 typedef void (*kFCurveCallback) (KFCurve *pFCurve, KFCurveEvent *FCurveEvent, void* pObject);
00378
00383 class KFBX_DLL KFCurveTangeantInfo
00384 {
00385 public:
00386 KFBX_FCURVE_INLINE KFCurveTangeantInfo();
00387
00388 kFCurveDouble mDerivative;
00389 kFCurveDouble mWeight;
00390 bool mWeighted;
00391 kFCurveDouble mVelocity;
00392 bool mHasVelocity;
00393 kFCurveDouble mAuto;
00394 };
00395
00405 class KFBX_DLL KFCurveKey
00406 {
00407 public:
00408 KFCurveKey()
00409 {
00410 Init();
00411 }
00412
00413 public:
00414
00440 KFBX_FCURVE_INLINE void Set
00441 (
00442 KTime pTime,
00443 kFCurveDouble pValue,
00444 kFCurveInterpolation pInterpolation = KFCURVE_INTERPOLATION_CUBIC,
00445 kFCurveTangeantMode pTangentMode = KFCURVE_TANGEANT_AUTO,
00446 kFCurveDouble pData0 = 0.0,
00447 kFCurveDouble pData1 = 0.0,
00448 kFCurveTangeantWeightMode pTangentWeightMode = KFCURVE_WEIGHTED_NONE,
00449 kFCurveDouble pWeight0 = KFCURVE_DEFAULT_WEIGHT,
00450 kFCurveDouble pWeight1 = KFCURVE_DEFAULT_WEIGHT,
00451 kFCurveDouble pVelocity0 = KFCURVE_DEFAULT_VELOCITY,
00452 kFCurveDouble pVelocity1 = KFCURVE_DEFAULT_VELOCITY
00453 );
00454
00462 KFBX_FCURVE_INLINE void SetTCB
00463 (
00464 KTime pTime,
00465 kFCurveDouble pValue,
00466 float pData0 = 0.0f,
00467 float pData1 = 0.0f,
00468 float pData2 = 0.0f
00469 );
00470
00474 KFBX_FCURVE_INLINE void Set(KFCurveKey& pSource);
00475
00481 KFBX_FCURVE_INLINE kFCurveInterpolation GetInterpolation();
00482
00489 KFBX_FCURVE_INLINE void SetInterpolation(kFCurveInterpolation pInterpolation);
00490
00498 KFBX_FCURVE_INLINE kFCurveConstantMode GetConstantMode();
00499
00511 KFBX_FCURVE_INLINE kFCurveTangeantMode GetTangeantMode( bool pIncludeOverrides = false );
00512
00520 KFBX_FCURVE_INLINE kFCurveTangeantWeightMode GetTangeantWeightMode();
00521
00529 KFBX_FCURVE_INLINE kFCurveTangeantVelocityMode GetTangeantVelocityMode();
00530
00537 KFBX_FCURVE_INLINE void SetConstantMode(kFCurveConstantMode pMode);
00538
00548 KFBX_FCURVE_INLINE void SetTangeantMode(kFCurveTangeantMode pTangent);
00549
00563 KFBX_FCURVE_INLINE void SetTangeantWeightMode(kFCurveTangeantWeightMode pTangentWeightMode, kFCurveTangeantWeightMode pMask = KFCURVE_WEIGHTED_ALL );
00564
00578 KFBX_FCURVE_INLINE void SetTangeantVelocityMode(kFCurveTangeantVelocityMode pTangentVelocityMode, kFCurveTangeantVelocityMode pMask = KFCURVE_VELOCITY_ALL );
00579
00603 KFBX_FCURVE_INLINE void SetTangentWeightAndAdjustTangent( EKFCurveDataIndex pIndex, kFCurveDouble pWeight );
00604
00605
00620 KFBX_FCURVE_INLINE kFCurveDouble GetDataDouble(EKFCurveDataIndex pIndex);
00621
00637 KFBX_FCURVE_INLINE void SetDataDouble(EKFCurveDataIndex pIndex, kFCurveDouble pValue);
00638
00644 KFBX_FCURVE_INLINE float GetDataFloat(EKFCurveDataIndex pIndex);
00645
00652 KFBX_FCURVE_INLINE void SetDataFloat(EKFCurveDataIndex pIndex, float pValue);
00653
00657 KFBX_FCURVE_INLINE float* GetDataPtr();
00658
00660 KFBX_FCURVE_INLINE kFCurveDouble GetValue();
00661
00665 KFBX_FCURVE_INLINE void SetValue(kFCurveDouble pValue);
00666
00670 KFBX_FCURVE_INLINE void IncValue(kFCurveDouble pValue);
00671
00675 KFBX_FCURVE_INLINE void MultValue(kFCurveDouble pValue);
00676
00682 KFBX_FCURVE_INLINE void MultTangeant(kFCurveDouble pValue);
00683
00687 KFBX_FCURVE_INLINE KTime GetTime();
00688
00692 KFBX_FCURVE_INLINE void SetTime(KTime pTime);
00693
00697 KFBX_FCURVE_INLINE void IncTime(KTime pTime);
00698
00702 KFBX_FCURVE_INLINE void SetSelected(bool pSelected);
00703
00707 KFBX_FCURVE_INLINE bool GetSelected();
00708
00712 KFBX_FCURVE_INLINE void SetMarkedForManipulation(bool pMark);
00713
00717 KFBX_FCURVE_INLINE bool GetMarkedForManipulation();
00718
00726 KFBX_FCURVE_INLINE void SetTangeantVisibility (kFCurveTangeantVisibility pVisibility);
00727
00735 KFBX_FCURVE_INLINE kFCurveTangeantVisibility GetTangeantVisibility ();
00736
00741 KFBX_FCURVE_INLINE void SetBreak(bool pVal);
00742
00746 KFBX_FCURVE_INLINE bool GetBreak();
00747
00748
00749
00750
00752
00753
00754
00755
00756
00757
00759
00760 KFBX_FCURVE_INLINE void Init();
00761
00762 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00763
00764 private:
00765
00766 kFCurveDouble mValue;
00767 KTime mTime;
00768 kUInt mFlags;
00769
00770 #ifdef KFCURVE_FLOAT
00771 float mData[4];
00772 #else
00773 double mData[2];
00774 kInt16 mWeight[2];
00775 kInt16 mVelocity[2];
00776 #endif
00777
00778 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
00779
00780 };
00781
00782
00783 const int KEY_BLOCK_SIZE = 1024;
00784 const int KEY_BLOCK_COUNT = KEY_BLOCK_SIZE/sizeof (KFCurveKey);
00785
00786 const int KEY_LIST_BLOCK_SIZE = 256;
00787 const int KEY_LIST_BLOCK_COUNT = KEY_LIST_BLOCK_SIZE/sizeof (KFCurveKey *);
00788
00789
00796 #ifdef KFBX_PLUGIN
00797 class KFBX_DLL KFCurve
00798 #else
00799 class KFBX_DLL KFCurve : public IFBObjectHolder
00800 #endif
00801 {
00802
00803 public:
00804
00809
00811 KFCurve();
00812
00814 virtual ~KFCurve();
00815
00816 #ifdef KFBX_PLUGIN
00817 void Destroy(int Local=0);
00818 #else
00819 KFBX_IObject_Declare(KFBX_Implementation)
00820 #endif
00821
00823
00827 float* GetColor();
00828
00832 void SetColor(float *pColor);
00833
00838 void SetValue(kFCurveDouble pValue);
00839
00844 KFBX_FCURVE_INLINE kFCurveDouble GetValue() const;
00845
00850
00854 void ResizeKeyBuffer(int pKeyCount);
00855
00860 void KeyModifyBegin ();
00861
00865 void KeyModifyEnd ();
00866
00868 int KeyGetCount ();
00869
00871 int KeyGetSelectionCount ();
00872
00874 void KeySelectAll ();
00875
00877 void KeyUnselectAll ();
00878
00884 KFCurveKey KeyGet(kFCurveIndex pIndex);
00885
00887 void KeyClear ();
00888
00890 void KeyShrink();
00891
00900 bool KeySet(kFCurveIndex pIndex, KFCurveKey& pKey);
00901
00911 KFBX_FCURVE_INLINE bool KeySet(kFCurveIndex pIndex, KFCurve* pSourceCurve, int pSourceIndex);
00912
00920 int KeyMove(kFCurveIndex pIndex, KTime pTime);
00921
00929 bool KeyMoveOf (bool pSelectedOnly, KTime pDeltaTime, kFCurveDouble pDeltaValue);
00930
00937 bool KeyMoveValueTo (bool pSelectedOnly, kFCurveDouble pValue);
00938
00945 bool KeyScaleValue (bool pSelectedOnly, kFCurveDouble pMultValue);
00946
00953 bool KeyScaleTangeant (bool pSelectedOnly, kFCurveDouble pMultValue);
00954
00961 bool KeyScaleValueAndTangeant (bool pSelectedOnly, kFCurveDouble pMultValue);
00962
00967 bool KeyRemove(kFCurveIndex pIndex);
00968
00984 int KeyInsert ( KTime pTime, kFCurveIndex* pLast = NULL );
00985
01002 int KeyAdd (KTime pTime, KFCurveKey& pKey, kFCurveIndex* pLast = NULL);
01003
01021 int KeyAdd(KTime pTime, KFCurve* pSourceCurve, int pSourceIndex, kFCurveIndex* pLast = NULL);
01022
01037 int KeyAdd (KTime pTime, kFCurveIndex* pLast = NULL);
01038
01046 int KeyAppend(KTime pAtTime, KFCurve* pSourceCurve, int pSourceIndex);
01047
01057 int KeyAppendFast( KTime pTime, kFCurveDouble pValue );
01058
01069 double KeyFind (KTime pTime, kFCurveIndex* pLast = NULL);
01070
01072
01073
01074
01075
01076
01077
01078
01079
01080
01085
01112 KFBX_FCURVE_INLINE void KeySet
01113 (
01114 kFCurveIndex pKeyIndex,
01115 KTime pTime,
01116 kFCurveDouble pValue,
01117 kFCurveInterpolation pInterpolation = KFCURVE_INTERPOLATION_CUBIC,
01118 kFCurveTangeantMode pTangentMode = KFCURVE_TANGEANT_AUTO,
01119 kFCurveDouble pData0 = 0.0,
01120 kFCurveDouble pData1 = 0.0,
01121 kFCurveTangeantWeightMode pTangentWeightMode = KFCURVE_WEIGHTED_NONE,
01122 kFCurveDouble pWeight0 = KFCURVE_DEFAULT_WEIGHT,
01123 kFCurveDouble pWeight1 = KFCURVE_DEFAULT_WEIGHT,
01124 kFCurveDouble pVelocity0 = KFCURVE_DEFAULT_VELOCITY,
01125 kFCurveDouble pVelocity1 = KFCURVE_DEFAULT_VELOCITY
01126 );
01127
01136 KFBX_FCURVE_INLINE void KeySetTCB
01137 (
01138 kFCurveIndex pKeyIndex,
01139 KTime pTime,
01140 kFCurveDouble pValue,
01141 float pData0 = 0.0f,
01142 float pData1 = 0.0f,
01143 float pData2 = 0.0f
01144 );
01145
01153 KFBX_FCURVE_INLINE kFCurveInterpolation KeyGetInterpolation(kFCurveIndex pKeyIndex);
01154
01162 KFBX_FCURVE_INLINE void KeySetInterpolation(kFCurveIndex pKeyIndex, kFCurveInterpolation pInterpolation);
01163
01172 KFBX_FCURVE_INLINE kFCurveConstantMode KeyGetConstantMode(kFCurveIndex pKeyIndex);
01173
01186 KFBX_FCURVE_INLINE kFCurveTangeantMode KeyGetTangeantMode(kFCurveIndex pKeyIndex, bool pIncludeOverrides = false );
01187
01196 KFBX_FCURVE_INLINE kFCurveTangeantWeightMode KeyGetTangeantWeightMode(kFCurveIndex pKeyIndex);
01197
01206 KFBX_FCURVE_INLINE kFCurveTangeantVelocityMode KeyGetTangeantVelocityMode(kFCurveIndex pKeyIndex);
01207
01215 KFBX_FCURVE_INLINE void KeySetConstantMode(kFCurveIndex pKeyIndex, kFCurveConstantMode pMode);
01216
01227 KFBX_FCURVE_INLINE void KeySetTangeantMode(kFCurveIndex pKeyIndex, kFCurveTangeantMode pTangent);
01228
01243 KFBX_FCURVE_INLINE void KeySetTangeantWeightMode(kFCurveIndex pKeyIndex, kFCurveTangeantWeightMode pTangentWeightMode, kFCurveTangeantWeightMode pMask = KFCURVE_WEIGHTED_ALL );
01244
01259 KFBX_FCURVE_INLINE void KeySetTangeantVelocityMode(kFCurveIndex pKeyIndex, kFCurveTangeantVelocityMode pTangentVelocityMode, kFCurveTangeantVelocityMode pMask = KFCURVE_VELOCITY_ALL );
01260
01261
01277 KFBX_FCURVE_INLINE kFCurveDouble KeyGetDataDouble(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex);
01278
01295 KFBX_FCURVE_INLINE void KeySetDataDouble(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex, kFCurveDouble pValue);
01296
01303 KFBX_FCURVE_INLINE float KeyGetDataFloat(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex);
01304
01312 KFBX_FCURVE_INLINE void KeySetDataFloat(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex, float pValue);
01313
01318 KFBX_FCURVE_INLINE const float* KeyGetDataPtr(kFCurveIndex pKeyIndex);
01319
01323 KFBX_FCURVE_INLINE kFCurveDouble KeyGetValue(kFCurveIndex pKeyIndex);
01324
01329 KFBX_FCURVE_INLINE void KeySetValue(kFCurveIndex pKeyIndex, kFCurveDouble pValue);
01330
01335 KFBX_FCURVE_INLINE void KeyIncValue(kFCurveIndex pKeyIndex, kFCurveDouble pValue);
01336
01341 KFBX_FCURVE_INLINE void KeyMultValue(kFCurveIndex pKeyIndex, kFCurveDouble pValue);
01342
01349 KFBX_FCURVE_INLINE void KeyMultTangeant(kFCurveIndex pKeyIndex, kFCurveDouble pValue);
01350
01355 KFBX_FCURVE_INLINE KTime KeyGetTime(kFCurveIndex pKeyIndex);
01356
01361 KFBX_FCURVE_INLINE void KeySetTime(kFCurveIndex pKeyIndex, KTime pTime);
01362
01367 KFBX_FCURVE_INLINE void KeyIncTime(kFCurveIndex pKeyIndex, KTime pTime);
01368
01373 KFBX_FCURVE_INLINE void KeySetSelected(kFCurveIndex pKeyIndex, bool pSelected);
01374
01379 KFBX_FCURVE_INLINE bool KeyGetSelected(kFCurveIndex pKeyIndex);
01380
01385 KFBX_FCURVE_INLINE void KeySetMarkedForManipulation(kFCurveIndex pKeyIndex, bool pMark);
01386
01391 KFBX_FCURVE_INLINE bool KeyGetMarkedForManipulation(kFCurveIndex pKeyIndex);
01392
01401 KFBX_FCURVE_INLINE void KeySetTangeantVisibility (kFCurveIndex pKeyIndex, kFCurveTangeantVisibility pVisibility);
01402
01411 KFBX_FCURVE_INLINE kFCurveTangeantVisibility KeyGetTangeantVisibility (kFCurveIndex pKeyIndex);
01412
01418 KFBX_FCURVE_INLINE void KeySetBreak(kFCurveIndex pKeyIndex, bool pVal);
01419
01424 KFBX_FCURVE_INLINE bool KeyGetBreak(kFCurveIndex pKeyIndex);
01425
01427
01428
01429
01430
01431
01432
01433
01434
01439
01445 void KeyTangeantSetInterpolation(bool pSelectedOnly, kFCurveInterpolation pInterpolation);
01446
01453 void KeyTangeantSetMode(bool pSelectedOnly, kFCurveTangeantMode pTangentMode);
01454
01461 kFCurveDouble KeyGetLeftDerivative(kFCurveIndex pIndex);
01462
01472 void KeySetLeftDerivative(kFCurveIndex pIndex, kFCurveDouble pValue);
01473
01481 kFCurveDouble KeyGetLeftAuto(kFCurveIndex pIndex, bool pApplyOvershootProtection = false);
01482
01492 void KeySetLeftAuto(kFCurveIndex pIndex, kFCurveDouble pValue);
01493
01500 KFCurveTangeantInfo KeyGetLeftDerivativeInfo(kFCurveIndex pIndex);
01501
01513 void KeySetLeftDerivativeInfo(kFCurveIndex pIndex, KFCurveTangeantInfo pValue, bool pForceDerivative = false);
01514
01515
01525 void KeyIncLeftDerivative(kFCurveIndex pIndex, kFCurveDouble pInc);
01526
01533 kFCurveDouble KeyGetRightDerivative(kFCurveIndex pIndex);
01534
01544 void KeySetRightDerivative(kFCurveIndex pIndex, kFCurveDouble pValue);
01545
01553 kFCurveDouble KeyGetRightAuto(kFCurveIndex pIndex, bool pApplyOvershootProtection = false);
01554
01564 void KeySetRightAuto(kFCurveIndex pIndex, kFCurveDouble pValue);
01565
01566
01573 KFCurveTangeantInfo KeyGetRightDerivativeInfo(kFCurveIndex pIndex);
01574
01585 void KeySetRightDerivativeInfo(kFCurveIndex pIndex, KFCurveTangeantInfo pValue, bool pForceDerivative = false);
01586
01587
01597 void KeyIncRightDerivative(kFCurveIndex pIndex, kFCurveDouble pInc);
01598
01602 kFCurveDouble KeyGetRightBezierTangeant(kFCurveIndex pIndex);
01603
01613 void KeySetLeftBezierTangeant(kFCurveIndex pIndex, kFCurveDouble pValue);
01614
01618 kFCurveDouble KeyGetLeftBezierTangeant(kFCurveIndex pIndex);
01619
01629 void KeySetRightBezierTangeant(kFCurveIndex pIndex, kFCurveDouble pValue);
01630
01631
01640 void KeyMultDerivative(kFCurveIndex pIndex, kFCurveDouble pMultValue);
01641
01648 bool KeyIsLeftTangeantWeighted(kFCurveIndex pIndex);
01649
01656 bool KeyIsRightTangeantWeighted(kFCurveIndex pIndex);
01657
01665 void KeySetLeftTangeantWeightedMode( kFCurveIndex pIndex, bool pWeighted);
01666
01674 void KeySetRightTangeantWeightedMode( kFCurveIndex pIndex, bool pWeighted);
01675
01682 kFCurveDouble KeyGetLeftTangeantWeight(kFCurveIndex pIndex);
01683
01690 kFCurveDouble KeyGetRightTangeantWeight(kFCurveIndex pIndex);
01691
01704 void KeySetLeftTangeantWeight( kFCurveIndex pIndex, kFCurveDouble pWeight, bool pAdjustTan = false );
01705
01718 void KeySetRightTangeantWeight( kFCurveIndex pIndex, kFCurveDouble pWeight, bool pAdjustTan = false );
01719
01726 bool KeyIsLeftTangeantVelocity(kFCurveIndex pIndex);
01727
01734 bool KeyIsRightTangeantVelocity(kFCurveIndex pIndex);
01735
01743 void KeySetLeftTangeantVelocityMode( kFCurveIndex pIndex, bool pVelocity );
01744
01752 void KeySetRightTangeantVelocityMode( kFCurveIndex pIndex, bool pVelocity);
01753
01760 kFCurveDouble KeyGetLeftTangeantVelocity(kFCurveIndex pIndex);
01761
01768 kFCurveDouble KeyGetRightTangeantVelocity(kFCurveIndex pIndex);
01769
01778 void KeySetLeftTangeantVelocity( kFCurveIndex pIndex, kFCurveDouble pVelocity );
01779
01788 void KeySetRightTangeantVelocity( kFCurveIndex pIndex, kFCurveDouble pVelocity );
01789
01791
01803
01807 KFBX_FCURVE_INLINE void SetPreExtrapolation(kFCurveExtrapolationMode pExtrapolation);
01808
01810 KFBX_FCURVE_INLINE kFCurveExtrapolationMode GetPreExtrapolation();
01811
01816 KFBX_FCURVE_INLINE void SetPreExtrapolationCount(kULong pCount);
01817
01822 KFBX_FCURVE_INLINE kULong GetPreExtrapolationCount();
01823
01827 KFBX_FCURVE_INLINE void SetPostExtrapolation(kFCurveExtrapolationMode pExtrapolation);
01828
01830 KFBX_FCURVE_INLINE kFCurveExtrapolationMode GetPostExtrapolation();
01831
01836 KFBX_FCURVE_INLINE void SetPostExtrapolationCount(kULong pCount);
01837
01842 KFBX_FCURVE_INLINE kULong GetPostExtrapolationCount();
01843
01850 int KeyGetCountAll();
01851
01863 double KeyFindAll(KTime pTime, kFCurveIndex* pLast = NULL);
01864
01866
01871
01884 kFCurveDouble Evaluate (KTime pTime, kFCurveIndex* pLast = NULL);
01885
01895 kFCurveDouble EvaluateIndex( double pIndex);
01896
01905 kFCurveDouble EvaluateLeftDerivative (KTime pTime, kFCurveIndex* pLast = NULL);
01906
01915 kFCurveDouble EvaluateRightDerivative (KTime pTime, kFCurveIndex* pLast = NULL);
01916
01925 int FindPeaks(kFCurveIndex pLeftKeyIndex, KTime& pPeakTime1, KTime& pPeakTime2);
01926
01935 int FindPeaks(kFCurveIndex pLeftKeyIndex, kFCurveDouble& pPeak1, kFCurveDouble& pPeak2);
01936
01947 int FindPeaks(kFCurveIndex pLeftKeyIndex, KTime& pPeakTime1, kFCurveDouble& pPeak1, KTime& pPeakTime2, kFCurveDouble& pPeak2);
01948
01954 void KeyGetPeriods(KTime& pAveragePeriod, KTime& pMinPeriod, KTime& pMaxPeriod);
01955
01957
01962
01970 HKFCurve Copy(KTime pStart = KTIME_MINUS_INFINITE, KTime pStop = KTIME_INFINITE);
01971
01978 void CopyFrom(KFCurve& pSource, bool pWithKeys = true);
01979
01988 void Replace(HKFCurve pSource, KTime pStart = KTIME_MINUS_INFINITE, KTime pStop = KTIME_INFINITE, bool pUseExactGivenSpan = false, bool pKeyStartEndOnNoKey = true, KTime pTimeSpanOffset = KTIME_ZERO );
01989
02002 void ReplaceForQuaternion(HKFCurve pSource, KTime pStart, KTime pStop, kFCurveDouble pScaleStart, kFCurveDouble pScaleStop, bool pUseExactGivenSpan = false, bool pKeyStartEndOnNoKey = true, KTime pTimeSpanOffset = KTIME_ZERO );
02003
02022 void ReplaceForEulerXYZ(HKFCurve pSource, KTime pStart, KTime pStop, kFCurveDouble pAddFromStart, kFCurveDouble pAddAfterStop, bool pValueSubOffsetAfterStart, bool pValueSubOffsetAfterStop, bool pUseExactGivenSpan = false, bool pKeyStartEndOnNoKey = true, KTime pTimeSpanOffset = KTIME_ZERO );
02023
02036 void Insert(HKFCurve pSource, KTime pInsertTime, kFCurveDouble pFirstKeyLeftDerivative, bool pFirstKeyIsWeighted = false, kFCurveDouble pFirstKeyWeight = KFCURVE_DEFAULT_WEIGHT);
02037
02047 void Insert(HKFCurve pSource, KTime pInsertTime, KFCurveTangeantInfo pFirstKeyLeftDerivative );
02048
02058 bool Delete(kFCurveIndex pStartIndex , kFCurveIndex pStopIndex);
02059
02067 bool Delete (KTime pStart = KTIME_MINUS_INFINITE, KTime pStop = KTIME_INFINITE);
02068
02073 bool IsKeyInterpolationPureCubicAuto(kFCurveIndex pKeyIndex);
02074
02075 #ifndef KFBX_PLUGIN
02076
02083 void ExtractKeysIndex( KArraykInt &pArray, int pMinIndex, int pMaxIndex, double pMinValue = -K_DOUBLE_MAX, double pMaxValue = K_DOUBLE_MAX);
02084 #endif
02085
02087
02089
02090
02091
02092
02093
02094
02096
02097 #ifndef DOXYGEN_SHOULD_SKIP_THIS
02098
02099 bool FbxStore (KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = true, bool pIsVersion5 = false );
02100 bool FbxRetrieve (KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = false );
02101 bool FbxInternalRetrieve (KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = false );
02102
02103 double CandidateEvaluate (KTime pTime, kFCurveIndex* pLast = NULL);
02104 bool CandidateClear ();
02105 bool CandidateSet (KTime pTime, double pValue);
02106 bool IsCandidate ();
02107 double CandidateGet ();
02108 KTime CandidateGetTime ();
02109
02110 bool CandidateKey
02111 (
02112 kFCurveIndex *pLast = NULL,
02113 int pInterpolation = KFCURVE_INTERPOLATION_CUBIC,
02114 int pTanMode = KFCURVE_TANGEANT_USER,
02115 int pContinuity = KFCURVE_CONTINUITY,
02116 bool pTangeantOverride = true,
02117 KTime pCandidateTime = KTIME_INFINITE,
02118 double pKeyIndexTolerance = 0.0
02119 );
02120
02121 bool NormalsSeemsToComeFromAPlot();
02122
02123 void SetWasData (int pType);
02124 int GetWasData ();
02125 int GuessWasData (KTime* pStart = NULL, KTime* pStep = NULL);
02126
02127 void KeyTangeantHide ();
02128
02129 int GetUpdateId ();
02130 int GetValuesUpdateId ();
02131
02132 void CallbackRegister (kFCurveCallback pCallback, void* pObject);
02133 void CallbackUnregister (kFCurveCallback pCallback, void* pObject);
02134 void CallbackEnable (bool pEnable);
02135 void CallbackClear ();
02136
02137 private:
02138 void IncrementUpdateId(int pInc);
02139 void CallbackAddEvent (int pWhat, int pIndexStart);
02140
02141 int MapIndexAll (int pIndex, int &pWhere);
02142 void InitBuffers (int pKeyCount);
02143
02144 bool CheckCurve();
02145 void IsClamped( int pIndex, bool &pLeftClamped, bool &pRightClamped );
02146
02147 float mColor[3];
02148
02149 kFCurveDouble mValue;
02150
02151 int mUpdateId;
02152 bool mCallbackEnable;
02153 bool mInternalCallbackEnable;
02154 int mKeyModifyGuard;
02155
02156 KFCurveKey** mFCurveKeysList;
02157
02158 int mFCurveKeyCount;
02159 int mFCurveKeySize;
02160 int mFCurveLastBlockIndex;
02161
02162
02163 kUInt mPreExtrapolation;
02164 kULong mPreExtrapolationCount;
02165 kUInt mPostExtrapolation;
02166 kULong mPostExtrapolationCount;
02167
02168 int mWasType;
02169
02170 kFCurveIndex mLastSearchIndex;
02171
02172 KTime mCandidateTime;
02173 kFCurveDouble mCandidateValue;
02174
02175 KFCurveEvent mEvent;
02176 KArrayUL mCallbackFunctions;
02177 KArrayUL mCallbackObjects;
02178
02179
02180 #ifndef KFBX_PLUGIN
02181 KFBObjectHolder mFBObjectHolder;
02182 KFBX_FCURVE_INLINE KFBObjectHolder& GetFBHolder ();
02183 #endif
02184
02185 KFBX_FCURVE_INLINE KFCurveKey* InternalKeyGetPtr(kFCurveIndex pIndex);
02186
02187 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
02188
02189 };
02190
02191
02192 KFBX_FCURVE_INLINE void KFCurveEvent::Clear ()
02193 {
02194 mType = KFCURVEEVENT_NONE;
02195 mKeyIndexStart = mKeyIndexStop=-1;
02196 mEventCount = 0;
02197 }
02198
02199
02200 KFBX_FCURVE_INLINE void KFCurveEvent::Add (int pWhat, int pIndex)
02201 {
02202 mType |= pWhat;
02203 mEventCount++;
02204 if ( (pIndex<mKeyIndexStart) || (mKeyIndexStart==-1))
02205 {
02206 mKeyIndexStart = pIndex;
02207 }
02208 if (pIndex>mKeyIndexStop)
02209 {
02210 mKeyIndexStop = pIndex;
02211 }
02212 }
02213
02214
02215
02216
02217 KFBX_FCURVE_INLINE KFCurveTangeantInfo::KFCurveTangeantInfo()
02218 {
02219 mDerivative = 0.0;
02220 mWeight = KFCURVE_DEFAULT_WEIGHT;
02221 mWeighted = false;
02222 mVelocity = KFCURVE_DEFAULT_VELOCITY;
02223 mHasVelocity= false;
02224 mAuto = 0.0;
02225 }
02226
02227
02228
02229
02230
02231 KFBX_FCURVE_INLINE void KFCurveKey::Set
02232 (
02233 KTime pTime,
02234 kFCurveDouble pValue,
02235 kFCurveInterpolation pInterpolation ,
02236 kFCurveTangeantMode pTangeantMode ,
02237 kFCurveDouble pData0 ,
02238 kFCurveDouble pData1 ,
02239 kFCurveTangeantWeightMode pTangeantWeightMode ,
02240 kFCurveDouble pWeight0 ,
02241 kFCurveDouble pWeight1 ,
02242 kFCurveDouble pVelocity0 ,
02243 kFCurveDouble pVelocity1
02244 )
02245 {
02246 K_ASSERT (pInterpolation != KFCURVE_INTERPOLATION_CUBIC || pTangeantMode != KFCURVE_TANGEANT_TCB);
02247
02248 SetTime (pTime);
02249 SetValue (pValue);
02250 SetInterpolation (pInterpolation);
02251 SetTangeantMode (pTangeantMode);
02252 SetDataDouble (KFCURVEKEY_RIGHT_SLOPE, pData0);
02253 SetDataDouble (KFCURVEKEY_NEXT_LEFT_SLOPE, pData1);
02254
02255 SetTangeantWeightMode (pTangeantWeightMode);
02256 SetDataDouble (KFCURVEKEY_RIGHT_WEIGHT, pWeight0);
02257 SetDataDouble (KFCURVEKEY_NEXT_LEFT_WEIGHT, pWeight1);
02258
02259 SetDataDouble (KFCURVEKEY_RIGHT_VELOCITY, pVelocity0);
02260 SetDataDouble (KFCURVEKEY_NEXT_LEFT_VELOCITY, pVelocity1);
02261
02262 SetTangeantVisibility (KFCURVE_TANGEANT_SHOW_NONE);
02263 }
02264
02265
02266 KFBX_FCURVE_INLINE void KFCurveKey::SetTCB (KTime pTime, kFCurveDouble pValue, float pData1, float pData2, float pData3)
02267 {
02268 SetTime (pTime);
02269 SetValue (pValue);
02270 SetInterpolation (KFCURVE_INTERPOLATION_CUBIC);
02271 SetTangeantMode (KFCURVE_TANGEANT_TCB);
02272 SetDataFloat (KFCURVEKEY_TCB_TENSION, pData1);
02273 SetDataFloat (KFCURVEKEY_TCB_CONTINUITY, pData2);
02274 SetDataFloat (KFCURVEKEY_TCB_BIAS, pData3);
02275 SetTangeantVisibility (KFCURVE_TANGEANT_SHOW_NONE);
02276 }
02277
02278
02279 KFBX_FCURVE_INLINE void KFCurveKey::Set (KFCurveKey& iSource)
02280 {
02281 mValue = iSource.mValue;
02282 mTime = iSource.mTime;
02283 mFlags = iSource.mFlags;
02284 mData[0] = iSource.mData[0];
02285 mData[1] = iSource.mData[1];
02286 #ifdef KFCURVE_FLOAT
02287 mData[2] = iSource.mData[2];
02288 mData[3] = iSource.mData[3];
02289 #else
02290 mWeight[0] = iSource.mWeight[0];
02291 mWeight[1] = iSource.mWeight[1];
02292 mVelocity[0] = iSource.mVelocity[0];
02293 mVelocity[1] = iSource.mVelocity[1];
02294 #endif
02295 }
02296
02297
02298 KFBX_FCURVE_INLINE kFCurveInterpolation KFCurveKey::GetInterpolation ()
02299 {
02300 return mFlags & KFCURVE_INTERPOLATION_ALL;
02301 }
02302
02303
02304 KFBX_FCURVE_INLINE void KFCurveKey::SetInterpolation (kFCurveInterpolation pInterpolation)
02305 {
02306 K_ASSERT_MSG( (pInterpolation == KFCURVE_INTERPOLATION_CUBIC) ||
02307 (pInterpolation == KFCURVE_INTERPOLATION_LINEAR) ||
02308 (pInterpolation == KFCURVE_INTERPOLATION_CONSTANT) ,"Wrong interpolation type." );
02309
02310 if( (((mFlags & KFCURVE_INTERPOLATION_ALL)!=KFCURVE_INTERPOLATION_CUBIC)) && pInterpolation == KFCURVE_INTERPOLATION_CUBIC )
02311 {
02312
02313 SetTangeantWeightMode( KFCURVE_WEIGHTED_NONE);
02314 SetDataDouble (KFCURVEKEY_RIGHT_WEIGHT, KFCURVE_DEFAULT_WEIGHT);
02315 SetDataDouble (KFCURVEKEY_NEXT_LEFT_WEIGHT, KFCURVE_DEFAULT_WEIGHT);
02316
02317 SetTangeantVelocityMode(KFCURVE_VELOCITY_NONE);
02318 SetDataDouble( KFCURVEKEY_RIGHT_VELOCITY, KFCURVE_DEFAULT_VELOCITY);
02319 SetDataDouble( KFCURVEKEY_NEXT_LEFT_VELOCITY, KFCURVE_DEFAULT_VELOCITY);
02320 }
02321
02322 mFlags = (mFlags & ~KFCURVE_INTERPOLATION_ALL) | (pInterpolation & KFCURVE_INTERPOLATION_ALL);
02323 }
02324
02325
02326 KFBX_FCURVE_INLINE kFCurveConstantMode KFCurveKey::GetConstantMode()
02327 {
02328 return mFlags & KFCURVE_CONSTANT_ALL;
02329 }
02330
02331 KFBX_FCURVE_INLINE kFCurveTangeantMode KFCurveKey::GetTangeantMode( bool pIncludeOverrides )
02332 {
02333 if( pIncludeOverrides )
02334 {
02335 return mFlags & KFCURVE_TANGEANT_ALL;
02336 }
02337 else
02338 {
02339 return mFlags & KFCURVE_TANGEANT_TYPE_MASK;
02340 }
02341 }
02342
02343 KFBX_FCURVE_INLINE void KFCurveKey::SetConstantMode (kFCurveConstantMode pMode)
02344 {
02345 K_ASSERT_MSG( (GetInterpolation() != KFCURVE_INTERPOLATION_CONSTANT) ||
02346 (pMode == KFCURVE_CONSTANT_STANDARD) ||
02347 (pMode == KFCURVE_CONSTANT_NEXT),"Wrong constant mode.");
02348
02349 mFlags = (mFlags & ~KFCURVE_CONSTANT_ALL) | (pMode & KFCURVE_CONSTANT_ALL);
02350 }
02351
02352 KFBX_FCURVE_INLINE void KFCurveKey::SetTangeantMode (kFCurveTangeantMode pTangeant)
02353 {
02354
02355 K_ASSERT_MSG( (GetInterpolation() != KFCURVE_INTERPOLATION_CUBIC) || !(pTangeant & ~KFCURVE_TANGEANT_ALL), "Wrong tangent mode." );
02356 K_ASSERT_MSG( (GetInterpolation() != KFCURVE_INTERPOLATION_CONSTANT) || !(pTangeant & ~KFCURVE_CONSTANT_ALL), "Wrong tangent mode." );
02357
02358 mFlags = (mFlags & ~(KFCURVE_TANGEANT_ALL|KFCURVE_CONSTANT_ALL)) | (pTangeant & (KFCURVE_TANGEANT_ALL|KFCURVE_CONSTANT_ALL) );
02359 }
02360
02361 KFBX_FCURVE_INLINE kFCurveTangeantWeightMode KFCurveKey::GetTangeantWeightMode()
02362 {
02363 return mFlags & KFCURVE_WEIGHTED_ALL;
02364 }
02365
02366 KFBX_FCURVE_INLINE void KFCurveKey::SetTangeantWeightMode(kFCurveTangeantWeightMode pTangent, kFCurveTangeantWeightMode pMask )
02367 {
02368
02369 pMask &= KFCURVE_WEIGHTED_ALL;
02370 mFlags = (mFlags & ~pMask) | (pTangent & pMask);
02371 }
02372
02373 KFBX_FCURVE_INLINE kFCurveTangeantVelocityMode KFCurveKey::GetTangeantVelocityMode()
02374 {
02375 return mFlags & KFCURVE_VELOCITY_ALL;
02376 }
02377
02378 KFBX_FCURVE_INLINE void KFCurveKey::SetTangeantVelocityMode(kFCurveTangeantVelocityMode pTangent, kFCurveTangeantVelocityMode pMask )
02379 {
02380 pMask &= KFCURVE_VELOCITY_ALL;
02381 mFlags = (mFlags & ~pMask) | (pTangent & pMask);
02382 }
02383
02384 KFBX_FCURVE_INLINE void KFCurveKey::SetTangentWeightAndAdjustTangent( EKFCurveDataIndex pIndex, kFCurveDouble pWeight )
02385 {
02386 K_ASSERT( pIndex == KFCURVEKEY_RIGHT_WEIGHT || pIndex == KFCURVEKEY_NEXT_LEFT_WEIGHT);
02387 if (pIndex != KFCURVEKEY_RIGHT_WEIGHT && pIndex != KFCURVEKEY_NEXT_LEFT_WEIGHT)
02388 return;
02389
02390 if( pWeight > KFCURVE_MAX_WEIGHT )
02391 {
02392 pWeight = KFCURVE_MAX_WEIGHT;
02393 }
02394
02395 int lWeightToStore = (int)(pWeight*KFCURVE_WEIGHT_DIVIDER);
02396 if( lWeightToStore < 1 )
02397 {
02398 lWeightToStore = 1;
02399 }
02400
02401
02402
02403
02404 if( pWeight < ((kFCurveDouble)(100.0/KFCURVE_WEIGHT_DIVIDER)) )
02405 {
02406 int index = (pIndex == KFCURVEKEY_RIGHT_WEIGHT) ? KFCURVEKEY_RIGHT_SLOPE : KFCURVEKEY_NEXT_LEFT_SLOPE;
02407 double lTangent = mData[index];
02408 lTangent = lTangent*pWeight*KFCURVE_WEIGHT_DIVIDER/(double)lWeightToStore;
02409 mData[index] = lTangent;
02410 }
02411
02412 #ifdef KFCURVE_FLOAT
02413 (((kInt16*)(&mData[KFCURVEKEY_WEIGHTS]))[pIndex-KFCURVEKEY_WEIGHTS]) = (kInt16)lWeightToStore;
02414 #else
02415 mWeight[pIndex-KFCURVEKEY_WEIGHTS] = lWeightToStore;
02416 #endif
02417 }
02418
02419 KFBX_FCURVE_INLINE void KFCurveKey::SetTangeantVisibility (kFCurveTangeantVisibility pVisibility)
02420 {
02421 K_ASSERT_MSG( (pVisibility == KFCURVE_TANGEANT_SHOW_NONE) ||
02422 (pVisibility == KFCURVE_TANGEANT_SHOW_LEFT) ||
02423 (pVisibility == KFCURVE_TANGEANT_SHOW_RIGHT) ||
02424 (pVisibility == KFCURVE_TANGEANT_SHOW_BOTH) ,"Wrong visibility type." );
02425
02426 mFlags = (mFlags & ~KFCURVE_TANGEANT_SHOW_BOTH) | (pVisibility & KFCURVE_TANGEANT_SHOW_BOTH);
02427 }
02428
02429
02430 KFBX_FCURVE_INLINE kFCurveTangeantVisibility KFCurveKey::GetTangeantVisibility ()
02431 {
02432 return mFlags & KFCURVE_TANGEANT_SHOW_BOTH;
02433 }
02434
02435
02436 KFBX_FCURVE_INLINE kFCurveDouble KFCurveKey::GetDataDouble (EKFCurveDataIndex pIndex)
02437 {
02438 if( pIndex < KFCURVEKEY_WEIGHTS )
02439 {
02440 return mData[pIndex];
02441 }
02442 else
02443 {
02444 #ifdef KFCURVE_FLOAT
02445 return (kFCurveDouble)(((kInt16*)(&mData[KFCURVEKEY_WEIGHTS]))[pIndex-KFCURVEKEY_WEIGHTS])/(kFCurveDouble)KFCURVE_WEIGHT_DIVIDER;
02446 #else
02447 return (kFCurveDouble)mWeight[pIndex-KFCURVEKEY_WEIGHTS]/(kFCurveDouble)KFCURVE_WEIGHT_DIVIDER;
02448 #endif
02449 }
02450 }
02451
02452
02453 KFBX_FCURVE_INLINE void KFCurveKey::SetDataDouble (EKFCurveDataIndex pIndex, kFCurveDouble pValue)
02454 {
02455 if( pIndex < KFCURVEKEY_RIGHT_WEIGHT )
02456 {
02457 mData[pIndex] = pValue;
02458 }
02459 else
02460 {
02461 if( (pIndex == KFCURVEKEY_RIGHT_WEIGHT || pIndex == KFCURVEKEY_NEXT_LEFT_WEIGHT ) && pValue > KFCURVE_MAX_WEIGHT )
02462 {
02463 pValue = KFCURVE_MAX_WEIGHT;
02464 }
02465 else if( (pIndex == KFCURVEKEY_RIGHT_WEIGHT || pIndex == KFCURVEKEY_NEXT_LEFT_WEIGHT ) && pValue < KFCURVE_MIN_WEIGHT )
02466 {
02467 pValue = KFCURVE_MIN_WEIGHT;
02468 }
02469
02470 #ifdef KFCURVE_FLOAT
02471 (((kInt16*)(&mData[KFCURVEKEY_WEIGHTS]))[pIndex-KFCURVEKEY_WEIGHTS]) = (kInt16)(pValue*KFCURVE_WEIGHT_DIVIDER);
02472 #else
02473 mWeight[pIndex-KFCURVEKEY_WEIGHTS] = pValue*KFCURVE_WEIGHT_DIVIDER;
02474 #endif
02475 }
02476 }
02477
02478
02479 KFBX_FCURVE_INLINE float KFCurveKey::GetDataFloat (EKFCurveDataIndex pIndex)
02480 {
02481 return ( (float *)&mData[0])[pIndex];
02482 }
02483
02484
02485 KFBX_FCURVE_INLINE void KFCurveKey::SetDataFloat (EKFCurveDataIndex pIndex, float pValue)
02486 {
02487 ((float *)&mData[0])[pIndex] = pValue;
02488 }
02489
02490 KFBX_FCURVE_INLINE float* KFCurveKey::GetDataPtr()
02491 {
02492 return (float*)mData;
02493 }
02494
02495
02496 KFBX_FCURVE_INLINE kFCurveDouble KFCurveKey::GetValue ()
02497 {
02498 return mValue;
02499 }
02500
02501
02502 KFBX_FCURVE_INLINE void KFCurveKey::SetValue (kFCurveDouble pValue)
02503 {
02504 mValue=pValue;
02505 }
02506
02507
02508 KFBX_FCURVE_INLINE void KFCurveKey::IncValue (kFCurveDouble pValue)
02509 {
02510 mValue+=pValue;
02511 }
02512
02513 KFBX_FCURVE_INLINE void KFCurveKey::MultValue (kFCurveDouble pValue)
02514 {
02515 mValue*=pValue;
02516 }
02517
02518 KFBX_FCURVE_INLINE void KFCurveKey::MultTangeant (kFCurveDouble pValue)
02519 {
02520 if (GetInterpolation() == KFCURVE_INTERPOLATION_CUBIC)
02521 {
02522 switch (GetTangeantMode())
02523 {
02524 case KFCURVE_TANGEANT_USER:
02525 case KFCURVE_TANGEANT_BREAK:
02526 SetDataDouble(KFCURVEKEY_RIGHT_SLOPE, GetDataDouble(KFCURVEKEY_RIGHT_SLOPE) * pValue);
02527 SetDataDouble(KFCURVEKEY_NEXT_LEFT_SLOPE, GetDataDouble(KFCURVEKEY_NEXT_LEFT_SLOPE) * pValue);
02528 break;
02529 case KFCURVE_TANGEANT_TCB:
02530
02531 case KFCURVE_TANGEANT_AUTO:
02532 case KFCURVE_TANGEANT_AUTO_BREAK:
02533 default:
02534
02535 break;
02536 }
02537 }
02538 }
02539
02540 KFBX_FCURVE_INLINE KTime KFCurveKey::GetTime ()
02541 {
02542 return mTime;
02543 }
02544
02545
02546 KFBX_FCURVE_INLINE void KFCurveKey::SetTime (KTime pTime)
02547 {
02548 K_ASSERT_MSG( pTime != KTIME_MINUS_INFINITE &&
02549 pTime != KTIME_INFINITE, "Key at infinite!" );
02550
02551 mTime=pTime;
02552 }
02553
02554 KFBX_FCURVE_INLINE void KFCurveKey::IncTime (KTime pTime)
02555 {
02556 mTime+=pTime;
02557 }
02558
02559
02560 KFBX_FCURVE_INLINE void KFCurveKey::SetSelected (bool pSelected)
02561 {
02562 mFlags = pSelected ? (mFlags & ~KFCURVE_SELECT_ALL) | KFCURVE_SELECT_POINT : (mFlags & ~KFCURVE_SELECT_ALL);
02563 }
02564
02565
02566 KFBX_FCURVE_INLINE bool KFCurveKey::GetSelected ()
02567 {
02568 return (mFlags & KFCURVE_SELECT_POINT) ? true : false;
02569 }
02570
02571
02572 KFBX_FCURVE_INLINE void KFCurveKey::SetMarkedForManipulation (bool pSelected)
02573 {
02574 mFlags = pSelected ? (mFlags & ~KFCURVE_MARKED_ALL) | KFCURVE_MARKED_FOR_MANIP : (mFlags & ~KFCURVE_MARKED_ALL);
02575 }
02576
02577
02578 KFBX_FCURVE_INLINE bool KFCurveKey::GetMarkedForManipulation ()
02579 {
02580 return (mFlags & KFCURVE_MARKED_FOR_MANIP) ? true : false;
02581 }
02582
02583
02584 KFBX_FCURVE_INLINE void KFCurveKey::Init()
02585 {
02586 mValue = 0.0;
02587 mTime = KTIME_ZERO;
02588 mFlags = 0;
02589 }
02590
02591
02592 KFBX_FCURVE_INLINE void KFCurveKey::SetBreak(bool pVal)
02593 {
02594 K_ASSERT_MSG( (GetInterpolation() != KFCURVE_INTERPOLATION_CUBIC) ||
02595 (GetTangeantMode() == KFCURVE_TANGEANT_BREAK) ||
02596 (GetTangeantMode() == KFCURVE_TANGEANT_AUTO) ||
02597 (GetTangeantMode() == KFCURVE_TANGEANT_AUTO_BREAK) ||
02598 (GetTangeantMode() == KFCURVE_TANGEANT_USER) ,"Wrong tangent mode." );
02599
02600 if(pVal)
02601 mFlags = mFlags | KFCURVE_GENERIC_BREAK ;
02602 else
02603 mFlags = mFlags & ~KFCURVE_GENERIC_BREAK ;
02604
02605 }
02606
02607 KFBX_FCURVE_INLINE bool KFCurveKey::GetBreak()
02608 {
02609 K_ASSERT_MSG( (GetInterpolation() != KFCURVE_INTERPOLATION_CUBIC) ||
02610 (GetTangeantMode() == KFCURVE_TANGEANT_BREAK) ||
02611 (GetTangeantMode() == KFCURVE_TANGEANT_AUTO) ||
02612 (GetTangeantMode() == KFCURVE_TANGEANT_AUTO_BREAK) ||
02613 (GetTangeantMode() == KFCURVE_TANGEANT_USER) ,"Wrong tangent mode." );
02614
02615 if( ((mFlags & KFCURVE_GENERIC_BREAK ) == KFCURVE_GENERIC_BREAK))
02616 return true;
02617 else
02618 return false;
02619
02620 }
02621
02622
02623
02624
02625
02626
02627 KFBX_FCURVE_INLINE kFCurveDouble KFCurve::GetValue () const
02628 {
02629 return mValue;
02630 }
02631
02632 #ifndef DOXYGEN_SHOULD_SKIP_THIS
02633 KFBX_FCURVE_INLINE void KFCurve::SetPreExtrapolation (kUInt pExtrapolation)
02634 {
02635 K_ASSERT_MSG( (pExtrapolation == KFCURVE_EXTRAPOLATION_CONST) ||
02636 (pExtrapolation == KFCURVE_EXTRAPOLATION_REPETITION) ||
02637 (pExtrapolation == KFCURVE_EXTRAPOLATION_MIRROR_REPETITION) ||
02638 (pExtrapolation == KFCURVE_EXTRAPOLATION_KEEP_SLOPE) ,"Wrong extrapolation type." );
02639
02640 mPreExtrapolation = pExtrapolation;
02641 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, -1);
02642 }
02643 #endif
02644
02645 KFBX_FCURVE_INLINE kUInt KFCurve::GetPreExtrapolation ()
02646 {
02647 return mPreExtrapolation;
02648 }
02649
02650
02651 KFBX_FCURVE_INLINE void KFCurve::SetPreExtrapolationCount (kULong pCount)
02652 {
02653 mPreExtrapolationCount = pCount;
02654 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, -1);
02655 }
02656
02657
02658 KFBX_FCURVE_INLINE kULong KFCurve::GetPreExtrapolationCount ()
02659 {
02660 return mPreExtrapolationCount;
02661 }
02662
02663 #ifndef DOXYGEN_SHOULD_SKIP_THIS
02664
02665 KFBX_FCURVE_INLINE void KFCurve::SetPostExtrapolation (kUInt pExtrapolation)
02666 {
02667 K_ASSERT_MSG( (pExtrapolation == KFCURVE_EXTRAPOLATION_CONST) ||
02668 (pExtrapolation == KFCURVE_EXTRAPOLATION_REPETITION) ||
02669 (pExtrapolation == KFCURVE_EXTRAPOLATION_MIRROR_REPETITION) ||
02670 (pExtrapolation == KFCURVE_EXTRAPOLATION_KEEP_SLOPE) ,"Wrong extrapolation type." );
02671
02672 mPostExtrapolation = pExtrapolation;
02673 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, -1);
02674 }
02675
02676 #endif
02677
02678 KFBX_FCURVE_INLINE kUInt KFCurve::GetPostExtrapolation ()
02679 {
02680 return mPostExtrapolation;
02681 }
02682
02683
02684 KFBX_FCURVE_INLINE void KFCurve::SetPostExtrapolationCount (kULong pCount)
02685 {
02686 mPostExtrapolationCount = pCount;
02687 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, -1);
02688 }
02689
02690
02691 KFBX_FCURVE_INLINE kULong KFCurve::GetPostExtrapolationCount ()
02692 {
02693 return mPostExtrapolationCount;
02694 }
02695
02696 #ifndef DOXYGEN_SHOULD_SKIP_THIS
02697 KFBX_FCURVE_INLINE KFCurveKey* KFCurve::InternalKeyGetPtr (int pIndex)
02698 {
02699 K_ASSERT_MSG( pIndex >= 0, "Negative indexes are not recommended." );
02700 K_ASSERT_MSG( mFCurveKeysList && mFCurveKeysList[pIndex / KEY_BLOCK_COUNT], "Accessing unallocated buffer." );
02701
02702 return mFCurveKeysList[pIndex / KEY_BLOCK_COUNT] + (pIndex % KEY_BLOCK_COUNT);
02703 }
02704
02705 #ifndef KFBX_PLUGIN
02706 KFBX_FCURVE_INLINE KFBObjectHolder& KFCurve::GetFBHolder ()
02707 {
02708 return mFBObjectHolder;
02709 }
02710 #endif
02711 #endif
02712
02713
02714
02715
02716
02717 KFBX_FCURVE_INLINE bool KFCurve::KeySet(kFCurveIndex pIndex, KFCurve* pSourceCurve, int pSourceIndex)
02718 {
02719 KFCurveKey* lKey = pSourceCurve->InternalKeyGetPtr(pSourceIndex);
02720 return KeySet(pIndex, *lKey);
02721 }
02722
02723
02724 KFBX_FCURVE_INLINE int KFCurve::KeyAdd(KTime pTime, KFCurve* pSourceCurve, int pSourceIndex, kFCurveIndex* pLast)
02725 {
02726 K_ASSERT(pSourceIndex >= 0);
02727 K_ASSERT(pSourceIndex < pSourceCurve->KeyGetCount());
02728
02729 KFCurveKey* lKey = pSourceCurve->InternalKeyGetPtr(pSourceIndex);
02730 return KeyAdd(pTime, *lKey, pLast);
02731 }
02732
02733
02734 KFBX_FCURVE_INLINE void KFCurve::KeySet
02735 (
02736 kFCurveIndex pKeyIndex,
02737 KTime pTime,
02738 kFCurveDouble pValue,
02739 kFCurveInterpolation pInterpolation,
02740 kFCurveTangeantMode pTangentMode,
02741 kFCurveDouble pData0,
02742 kFCurveDouble pData1,
02743 kFCurveTangeantWeightMode pTangentWeightMode,
02744 kFCurveDouble pWeight0,
02745 kFCurveDouble pWeight1,
02746 kFCurveDouble pVelocity0,
02747 kFCurveDouble pVelocity1
02748 )
02749 {
02750 InternalKeyGetPtr(pKeyIndex)->Set(pTime, pValue, pInterpolation, pTangentMode, pData0, pData1, pTangentWeightMode, pWeight0, pWeight1, pVelocity0, pVelocity1);
02751
02752 if (pKeyIndex >= mFCurveKeyCount)
02753 {
02754 int lOldCount = mFCurveKeyCount;
02755 mFCurveKeyCount = pKeyIndex + 1;
02756
02757 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_KEYADD, lOldCount);
02758 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_KEYADD, pKeyIndex);
02759 }
02760 else
02761 {
02762 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITVALUE | KFCURVEEVENT_EDITTIME | KFCURVEEVENT_EDITOTHER, pKeyIndex);
02763 }
02764 }
02765
02766 KFBX_FCURVE_INLINE void KFCurve::KeySetTCB
02767 (
02768 kFCurveIndex pKeyIndex,
02769 KTime pTime,
02770 kFCurveDouble pValue,
02771 float pData0,
02772 float pData1,
02773 float pData2
02774 )
02775 {
02776 InternalKeyGetPtr(pKeyIndex)->SetTCB(pTime, pValue, pData0, pData1, pData2);
02777
02778 if (pKeyIndex >= mFCurveKeyCount)
02779 {
02780 int lOldCount = mFCurveKeyCount;
02781 mFCurveKeyCount = pKeyIndex + 1;
02782
02783 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_KEYADD, lOldCount);
02784 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_KEYADD, pKeyIndex);
02785 }
02786 else
02787 {
02788 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITVALUE | KFCURVEEVENT_EDITTIME | KFCURVEEVENT_EDITOTHER, pKeyIndex);
02789 }
02790 }
02791
02792 KFBX_FCURVE_INLINE kFCurveInterpolation KFCurve::KeyGetInterpolation(kFCurveIndex pKeyIndex)
02793 {
02794 K_ASSERT(pKeyIndex >= 0);
02795 K_ASSERT(pKeyIndex < KeyGetCount());
02796
02797 return InternalKeyGetPtr(pKeyIndex)->GetInterpolation();
02798 }
02799
02800 KFBX_FCURVE_INLINE void KFCurve::KeySetInterpolation(kFCurveIndex pKeyIndex, kFCurveInterpolation pInterpolation)
02801 {
02802 K_ASSERT(pKeyIndex >= 0);
02803 K_ASSERT(pKeyIndex < KeyGetCount());
02804
02805 InternalKeyGetPtr(pKeyIndex)->SetInterpolation(pInterpolation);
02806 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, pKeyIndex);
02807 }
02808
02809 KFBX_FCURVE_INLINE kFCurveConstantMode KFCurve::KeyGetConstantMode(kFCurveIndex pKeyIndex)
02810 {
02811 K_ASSERT(pKeyIndex >= 0);
02812 K_ASSERT(pKeyIndex < KeyGetCount());
02813
02814 return InternalKeyGetPtr(pKeyIndex)->GetConstantMode();
02815 }
02816
02817 KFBX_FCURVE_INLINE kFCurveTangeantMode KFCurve::KeyGetTangeantMode(kFCurveIndex pKeyIndex, bool pIncludeOverrides )
02818 {
02819 K_ASSERT(pKeyIndex >= 0);
02820 K_ASSERT(pKeyIndex < KeyGetCount());
02821
02822 return InternalKeyGetPtr(pKeyIndex)->GetTangeantMode( pIncludeOverrides );
02823 }
02824
02825 KFBX_FCURVE_INLINE kFCurveTangeantWeightMode KFCurve::KeyGetTangeantWeightMode(kFCurveIndex pKeyIndex)
02826 {
02827 K_ASSERT(pKeyIndex >= 0);
02828 K_ASSERT(pKeyIndex < KeyGetCount());
02829
02830 return InternalKeyGetPtr(pKeyIndex)->GetTangeantWeightMode();
02831 }
02832
02833 KFBX_FCURVE_INLINE kFCurveTangeantVelocityMode KFCurve::KeyGetTangeantVelocityMode(kFCurveIndex pKeyIndex)
02834 {
02835 K_ASSERT(pKeyIndex >= 0);
02836 K_ASSERT(pKeyIndex < KeyGetCount());
02837
02838 return InternalKeyGetPtr(pKeyIndex)->GetTangeantVelocityMode();
02839 }
02840
02841 KFBX_FCURVE_INLINE void KFCurve::KeySetConstantMode(kFCurveIndex pKeyIndex, kFCurveConstantMode pMode)
02842 {
02843 K_ASSERT(pKeyIndex >= 0);
02844 K_ASSERT(pKeyIndex < KeyGetCount());
02845
02846 InternalKeyGetPtr(pKeyIndex)->SetConstantMode(pMode);
02847 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, pKeyIndex);
02848 }
02849
02850 KFBX_FCURVE_INLINE void KFCurve::KeySetTangeantMode(kFCurveIndex pKeyIndex, kFCurveTangeantMode pTangent)
02851 {
02852 K_ASSERT(pKeyIndex >= 0);
02853 K_ASSERT(pKeyIndex < KeyGetCount());
02854
02855 InternalKeyGetPtr(pKeyIndex)->SetTangeantMode(pTangent);
02856 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, pKeyIndex);
02857 }
02858
02859 KFBX_FCURVE_INLINE void KFCurve::KeySetTangeantWeightMode(kFCurveIndex pKeyIndex, kFCurveTangeantWeightMode pTangentWeightMode, kFCurveTangeantWeightMode pMask)
02860 {
02861 K_ASSERT(pKeyIndex >= 0);
02862 K_ASSERT(pKeyIndex < KeyGetCount());
02863
02864 InternalKeyGetPtr(pKeyIndex)->SetTangeantWeightMode(pTangentWeightMode, pMask);
02865 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, pKeyIndex);
02866 }
02867
02868 KFBX_FCURVE_INLINE void KFCurve::KeySetTangeantVelocityMode(kFCurveIndex pKeyIndex, kFCurveTangeantVelocityMode pTangentVelocityMode, kFCurveTangeantVelocityMode pMask)
02869 {
02870 K_ASSERT(pKeyIndex >= 0);
02871 K_ASSERT(pKeyIndex < KeyGetCount());
02872
02873 InternalKeyGetPtr(pKeyIndex)->SetTangeantVelocityMode(pTangentVelocityMode, pMask);
02874 CallbackAddEvent (KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, pKeyIndex);
02875 }
02876
02877 KFBX_FCURVE_INLINE kFCurveDouble KFCurve::KeyGetDataDouble(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex)
02878 {
02879 K_ASSERT(pKeyIndex >= 0);
02880 K_ASSERT(pKeyIndex < KeyGetCount());
02881
02882 return InternalKeyGetPtr(pKeyIndex)->GetDataDouble(pIndex);
02883 }
02884
02885 KFBX_FCURVE_INLINE void KFCurve::KeySetDataDouble(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex, kFCurveDouble pValue)
02886 {
02887 K_ASSERT(pKeyIndex >= 0);
02888 K_ASSERT(pKeyIndex < KeyGetCount());
02889
02890 InternalKeyGetPtr(pKeyIndex)->SetDataDouble(pIndex, pValue);
02891 CallbackAddEvent(KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, pKeyIndex);
02892 }
02893
02894 KFBX_FCURVE_INLINE float KFCurve::KeyGetDataFloat(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex)
02895 {
02896 K_ASSERT(pKeyIndex >= 0);
02897 K_ASSERT(pKeyIndex < KeyGetCount());
02898
02899 return InternalKeyGetPtr(pKeyIndex)->GetDataFloat(pIndex);
02900 }
02901
02902 KFBX_FCURVE_INLINE void KFCurve::KeySetDataFloat(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex, float pValue)
02903 {
02904 K_ASSERT(pKeyIndex >= 0);
02905 K_ASSERT(pKeyIndex < KeyGetCount());
02906
02907 InternalKeyGetPtr(pKeyIndex)->SetDataFloat(pIndex, pValue);
02908 CallbackAddEvent(KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, pKeyIndex);
02909 }
02910
02911 KFBX_FCURVE_INLINE const float* KFCurve::KeyGetDataPtr(kFCurveIndex pKeyIndex)
02912 {
02913 K_ASSERT(pKeyIndex >= 0);
02914 K_ASSERT(pKeyIndex < KeyGetCount());
02915
02916 return InternalKeyGetPtr(pKeyIndex)->GetDataPtr();
02917 }
02918
02919 KFBX_FCURVE_INLINE kFCurveDouble KFCurve::KeyGetValue(kFCurveIndex pKeyIndex)
02920 {
02921 K_ASSERT(pKeyIndex >= 0);
02922 K_ASSERT(pKeyIndex < KeyGetCount());
02923
02924 return InternalKeyGetPtr(pKeyIndex)->GetValue();
02925 }
02926
02927 KFBX_FCURVE_INLINE void KFCurve::KeySetValue(kFCurveIndex pKeyIndex, kFCurveDouble pValue)
02928 {
02929 InternalKeyGetPtr(pKeyIndex)->SetValue(pValue);
02930 CallbackAddEvent(KFCURVEEVENT_KEY | KFCURVEEVENT_EDITVALUE, pKeyIndex);
02931 }
02932
02933 KFBX_FCURVE_INLINE void KFCurve::KeyIncValue(kFCurveIndex pKeyIndex, kFCurveDouble pValue)
02934 {
02935 K_ASSERT(pKeyIndex >= 0);
02936 K_ASSERT(pKeyIndex < KeyGetCount());
02937
02938 InternalKeyGetPtr(pKeyIndex)->IncValue(pValue);
02939 CallbackAddEvent(KFCURVEEVENT_KEY | KFCURVEEVENT_EDITVALUE, pKeyIndex);
02940 }
02941
02942 KFBX_FCURVE_INLINE void KFCurve::KeyMultValue(kFCurveIndex pKeyIndex, kFCurveDouble pValue)
02943 {
02944 K_ASSERT(pKeyIndex >= 0);
02945 K_ASSERT(pKeyIndex < KeyGetCount());
02946
02947 InternalKeyGetPtr(pKeyIndex)->MultValue(pValue);
02948 CallbackAddEvent(KFCURVEEVENT_KEY | KFCURVEEVENT_EDITVALUE, pKeyIndex);
02949 }
02950
02951 KFBX_FCURVE_INLINE void KFCurve::KeyMultTangeant(kFCurveIndex pKeyIndex, kFCurveDouble pValue)
02952 {
02953 K_ASSERT(pKeyIndex >= 0);
02954 K_ASSERT(pKeyIndex < KeyGetCount());
02955
02956 InternalKeyGetPtr(pKeyIndex)->MultTangeant(pValue);
02957 CallbackAddEvent(KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, pKeyIndex);
02958 }
02959
02960 KFBX_FCURVE_INLINE KTime KFCurve::KeyGetTime(kFCurveIndex pKeyIndex)
02961 {
02962 K_ASSERT(pKeyIndex >= 0);
02963 K_ASSERT(pKeyIndex < KeyGetCount());
02964
02965 return InternalKeyGetPtr(pKeyIndex)->GetTime();
02966 }
02967
02968 KFBX_FCURVE_INLINE void KFCurve::KeySetTime(kFCurveIndex pKeyIndex, KTime pTime)
02969 {
02970 K_ASSERT(pKeyIndex >= 0);
02971 K_ASSERT(pKeyIndex < KeyGetCount());
02972
02973 InternalKeyGetPtr(pKeyIndex)->SetTime(pTime);
02974 CallbackAddEvent(KFCURVEEVENT_KEY | KFCURVEEVENT_EDITTIME, pKeyIndex);
02975 }
02976
02977 KFBX_FCURVE_INLINE void KFCurve::KeyIncTime(kFCurveIndex pKeyIndex, KTime pTime)
02978 {
02979 K_ASSERT(pKeyIndex >= 0);
02980 K_ASSERT(pKeyIndex < KeyGetCount());
02981
02982 InternalKeyGetPtr(pKeyIndex)->IncTime(pTime);
02983 CallbackAddEvent(KFCURVEEVENT_KEY | KFCURVEEVENT_EDITTIME, pKeyIndex);
02984 }
02985
02986 KFBX_FCURVE_INLINE void KFCurve::KeySetSelected(kFCurveIndex pKeyIndex, bool pSelected)
02987 {
02988 K_ASSERT(pKeyIndex >= 0);
02989 K_ASSERT(pKeyIndex < KeyGetCount());
02990
02991 InternalKeyGetPtr(pKeyIndex)->SetSelected(pSelected);
02992 CallbackAddEvent(KFCURVEEVENT_SELECTION, pKeyIndex);
02993 }
02994
02995 KFBX_FCURVE_INLINE bool KFCurve::KeyGetSelected(kFCurveIndex pKeyIndex)
02996 {
02997 K_ASSERT(pKeyIndex >= 0);
02998 K_ASSERT(pKeyIndex < KeyGetCount());
02999
03000 return InternalKeyGetPtr(pKeyIndex)->GetSelected();
03001 }
03002
03003 KFBX_FCURVE_INLINE void KFCurve::KeySetMarkedForManipulation(kFCurveIndex pKeyIndex, bool pMarked)
03004 {
03005 K_ASSERT(pKeyIndex >= 0);
03006 K_ASSERT(pKeyIndex < KeyGetCount());
03007
03008 InternalKeyGetPtr(pKeyIndex)->SetMarkedForManipulation(pMarked);
03009 }
03010
03011 KFBX_FCURVE_INLINE bool KFCurve::KeyGetMarkedForManipulation(kFCurveIndex pKeyIndex)
03012 {
03013 K_ASSERT(pKeyIndex >= 0);
03014 K_ASSERT(pKeyIndex < KeyGetCount());
03015
03016 return InternalKeyGetPtr(pKeyIndex)->GetMarkedForManipulation();
03017 }
03018
03019 KFBX_FCURVE_INLINE void KFCurve::KeySetTangeantVisibility (kFCurveIndex pKeyIndex, kFCurveTangeantVisibility pVisibility)
03020 {
03021 K_ASSERT(pKeyIndex >= 0);
03022 K_ASSERT(pKeyIndex < KeyGetCount());
03023
03024 InternalKeyGetPtr(pKeyIndex)->SetTangeantVisibility(pVisibility);
03025 CallbackAddEvent(KFCURVEEVENT_SELECTION, pKeyIndex);
03026 }
03027
03028 KFBX_FCURVE_INLINE kFCurveTangeantVisibility KFCurve::KeyGetTangeantVisibility (kFCurveIndex pKeyIndex)
03029 {
03030 K_ASSERT(pKeyIndex >= 0);
03031 K_ASSERT(pKeyIndex < KeyGetCount());
03032
03033 return InternalKeyGetPtr(pKeyIndex)->GetTangeantVisibility();
03034 }
03035
03036 KFBX_FCURVE_INLINE void KFCurve::KeySetBreak(kFCurveIndex pKeyIndex, bool pVal)
03037 {
03038 K_ASSERT(pKeyIndex >= 0);
03039 K_ASSERT(pKeyIndex < KeyGetCount());
03040
03041 InternalKeyGetPtr(pKeyIndex)->SetBreak(pVal);
03042 CallbackAddEvent(KFCURVEEVENT_KEY | KFCURVEEVENT_EDITOTHER, pKeyIndex);
03043 }
03044
03045 KFBX_FCURVE_INLINE bool KFCurve::KeyGetBreak(kFCurveIndex pKeyIndex)
03046 {
03047 K_ASSERT(pKeyIndex >= 0);
03048 K_ASSERT(pKeyIndex < KeyGetCount());
03049
03050 return InternalKeyGetPtr(pKeyIndex)->GetBreak();
03051 }
03052
03053
03054
03057 KFBX_DLL HKFCurve KFCurveCreate();
03058
03059
03060 KFBX_DLL HKFCurve KFCurveCreate(KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = false);
03061
03062
03063 KFBX_DLL HKFCurve KFCurveCreate(KFbx* pFbx, HKFCurve pCurve, bool pOnlyDefaults = false, bool pColor = false);
03064
03065 #include <fbxfilesdk/fbxfilesdk_nsend.h>
03066
03067
03068 #endif // FBXFILESDK_COMPONENTS_KFCURVE_KFCURVE_H
03069