kfcurvenode.h

Go to the documentation of this file.
00001 
00004 #ifndef FBXFILESDK_COMPONENTS_KFCURVE_KFCURVENODE_H
00005 #define FBXFILESDK_COMPONENTS_KFCURVE_KFCURVENODE_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 
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     // Picking Types define
00094     //
00095     enum 
00096     {
00097         KCP_KEY = 1, 
00098         KCP_LTANGENT, 
00099         KCP_RTANGENT
00100     };
00101 
00102     //
00103     //  Node/Layer info
00104     //
00105     enum
00106     {
00107         KFCL_NOLAYER,
00108         KFCL_ADD,       // For translation and standard others
00109         KFCL_EULER_XYZ, // For rotation
00110         KFCL_MULT,      // For scaling, mainly
00111         KFCL_QUAT       // For quaternion rotation
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     // Addition for the optical marker node attribute.
00134     #define KFCURVENODE_OCCLUSION               "Occlusion"
00135 
00136     // Addition for the IK effector marker node attribute.
00137     #define KFCURVENODE_IK_REACH_TRANSLATION    "IK Reach Translation"
00138     #define KFCURVENODE_IK_REACH_ROTATION       "IK Reach Rotation"
00139 
00140     // Addition for the light node attribute.
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     // Addition for the camera node attribute.
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     // Addition for the camera switcher node attribute.
00164     #define KFCURVENODE_CAMERA_INDEX            "Camera Index"
00165 
00166     // Addition for the texture.
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     // Addition for the material.
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     // Addition for the generic vector property.
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     // Addition for the generic color property.
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     // Addition of generic matrix
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     // Default array size for 1 minute of animation (30fps) 
00234     #define SELECTION_ARRAY_SIZE    30*60+1
00235     //#define SELECTION_ARRAY_SIZE 1024*1024
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         // Set the data contained by the node event.
00300         inline void SetData (void* pData) {mData = pData;}
00301     };
00302 
00303 
00304     struct KFCurveNodeCallback 
00305     {
00306         KFCurveNodeEvent mEvent;
00307         KArrayUL mCallbackFunctions;   // no delete on object must use array ul
00308         KArrayUL mCallbackObjects;     // no delete on object must use array ul
00309         bool mCallbackEnable;
00310     };
00311 
00312     typedef void (*kFCurveNodeCallback) (KFCurveNode* pFCurve, KFCurveNodeEvent* FCurveNodeEvent, void* pObject) ;
00313 
00314     typedef class KArrayTemplate< HKFCurveNode > KArrayTemplateFCurveNode;  
00315 
00316     // Return codes for function KFCurveNode::IsKey().
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 /* = NULL */, bool pRecursiveInLayers);
00659 
00666         void GetCurveWithLastKey(KFCurve*& lCurveWithLastKey, bool *pCurveMask /* = NULL */, 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     //  WARNING!
00846     //
00847     //  Anything beyond these lines may not be documented accurately and is 
00848     //  subject to change without notice.
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;        // Ctrl Curve (Animation layering) 
01137         HKFCurveNode mObjectLayer;  // Pointer to Layer 0
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         //  Candidates in nodes (Max is KFCURVENODE_CANDIDATE_MAX_COUNT)
01158         //
01159         
01160         void FromTotalCandidateToSpecificCandidate(int pLayerID);
01161 
01162         enum {eUseFCurve = 1, eUseTotal = 2};
01163         int mSpecificCandidateMethod;  // Used as a bit field
01164         int mTotalCandidateMethod;     // Used as an enum
01165                                         // To my knowledge the possible state are       
01166                                         // No validcandidate                            mCandidateTotalTime == INFINITE and no FCurve candidate for the current time
01167                                         // Total candidate is valid and fcuve invalid   mTotalCandidateMethod ==  eUseTotal and mSpecificCandidateMethod == eUseTotal
01168                                         // FCurve is valid and Total invalid            mTotalCandidateMethod ==  eUseFCurve and mSpecificCandidateMethod == eUseFCurve
01169                                         // Total valid and FCurve computed              mTotalCandidateMethod ==  eUseTotal and mSpecificCandidateMethod == eUseTotal | eUseFCurve
01170 
01171                                         // FCurve valid and total computed              mTotalCandidateMethod ==  eUseTotal and mSpecificCandidateMethod == eUseFCurve
01172                                         // FCurve valid (and computed from total) and total computed    mTotalCandidateMethod ==  eUseTotal and mSpecificCandidateMethod == eUseTotal | eUseFCurve
01173                         
01174                     
01175                                         
01176 
01177         double mCandidateTotalValue[KFCURVENODE_CANDIDATE_MAX_COUNT];   // For all layers at once (only meaningful on ObjectLayer )
01178         KTime   mCandidateTotalTime;
01179 
01180         //
01181         //  Callbacks
01182         //
01183         
01184         KFCurveNodeCallback* mCallback;
01185         int mUserLock;
01186 
01187 
01188     #ifndef KFBX_PLUGIN
01189         //
01190         //  External Timing Information (for transportation only: optional, not used internally, and not persisted).
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         // TimeWarp
01205         //
01206 
01208         void TimeWarpSet (HKFCurveNode pLayer);
01209 
01213         HKFCurveNode TimeWarpGet ();
01214 
01215         //
01216         // Layers
01217         //
01218 
01220         void LayerSet(HKFCurveNode pLayer, bool pDeleteCurrentAndSubLayers ); // No default value to make sure you know what you are doing
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 );    // No default value to make sure you know what you are doing
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         // Copy a specific anyer or create one if none exist 
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         // Templates
01285         //
01286 
01288         void TemplateSet (HKFCurveNode pTemplate);
01289 
01293         HKFCurveNode TemplateGet ();
01294 
01295         //
01296         // Copy/paste
01297         //
01298 
01300         void LayerCopyFromRecursive( HKFCurveNode pSource, bool pTransferCurve = false );
01301 
01302         //
01303         //  Candidates
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         // !    If CurveNode is MonoLayer it will return 0
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         // Helpers
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         // ! Content replacement for quaternions ( = with scaling of the quaternion )
01411         void ReplaceForQuaternion( HKFCurveNode pSource, KTime pStart, KTime pStop, double pScaleStart, double pScaleStop, bool pUseExactGivenSpan /*= false*/, bool pKeyStartEndOnNoKey /*= true*/, KTime pTimeSpanOffset /*= KTIME_ZERO*/ );
01412 
01413         // ! Calculates the offset between to euler rotations
01414         bool GetContinuousOffset( double pOffset[3], double pNew[3], double pOld[3] );
01415 
01416         // ! Unrolls a rotation at a given time, using the previous key.
01417         void GetContinuousRotation( double pResultKeyValue[3], double pCurrentKeyValue[3], KTime pCurrentKeyTime );
01418 
01419         // ! Sets the user name
01420         void SetTimeWarpName( char* pName );
01421 
01422         // ! Returns the total key count for all child (pChildIndex) in every layer.
01423         int KeyGetCountOnChild( int pChildIndex );
01424 
01425         //
01426         //  User lock
01427         //
01428 
01430         void    UserLockAdd();
01431 
01433         void    UserLockRemove();
01434 
01436         bool    IsUserLocked();
01437 
01438     #ifndef KFBX_PLUGIN
01439         //
01440         // FBObjectHolder for FBSDK reference
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         // For Backward compatibility reasons must be revisited please ...
01461         HIConnector mConnector; // Do not set this member because if the Connector is set, it means that it is a Connector FCurveNode. So watchout!!!
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     // Create a curve node, FBX SDK internal use only.
01491     KFBX_DLL HKFCurveNode KFCurveNodeCreate(KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = false);
01492 
01493     // Create a curve node, FBX SDK internal use only.
01494     KFBX_DLL HKFCurveNode KFCurveNodeCreate(KFbx* pFbx, HKFCurveNode pParent, bool pOnlyDefaults = false, bool pCreateIfNotFound = true, bool pColor = false);
01495 
01496     // Create a layer node, FBX SDK internal use only.
01497     KFBX_DLL HKFCurveNode KFCurveNodeLayerCreate (KFbx* pFbx,HKFCurveNode pParent, bool pOnlyDefaults = false );
01498 
01499     // Create a curve node from a datatype, FBX SDK internal use only.
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