00001
00004 #ifndef FBXFILESDK_COMPONENTS_KFCURVE_KFCURVENODE_H
00005 #define FBXFILESDK_COMPONENTS_KFCURVE_KFCURVENODE_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
00042 #include <fbxfilesdk/components/kfcurve/kfcurve_h.h>
00043
00044 #include <fbxfilesdk/components/kbaselib/klib/karrayul.h>
00045 #include <fbxfilesdk/components/kbaselib/klib/kerror.h>
00046 #include <fbxfilesdk/components/kbaselib/klib/kstring.h>
00047
00048 #include <fbxfilesdk/components/kfcurve/kfcurve.h>
00049
00050 #ifndef KFBX_PLUGIN
00051 #include <fbxfilesdk/components/kfcurve/i/ifcurveeti.h>
00052 #include <fbxfilesdk/components/kbaselib/object/i/iobject.h>
00053 #include <fbxfilesdk/components/kbaselib/object/i/ifbobjectholder.h>
00054 #endif
00055
00056 KFBX_FORWARD (IConnector)
00057 KFBX_FORWARD (IData)
00058
00059 #include <fbxfilesdk/components/kbaselib/kbaselib_forward.h>
00060
00061 #include <fbxfilesdk/fbxfilesdk_nsbegin.h>
00062
00063 enum
00064 {
00065 KFCN_IN = 0,
00066 KFCN_OUT = 1,
00067 KFCN_INOUT_MASK = 1,
00068
00069 KFCN_HIDDEN = 0,
00070 KFCN_SHOWN = 2,
00071
00072 KFCN_CONTAINER_NODE = 0,
00073 KFCN_REFERENCER_NODE = 8,
00074 KFCN_REFERENCER_MASK = 8,
00075
00076 KFCN_TAKE_NODE = 16,
00077 KFCN_FIXED_NODE = 0,
00078 KFCN_TAKE_MASK = 16,
00079
00080 KFCN_EXPENDED_NODE = 32,
00081 KFCN_NOTEXPENDED_NODE = 0,
00082 KFCN_EXPENDED_MASK = 32,
00083
00084 KFCN_MULTILAYER = 64,
00085 KFCN_MONOLAYER = 0,
00086 KFCN_MULTILAYER_MASK = 64,
00087
00088 KFCN_ALWAYS_CANDIDATE = 128,
00089 KFCN_ALWAYS_CANDIDATE_TESTED = 256
00090 };
00091
00092
00093
00094
00095 enum
00096 {
00097 KCP_KEY = 1,
00098 KCP_LTANGENT,
00099 KCP_RTANGENT
00100 };
00101
00102
00103
00104
00105 enum
00106 {
00107 KFCL_NOLAYER,
00108 KFCL_ADD,
00109 KFCL_EULER_XYZ,
00110 KFCL_MULT,
00111 KFCL_QUAT
00112 };
00113
00114 #define KFCURVENODE_TRANSFORM "Transform"
00115 #define KFCURVENODE_T "T"
00116 #define KFCURVENODE_T_X "X"
00117 #define KFCURVENODE_T_Y "Y"
00118 #define KFCURVENODE_T_Z "Z"
00119 #define KFCURVENODE_R "R"
00120 #define KFCURVENODE_R_X "X"
00121 #define KFCURVENODE_R_Y "Y"
00122 #define KFCURVENODE_R_Z "Z"
00123 #define KFCURVENODE_R_W "W"
00124 #define KFCURVENODE_S "S"
00125 #define KFCURVENODE_S_X "X"
00126 #define KFCURVENODE_S_Y "Y"
00127 #define KFCURVENODE_S_Z "Z"
00128 #define KFCURVENODE_LCL_T "Lcl Translation"
00129 #define KFCURVENODE_LCL_R "Lcl Rotation"
00130 #define KFCURVENODE_LCL_S "Lcl Scaling"
00131 #define KFCURVENODE_VISIBILITY "Visibility"
00132
00133
00134 #define KFCURVENODE_OCCLUSION "Occlusion"
00135
00136
00137 #define KFCURVENODE_IK_REACH_TRANSLATION "IK Reach Translation"
00138 #define KFCURVENODE_IK_REACH_ROTATION "IK Reach Rotation"
00139
00140
00141 #define KFCURVENODE_LIGHT_CONEANGLE "Cone angle"
00142 #define KFCURVENODE_LIGHT_FOG "Fog"
00143 #define KFCURVENODE_LIGHT_INTENSITY "Intensity"
00144 #define KFCURVENODE_COLOR "Color"
00145 #define KFCURVENODE_COLOR_RED "X"
00146 #define KFCURVENODE_COLOR_GREEN "Y"
00147 #define KFCURVENODE_COLOR_BLUE "Z"
00148
00149
00150 #define KFCURVENODE_CAMERA_FIELDOFVIEW "FieldOfView"
00151 #define KFCURVENODE_CAMERA_FIELDOFVIEWX "FieldOfViewX"
00152 #define KFCURVENODE_CAMERA_FIELDOFVIEWY "FieldOfViewY"
00153 #define KFCURVENODE_CAMERA_FOCALLENGTH "FocalLength"
00154 #define KFCURVENODE_CAMERA_OPTICALCENTERX "OpticalCenterX"
00155 #define KFCURVENODE_CAMERA_OPTICALCENTERY "OpticalCenterY"
00156 #define KFCURVENODE_CAMERA_ROLL "Roll"
00157 #define KFCURVENODE_CAMERA_TURNTABLE "TurnTable"
00158 #define KFCURVENODE_BACKGROUND_COLOR "BackgroundColor"
00159 #define KFCURVENODE_BACKGROUND_COLOR_RED "X"
00160 #define KFCURVENODE_BACKGROUND_COLOR_GREEN "Y"
00161 #define KFCURVENODE_BACKGROUND_COLOR_BLUE "Z"
00162
00163
00164 #define KFCURVENODE_CAMERA_INDEX "Camera Index"
00165
00166
00167 #define KFCURVENODE_TEXTURE_TRANSLATION "Translation"
00168 #define KFCURVENODE_TEXTURE_TRANSLATION_X "X"
00169 #define KFCURVENODE_TEXTURE_TRANSLATION_Y "Y"
00170 #define KFCURVENODE_TEXTURE_TRANSLATION_Z "Z"
00171 #define KFCURVENODE_TEXTURE_ROTATION "Rotation"
00172 #define KFCURVENODE_TEXTURE_ROTATION_X "X"
00173 #define KFCURVENODE_TEXTURE_ROTATION_Y "Y"
00174 #define KFCURVENODE_TEXTURE_ROTATION_Z "Z"
00175 #define KFCURVENODE_TEXTURE_SCALING "Scaling"
00176 #define KFCURVENODE_TEXTURE_SCALING_X "X"
00177 #define KFCURVENODE_TEXTURE_SCALING_Y "Y"
00178 #define KFCURVENODE_TEXTURE_SCALING_Z "Z"
00179 #define KFCURVENODE_TEXTURE_ALPHA "Alpha"
00180
00181
00182 #define KFCURVENODE_MATERIAL_EMISSIVE "Emissive"
00183 #define KFCURVENODE_MATERIAL_EMISSIVE_R "X"
00184 #define KFCURVENODE_MATERIAL_EMISSIVE_G "Y"
00185 #define KFCURVENODE_MATERIAL_EMISSIVE_B "Z"
00186 #define KFCURVENODE_MATERIAL_AMBIENT "Ambient"
00187 #define KFCURVENODE_MATERIAL_AMBIENT_R "X"
00188 #define KFCURVENODE_MATERIAL_AMBIENT_G "Y"
00189 #define KFCURVENODE_MATERIAL_AMBIENT_B "Z"
00190 #define KFCURVENODE_MATERIAL_DIFFUSE "Diffuse"
00191 #define KFCURVENODE_MATERIAL_DIFFUSE_R "X"
00192 #define KFCURVENODE_MATERIAL_DIFFUSE_G "Y"
00193 #define KFCURVENODE_MATERIAL_DIFFUSE_B "Z"
00194 #define KFCURVENODE_MATERIAL_SPECULAR "Specular"
00195 #define KFCURVENODE_MATERIAL_SPECULAR_R "X"
00196 #define KFCURVENODE_MATERIAL_SPECULAR_G "Y"
00197 #define KFCURVENODE_MATERIAL_SPECULAR_B "Z"
00198 #define KFCURVENODE_MATERIAL_OPACITY "Opacity"
00199 #define KFCURVENODE_MATERIAL_REFLECTIVITY "Reflectivity"
00200 #define KFCURVENODE_MATERIAL_SHININESS "Shininess"
00201
00202
00203 #define KFCURVENODE_USER_PROPERTY_VECTOR_X "X"
00204 #define KFCURVENODE_USER_PROPERTY_VECTOR_Y "Y"
00205 #define KFCURVENODE_USER_PROPERTY_VECTOR_Z "Z"
00206 #define KFCURVENODE_USER_PROPERTY_VECTOR_W "W"
00207
00208
00209 #define KFCURVENODE_USER_PROPERTY_COLOR_R "X"
00210 #define KFCURVENODE_USER_PROPERTY_COLOR_G "Y"
00211 #define KFCURVENODE_USER_PROPERTY_COLOR_B "Z"
00212 #define KFCURVENODE_USER_PROPERTY_COLOR_A "W"
00213
00214
00215 #define KFCURVENODE_USER_PROPERTY_MATRIX "Matrix"
00216 #define KFCURVENODE_USER_PROPERTY_MATRIX_0 "0"
00217 #define KFCURVENODE_USER_PROPERTY_MATRIX_1 "1"
00218 #define KFCURVENODE_USER_PROPERTY_MATRIX_2 "2"
00219 #define KFCURVENODE_USER_PROPERTY_MATRIX_3 "3"
00220 #define KFCURVENODE_USER_PROPERTY_MATRIX_4 "4"
00221 #define KFCURVENODE_USER_PROPERTY_MATRIX_5 "5"
00222 #define KFCURVENODE_USER_PROPERTY_MATRIX_6 "6"
00223 #define KFCURVENODE_USER_PROPERTY_MATRIX_7 "7"
00224 #define KFCURVENODE_USER_PROPERTY_MATRIX_8 "8"
00225 #define KFCURVENODE_USER_PROPERTY_MATRIX_9 "9"
00226 #define KFCURVENODE_USER_PROPERTY_MATRIX_A "A"
00227 #define KFCURVENODE_USER_PROPERTY_MATRIX_B "B"
00228 #define KFCURVENODE_USER_PROPERTY_MATRIX_C "C"
00229 #define KFCURVENODE_USER_PROPERTY_MATRIX_D "D"
00230 #define KFCURVENODE_USER_PROPERTY_MATRIX_E "E"
00231 #define KFCURVENODE_USER_PROPERTY_MATRIX_F "F"
00232
00233
00234 #define SELECTION_ARRAY_SIZE 30*60+1
00235
00236
00237 #define KFCURVENODE_CANDIDATE_MAX_COUNT 4
00238
00239
00240 typedef int kFCurveNodeType;
00241
00242 KFBX_FORWARD (KFCurveNode);
00243 typedef HKFCurveNode HIKFCurveNode;
00244 typedef KFCurveNode IKFCurveNode;
00245
00246 #define IKFCurveNodeID 43763634
00247
00248 enum EKFCurveNodeEventType
00249 {
00250 KFCURVENODEEVENT_NONE = 0,
00251 KFCURVENODEEVENT_SELECTION = 1,
00252 KFCURVENODEEVENT_DESTROY = 2,
00253 KFCURVENODEEVENT_FCURVE = 4,
00254 KFCURVENODEEVENT_TIMEWARP = 8,
00255 KFCURVENODEEVENT_CTRLCURVE = 16,
00256 KFCURVENODEEVENT_DATAUPDATED = 32
00257 };
00258
00259 struct KExternalTimingInformation
00260 {
00261 KTime mLclOffset;
00262 KTime mDuration;
00263 };
00264
00265
00268 class KFBX_DLL KFCurveNodeEvent : public KEventBase
00269 {
00270 public:
00276
00277 int mEventCount;
00278
00280 void* mData;
00281
00283 inline void Clear ()
00284 {
00285 mType=KFCURVENODEEVENT_NONE;
00286 mEventCount = 0;
00287 mData = NULL;
00288 }
00289
00293 inline void Add (int pWhat)
00294 {
00295 mType |= pWhat;
00296 mEventCount++;
00297 }
00298
00299
00300 inline void SetData (void* pData) {mData = pData;}
00301 };
00302
00303
00304 struct KFCurveNodeCallback
00305 {
00306 KFCurveNodeEvent mEvent;
00307 KArrayUL mCallbackFunctions;
00308 KArrayUL mCallbackObjects;
00309 bool mCallbackEnable;
00310 };
00311
00312 typedef void (*kFCurveNodeCallback) (KFCurveNode* pFCurve, KFCurveNodeEvent* FCurveNodeEvent, void* pObject) ;
00313
00314 typedef class KArrayTemplate< HKFCurveNode > KArrayTemplateFCurveNode;
00315
00316
00317 enum
00318 {
00319 ISKEY_NONE,
00320 ISKEY_SOME,
00321 ISKEY_ALL
00322 };
00323
00324
00325 class KFBX_DLL KFCurveNodeCandidateState
00326 {
00327 public:
00328 KFCurveNodeCandidateState();
00329 ~KFCurveNodeCandidateState();
00330
00331 void Dump(int pLevel = 0);
00332
00333 void SetCandidateTotalTime ( KTime &pCandidateTime ) { mCandidateTotalTime = pCandidateTime; };
00334 void SetCandidateSpecificTime ( KTime &pCandidateTime ) { mCandidateSpecificTime = pCandidateTime; };
00335
00336 protected:
00337 friend class KFCurveNode;
00338
00339 int mSpecificCandidateMethod;
00340 int mTotalCandidateMethod;
00341
00342 double mCandidateTotalValue[KFCURVENODE_CANDIDATE_MAX_COUNT];
00343 KTime mCandidateTotalTime;
00344
00345 double mCandidateSpecificValue;
00346 double mFCurveValue;
00347 KTime mCandidateSpecificTime;
00348
00349 KFCurveNodeCandidateState *mSubStates[KFCURVENODE_CANDIDATE_MAX_COUNT];
00350 KFCurveNodeCandidateState *mLayerState;
00351 int mLayerID;
00352
00353 };
00354
00355
00368 #ifdef KFBX_PLUGIN
00369 class KFBX_DLL KFCurveNode
00370 #else
00371 class KFBX_DLL KFCurveNode : public IFBObjectHolder
00372 #endif
00373 {
00374
00375 public:
00376
00381
00390 KFCurveNode
00391 (
00392 char* pNodeName,
00393 char* pTimeWarpName,
00394 HKDataType pDataType,
00395 int pLayerType = KFCL_NOLAYER,
00396 int pLayerID = 0
00397 ) ;
00398
00406 KFCurveNode(HKFCurveNode pTemplateCurveNode);
00407
00409 virtual ~KFCurveNode () ;
00410
00411 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00412 #ifdef KFBX_PLUGIN
00413 void Destroy (int Local=0) ;
00414 #else
00415 KFBX_IObject_Declare (KFBX_Implementation)
00416 #endif
00417 #endif
00418
00420
00425
00429 void CreateFCurve( );
00430
00435 bool FCurveCreated( );
00436
00438
00443
00454 HKFCurveNode Clone(bool pKeepAttached);
00455
00469 HKFCurveNode CloneTemplate(bool pKeepAttached=false, bool pCloneFCurves=false, bool pCreateCurves=false, int pLayerID = -1);
00470
00478 void CopyFrom(HKFCurveNode pSource, bool pTransferCurve = false);
00479
00488 HKFCurveNode Copy(KTime pStart=KTIME_MINUS_INFINITE, KTime pStop=KTIME_INFINITE);
00489
00491
00496
00498 char* GetName () ;
00499
00501 char* GetTimeWarpName() ;
00502
00504 char* GetTypeName() ;
00505
00507
00512
00516 HKFCurve FCurveGet();
00517
00526 KFCurve* FCurveSet (KFCurve* pCurve, bool pDestroyOldCurve = false) ;
00527
00534 void FCurveReplace (KFCurve* pCurve) ;
00535
00544 bool GetTransformCurves (KFCurve* pT[3], KFCurve* pR[3], KFCurve* pS[3]) ;
00545
00547
00552
00556 virtual void Clear () ;
00557
00562 virtual int Add(HKFCurveNode pCurveNode);
00563
00567 virtual void Remove (int pIndex) ;
00568
00572 virtual void Delete (int pIndex) ;
00573
00575 virtual int GetCount () ;
00576
00581 virtual HKFCurveNode Get(int pIndex) ;
00582
00589 virtual bool IsChild(KFCurveNode* pCurveNode, bool pRecursive = false) ;
00590
00596 virtual int Find (char* pName) ;
00597
00603 virtual int Find(HKFCurveNode pNode);
00604
00609 HKFCurveNode FindRecursive(char* pName);
00610
00617 HKFCurveNode FindOrCreate(char* pName, bool pFindOrCreateCurve = true) ;
00618
00622 virtual void SetParent(HKFCurveNode pParent) {mParent = pParent;}
00623
00627 virtual HKFCurveNode GetParent() {return mParent;}
00628
00630
00635
00641 int KeyGetCount(bool pRecursiveInLayers = false);
00642
00649 void KeyGetCount(int& pCurveCount, int& pTotalCount, int& pMinCount, int& pMaxCount);
00650
00658 void GetCurveWithFirstKey(KFCurve*& lCurveWithFirstKey, bool *pCurveMask , bool pRecursiveInLayers);
00659
00666 void GetCurveWithLastKey(KFCurve*& lCurveWithLastKey, bool *pCurveMask , bool pRecursiveInLayers);
00667
00674 KTime GetFirstKeyTime(bool *pCurveMask = NULL, bool pRecursiveInLayers = false);
00675
00682 KTime GetLastKeyTime(bool *pCurveMask = NULL, bool pRecursiveInLayers = false);
00683
00694 double* KeyAdd (KTime pTime, double* pValue) ;
00695
00709 double* KeyAppend (KTime pTime, double* pValue, bool pCheckForContinuousRotation = false) ;
00710
00721 bool GetAnimationInterval (KTime& pStart, KTime& pStop) ;
00722
00727 void GetTimeSpan (KTime& pStart, KTime& pStop) ;
00728
00744 int IsKey (KTime& pTime, int *pLast, bool* pCurveMask = NULL, double pKeyIndexTolerance = 0.0, double pMin = -K_DOUBLE_MAX, double pMax = K_DOUBLE_MAX );
00745
00755 bool DeleteKey (KTime& pTime, bool* pCurveMask = NULL, double pKeyIndexTolerance = 0.0 );
00756
00767 KTime GetNextKeyTime (KTime pTime, bool* pCurveMask = NULL, bool pRecursiveInLayers = false);
00768
00778 KTime GetPrevKeyTime (KTime pTime, bool* pCurveMask = NULL );
00779
00794 double* Evaluate (double* pValue, KTime pTime, kFCurveIndex* pLast=NULL) ;
00795
00806 double* GetValue (double* pValue) ;
00807
00817 double* SetValue (double* pValue) ;
00818
00825 void Delete(KTime pStart=KTIME_MINUS_INFINITE, KTime pStop=KTIME_INFINITE);
00826
00839 void Replace(HKFCurveNode pSource, KTime pStart = KTIME_MINUS_INFINITE, KTime pStop = KTIME_INFINITE, bool pUseGivenSpan = false, bool pKeyStartEndOnNoKey = true, KTime pTimeSpanOffset = KTIME_ZERO );
00840
00842
00844
00845
00846
00847
00848
00849
00851
00852 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00853
00858
00860 float* GetColor();
00861
00863 void SetColor (float pColor[3]) ;
00864
00866
00871
00873 inline int IncReferenceCount () {return ++mReferenceCount;}
00874
00876 inline int DecReferenceCount () {mReferenceCount--; return mReferenceCount;}
00877
00879 inline int GetReferenceCount () {return mReferenceCount;}
00880
00882
00887
00889 int GetTakeType () ;
00890
00892 void SetTakeType (int pType) ;
00893
00895
00900
00902 bool GetVisibility () ;
00903
00905 void SetVisibility (bool pVisible, bool pRecursive=false, bool pRecurseLayer = false, int lChildIndex = -1) ;
00906
00908
00913
00918 void DataNodeSet (HKFCurveNode pDataNode, bool pRecursive=true) ;
00919
00923 HKFCurveNode DataNodeGet () ;
00924
00928 bool SetPreExtrapolation(kUInt pNewPreExtrapolation, bool pRespectUserLock=true );
00929 bool SetPreExtrapolationCount(kUInt pNewPreExtrapolationCount, bool pRespectUserLock=true);
00930 bool SetPostExtrapolation(kUInt pNewPreExtrapolation, bool pRespectUserLock=true);
00931 bool SetPostExtrapolationCount(kUInt pNewPreExtrapolationCount, bool pRespectUserLock=true);
00932
00934
00939
00941 int GetContainerType () ;
00942
00944 void SetContainerType (int pInOutType) ;
00945
00947
00952
00954 int GetIOType () ;
00955
00957 void SetIOType (int pInOutType) ;
00958
00960
00965
00967 int IsExpended () ;
00968
00970 void SetExpended (bool pExpended) ;
00971
00973
00978
00980 int IsMultiLayer() ;
00981
00983 void SetMultiLayer (bool pMultiLayer) ;
00984
00986 HKFCurveNode GetLayerNode(int pLayerID);
00987
00989 #ifndef KFBX_PLUGIN
00990 void ExtractKeysIndex( KArraykInt &pArray, KTimeSpan pTimeSpan, double pMinValue = -K_DOUBLE_MAX, double pMaxValue = K_DOUBLE_MAX);
00991 #endif
00992
00994
00999
01003 bool LookLikeSampledData(KTime pThresholdPeriod);
01004
01006
01011
01013 int GetUpdateId () ;
01014
01016 int GetValuesUpdateId ();
01017
01019 int GetNodeUpdateId () ;
01020
01021
01023
01028
01030 bool CallbackEnable (bool pEnable) ;
01031
01033 bool CallbackIsEnable () ;
01034
01036 void CallbackClear () ;
01037
01039 void CallbackAddEvent (int pWhat) ;
01040
01042 void CallbackRegister (kFCurveNodeCallback, void* pObject) ;
01043
01045 void CallbackUnregister (kFCurveNodeCallback, void* pObject) ;
01046
01048
01049 #ifndef KFBX_PLUGIN
01050
01054
01056 void SetETI(IKFCurveETI * pFCurveETI);
01057 IKFCurveETI * GetETI() const;
01058
01060 KTime ETINodeTime2GlobalTime(KTime const & pTime);
01061 KTime ETIGlobalTime2NodeTime(KTime const & pTime);
01062 KTime ETIGetDuration();
01063 KTime ETIGetTrimOffset();
01064 KTime ETIGetGlobalOffset();
01065 double ETIGetScaleFactor();
01066 bool ETIGetColor(KgeRGBVector & pColor);
01067 bool ETIIsGlobalTimeInSpan(KTime const & pTime, bool pIncludeStop = true);
01068 typedef KTime (IKFCurveETI::*TETITimeFetcher)();
01069 KTime ETIGetSpecifiedTime(TETITimeFetcher pFunc);
01070 bool ETIIsSelectedDuration();
01071 #endif
01072
01074
01075 bool FbxStore (KFbx* pFbx, bool pOnlyDefaults = false, bool pReplaceLclTRSName = false, bool pSkipTimeWarpName = false, char* pFieldName = "Channel", bool pColor = true, bool pIsVersion5 = false ) ;
01076 bool FbxRetrieve (KFbx* pFbx, bool pOnlyDefaults = false, bool pCreateIfNotFound = true,bool pColor = false);
01077 bool FbxInternalRetrieve (KFbx* pFbx, bool pOnlyDefaults = false, bool pCreateIfNotFound = true,bool pColor = false) ;
01078 bool FbxTimeWarpNameRetrieve(KFbx* pFbx);
01079 bool FbxLayerAndTimeWarpRetrieve(KFbx* pFbx, bool pOnlyDefaults = false, bool pCreateIfNotFound = true,bool pColor = false) ;
01080
01082
01086 bool mUseQuaternion;
01087 inline bool GetUseQuaternion(){return mUseQuaternion;};
01088 void SetUseQuaternion(bool pVal);
01089 private:
01090 void RotationNodeEvaluate(double* pValue, KTime pTime, kFCurveIndex* pLast,bool pEvaluateCandidate );
01091
01093
01094 public:
01096
01100 void GetCandidateState(KFCurveNodeCandidateState& pState);
01101 void SetCandidateState(const KFCurveNodeCandidateState& pState, bool pDestroyMissingLayers = false );
01102
01103 int GetCandidateSpecificMethod();
01104 int GetCandidateTotalMethod();
01105 KTime GetCandidateTotalTime();
01106 double* GetCandidateTotalValue();
01107 int GetCandidateTotalValueSize();
01108
01109 void SetCandidateSpecificMethod(int pMethod);
01110 void SetCandidateTotalMethod(int pMethod);
01111 void SetCandidateTotalTime(KTime pTime);
01112 void SetCandidateTotalValue(double* pValue);
01113
01115
01116 void GetQuaternionInterpolationBezierPoints(KTime pCurrentTime, KgeQuaternion &pQ0, KgeQuaternion &lQ1, KgeQuaternion &lQ2, KgeQuaternion &lQ3);
01117
01118 protected:
01119 struct NameInfo
01120 {
01121 KString mName;
01122 KString mTimeWarpName;
01123 HKDataType mDataType;
01124 int mRefCount;
01125 }*mNameInfo;
01126
01127 void SetNameInfo( NameInfo* pNameInfo );
01128
01129 int mType;
01130
01131 int mReferenceCount;
01132 KArrayTemplate<HKFCurveNode> mNodes;
01133
01134 HIKFCurve mFCurve;
01135 HKFCurveNode mTimeWarp;
01136 HKFCurveNode mLayer;
01137 HKFCurveNode mObjectLayer;
01138 HKFCurveNode mTemplate;
01139 HKFCurveNode mDataNode;
01140 HKFCurveNode mParent;
01141
01142 int mLayerType;
01143 int mLayerID;
01144
01145 int mUpdateId;
01146
01147 public:
01148 int mMBRotationOrder;
01149 inline int GetRotationOrder(){return mMBRotationOrder;};
01150 void SetRotationOrder(int pRotationOrder);
01151
01153 int GetLayerType() { return mLayerType; }
01154
01155 protected:
01156
01157
01158
01159
01160 void FromTotalCandidateToSpecificCandidate(int pLayerID);
01161
01162 enum {eUseFCurve = 1, eUseTotal = 2};
01163 int mSpecificCandidateMethod;
01164 int mTotalCandidateMethod;
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177 double mCandidateTotalValue[KFCURVENODE_CANDIDATE_MAX_COUNT];
01178 KTime mCandidateTotalTime;
01179
01180
01181
01182
01183
01184 KFCurveNodeCallback* mCallback;
01185 int mUserLock;
01186
01187
01188 #ifndef KFBX_PLUGIN
01189
01190
01191
01192 IKFCurveETI * mETI;
01193 #endif
01194
01195 private:
01196 void KeyGetCountRecursive(int& pCurveCount, int& pTotalCount, int& pMinCount, int& pMaxCount);
01197 bool GetAnimationIntervalRecursive (KTime& pStart, KTime& pStop) ;
01198 void IsKeyRecursive( KTime& pTime, int &pKeyCount, int &pKeyFound, int *pLast, bool *pCurveMask, double pKeyIndexTolerance = 0.0, double pMin = -K_DOUBLE_MAX, double pMax = K_DOUBLE_MAX );
01199
01200 friend KFBX_DLL HKFCurveNode KFCurveNodeCreate (KFbx* pFbx, HKFCurveNode pParent, bool pOnlyDefaults, bool pCreateIfNotFound, bool pColor );
01201
01202 public:
01203
01204
01205
01206
01208 void TimeWarpSet (HKFCurveNode pLayer);
01209
01213 HKFCurveNode TimeWarpGet ();
01214
01215
01216
01217
01218
01220 void LayerSet(HKFCurveNode pLayer, bool pDeleteCurrentAndSubLayers );
01221
01225 HKFCurveNode LayerGet ();
01226
01230 HKFCurveNode LayerGet( int pLayerID );
01231
01233 void CreateLayerAt( int pLayerID );
01234 private:
01236 HKFCurveNode LayerCreate ( int pLayerID, bool pDeleteCurrentLayer );
01237 public:
01239 virtual HKFCurveNode Find(HKDataType pDataType);
01240
01245 HKFCurveNode FindRecursive(HKDataType pDataType);
01246
01248 HKDataType GetDataType();
01249
01253 void Delete(HKFCurveNode pNode);
01254
01256 HKFCurveNode ObjectLayerGet();
01257
01259 void ObjectLayerSet( HKFCurveNode pNode );
01260
01262 inline int GetLayerID() { return mLayerID; };
01263
01265 inline void SetLayerID( int pLayerID ) { mLayerID = pLayerID; };
01266
01268 void SetLayerType( int pLayerType, HKFCurveNode pObjectLayerNode = NULL );
01269
01271 HKFCurveNode GetPreviousLayer( int pLayerID );
01272
01274 HKFCurveNode RemoveLayer( int pLayerID, bool pDestroy = true );
01275
01276
01277 HKFCurveNode InsertOrCopyLayer( int pLayerId, HKFCurveNode pLayerNode );
01278
01279 void SingleLayerCopyFrom(HKFCurveNode pSource, bool pTransferCurve = false );
01280
01281 HKFCurveNode SingleLayerCopy(KTime pStart=KTIME_MINUS_INFINITE, KTime pStop=KTIME_INFINITE );
01282
01283
01284
01285
01286
01288 void TemplateSet (HKFCurveNode pTemplate);
01289
01293 HKFCurveNode TemplateGet ();
01294
01295
01296
01297
01298
01300 void LayerCopyFromRecursive( HKFCurveNode pSource, bool pTransferCurve = false );
01301
01302
01303
01304
01305
01307 bool CandidateClear ( int pLayerID = 0, bool pClearAllSubLayersToo = true );
01308
01310 void CandidateClearSubLayers ();
01311
01313 double* CandidateSet (KTime pTime, double* pValue, int pLayerID = 0, int pChildIndexInParent = -1 );
01314
01316 double *CandidateSetSpecificLayer (KTime pTime,double *pValue, int pLayerID = 0 );
01317
01319 double* CandidateGet (double* pValue, int pLayerID = 0 );
01320
01322 double* CandidateGetSpecificLayer( double* pValue, KTime &pCandidateTime, int pLayerID = 0 );
01323
01325 void CandidateGetTotalCandidate( double* pValue, KTime &pCandidateTime );
01326
01328 bool IsCandidate ();
01329
01331 bool CandidateKey
01332 (
01333 kFCurveIndex* pLast = NULL,
01334 int pLayerID = 0,
01335 bool* pCurveMask = NULL,
01336 bool pZeroKey = false ,
01337 int pInterpolation = KFCURVE_INTERPOLATION_CUBIC,
01338 int pTangeantMode = KFCURVE_TANGEANT_USER,
01339 int pContinuity = KFCURVE_CONTINUITY,
01340 bool pTanOverride = true,
01341 KTime pCandidateTime = KTIME_INFINITE,
01342 double pKeyIndexTolerance = 0.0
01343 );
01344
01346 bool CandidateKeySpecificLayer
01347 (
01348 kFCurveIndex* pLast = NULL,
01349 int pLayerID = 0,
01350 bool* pCurveMask = NULL,
01351 int pInterpolation = KFCURVE_INTERPOLATION_CUBIC,
01352 int pTangeantMode = KFCURVE_TANGEANT_USER,
01353 int pContinuity = KFCURVE_CONTINUITY,
01354 bool pTanOverride = true,
01355 KTime pCandidateTime = KTIME_INFINITE,
01356 double pKeyIndexTolerance = 0.0
01357 );
01358
01359
01360 int GetCorrectLayerID( int pLayerID );
01361 HKFCurveNode GetCorrectLayer ( int pLayerID, bool pCreateLayerIfNesseary = false );
01362
01364 void ComputeCandidateForLayer( double *pDestLayerValue, double *pCandidateValue, KTime pTime, int pLayerID, kFCurveIndex *pLast );
01365
01367 void EvaluateCurvesExceptLayerRecursiveAdd ( double *pValue, KTime pTime, int pExceptLayerID, kFCurveIndex* pLast=NULL);
01368
01370 void EvaluateCurvesExceptLayerRecursiveMult ( double *pValue, KTime pTime, int pExceptLayerID, kFCurveIndex* pLast=NULL);
01371
01373 void EvaluateCurvesBeforeLayerRecursiveEulerXYZ ( KgeRMatrix &pBefore, KTime lCandidateTime, int pLayerID, kFCurveIndex* pLast );
01374
01376 void EvaluateCurvesAfterLayerRecursiveEulerXYZ ( KgeRMatrix &pAfter, KTime lCandidateTime, int pAfterLayerID, kFCurveIndex* pLast );
01377
01379 void EvaluateCurvesBeforeLayerRecursiveQuat( KgeQuaternion &pBefore, KTime pTime, int pBeforeLayerID, kFCurveIndex* pLast );
01380
01382 void EvaluateCurvesAfterLayerRecursiveQuat ( KgeQuaternion &pAfter , KTime pTime, int pBeforeLayerID, kFCurveIndex* pLast );
01383
01385 double* CandidateGetWithTime ( double *pValue, KTime &pCandidateTime );
01386
01387
01388
01389
01390
01391
01393 double* EvaluateSpecificLayer( double *pValue, KTime pTime, int pLayerID, kFCurveIndex* pLast=NULL);
01394
01396 double *CandidateEvaluateSpecificLayer( double *pValue, KTime pTime, int pLayerID, kFCurveIndex *pLast=NULL);
01397
01399 double* GeneralEvaluate (double* pValue, KTime pTime, kFCurveIndex* pLast=NULL,bool pEvaluateCandidate=true);
01400
01402 double* CandidateEvaluate (double* pValue, KTime pTime, kFCurveIndex* pLast=NULL);
01403
01405 bool IsEditable ();
01406
01408 void GetZeroValues( double *pValues );
01409
01410
01411 void ReplaceForQuaternion( HKFCurveNode pSource, KTime pStart, KTime pStop, double pScaleStart, double pScaleStop, bool pUseExactGivenSpan , bool pKeyStartEndOnNoKey , KTime pTimeSpanOffset );
01412
01413
01414 bool GetContinuousOffset( double pOffset[3], double pNew[3], double pOld[3] );
01415
01416
01417 void GetContinuousRotation( double pResultKeyValue[3], double pCurrentKeyValue[3], KTime pCurrentKeyTime );
01418
01419
01420 void SetTimeWarpName( char* pName );
01421
01422
01423 int KeyGetCountOnChild( int pChildIndex );
01424
01425
01426
01427
01428
01430 void UserLockAdd();
01431
01433 void UserLockRemove();
01434
01436 bool IsUserLocked();
01437
01438 #ifndef KFBX_PLUGIN
01439
01440
01441
01442
01444 KFBObjectHolder mFBObjectHolder;
01445
01447 KFBObjectHolder &GetFBHolder () {return mFBObjectHolder;}
01448 #endif
01449
01450 public:
01455 virtual int SortedAdd (HKFCurveNode pNode) ;
01456
01458 public:
01459
01460
01461 HIConnector mConnector;
01462
01463 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
01464
01465 };
01466
01467
01477 KFBX_DLL HKFCurveNode KFCurveNodeCreate(char* pNodeName, char* pTimeWarpName, char* pTypeName, int pLayerType = KFCL_NOLAYER, int pLayerID = 0);
01478 KFBX_DLL HKFCurveNode KFCurveNodeCreate(char* pNodeName, HKDataType pDataType=NULL, int pLayerType = KFCL_NOLAYER, int pLayerID = 0);
01479
01480
01488 KFBX_DLL HKFCurveNode KFCurveNodeCreate(HKFCurveNode pTemplateCurveNode);
01489
01490
01491 KFBX_DLL HKFCurveNode KFCurveNodeCreate(KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = false);
01492
01493
01494 KFBX_DLL HKFCurveNode KFCurveNodeCreate(KFbx* pFbx, HKFCurveNode pParent, bool pOnlyDefaults = false, bool pCreateIfNotFound = true, bool pColor = false);
01495
01496
01497 KFBX_DLL HKFCurveNode KFCurveNodeLayerCreate (KFbx* pFbx,HKFCurveNode pParent, bool pOnlyDefaults = false );
01498
01499
01500 KFBX_DLL HKFCurveNode FCurveNodeCreateFromDataType( HKDataType pDataType,char* pNodeName);
01501
01502 #include <fbxfilesdk/fbxfilesdk_nsend.h>
01503
01504 #endif // FBXFILESDK_COMPONENTS_KFCURVE_KFCURVENODE_H
01505