00001
00004 #ifndef _FBXSDK_KFCURVE_H_
00005 #define _FBXSDK_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 <kfcurve/kfcurve_h.h>
00042
00043 #include <klib/karrayul.h>
00044 #include <klib/ktime.h>
00045 #include <object/e/keventbase.h>
00046
00047
00048 #ifndef K_PLUGIN
00049 #include <object/i/iobject.h>
00050 #include <object/i/ifbobjectholder.h>
00051 #endif
00052
00053 #ifndef K_PLUGIN
00054 #include <klib/kdebug.h>
00055 #endif
00056
00057 #include <kbaselib_forward.h>
00058 #ifndef MB_FBXSDK
00059 #include <kbaselib_nsuse.h>
00060 #endif
00061
00062 #ifdef K_PLUGIN
00063 #define KFCURVE_INLINE
00064 #else
00065 #define KFCURVE_INLINE inline
00066 #endif
00067
00068 #include <kfcurve/kfcurve_nsbegin.h>
00069
00070 #define KFCURVE_FLOAT
00071 #ifdef KFCURVE_FLOAT
00072 typedef float kFCurveDouble;
00073 #else
00074 typedef double kFCurveDouble;
00075 #endif
00076
00077
00078 K_FORWARD(KFCurve);
00079
00080 #define IKFCurveID 43763635
00081
00082 typedef HKFCurve HIKFCurve;
00083 typedef class KFCURVE_DLL KArrayTemplate< KFCurve * > KArrayKFCurve;
00084
00085
00086 KFCURVE_DLL kULong GetRecordingMemory();
00087 KFCURVE_DLL void WatchFree(void* pPtr, kULong pSize);
00088 KFCURVE_DLL void* WatchMalloc(kULong pSize);
00089
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
00101 enum
00102 {
00103 KFCURVE_CONSTANT_STANDARD = 0x00000000,
00104 KFCURVE_CONSTANT_NEXT = 0x00000100,
00105 KFCURVE_CONSTANT_ALL = KFCURVE_CONSTANT_STANDARD | KFCURVE_CONSTANT_NEXT,
00106 KFCURVE_CONSTANT_COUNT = 2
00107 };
00108
00110 enum
00111 {
00112 KFCURVE_TANGEANT_AUTO = 0x00000100,
00113 KFCURVE_TANGEANT_TCB = 0x00000200,
00114 KFCURVE_TANGEANT_USER = 0x00000400,
00115 KFCURVE_GENERIC_BREAK = 0x00000800,
00116 KFCURVE_GENERIC_CLAMP = 0x00001000,
00117 KFCURVE_TANGEANT_BREAK = KFCURVE_TANGEANT_USER|KFCURVE_GENERIC_BREAK,
00118 KFCURVE_TANGEANT_AUTO_BREAK = KFCURVE_TANGEANT_AUTO|KFCURVE_GENERIC_BREAK,
00119 KFCURVE_TANGEANT_ALL = KFCURVE_TANGEANT_AUTO|KFCURVE_TANGEANT_TCB|KFCURVE_TANGEANT_USER|KFCURVE_GENERIC_BREAK|KFCURVE_GENERIC_CLAMP,
00120 KFCURVE_TANGEANT_TYPE_MASK = KFCURVE_TANGEANT_AUTO|KFCURVE_TANGEANT_TCB|KFCURVE_TANGEANT_USER|KFCURVE_TANGEANT_BREAK,
00121 KFCURVE_TANGEANT_OVERRIDES_MASK = KFCURVE_GENERIC_CLAMP
00122
00123 };
00124
00126 enum
00127 {
00128 KFCURVE_SELECT_POINT = 0x00010000,
00129 KFCURVE_SELECT_LEFT = 0x00020000,
00130 KFCURVE_SELECT_RIGHT = 0x00040000,
00131 KFCURVE_SELECT_ALL = KFCURVE_SELECT_POINT|KFCURVE_SELECT_LEFT|KFCURVE_SELECT_RIGHT
00132 };
00133
00135 enum
00136 {
00137 KFCURVE_MARKED_FOR_MANIP = 0x00080000,
00138 KFCURVE_MARKED_ALL = KFCURVE_MARKED_FOR_MANIP
00139 };
00140
00142 enum
00143 {
00144 KFCURVE_TANGEANT_SHOW_NONE = 0x00000000,
00145 KFCURVE_TANGEANT_SHOW_LEFT = 0x00100000,
00146 KFCURVE_TANGEANT_SHOW_RIGHT = 0x00200000,
00147 KFCURVE_TANGEANT_SHOW_BOTH = KFCURVE_TANGEANT_SHOW_LEFT|KFCURVE_TANGEANT_SHOW_RIGHT
00148 };
00149
00151 enum
00152 {
00153 KFCURVE_CONTINUITY = 0x00000000,
00154 KFCURVE_CONTINUITY_FLAT = 0x00100000,
00155 KFCURVE_CONTINUITY_BREAK = 0x00200000,
00156 KFCURVE_CONTINUITY_INSERT = 0x00400000
00157 };
00158
00160 enum
00161 {
00162 KFCURVE_WEIGHTED_NONE = 0x00000000,
00163 KFCURVE_WEIGHTED_RIGHT = 0x01000000,
00164 KFCURVE_WEIGHTED_NEXT_LEFT = 0x02000000,
00165 KFCURVE_WEIGHTED_ALL = KFCURVE_WEIGHTED_RIGHT|KFCURVE_WEIGHTED_NEXT_LEFT
00166 };
00167
00168
00169 enum
00170 {
00171 KFCURVE_VELOCITY_NONE = 0x00000000,
00172 KFCURVE_VELOCITY_RIGHT = 0x10000000,
00173 KFCURVE_VELOCITY_NEXT_LEFT = 0x20000000,
00174 KFCURVE_VELOCITY_ALL = KFCURVE_VELOCITY_RIGHT | KFCURVE_VELOCITY_NEXT_LEFT
00175 };
00176
00177
00178 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00179
00180 #define KFCURVE_WEIGHT_DIVIDER 9999 // precise enough and can be divided by 3 without error
00181 #define KFCURVE_DEFAULT_WEIGHT ((kFCurveDouble)(1.0/3.0))
00182 #define KFCURVE_MIN_WEIGHT ((kFCurveDouble)(1.0/KFCURVE_WEIGHT_DIVIDER))
00183 #define KFCURVE_MAX_WEIGHT ((kFCurveDouble)0.99)
00184 #define KFCURVE_DEFAULT_VELOCITY 0.0
00185
00186 #endif // DOXYGEN_SHOULD_SKIP_THIS
00187
00188
00190 enum EKFCurveDataIndex
00191 {
00192
00193 KFCURVEKEY_RIGHT_SLOPE = 0,
00194 KFCURVEKEY_NEXT_LEFT_SLOPE = 1,
00195
00196
00197 KFCURVEKEY_WEIGHTS = 2,
00198 KFCURVEKEY_RIGHT_WEIGHT = 2,
00199 KFCURVEKEY_NEXT_LEFT_WEIGHT = 3,
00200
00201
00202 KFCURVEKEY_VELOCITY = 4,
00203 KFCURVEKEY_RIGHT_VELOCITY = 4,
00204 KFCURVEKEY_NEXT_LEFT_VELOCITY = 5,
00205
00206
00207 KFCURVEKEY_TCB_TENSION = 0,
00208 KFCURVEKEY_TCB_CONTINUITY = 1,
00209 KFCURVEKEY_TCB_BIAS = 2,
00210
00211 KFCURVEKEY_RIGHT_AUTO = 0,
00212 KFCURVEKEY_NEXT_LEFT_AUTO = 1
00213 };
00214
00216 enum
00217 {
00218 KFCURVE_EXTRAPOLATION_CONST = 1,
00219 KFCURVE_EXTRAPOLATION_REPETITION = 2,
00220 KFCURVE_EXTRAPOLATION_MIRROR_REPETITION = 3,
00221 KFCURVE_EXTRAPOLATION_KEEP_SLOPE = 4
00222 };
00223
00224 enum
00225 {
00226 KFCURVE_BEZIER = 0,
00227 KFCURVE_SAMPLE = 1,
00228 KFCURVE_ISO = 2
00229 };
00230
00231 typedef kUInt kFCurveInterpolation;
00232 typedef kUInt kFCurveConstantMode;
00233 typedef kUInt kFCurveTangeantMode;
00234 typedef kUInt kFCurveTangeantWeightMode;
00235 typedef kUInt kFCurveTangeantVelocityMode;
00236 typedef kUInt kFCurveExtrapolationMode;
00237 typedef kUInt kFCurveTangeantVisibility;
00238 typedef int kFCurveIndex;
00239
00240 enum
00241 {
00242 KFCURVEEVENT_NONE =0,
00243 KFCURVEEVENT_CANDIDATE =1 << 0,
00244 KFCURVEEVENT_UNUSED1 =1 << 1,
00245 KFCURVEEVENT_UNUSED2 =1 << 2,
00246 KFCURVEEVENT_UNUSED3 =1 << 3,
00247 KFCURVEEVENT_KEY =1 << 4,
00248 KFCURVEEVENT_DEPRECATED5 =1 << 5,
00249 KFCURVEEVENT_UNUSED6 =1 << 6,
00250 KFCURVEEVENT_UNUSED7 =1 << 7,
00251 KFCURVEEVENT_SELECTION =1 << 8,
00252 KFCURVEEVENT_DESTROY =1 << 9,
00253 KFCURVEEVENT_DEPRECATED10 =1 << 10,
00254 KFCURVEEVENT_KEYADD =1 << 11,
00255 KFCURVEEVENT_KEYREMOVE =1 << 12,
00256 KFCURVEEVENT_EDITVALUE =1 << 13,
00257 KFCURVEEVENT_EDITTIME =1 << 14,
00258 KFCURVEEVENT_EDITOTHER =1 << 15,
00259 };
00260
00261
00262
00263 class KFCURVE_DLL KFCurveEvent : public KEventBase
00264 {
00265 public:
00266
00267
00268
00269
00270 int mKeyIndexStart;
00271
00272
00273 int mKeyIndexStop;
00274
00275
00276 int mEventCount;
00277
00278
00279 KFCURVE_INLINE void Clear ();
00280
00281
00282 KFCURVE_INLINE void Add (int pWhat, int pIndex);
00283 };
00284
00285 typedef void (*kFCurveCallback) (KFCurve *pFCurve, KFCurveEvent *FCurveEvent, void* pObject);
00286
00291 class KFCURVE_DLL KFCurveTangeantInfo
00292 {
00293 public:
00294 KFCURVE_INLINE KFCurveTangeantInfo();
00295
00296 kFCurveDouble mDerivative;
00297 kFCurveDouble mWeight;
00298 bool mWeighted;
00299 kFCurveDouble mVelocity;
00300 bool mHasVelocity;
00301 kFCurveDouble mAuto;
00302 };
00303
00313 class KFCURVE_DLL KFCurveKey
00314 {
00315 public:
00316 KFCurveKey()
00317 {
00318 Init();
00319 }
00320
00321 public:
00322
00348 KFCURVE_INLINE void Set
00349 (
00350 KTime pTime,
00351 kFCurveDouble pValue,
00352 kFCurveInterpolation pInterpolation = KFCURVE_INTERPOLATION_CUBIC,
00353 kFCurveTangeantMode pTangentMode = KFCURVE_TANGEANT_AUTO,
00354 kFCurveDouble pData0 = 0.0,
00355 kFCurveDouble pData1 = 0.0,
00356 kFCurveTangeantWeightMode pTangentWeightMode = KFCURVE_WEIGHTED_NONE,
00357 kFCurveDouble pWeight0 = KFCURVE_DEFAULT_WEIGHT,
00358 kFCurveDouble pWeight1 = KFCURVE_DEFAULT_WEIGHT,
00359 kFCurveDouble pVelocity0 = KFCURVE_DEFAULT_VELOCITY,
00360 kFCurveDouble pVelocity1 = KFCURVE_DEFAULT_VELOCITY
00361 );
00362
00370 KFCURVE_INLINE void SetTCB
00371 (
00372 KTime pTime,
00373 kFCurveDouble pValue,
00374 float pData0 = 0.0f,
00375 float pData1 = 0.0f,
00376 float pData2 = 0.0f
00377 );
00378
00382 KFCURVE_INLINE void Set(KFCurveKey& pSource);
00383
00389 KFCURVE_INLINE kFCurveInterpolation GetInterpolation();
00390
00397 KFCURVE_INLINE void SetInterpolation(kFCurveInterpolation pInterpolation);
00398
00406 KFCURVE_INLINE kFCurveConstantMode GetConstantMode();
00407
00418 KFCURVE_INLINE kFCurveTangeantMode GetTangeantMode( bool pIncludeOverrides = false );
00419
00427 KFCURVE_INLINE kFCurveTangeantWeightMode GetTangeantWeightMode();
00428
00436 KFCURVE_INLINE kFCurveTangeantVelocityMode GetTangeantVelocityMode();
00437
00444 KFCURVE_INLINE void SetConstantMode(kFCurveConstantMode pMode);
00445
00455 KFCURVE_INLINE void SetTangeantMode(kFCurveTangeantMode pTangent);
00456
00470 KFCURVE_INLINE void SetTangeantWeightMode(kFCurveTangeantWeightMode pTangentWeightMode, kFCurveTangeantWeightMode pMask = KFCURVE_WEIGHTED_ALL );
00471
00485 KFCURVE_INLINE void SetTangeantVelocityMode(kFCurveTangeantVelocityMode pTangentVelocityMode, kFCurveTangeantVelocityMode pMask = KFCURVE_VELOCITY_ALL );
00486
00487
00502 KFCURVE_INLINE kFCurveDouble GetDataDouble(EKFCurveDataIndex pIndex);
00503
00519 KFCURVE_INLINE void SetDataDouble(EKFCurveDataIndex pIndex, kFCurveDouble pValue);
00520
00526 KFCURVE_INLINE float GetDataFloat(EKFCurveDataIndex pIndex);
00527
00534 KFCURVE_INLINE void SetDataFloat(EKFCurveDataIndex pIndex, float pValue);
00535
00539 KFCURVE_INLINE float* GetDataPtr();
00540
00542 KFCURVE_INLINE kFCurveDouble GetValue();
00543
00545 KFCURVE_INLINE void SetValue(kFCurveDouble pValue);
00546
00550 KFCURVE_INLINE void IncValue(kFCurveDouble pValue);
00551
00555 KFCURVE_INLINE void MultValue(kFCurveDouble pValue);
00556
00562 KFCURVE_INLINE void MultTangeant(kFCurveDouble pValue);
00563
00567 KFCURVE_INLINE KTime GetTime();
00568
00572 KFCURVE_INLINE void SetTime(KTime pTime);
00573
00577 KFCURVE_INLINE void IncTime(KTime pTime);
00578
00582 KFCURVE_INLINE void SetSelected(bool pSelected);
00583
00587 KFCURVE_INLINE bool GetSelected();
00588
00592 KFCURVE_INLINE void SetMarkedForManipulation(bool pMark);
00593
00597 KFCURVE_INLINE bool GetMarkedForManipulation();
00598
00606 KFCURVE_INLINE void SetTangeantVisibility (kFCurveTangeantVisibility pVisibility);
00607
00615 KFCURVE_INLINE kFCurveTangeantVisibility GetTangeantVisibility ();
00616
00620 KFCURVE_INLINE void SetBreak(bool pVal);
00621
00625 KFCURVE_INLINE bool GetBreak();
00626
00627
00628
00629
00631
00632
00633
00634
00635
00636
00638
00639 KFCURVE_INLINE void Init();
00640
00641 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00642
00643 private:
00644
00645 kFCurveDouble mValue;
00646 KTime mTime;
00647 kUInt mFlags;
00648
00649 #ifdef KFCURVE_FLOAT
00650 float mData[4];
00651 #else
00652 double mData[2];
00653 kInt16 mWeight[2];
00654 kInt16 mVelocity[2];
00655 #endif
00656
00657 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
00658
00659 };
00660
00661
00662 const int KEY_BLOCK_SIZE = 1024;
00663 const int KEY_BLOCK_COUNT = KEY_BLOCK_SIZE/sizeof (KFCurveKey);
00664
00665 const int KEY_LIST_BLOCK_SIZE = 256;
00666 const int KEY_LIST_BLOCK_COUNT = KEY_LIST_BLOCK_SIZE/sizeof (KFCurveKey *);
00667
00668
00675 #ifdef K_PLUGIN
00676 class KFCURVE_DLL KFCurve
00677 #else
00678 class KFCURVE_DLL KFCurve : public IFBObjectHolder
00679 #endif
00680 {
00681
00682 public:
00683
00688
00690 KFCurve();
00691
00693 virtual ~KFCurve();
00694
00695 #ifdef K_PLUGIN
00696 void Destroy(int Local=0);
00697 #else
00698 IObject_Declare(Implementation)
00699 #endif
00700
00702
00706 float* GetColor();
00707
00711 void SetColor(float *pColor);
00712
00717 void SetValue(kFCurveDouble pValue);
00718
00723 KFCURVE_INLINE kFCurveDouble GetValue() const;
00724
00729
00733 void ResizeKeyBuffer(int pKeyCount);
00734
00739 void KeyModifyBegin ();
00740
00744 void KeyModifyEnd ();
00745
00747 int KeyGetCount ();
00748
00750 int KeyGetSelectionCount ();
00751
00752
00753 void KeySelectAll ();
00754
00755
00756 void KeyUnselectAll ();
00757
00762 KFCurveKey KeyGet(kFCurveIndex pIndex);
00763
00765 void KeyClear ();
00766
00768 void KeyShrink();
00769
00776 bool KeySet(kFCurveIndex pIndex, KFCurveKey& pKey);
00777 KFCURVE_INLINE bool KeySet(kFCurveIndex pIndex, KFCurve* pSourceCurve, int pSourceIndex);
00778
00786 int KeyMove(kFCurveIndex pIndex, KTime pTime);
00787
00795 bool KeyMoveOf (bool pSelectedOnly, KTime pDeltaTime, kFCurveDouble pDeltaValue);
00796
00803 bool KeyMoveValueTo (bool pSelectedOnly, kFCurveDouble pValue);
00804
00811 bool KeyScaleValue (bool pSelectedOnly, kFCurveDouble pMultValue);
00812
00819 bool KeyScaleTangeant (bool pSelectedOnly, kFCurveDouble pMultValue);
00820
00827 bool KeyScaleValueAndTangeant (bool pSelectedOnly, kFCurveDouble pMultValue);
00828
00833 bool KeyRemove(kFCurveIndex pIndex);
00834
00850 int KeyInsert ( KTime pTime, kFCurveIndex* pLast = NULL );
00851
00868 int KeyAdd (KTime pTime, KFCurveKey& pKey, kFCurveIndex* pLast = NULL);
00869 int KeyAdd(KTime pTime, KFCurve* pSourceCurve, int pSourceIndex, kFCurveIndex* pLast = NULL);
00870
00885 int KeyAdd (KTime pTime, kFCurveIndex* pLast = NULL);
00886
00894 int KeyAppend(KTime pAtTime, KFCurve* pSourceCurve, int pSourceIndex);
00895
00905 int KeyAppendFast( KTime pTime, kFCurveDouble pValue );
00906
00917 double KeyFind (KTime pTime, kFCurveIndex* pLast = NULL);
00918
00920
00921
00922
00923
00924
00925
00926
00927
00928
00933
00960 KFCURVE_INLINE void KeySet
00961 (
00962 kFCurveIndex pKeyIndex,
00963 KTime pTime,
00964 kFCurveDouble pValue,
00965 kFCurveInterpolation pInterpolation = KFCURVE_INTERPOLATION_CUBIC,
00966 kFCurveTangeantMode pTangentMode = KFCURVE_TANGEANT_AUTO,
00967 kFCurveDouble pData0 = 0.0,
00968 kFCurveDouble pData1 = 0.0,
00969 kFCurveTangeantWeightMode pTangentWeightMode = KFCURVE_WEIGHTED_NONE,
00970 kFCurveDouble pWeight0 = KFCURVE_DEFAULT_WEIGHT,
00971 kFCurveDouble pWeight1 = KFCURVE_DEFAULT_WEIGHT,
00972 kFCurveDouble pVelocity0 = KFCURVE_DEFAULT_VELOCITY,
00973 kFCurveDouble pVelocity1 = KFCURVE_DEFAULT_VELOCITY
00974 );
00975
00984 KFCURVE_INLINE void KeySetTCB
00985 (
00986 kFCurveIndex pKeyIndex,
00987 KTime pTime,
00988 kFCurveDouble pValue,
00989 float pData0 = 0.0f,
00990 float pData1 = 0.0f,
00991 float pData2 = 0.0f
00992 );
00993
01001 KFCURVE_INLINE kFCurveInterpolation KeyGetInterpolation(kFCurveIndex pKeyIndex);
01002
01010 KFCURVE_INLINE void KeySetInterpolation(kFCurveIndex pKeyIndex, kFCurveInterpolation pInterpolation);
01011
01020 KFCURVE_INLINE kFCurveConstantMode KeyGetConstantMode(kFCurveIndex pKeyIndex);
01021
01032 KFCURVE_INLINE kFCurveTangeantMode KeyGetTangeantMode(kFCurveIndex pKeyIndex, bool pIncludeOverrides = false );
01033
01041 KFCURVE_INLINE kFCurveTangeantWeightMode KeyGetTangeantWeightMode(kFCurveIndex pKeyIndex);
01042
01050 KFCURVE_INLINE kFCurveTangeantVelocityMode KeyGetTangeantVelocityMode(kFCurveIndex pKeyIndex);
01051
01059 KFCURVE_INLINE void KeySetConstantMode(kFCurveIndex pKeyIndex, kFCurveConstantMode pMode);
01060
01071 KFCURVE_INLINE void KeySetTangeantMode(kFCurveIndex pKeyIndex, kFCurveTangeantMode pTangent);
01072
01087 KFCURVE_INLINE void KeySetTangeantWeightMode(kFCurveIndex pKeyIndex, kFCurveTangeantWeightMode pTangentWeightMode, kFCurveTangeantWeightMode pMask = KFCURVE_WEIGHTED_ALL );
01088
01103 KFCURVE_INLINE void KeySetTangeantVelocityMode(kFCurveIndex pKeyIndex, kFCurveTangeantVelocityMode pTangentVelocityMode, kFCurveTangeantVelocityMode pMask = KFCURVE_VELOCITY_ALL );
01104
01105
01121 KFCURVE_INLINE kFCurveDouble KeyGetDataDouble(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex);
01122
01139 KFCURVE_INLINE void KeySetDataDouble(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex, kFCurveDouble pValue);
01140
01147 KFCURVE_INLINE float KeyGetDataFloat(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex);
01148
01156 KFCURVE_INLINE void KeySetDataFloat(kFCurveIndex pKeyIndex, EKFCurveDataIndex pIndex, float pValue);
01157
01161 KFCURVE_INLINE const float* KeyGetDataPtr(kFCurveIndex pKeyIndex);
01162
01164 KFCURVE_INLINE kFCurveDouble KeyGetValue(kFCurveIndex pKeyIndex);
01165
01167 KFCURVE_INLINE void KeySetValue(kFCurveIndex pKeyIndex, kFCurveDouble pValue);
01168
01173 KFCURVE_INLINE void KeyIncValue(kFCurveIndex pKeyIndex, kFCurveDouble pValue);
01174
01179 KFCURVE_INLINE void KeyMultValue(kFCurveIndex pKeyIndex, kFCurveDouble pValue);
01180
01187 KFCURVE_INLINE void KeyMultTangeant(kFCurveIndex pKeyIndex, kFCurveDouble pValue);
01188
01193 KFCURVE_INLINE KTime KeyGetTime(kFCurveIndex pKeyIndex);
01194
01199 KFCURVE_INLINE void KeySetTime(kFCurveIndex pKeyIndex, KTime pTime);
01200
01205 KFCURVE_INLINE void KeyIncTime(kFCurveIndex pKeyIndex, KTime pTime);
01206
01211 KFCURVE_INLINE void KeySetSelected(kFCurveIndex pKeyIndex, bool pSelected);
01212
01216 KFCURVE_INLINE bool KeyGetSelected(kFCurveIndex pKeyIndex);
01217
01222 KFCURVE_INLINE void KeySetMarkedForManipulation(kFCurveIndex pKeyIndex, bool pMark);
01223
01227 KFCURVE_INLINE bool KeyGetMarkedForManipulation(kFCurveIndex pKeyIndex);
01228
01237 KFCURVE_INLINE void KeySetTangeantVisibility (kFCurveIndex pKeyIndex, kFCurveTangeantVisibility pVisibility);
01238
01246 KFCURVE_INLINE kFCurveTangeantVisibility KeyGetTangeantVisibility (kFCurveIndex pKeyIndex);
01247
01251 KFCURVE_INLINE void KeySetBreak(kFCurveIndex pKeyIndex, bool pVal);
01252
01256 KFCURVE_INLINE bool KeyGetBreak(kFCurveIndex pKeyIndex);
01257
01259
01260
01261
01262
01263
01264
01265
01266
01271
01277 void KeyTangeantSetInterpolation(bool pSelectedOnly, kFCurveInterpolation pInterpolation);
01278
01285 void KeyTangeantSetMode(bool pSelectedOnly, kFCurveTangeantMode pTangentMode);
01286
01293 kFCurveDouble KeyGetLeftDerivative(kFCurveIndex pIndex);
01294
01304 void KeySetLeftDerivative(kFCurveIndex pIndex, kFCurveDouble pValue);
01305
01313 kFCurveDouble KeyGetLeftAuto(kFCurveIndex pIndex, bool pApplyOvershootProtection = false);
01314
01324 void KeySetLeftAuto(kFCurveIndex pIndex, kFCurveDouble pValue);
01325
01332 KFCurveTangeantInfo KeyGetLeftDerivativeInfo(kFCurveIndex pIndex);
01333
01345 void KeySetLeftDerivativeInfo(kFCurveIndex pIndex, KFCurveTangeantInfo pValue, bool pForceDerivative = false);
01346
01347
01357 void KeyIncLeftDerivative(kFCurveIndex pIndex, kFCurveDouble pInc);
01358
01365 kFCurveDouble KeyGetRightDerivative(kFCurveIndex pIndex);
01366
01376 void KeySetRightDerivative(kFCurveIndex pIndex, kFCurveDouble pValue);
01377
01385 kFCurveDouble KeyGetRightAuto(kFCurveIndex pIndex, bool pApplyOvershootProtection = false);
01386
01396 void KeySetRightAuto(kFCurveIndex pIndex, kFCurveDouble pValue);
01397
01398
01405 KFCurveTangeantInfo KeyGetRightDerivativeInfo(kFCurveIndex pIndex);
01406
01417 void KeySetRightDerivativeInfo(kFCurveIndex pIndex, KFCurveTangeantInfo pValue, bool pForceDerivative = false);
01418
01419
01429 void KeyIncRightDerivative(kFCurveIndex pIndex, kFCurveDouble pInc);
01430
01432 kFCurveDouble KeyGetRightBezierTangeant(kFCurveIndex pIndex);
01433
01443 void KeySetLeftBezierTangeant(kFCurveIndex pIndex, kFCurveDouble pValue);
01444
01446 kFCurveDouble KeyGetLeftBezierTangeant(kFCurveIndex pIndex);
01447
01457 void KeySetRightBezierTangeant(kFCurveIndex pIndex, kFCurveDouble pValue);
01458
01459
01468 void KeyMultDerivative(kFCurveIndex pIndex, kFCurveDouble pMultValue);
01469
01476 bool KeyIsLeftTangeantWeighted(kFCurveIndex pIndex);
01477
01484 bool KeyIsRightTangeantWeighted(kFCurveIndex pIndex);
01485
01493 void KeySetLeftTangeantWeightedMode( kFCurveIndex pIndex, bool pWeighted );
01494
01502 void KeySetRightTangeantWeightedMode( kFCurveIndex pIndex, bool pWeighted );
01503
01510 kFCurveDouble KeyGetLeftTangeantWeight(kFCurveIndex pIndex);
01511
01518 kFCurveDouble KeyGetRightTangeantWeight(kFCurveIndex pIndex);
01519
01528 void KeySetLeftTangeantWeight( kFCurveIndex pIndex, kFCurveDouble pWeight );
01529
01538 void KeySetRightTangeantWeight( kFCurveIndex pIndex, kFCurveDouble pWeight );
01539
01546 bool KeyIsLeftTangeantVelocity(kFCurveIndex pIndex);
01547
01554 bool KeyIsRightTangeantVelocity(kFCurveIndex pIndex);
01555
01563 void KeySetLeftTangeantVelocityMode( kFCurveIndex pIndex, bool pVelocity );
01564
01572 void KeySetRightTangeantVelocityMode( kFCurveIndex pIndex, bool pVelocity);
01573
01580 kFCurveDouble KeyGetLeftTangeantVelocity(kFCurveIndex pIndex);
01581
01588 kFCurveDouble KeyGetRightTangeantVelocity(kFCurveIndex pIndex);
01589
01598 void KeySetLeftTangeantVelocity( kFCurveIndex pIndex, kFCurveDouble pVelocity );
01599
01608 void KeySetRightTangeantVelocity( kFCurveIndex pIndex, kFCurveDouble pVelocity );
01609
01611
01623
01625 KFCURVE_INLINE void SetPreExtrapolation(kFCurveExtrapolationMode pExtrapolation);
01626
01628 KFCURVE_INLINE kFCurveExtrapolationMode GetPreExtrapolation();
01629
01634 KFCURVE_INLINE void SetPreExtrapolationCount(kULong pCount);
01635
01640 KFCURVE_INLINE kULong GetPreExtrapolationCount();
01641
01643 KFCURVE_INLINE void SetPostExtrapolation(kFCurveExtrapolationMode pExtrapolation);
01644
01646 KFCURVE_INLINE kFCurveExtrapolationMode GetPostExtrapolation();
01647
01652 KFCURVE_INLINE void SetPostExtrapolationCount(kULong pCount);
01653
01658 KFCURVE_INLINE kULong GetPostExtrapolationCount();
01659
01666 int KeyGetCountAll();
01667
01679 double KeyFindAll(KTime pTime, kFCurveIndex* pLast = NULL);
01680
01682
01687
01700 kFCurveDouble Evaluate (KTime pTime, kFCurveIndex* pLast = NULL);
01701
01711 kFCurveDouble EvaluateIndex( double pIndex);
01712
01721 kFCurveDouble EvaluateLeftDerivative (KTime pTime, kFCurveIndex* pLast = NULL);
01722
01731 kFCurveDouble EvaluateRightDerivative (KTime pTime, kFCurveIndex* pLast = NULL);
01732
01741 int FindPeaks(kFCurveIndex pLeftKeyIndex, KTime& pPeakTime1, KTime& pPeakTime2);
01742
01751 int FindPeaks(kFCurveIndex pLeftKeyIndex, kFCurveDouble& pPeak1, kFCurveDouble& pPeak2);
01752
01763 int FindPeaks(kFCurveIndex pLeftKeyIndex, KTime& pPeakTime1, kFCurveDouble& pPeak1, KTime& pPeakTime2, kFCurveDouble& pPeak2);
01764
01770 void KeyGetPeriods(KTime& pAveragePeriod, KTime& pMinPeriod, KTime& pMaxPeriod);
01771
01773
01778
01786 HKFCurve Copy(KTime pStart = KTIME_MINUS_INFINITE, KTime pStop = KTIME_INFINITE);
01787
01794 void CopyFrom(KFCurve& pSource, bool pWithKeys = true);
01795
01804 void Replace(HKFCurve pSource, KTime pStart = KTIME_MINUS_INFINITE, KTime pStop = KTIME_INFINITE, bool pUseExactGivenSpan = false, bool pKeyStartEndOnNoKey = true, KTime pTimeSpanOffset = KTIME_ZERO );
01805
01818 void ReplaceForQuaternion(HKFCurve pSource, KTime pStart, KTime pStop, kFCurveDouble pScaleStart, kFCurveDouble pScaleStop, bool pUseExactGivenSpan = false, bool pKeyStartEndOnNoKey = true, KTime pTimeSpanOffset = KTIME_ZERO );
01819
01838 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 );
01839
01852 void Insert(HKFCurve pSource, KTime pInsertTime, kFCurveDouble pFirstKeyLeftDerivative, bool pFirstKeyIsWeighted = false, kFCurveDouble pFirstKeyWeight = KFCURVE_DEFAULT_WEIGHT);
01853
01863 void Insert(HKFCurve pSource, KTime pInsertTime, KFCurveTangeantInfo pFirstKeyLeftDerivative );
01864
01874 bool Delete(kFCurveIndex pStartIndex , kFCurveIndex pStopIndex);
01875
01883 bool Delete (KTime pStart = KTIME_MINUS_INFINITE, KTime pStop = KTIME_INFINITE);
01884
01889 bool IsKeyInterpolationPureCubicAuto(kFCurveIndex pKeyIndex);
01890
01891 #ifndef K_PLUGIN
01892
01899 void ExtractKeysIndex( KArraykInt &pArray, int pMinIndex, int pMaxIndex, double pMinValue = -K_DOUBLE_MAX, double pMaxValue = K_DOUBLE_MAX);
01900 #endif
01901
01903
01905
01906
01907
01908
01909
01910
01912
01913 #ifndef DOXYGEN_SHOULD_SKIP_THIS
01914
01915 bool FbxStore (KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = true, bool pIsVersion5 = false );
01916 bool FbxRetrieve (KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = false );
01917 bool FbxInternalRetrieve (KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = false );
01918
01919 double CandidateEvaluate (KTime pTime, kFCurveIndex* pLast = NULL);
01920 bool CandidateClear ();
01921 bool CandidateSet (KTime pTime, double pValue);
01922 bool IsCandidate ();
01923 double CandidateGet ();
01924 KTime CandidateGetTime ();
01925
01926 bool CandidateKey
01927 (
01928 kFCurveIndex *pLast = NULL,
01929 int pInterpolation = KFCURVE_INTERPOLATION_CUBIC,
01930 int pTanMode = KFCURVE_TANGEANT_USER,
01931 int pContinuity = KFCURVE_CONTINUITY,
01932 bool pTangeantOverride = true,
01933 KTime pCandidateTime = KTIME_INFINITE,
01934 double pKeyIndexTolerance = 0.0
01935 );
01936
01937 bool NormalsSeemsToComeFromAPlot();
01938
01939 void SetWasData (int pType);
01940 int GetWasData ();
01941 int GuessWasData (KTime* pStart = NULL, KTime* pStep = NULL);
01942
01943 void KeyTangeantHide ();
01944
01945 int GetUpdateId ();
01946 int GetValuesUpdateId ();
01947
01948 void CallbackRegister (kFCurveCallback pCallback, void* pObject);
01949 void CallbackUnregister (kFCurveCallback pCallback, void* pObject);
01950 void CallbackEnable (bool pEnable);
01951 void CallbackClear ();
01952
01953 private:
01954 void IncrementUpdateId(int pInc);
01955 void CallbackAddEvent (int pWhat, int pIndexStart);
01956
01957 int MapIndexAll (int pIndex, int &pWhere);
01958 void InitBuffers (int pKeyCount);
01959
01960 bool CheckCurve();
01961 void IsClamped( int pIndex, bool &pLeftClamped, bool &pRightClamped );
01962
01963 float mColor[3];
01964
01965 kFCurveDouble mValue;
01966
01967 int mUpdateId;
01968 bool mCallbackEnable;
01969 bool mInternalCallbackEnable;
01970 int mKeyModifyGuard;
01971
01972 KFCurveKey** mFCurveKeysList;
01973
01974 int mFCurveKeyCount;
01975 int mFCurveKeySize;
01976 int mFCurveLastBlockIndex;
01977
01978
01979 kUInt mPreExtrapolation;
01980 kULong mPreExtrapolationCount;
01981 kUInt mPostExtrapolation;
01982 kULong mPostExtrapolationCount;
01983
01984 int mWasType;
01985
01986 kFCurveIndex mLastSearchIndex;
01987
01988 KTime mCandidateTime;
01989 kFCurveDouble mCandidateValue;
01990
01991 KFCurveEvent mEvent;
01992 KArrayUL mCallbackFunctions;
01993 KArrayUL mCallbackObjects;
01994
01995
01996 #ifndef K_PLUGIN
01997 KFBObjectHolder mFBObjectHolder;
01998 KFCURVE_INLINE KFBObjectHolder& GetFBHolder ();
01999 #endif
02000
02001 KFCURVE_INLINE KFCurveKey* InternalKeyGetPtr(kFCurveIndex pIndex);
02002
02003 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
02004
02005 };
02006
02007
02008 #ifndef K_PLUGIN
02009 #include <kfcurve/kfcurveinline.h>
02010 #endif
02011
02012
02015 KFCURVE_DLL HKFCurve KFCurveCreate();
02016
02017
02018 KFCURVE_DLL HKFCurve KFCurveCreate(KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = false);
02019
02020
02021 KFCURVE_DLL HKFCurve KFCurveCreate(KFbx* pFbx, HKFCurve pCurve, bool pOnlyDefaults = false, bool pColor = false);
02022
02023 #include <kfcurve/kfcurve_nsend.h>
02024
02025
02026 #endif // #ifndef _FBXSDK_KFCURVE_H_
02027
02028