kfcurve.h

Go to the documentation of this file.
00001 
00004 #ifndef FBXFILESDK_COMPONENTS_KFCURVE_KFCURVE_H
00005 #define FBXFILESDK_COMPONENTS_KFCURVE_KFCURVE_H
00006 
00007 /**************************************************************************************
00008 
00009  Copyright (C) 2001 - 2009 Autodesk, Inc. and/or its licensors.
00010  All Rights Reserved.
00011 
00012  The coded instructions, statements, computer programs, and/or related material 
00013  (collectively the "Data") in these files contain unpublished information 
00014  proprietary to Autodesk, Inc. and/or its licensors, which is protected by 
00015  Canada and United States of America federal copyright law and by international 
00016  treaties. 
00017  
00018  The Data may not be disclosed or distributed to third parties, in whole or in
00019  part, without the prior written consent of Autodesk, Inc. ("Autodesk").
00020 
00021  THE DATA IS PROVIDED "AS IS" AND WITHOUT WARRANTY.
00022  ALL WARRANTIES ARE EXPRESSLY EXCLUDED AND DISCLAIMED. AUTODESK MAKES NO
00023  WARRANTY OF ANY KIND WITH RESPECT TO THE DATA, EXPRESS, IMPLIED OR ARISING
00024  BY CUSTOM OR TRADE USAGE, AND DISCLAIMS ANY IMPLIED WARRANTIES OF TITLE, 
00025  NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR USE. 
00026  WITHOUT LIMITING THE FOREGOING, AUTODESK DOES NOT WARRANT THAT THE OPERATION
00027  OF THE DATA WILL BE UNINTERRUPTED OR ERROR FREE. 
00028  
00029  IN NO EVENT SHALL AUTODESK, ITS AFFILIATES, PARENT COMPANIES, LICENSORS
00030  OR SUPPLIERS ("AUTODESK GROUP") BE LIABLE FOR ANY LOSSES, DAMAGES OR EXPENSES
00031  OF ANY KIND (INCLUDING WITHOUT LIMITATION PUNITIVE OR MULTIPLE DAMAGES OR OTHER
00032  SPECIAL, DIRECT, INDIRECT, EXEMPLARY, INCIDENTAL, LOSS OF PROFITS, REVENUE
00033  OR DATA, COST OF COVER OR CONSEQUENTIAL LOSSES OR DAMAGES OF ANY KIND),
00034  HOWEVER CAUSED, AND REGARDLESS OF THE THEORY OF LIABILITY, WHETHER DERIVED
00035  FROM CONTRACT, TORT (INCLUDING, BUT NOT LIMITED TO, NEGLIGENCE), OR OTHERWISE,
00036  ARISING OUT OF OR RELATING TO THE DATA OR ITS USE OR ANY OTHER PERFORMANCE,
00037  WHETHER OR NOT AUTODESK HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS
00038  OR DAMAGE. 
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     // Recording memory functions declaration
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, // Break is part of the modes for historic reasons, should be part of overrides
00137         KFCURVE_TANGEANT_OVERRIDES_MASK   = KFCURVE_GENERIC_CLAMP
00138         // KFCURVE_TANGEANT_COUNT             = 4
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         // User and Break tangent mode (data are doubles).
00259         KFCURVEKEY_RIGHT_SLOPE          = 0, 
00260         KFCURVEKEY_NEXT_LEFT_SLOPE      = 1, 
00261 
00262         // User and Break tangent break mode (data are kInt16 thken from mwight and converted to doubles).
00263         KFCURVEKEY_WEIGHTS              = 2, 
00264         KFCURVEKEY_RIGHT_WEIGHT         = 2, 
00265         KFCURVEKEY_NEXT_LEFT_WEIGHT     = 3, 
00266 
00267         // Velocity mode
00268         KFCURVEKEY_VELOCITY             = 4,
00269         KFCURVEKEY_RIGHT_VELOCITY       = 4,
00270         KFCURVEKEY_NEXT_LEFT_VELOCITY   = 5, 
00271 
00272         // TCB tangent mode (data are floats).
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, // default event value
00333         KFCURVEEVENT_CANDIDATE  =1 << 0, // curve value (not candidate) changed
00334         KFCURVEEVENT_UNUSED1    =1 << 1,
00335         KFCURVEEVENT_UNUSED2    =1 << 2,
00336         KFCURVEEVENT_UNUSED3    =1 << 3,
00337         KFCURVEEVENT_KEY        =1 << 4, // key changed (add, removed, edited); see bits 11-15 for precisions
00338         KFCURVEEVENT_DEPRECATED5 =1 << 5,
00339         KFCURVEEVENT_UNUSED6    =1 << 6,
00340         KFCURVEEVENT_UNUSED7    =1 << 7,
00341         KFCURVEEVENT_SELECTION  =1 << 8, // key selection changed
00342         KFCURVEEVENT_DESTROY    =1 << 9, // fcurve destruction
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         // Curve event type, the enum stated above allow composition of type (bitfield). 
00358         // Stored in mType
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;  // The auto parameter!
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     //  WARNING!
00754     //
00755     //  Anything beyond these lines may not be documented accurately and is 
00756     //  subject to change without notice.
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         //  WARNING!
02091         //
02092         //  Anything beyond these lines may not be documented accurately and is 
02093         //  subject to change without notice.
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 ); // Return true if the specified key is an auto clamp that is currently clamped
02146 
02147         float mColor[3];
02148 
02149         kFCurveDouble mValue;
02150 
02151         int mUpdateId;
02152         bool mCallbackEnable;
02153         bool mInternalCallbackEnable; // Internal use, to replace many callback by one
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;   // no delete on object must use array ul
02177         KArrayUL mCallbackObjects;     // no delete on object must use array ul
02178 
02179         // FBObjectHolder for FBSDK reference
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     //  class KFCurveKey
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     //  class KFCurveKey
02229     //
02230 
02231     KFBX_FCURVE_INLINE void KFCurveKey::Set 
02232         (
02233         KTime pTime, 
02234         kFCurveDouble pValue, 
02235         kFCurveInterpolation pInterpolation /* = KFCURVE_INTERPOLATION_CUBIC*/, 
02236         kFCurveTangeantMode pTangeantMode /*= KFCURVE_TANGEANT_AUTO*/, 
02237         kFCurveDouble pData0 /*= 0*/, 
02238         kFCurveDouble pData1 /*= 0*/,
02239         kFCurveTangeantWeightMode pTangeantWeightMode /*= KFCURVE_WEIGHT_NONE*/, 
02240         kFCurveDouble pWeight0 /* = KFCURVE_DEFAULT_WEIGHT */,
02241         kFCurveDouble pWeight1 /* = KFCURVE_DEFAULT_WEIGHT */,
02242         kFCurveDouble pVelocity0 /* = KFCURVE_DEFAULT_VELOCITY */,
02243         kFCurveDouble pVelocity1 /* = KFCURVE_DEFAULT_VELOCITY */
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/*=0.0f*/, float pData2/*=0.0f*/, float pData3/*=0.0f*/)
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             // Clear weighting information
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 /* KFCURVE_WEIGHTED_ALL */ )
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 /* KFCURVE_VELOCITY_ALL */ )
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         // Apply the adjustment to the tangent value
02402         // ..only if Weight is small values..for weights below 0.01 here which will correct all errors over 1%
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                 // dunno how to handle this
02531             case KFCURVE_TANGEANT_AUTO:
02532             case KFCURVE_TANGEANT_AUTO_BREAK:
02533             default:
02534                 // nothing to do
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     // class KFCurve
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     // Create a function curve, FBX SDK internal use only.
03060     KFBX_DLL HKFCurve KFCurveCreate(KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = false);
03061 
03062     // Create a function curve, FBX SDK internal use only.
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