kfcurvenode.h

Go to the documentation of this file.
00001 
00004 #ifndef _FBXSDK_KFCURVE_NODE_H_
00005 #define _FBXSDK_KFCURVE_NODE_H_
00006 
00007 /**************************************************************************************
00008 
00009  Copyright © 1999 - 2007 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 <kfcurve/kfcurve_h.h>
00043 
00044 #include <klib/karrayul.h>
00045 #include <klib/kerror.h>
00046 #include <klib/kstring.h>
00047 #include <object/e/keventbase.h>
00048 
00049 #include <kfcurve/kfcurve.h>
00050 
00051 #ifndef K_PLUGIN
00052     #include <kfcurve/i/ifcurveeti.h>
00053     #include <object/i/iobject.h>
00054     #include <object/i/ifbobjectholder.h>
00055 #endif
00056 
00057 K_FORWARD (IConnector) 
00058 K_FORWARD (IData) 
00059 
00060 #ifndef MB_FBXSDK
00061 #include <kbaselib_nsuse.h>
00062 #endif
00063 #include <kbaselib_forward.h>
00064 
00065 #include <kfcurve/kfcurve_nsbegin.h>
00066 
00067     enum 
00068     {   
00069         KFCN_IN = 0, 
00070         KFCN_OUT = 1, 
00071         KFCN_INOUT_MASK = 1, 
00072 
00073         KFCN_HIDDEN = 0, 
00074         KFCN_SHOWN = 2, 
00075 
00076         KFCN_CONTAINER_NODE = 0, 
00077         KFCN_REFERENCER_NODE = 8, 
00078         KFCN_REFERENCER_MASK = 8, 
00079 
00080         KFCN_TAKE_NODE = 16, 
00081         KFCN_FIXED_NODE = 0, 
00082         KFCN_TAKE_MASK = 16,
00083 
00084         KFCN_EXPENDED_NODE = 32, 
00085         KFCN_NOTEXPENDED_NODE = 0, 
00086         KFCN_EXPENDED_MASK = 32,
00087 
00088         KFCN_MULTILAYER = 64,
00089         KFCN_MONOLAYER  = 0,
00090         KFCN_MULTILAYER_MASK = 64,
00091 
00092         KFCN_ALWAYS_CANDIDATE = 128,
00093         KFCN_ALWAYS_CANDIDATE_TESTED = 256
00094     };
00095 
00096     //
00097     // Picking Types define
00098     //
00099     enum 
00100     {
00101         KCP_KEY = 1, 
00102         KCP_LTANGENT, 
00103         KCP_RTANGENT
00104     };
00105 
00106     //
00107     //  Node/Layer info
00108     //
00109     enum
00110     {
00111         KFCL_NOLAYER,
00112         KFCL_ADD,       // For translation and standard others
00113         KFCL_EULER_XYZ, // For rotation
00114         KFCL_MULT,      // For scaling, mainly
00115         KFCL_QUAT       // For quaternion rotation
00116     };
00117 
00118     #define KFCURVENODE_TRANSFORM               "Transform"
00119         #define KFCURVENODE_T                       "T"
00120             #define KFCURVENODE_T_X                     "X"
00121             #define KFCURVENODE_T_Y                     "Y"
00122             #define KFCURVENODE_T_Z                     "Z"
00123         #define KFCURVENODE_R                       "R"
00124             #define KFCURVENODE_R_X                     "X"
00125             #define KFCURVENODE_R_Y                     "Y"
00126             #define KFCURVENODE_R_Z                     "Z"
00127             #define KFCURVENODE_R_W                     "W"
00128         #define KFCURVENODE_S                       "S"
00129             #define KFCURVENODE_S_X                     "X"
00130             #define KFCURVENODE_S_Y                     "Y"
00131             #define KFCURVENODE_S_Z                     "Z"
00132     #define KFCURVENODE_LCL_T                   "Lcl Translation"
00133     #define KFCURVENODE_LCL_R                   "Lcl Rotation"
00134     #define KFCURVENODE_LCL_S                   "Lcl Scaling"
00135     #define KFCURVENODE_VISIBILITY              "Visibility"
00136 
00137     // Addition for the optical marker node attribute.
00138     #define KFCURVENODE_OCCLUSION               "Occlusion"
00139 
00140     // Addition for the IK effector marker node attribute.
00141     #define KFCURVENODE_IK_REACH_TRANSLATION    "IK Reach Translation"
00142     #define KFCURVENODE_IK_REACH_ROTATION       "IK Reach Rotation"
00143 
00144     // Addition for the light node attribute.
00145     #define KFCURVENODE_LIGHT_CONEANGLE         "Cone angle"
00146     #define KFCURVENODE_LIGHT_FOG               "Fog"
00147     #define KFCURVENODE_LIGHT_INTENSITY         "Intensity"
00148     #define KFCURVENODE_COLOR                   "Color"
00149     #define KFCURVENODE_COLOR_RED                   "X"
00150     #define KFCURVENODE_COLOR_GREEN                 "Y"
00151     #define KFCURVENODE_COLOR_BLUE                  "Z"
00152 
00153     // Addition for the camera node attribute.
00154     #define KFCURVENODE_CAMERA_FIELDOFVIEW      "FieldOfView"
00155     #define KFCURVENODE_CAMERA_FIELDOFVIEWX     "FieldOfViewX"
00156     #define KFCURVENODE_CAMERA_FIELDOFVIEWY     "FieldOfViewY"
00157     #define KFCURVENODE_CAMERA_FOCALLENGTH      "FocalLength"
00158     #define KFCURVENODE_CAMERA_OPTICALCENTERX   "OpticalCenterX"
00159     #define KFCURVENODE_CAMERA_OPTICALCENTERY   "OpticalCenterY"
00160     #define KFCURVENODE_CAMERA_ROLL             "Roll"
00161     #define KFCURVENODE_CAMERA_TURNTABLE        "TurnTable"
00162     #define KFCURVENODE_BACKGROUND_COLOR        "BackgroundColor"
00163     #define KFCURVENODE_BACKGROUND_COLOR_RED        "X"
00164     #define KFCURVENODE_BACKGROUND_COLOR_GREEN      "Y"
00165     #define KFCURVENODE_BACKGROUND_COLOR_BLUE       "Z"
00166 
00167     // Addition for the camera switcher node attribute.
00168     #define KFCURVENODE_CAMERA_INDEX            "Camera Index"
00169 
00170     // Addition for the texture.
00171     #define KFCURVENODE_TEXTURE_TRANSLATION     "Translation"
00172     #define KFCURVENODE_TEXTURE_TRANSLATION_X   "X"
00173     #define KFCURVENODE_TEXTURE_TRANSLATION_Y   "Y"
00174     #define KFCURVENODE_TEXTURE_TRANSLATION_Z   "Z"
00175     #define KFCURVENODE_TEXTURE_ROTATION        "Rotation"
00176     #define KFCURVENODE_TEXTURE_ROTATION_X      "X"
00177     #define KFCURVENODE_TEXTURE_ROTATION_Y      "Y"
00178     #define KFCURVENODE_TEXTURE_ROTATION_Z      "Z"
00179     #define KFCURVENODE_TEXTURE_SCALING         "Scaling"
00180     #define KFCURVENODE_TEXTURE_SCALING_X       "X"
00181     #define KFCURVENODE_TEXTURE_SCALING_Y       "Y"
00182     #define KFCURVENODE_TEXTURE_SCALING_Z       "Z"
00183     #define KFCURVENODE_TEXTURE_ALPHA           "Alpha"
00184 
00185     // Addition for the material.
00186     #define KFCURVENODE_MATERIAL_EMISSIVE       "Emissive"
00187     #define KFCURVENODE_MATERIAL_EMISSIVE_R     "X"
00188     #define KFCURVENODE_MATERIAL_EMISSIVE_G     "Y"
00189     #define KFCURVENODE_MATERIAL_EMISSIVE_B     "Z"
00190     #define KFCURVENODE_MATERIAL_AMBIENT        "Ambient"
00191     #define KFCURVENODE_MATERIAL_AMBIENT_R      "X"
00192     #define KFCURVENODE_MATERIAL_AMBIENT_G      "Y"
00193     #define KFCURVENODE_MATERIAL_AMBIENT_B      "Z"
00194     #define KFCURVENODE_MATERIAL_DIFFUSE        "Diffuse"
00195     #define KFCURVENODE_MATERIAL_DIFFUSE_R      "X"
00196     #define KFCURVENODE_MATERIAL_DIFFUSE_G      "Y"
00197     #define KFCURVENODE_MATERIAL_DIFFUSE_B      "Z"
00198     #define KFCURVENODE_MATERIAL_SPECULAR       "Specular"
00199     #define KFCURVENODE_MATERIAL_SPECULAR_R     "X"
00200     #define KFCURVENODE_MATERIAL_SPECULAR_G     "Y"
00201     #define KFCURVENODE_MATERIAL_SPECULAR_B     "Z"
00202     #define KFCURVENODE_MATERIAL_OPACITY        "Opacity"
00203     #define KFCURVENODE_MATERIAL_REFLECTIVITY   "Reflectivity"
00204     #define KFCURVENODE_MATERIAL_SHININESS      "Shininess"
00205 
00206     // Addition for the generic vector property.
00207     #define KFCURVENODE_USER_PROPERTY_VECTOR_X  "X"
00208     #define KFCURVENODE_USER_PROPERTY_VECTOR_Y  "Y"
00209     #define KFCURVENODE_USER_PROPERTY_VECTOR_Z  "Z"
00210 
00211     // Addition for the generic color property.
00212     #define KFCURVENODE_USER_PROPERTY_COLOR_R  "X"
00213     #define KFCURVENODE_USER_PROPERTY_COLOR_G  "Y"
00214     #define KFCURVENODE_USER_PROPERTY_COLOR_B  "Z"
00215 
00216 
00217     // Addition of generic matrix
00218     #define KFCURVENODE_USER_PROPERTY_MATRIX "Matrix"
00219     #define KFCURVENODE_USER_PROPERTY_MATRIX_0 "0"
00220     #define KFCURVENODE_USER_PROPERTY_MATRIX_1 "1"
00221     #define KFCURVENODE_USER_PROPERTY_MATRIX_2 "2"
00222     #define KFCURVENODE_USER_PROPERTY_MATRIX_3 "3"
00223     #define KFCURVENODE_USER_PROPERTY_MATRIX_4 "4"
00224     #define KFCURVENODE_USER_PROPERTY_MATRIX_5 "5"
00225     #define KFCURVENODE_USER_PROPERTY_MATRIX_6 "6"
00226     #define KFCURVENODE_USER_PROPERTY_MATRIX_7 "7" 
00227     #define KFCURVENODE_USER_PROPERTY_MATRIX_8 "8"
00228     #define KFCURVENODE_USER_PROPERTY_MATRIX_9 "9"
00229     #define KFCURVENODE_USER_PROPERTY_MATRIX_A "A"
00230     #define KFCURVENODE_USER_PROPERTY_MATRIX_B "B"
00231     #define KFCURVENODE_USER_PROPERTY_MATRIX_C "C"
00232     #define KFCURVENODE_USER_PROPERTY_MATRIX_D "D"
00233     #define KFCURVENODE_USER_PROPERTY_MATRIX_E "E"
00234     #define KFCURVENODE_USER_PROPERTY_MATRIX_F "F"
00235 
00236     // Default array size for 1 minute of animation (30fps) 
00237     #define SELECTION_ARRAY_SIZE    30*60+1
00238     //#define SELECTION_ARRAY_SIZE 1024*1024
00239 
00240     #define KFCURVENODE_CANDIDATE_MAX_COUNT 4
00241 
00242 
00243     typedef int  kFCurveNodeType;
00244 
00245     K_FORWARD (KFCurveNode);
00246     typedef HKFCurveNode HIKFCurveNode;
00247     typedef KFCurveNode IKFCurveNode;
00248 
00249     #define IKFCurveNodeID 43763634
00250 
00251     enum EKFCurveNodeEventType
00252     {
00253         KFCURVENODEEVENT_NONE = 0, 
00254         KFCURVENODEEVENT_SELECTION = 1, 
00255         KFCURVENODEEVENT_DESTROY = 2, 
00256         KFCURVENODEEVENT_FCURVE = 4, 
00257         KFCURVENODEEVENT_TIMEWARP = 8, 
00258         KFCURVENODEEVENT_CTRLCURVE = 16, 
00259         KFCURVENODEEVENT_DATAUPDATED = 32
00260     };
00261 
00262     struct KExternalTimingInformation
00263     {
00264         KTime mLclOffset;
00265         KTime mDuration;
00266     };
00267 
00268 
00269     // Curve node event class.
00270     class KFCURVE_DLL KFCurveNodeEvent : public KEventBase
00271     {
00272     public:
00273         /* Nature (s) of this node event.
00274         *   It is a bit field.  Value defined in the enum stated before 
00275         *   the class can composited. 
00276         * stored in mType
00277         */
00278         // Event count.
00279         int mEventCount;
00280 
00281         // Data.
00282         void* mData;
00283 
00284         // Clear the curve node event object.
00285         inline void Clear () 
00286         {
00287             mType=KFCURVENODEEVENT_NONE; 
00288             mEventCount = 0; 
00289             mData = NULL; 
00290         }
00291 
00292         /* Add an event of type pWhat.
00293         *   \param pWhat    Use EKFCurveNodeEventType to identify what pWhat means.
00294         */
00295         inline void Add (int pWhat) 
00296         {
00297             mType |= pWhat;
00298             mEventCount++;
00299         }
00300 
00301         // Set the data contained by the node event.
00302         inline void SetData (void* pData) {mData = pData;}
00303     };
00304 
00305 
00306     struct KFCurveNodeCallback 
00307     {
00308         KFCurveNodeEvent mEvent;
00309         KArrayUL mCallbackFunctions;   // no delete on object must use array ul
00310         KArrayUL mCallbackObjects;     // no delete on object must use array ul
00311         bool mCallbackEnable;
00312     };
00313 
00314     typedef void (*kFCurveNodeCallback) (KFCurveNode* pFCurve, KFCurveNodeEvent* FCurveNodeEvent, void* pObject) ;
00315 
00316     typedef class KArrayTemplate< HKFCurveNode > KArrayTemplateFCurveNode;  
00317 
00318     // Return codes for function KFCurveNode::IsKey().
00319     enum 
00320     { 
00321         ISKEY_NONE,
00322         ISKEY_SOME, 
00323         ISKEY_ALL 
00324     };
00325 
00326 
00327     class KFCURVE_DLL KFCurveNodeCandidateState
00328     {
00329     public:
00330         KFCurveNodeCandidateState();
00331         ~KFCurveNodeCandidateState();
00332 
00333         void Dump(int pLevel = 0);
00334 
00335         void SetCandidateTotalTime      ( KTime &pCandidateTime ) { mCandidateTotalTime = pCandidateTime; };
00336         void SetCandidateSpecificTime   ( KTime &pCandidateTime ) { mCandidateSpecificTime = pCandidateTime; };
00337 
00338     protected:
00339         friend class KFCurveNode;
00340         
00341         int mSpecificCandidateMethod;
00342         int mTotalCandidateMethod;
00343 
00344         double mCandidateTotalValue[KFCURVENODE_CANDIDATE_MAX_COUNT];
00345         KTime   mCandidateTotalTime;
00346 
00347         double mCandidateSpecificValue;
00348         double mFCurveValue;
00349         KTime mCandidateSpecificTime;
00350 
00351         KFCurveNodeCandidateState *mSubStates[KFCURVENODE_CANDIDATE_MAX_COUNT];
00352         KFCurveNodeCandidateState *mLayerState;
00353         int                        mLayerID;
00354 
00355     };
00356 
00357 
00370     #ifdef K_PLUGIN
00371         class KFCURVE_DLL KFCurveNode
00372     #else 
00373         class KFCURVE_DLL KFCurveNode : public IFBObjectHolder
00374     #endif
00375     {
00376 
00377     public:
00378 
00383 
00392         KFCurveNode 
00393         (
00394             char* pNodeName, 
00395             char* pTimeWarpName, 
00396             HKDataType pDataType, 
00397             int  pLayerType = KFCL_NOLAYER,
00398             int  pLayerID = 0
00399         ) ;
00400 
00408         KFCurveNode(HKFCurveNode pTemplateCurveNode);
00409 
00411         virtual ~KFCurveNode () ;
00412 
00413         #ifdef K_PLUGIN
00414             void Destroy (int Local=0) ;
00415         #else
00416             IObject_Declare (Implementation) 
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 
00559         virtual int Add(HKFCurveNode pCurveNode);
00560         
00564         virtual void Remove (int pIndex) ;
00565         
00569         virtual void Delete (int pIndex) ;
00570         
00572         virtual int GetCount () ;
00573         
00578         virtual HKFCurveNode Get(int pIndex) ;
00579         
00586         virtual bool IsChild(KFCurveNode* pCurveNode, bool pRecursive = false) ;
00587 
00593         virtual int Find (char* pName) ;
00594 
00600         virtual int Find(HKFCurveNode pNode);
00601 
00606         HKFCurveNode FindRecursive(char* pName);
00607 
00614         HKFCurveNode FindOrCreate(char* pName, bool pFindOrCreateCurve = true) ;
00615         
00617         virtual void SetParent(HKFCurveNode pParent) {mParent = pParent;}
00618         
00622         virtual HKFCurveNode GetParent() {return mParent;}
00623 
00625 
00630 
00635         int KeyGetCount(bool pRecursiveInLayers = false);
00636 
00643         void KeyGetCount(int& pCurveCount, int& pTotalCount, int& pMinCount, int& pMaxCount);
00644         
00645         // Get the first key in the children specified by the curve mask (NULL = all children)
00646         // DEPRECATED: use GetFirstKeyTime or GetCurveWithFirstKey instead.
00647         // K_DEPRECATED void KeyGetFirst(KFCurveKey*& lKey, bool *pCurveMask = NULL, bool pRecursiveInLayers = false);
00648         // Get the last key in the children specified by the curve mask (NULL = all children)
00649         // DEPRECATED: use GetLastKeyTime or GetCurveWithLastKey instead.
00650         // K_DEPRECATED void KeyGetLast(KFCurveKey*& lKey, bool *pCurveMask = NULL, bool pRecursiveInLayers = false);
00651 
00652         // Get the fcurve that has the earliest key. If many fcurves
00653         // has a key at the earliest time, returns one of the fcurves.
00654         void GetCurveWithFirstKey(KFCurve*& lCurveWithFirstKey, bool *pCurveMask /* = NULL */, bool pRecursiveInLayers);
00655         // Get the fcurve that has the latest key. If many fcurves has
00656         // a key at the latest time, returns one of the fcurves.
00657         void GetCurveWithLastKey(KFCurve*& lCurveWithLastKey, bool *pCurveMask /* = NULL */, bool pRecursiveInLayers);
00658 
00659         // Get the first key time in the children specified by the curve mask (NULL = all children)
00660         // If there is no key, return KTIME_MINUS_INFINITE.
00661         KTime GetFirstKeyTime(bool *pCurveMask = NULL, bool pRecursiveInLayers = false);
00662         // Get the last key time in the children specified by the curve mask (NULL = all children)
00663         // If there is no key, return KTIME_INFINITE.
00664         KTime GetLastKeyTime(bool *pCurveMask = NULL, bool pRecursiveInLayers = false);
00665 
00676         double* KeyAdd (KTime pTime, double* pValue) ;
00677 
00691         double* KeyAppend (KTime pTime, double* pValue, bool pCheckForContinuousRotation = false) ;
00692 
00703         bool GetAnimationInterval (KTime& pStart, KTime& pStop) ;
00704 
00709         void GetTimeSpan          (KTime& pStart, KTime& pStop) ;   
00710 
00726         int IsKey (KTime& pTime, int *pLast, bool* pCurveMask = NULL, double pKeyIndexTolerance = 0.0, double pMin = -K_DOUBLE_MAX,  double pMax = K_DOUBLE_MAX );
00727 
00737         bool DeleteKey (KTime& pTime, bool* pCurveMask = NULL, double pKeyIndexTolerance = 0.0 );
00738 
00748         KTime GetNextKeyTime (KTime pTime, bool* pCurveMask = NULL, bool pRecursiveInLayers = false);
00749 
00759         KTime GetPrevKeyTime (KTime pTime, bool* pCurveMask = NULL );
00760 
00775         double* Evaluate (double* pValue, KTime pTime, kFCurveIndex* pLast=NULL) ;
00776         
00787         double* GetValue (double* pValue) ;
00788         
00798         double* SetValue (double* pValue) ;
00799 
00806         void Delete(KTime pStart=KTIME_MINUS_INFINITE, KTime pStop=KTIME_INFINITE);
00807 
00819     void Replace(HKFCurveNode pSource, KTime pStart = KTIME_MINUS_INFINITE, KTime pStop = KTIME_INFINITE, bool pUseGivenSpan = false, bool pKeyStartEndOnNoKey = true, KTime pTimeSpanOffset = KTIME_ZERO );
00820 
00822 
00824     //
00825     //  WARNING!
00826     //
00827     //  Anything beyond these lines may not be documented accurately and is 
00828     //  subject to change without notice.
00829     //
00831 
00832     #ifndef DOXYGEN_SHOULD_SKIP_THIS
00833 
00838 
00840         float* GetColor();
00841 
00843         void SetColor (float pColor[3]) ;
00844 
00846 
00851 
00853         inline int IncReferenceCount () {return ++mReferenceCount;}
00854 
00856         inline int DecReferenceCount () {mReferenceCount--; return mReferenceCount;}
00857 
00859         inline int GetReferenceCount () {return mReferenceCount;}
00860 
00862 
00867 
00869         int GetTakeType () ;
00870 
00872         void SetTakeType (int pType) ;
00873 
00875 
00880 
00882         bool GetVisibility () ;
00883 
00885         void SetVisibility (bool pVisible, bool pRecursive=false, bool pRecurseLayer = false, int lChildIndex = -1) ;
00886 
00888 
00893 
00898         void DataNodeSet (HKFCurveNode pDataNode, bool pRecursive=true) ;
00899 
00903         HKFCurveNode DataNodeGet () ;
00904 
00908         bool SetPreExtrapolation(kUInt pNewPreExtrapolation, bool pRespectUserLock=true );
00909         bool SetPreExtrapolationCount(kUInt pNewPreExtrapolationCount, bool pRespectUserLock=true);
00910         bool SetPostExtrapolation(kUInt pNewPreExtrapolation, bool pRespectUserLock=true);
00911         bool SetPostExtrapolationCount(kUInt pNewPreExtrapolationCount, bool pRespectUserLock=true);
00912 
00914 
00919 
00921         int GetContainerType () ;
00922 
00924         void SetContainerType (int pInOutType) ;
00925 
00927 
00932 
00934         int GetIOType () ;
00935 
00937         void SetIOType (int pInOutType) ;
00938 
00940 
00945 
00947         int IsExpended () ;
00948 
00950         void SetExpended (bool pExpended) ;
00951 
00953 
00958 
00960         int IsMultiLayer() ;
00961 
00963         void SetMultiLayer (bool pMultiLayer) ;
00964 
00966         HKFCurveNode GetLayerNode(int pLayerID);
00967 
00969     #ifndef K_PLUGIN
00970         void ExtractKeysIndex( KArraykInt &pArray, KTimeSpan pTimeSpan, double pMinValue =  -K_DOUBLE_MAX, double pMaxValue =  K_DOUBLE_MAX);
00971     #endif
00972 
00974 
00979 
00983         bool LookLikeSampledData(KTime pThresholdPeriod);
00984 
00986 
00991 
00993         int GetUpdateId () ;
00994 
00996         int GetValuesUpdateId ();
00997 
00999         int GetNodeUpdateId () ;
01000 
01001 
01003 
01008         
01010         bool CallbackEnable (bool pEnable) ;
01011         
01013         bool CallbackIsEnable () ;
01014         
01016         void CallbackClear () ;
01017         
01019         void CallbackAddEvent (int pWhat) ;
01020         
01022         void CallbackRegister (kFCurveNodeCallback, void* pObject) ;
01023         
01025         void CallbackUnregister (kFCurveNodeCallback, void* pObject) ;
01026 
01028 
01029     #ifndef K_PLUGIN
01030 
01034 
01036         void SetETI(IKFCurveETI * pFCurveETI);
01037         IKFCurveETI * GetETI() const;
01038 
01040         KTime ETINodeTime2GlobalTime(KTime const & pTime);
01041         KTime ETIGlobalTime2NodeTime(KTime const & pTime);
01042         KTime ETIGetDuration();
01043         KTime ETIGetTrimOffset();
01044         KTime ETIGetGlobalOffset();
01045         double ETIGetScaleFactor();
01046         bool ETIGetColor(KgeRGBVector & pColor);
01047         bool ETIIsGlobalTimeInSpan(KTime const & pTime, bool pIncludeStop = true);
01048         typedef KTime (IKFCurveETI::*TETITimeFetcher)();
01049         KTime ETIGetSpecifiedTime(TETITimeFetcher pFunc);
01050         bool ETIIsSelectedDuration();
01051     #endif
01052 
01054 
01055         #ifndef K_FBXSDK_INTERFACE
01056             #include <kfcurve/kfcurvenodeinhouse.h>
01057         #endif
01058 
01059         bool    FbxStore (KFbx* pFbx, bool pOnlyDefaults = false, bool pReplaceLclTRSName = false, bool pSkipTimeWarpName = false, char* pFieldName = "Channel", bool pColor = true, bool pIsVersion5 = false ) ;
01060         bool    FbxRetrieve (KFbx* pFbx, bool pOnlyDefaults = false, bool pCreateIfNotFound = true,bool pColor = false);
01061         bool    FbxInternalRetrieve (KFbx* pFbx, bool pOnlyDefaults = false, bool pCreateIfNotFound = true,bool pColor = false) ;
01062 
01064 
01068         bool mUseQuaternion;
01069         inline bool GetUseQuaternion(){return mUseQuaternion;}; 
01070         void SetUseQuaternion(bool pVal); 
01071         private:
01072             void RotationNodeEvaluate(double* pValue, KTime pTime, kFCurveIndex* pLast,bool pEvaluateCandidate  );
01073 
01075 
01076     public:
01078 
01082         void GetCandidateState(KFCurveNodeCandidateState& pState);
01083         void SetCandidateState(const KFCurveNodeCandidateState& pState, bool pDestroyMissingLayers = false );
01084 
01086 
01087     void GetQuaternionInterpolationBezierPoints(KTime pCurrentTime, KgeQuaternion &pQ0, KgeQuaternion &lQ1, KgeQuaternion &lQ2, KgeQuaternion &lQ3);
01088 
01089     protected:
01090         struct NameInfo 
01091         {
01092             KString     mName;
01093             KString     mTimeWarpName;
01094             HKDataType  mDataType;
01095             KProperty*  mProperty;  // Helper to display enum values in fcurve editor
01096             int     mRefCount;
01097         }*mNameInfo;
01098 
01099         void    SetNameInfo( NameInfo* pNameInfo );
01100 
01101         int mType;
01102 
01103         int mReferenceCount;
01104         KArrayTemplate<HKFCurveNode> mNodes;
01105 
01106         HIKFCurve    mFCurve;
01107         HKFCurveNode mTimeWarp;
01108         HKFCurveNode mLayer;        // Ctrl Curve (Animation layering) 
01109         HKFCurveNode mObjectLayer;  // Pointer to Layer 0
01110         HKFCurveNode mTemplate;
01111         HKFCurveNode mDataNode;
01112         HKFCurveNode mParent;
01113 
01114         int mLayerType;
01115         int mLayerID;
01116 
01117         int mUpdateId;
01118 
01119         public:
01120         int mMBRotationOrder;
01121         inline int GetRotationOrder(){return mMBRotationOrder;}; 
01122         void SetRotationOrder(int pRotationOrder); 
01123         protected:
01124         //
01125         //  Candidates in nodes (Max is KFCURVENODE_CANDIDATE_MAX_COUNT)
01126         //
01127         
01128         void FromTotalCandidateToSpecificCandidate(int pLayerID);
01129 
01130         enum {eUseFCurve = 1, eUseTotal = 2};
01131         int mSpecificCandidateMethod;  // Used as a bit field
01132         int mTotalCandidateMethod;     // Used as an enum
01133                                         // To my knowledge the possible state are       
01134                                         // No validcandidate                            mCandidateTotalTime == INFINITE and no FCurve candidate for the current time
01135                                         // Total candidate is valid and fcuve invalid   mTotalCandidateMethod ==  eUseTotal and mSpecificCandidateMethod == eUseTotal
01136                                         // FCurve is valid and Total invalid            mTotalCandidateMethod ==  eUseFCurve and mSpecificCandidateMethod == eUseFCurve
01137                                         // Total valid and FCurve computed              mTotalCandidateMethod ==  eUseTotal and mSpecificCandidateMethod == eUseTotal | eUseFCurve
01138 
01139                                         // FCurve valid and total computed              mTotalCandidateMethod ==  eUseTotal and mSpecificCandidateMethod == eUseFCurve
01140                                         // FCurve valid (and computed from total) and total computed    mTotalCandidateMethod ==  eUseTotal and mSpecificCandidateMethod == eUseTotal | eUseFCurve
01141                         
01142                     
01143                                         
01144 
01145         double mCandidateTotalValue[KFCURVENODE_CANDIDATE_MAX_COUNT];   // For all layers at once (only meaningful on ObjectLayer )
01146         KTime   mCandidateTotalTime;
01147 
01148         //
01149         //  Callbacks
01150         //
01151         
01152         KFCurveNodeCallback* mCallback;
01153         int mUserLock;
01154 
01155 
01156     #ifndef K_PLUGIN
01157         //
01158         //  External Timing Information (for transportation only: optional, not used internally, and not persisted).
01159         //
01160         IKFCurveETI * mETI;
01161     #endif
01162 
01163     private:
01164         void KeyGetCountRecursive(int& pCurveCount, int& pTotalCount, int& pMinCount, int& pMaxCount);
01165         bool GetAnimationIntervalRecursive (KTime& pStart, KTime& pStop) ;
01166         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 );
01167 
01168         friend KFCURVE_DLL HKFCurveNode KFCurveNodeCreate (KFbx* pFbx, HKFCurveNode pParent, bool pOnlyDefaults, bool pCreateIfNotFound, bool pColor ); 
01169 
01170     #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
01171 
01172     };
01173 
01174 
01184     KFCURVE_DLL HKFCurveNode KFCurveNodeCreate(char* pNodeName, char* pTimeWarpName, char* pTypeName, int pLayerType = KFCL_NOLAYER, int pLayerID = 0);
01185     KFCURVE_DLL HKFCurveNode KFCurveNodeCreate(char* pNodeName, HKDataType pDataType=NULL, int pLayerType = KFCL_NOLAYER, int pLayerID = 0);
01186 
01187 
01195     KFCURVE_DLL HKFCurveNode KFCurveNodeCreate(HKFCurveNode pTemplateCurveNode);
01196 
01197     // Create a curve node, FBX SDK internal use only.
01198     KFCURVE_DLL HKFCurveNode KFCurveNodeCreate(KFbx* pFbx, bool pOnlyDefaults = false, bool pColor = false);
01199 
01200     // Create a curve node, FBX SDK internal use only.
01201     KFCURVE_DLL HKFCurveNode KFCurveNodeCreate(KFbx* pFbx, HKFCurveNode pParent, bool pOnlyDefaults = false, bool pCreateIfNotFound = true, bool pColor = false);
01202 
01203     // Create a layer node, FBX SDK internal use only.
01204     KFCURVE_DLL HKFCurveNode KFCurveNodeLayerCreate (KFbx* pFbx,HKFCurveNode pParent, bool pOnlyDefaults = false );
01205 
01206     // Create a curve node from a datatype, FBX SDK internal use only.
01207     KFCURVE_DLL HKFCurveNode FCurveNodeCreateFromDataType( HKDataType pDataType,char* pNodeName);
01208 
01209 #include <kfcurve/kfcurve_nsend.h>
01210 
01211 #endif // #ifndef _FBXSDK_KFCURVE_NODE_H_
01212 
01213