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