kfbxplug.h

Go to the documentation of this file.
00001 
00004 #ifndef _FBXSDK_PLUG_H_
00005 #define _FBXSDK_PLUG_H_
00006 /**************************************************************************************
00007 
00008  Copyright © 2004 - 2007 Autodesk, Inc. and/or its licensors.
00009  All Rights Reserved.
00010 
00011  The coded instructions, statements, computer programs, and/or related material
00012  (collectively the "Data") in these files contain unpublished information
00013  proprietary to Autodesk, Inc. and/or its licensors, which is protected by
00014  Canada and United States of America federal copyright law and by international
00015  treaties.
00016 
00017  The Data may not be disclosed or distributed to third parties, in whole or in
00018  part, without the prior written consent of Autodesk, Inc. ("Autodesk").
00019 
00020  THE DATA IS PROVIDED "AS IS" AND WITHOUT WARRANTY.
00021  ALL WARRANTIES ARE EXPRESSLY EXCLUDED AND DISCLAIMED. AUTODESK MAKES NO
00022  WARRANTY OF ANY KIND WITH RESPECT TO THE DATA, EXPRESS, IMPLIED OR ARISING
00023  BY CUSTOM OR TRADE USAGE, AND DISCLAIMS ANY IMPLIED WARRANTIES OF TITLE,
00024  NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR USE.
00025  WITHOUT LIMITING THE FOREGOING, AUTODESK DOES NOT WARRANT THAT THE OPERATION
00026  OF THE DATA WILL BE UNINTERRUPTED OR ERROR FREE.
00027 
00028  IN NO EVENT SHALL AUTODESK, ITS AFFILIATES, PARENT COMPANIES, LICENSORS
00029  OR SUPPLIERS ("AUTODESK GROUP") BE LIABLE FOR ANY LOSSES, DAMAGES OR EXPENSES
00030  OF ANY KIND (INCLUDING WITHOUT LIMITATION PUNITIVE OR MULTIPLE DAMAGES OR OTHER
00031  SPECIAL, DIRECT, INDIRECT, EXEMPLARY, INCIDENTAL, LOSS OF PROFITS, REVENUE
00032  OR DATA, COST OF COVER OR CONSEQUENTIAL LOSSES OR DAMAGES OF ANY KIND),
00033  HOWEVER CAUSED, AND REGARDLESS OF THE THEORY OF LIABILITY, WHETHER DERIVED
00034  FROM CONTRACT, TORT (INCLUDING, BUT NOT LIMITED TO, NEGLIGENCE), OR OTHERWISE,
00035  ARISING OUT OF OR RELATING TO THE DATA OR ITS USE OR ANY OTHER PERFORMANCE,
00036  WHETHER OR NOT AUTODESK HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS
00037  OR DAMAGE.
00038 
00039 **************************************************************************************/
00040 
00041 #include <kaydaradef.h>
00042 #ifndef KFBX_DLL 
00043     #define KFBX_DLL K_DLLIMPORT
00044 #endif
00045 
00046 #include <kaydara.h>
00047 
00048 #include <kbaselib_nsbegin.h> // namespace 
00049 
00050 class KPlug;
00051 
00052 #include <kbaselib_nsend.h> // namespace 
00053 #ifndef MB_FBXSDK
00054 #include <kbaselib_nsuse.h> // namespace 
00055 #endif
00056 
00057 
00058 #include <fbxfilesdk_nsbegin.h>
00059 
00064     class               KFbxPlug;
00065     class               KFbxSdkManager;
00066     class               KFbxClassIdInfo;
00067     class               KClassIdInfoFilter;
00068     class               KPlugFilter;
00069     class               KFbxObject;
00070 
00071     typedef KFbxPlug*   (*kFbxPlugConstructor)      (KFbxSdkManager& pManager, char const* pName);
00072 
00073     class KFBX_DLL kFbxClassId {
00074         public:
00075             kFbxClassId();
00076             kFbxClassId(char const *pClassName,kFbxClassId const &pParentClassId,kFbxPlugConstructor pConstructor=0);
00077         public:
00078             const char*         GetName  () const;
00079             kFbxClassId     GetParent() const;
00080             KFbxPlug*           Create   (KFbxSdkManager& pManager,char const *pName);
00081             bool                Override(kFbxPlugConstructor pConstructor);
00082             bool                Is(kFbxClassId const pId) const;
00083 
00084             inline KFbxClassIdInfo* GetClassIdInfo() { return mClassInfo; }
00085 
00086             bool                SetFbxFileTypeName(const char *);
00087             const char *        GetFbxFileTypeName() const;
00088             bool                SetFbxFileSubTypeName(const char *);
00089             const char *        GetFbxFileSubTypeName() const;
00090 
00091             inline bool         IsValid() const { return mClassInfo ? true : false; }
00092 
00093             KPlugFilter*        GetFilter();
00094             
00095         private:
00096             kFbxClassId(KFbxClassIdInfo*    mClassInfo);
00097             KFbxClassIdInfo*    mClassInfo;
00098 
00099             friend class KClassIdInfoFilter;
00100     };
00101 
00102 #if defined(KARCH_ENV_MACOSX)
00103     #define KFBXPLUG_DECLARE(Class)\
00104         public:\
00105         static kFbxClassId  ClassId;\
00106         static Class*           Create(KFbxSdkManager *pManager,char const *pName);\
00107         static Class*           SdkManagerCreate(KFbxSdkManager *pManager,char const *pName);\
00108         virtual kFbxClassId GetNewFbxClassId() const { return ClassId; }\
00109         \
00110         friend class FBXFILESDK_NAMESPACE::KFbxSdkManager;
00111 #else
00112     #define KFBXPLUG_DECLARE(Class)\
00113         public:\
00114         static kFbxClassId  ClassId;\
00115         static Class*           Create(KFbxSdkManager *pManager,char const *pName);\
00116         static Class*           SdkManagerCreate(KFbxSdkManager *pManager,char const *pName);\
00117         virtual kFbxClassId GetNewFbxClassId() const { return ClassId; }\
00118         \
00119         friend class KFbxSdkManager;
00120 #endif
00121 
00122     #define KFBXPLUG_IMPLEMENT(Class)\
00123         kFbxClassId Class::ClassId;\
00124         Class*  Class::Create(KFbxSdkManager *pManager,char const *pName="")\
00125         { \
00126           Class* ClassPtr=0;\
00127             return (Class *)pManager->CreateClass( Class::ClassId,pName );\
00128         }\
00129         Class*  Class::SdkManagerCreate(KFbxSdkManager *pManager,char const *pName)\
00130         {\
00131           Class* lClass = new Class(*pManager,pName);\
00132             lClass->Construct();\
00133             return lClass;\
00134         }
00135 
00136     enum EPlugEventType {
00137         eConnectSrcRequest,
00138         eConnectSrc,
00139         eConnectedSrc,
00140         eConnectDstRequest,
00141         eConnectDst,
00142         eConnectedDst,
00143         eDisconnectSrcRequest,
00144         eDisconnectSrc,
00145         eDisconnectedSrc,
00146         eDisconnectDstRequest,
00147         eDisconnectDst,
00148         eDisconnectedDst
00149     };
00150 
00154     class KFBX_DLL KFbxPlugEvent
00155     {
00160         public:
00161             inline KFbxPlugEvent(EPlugEventType pType,KFbxPlug* pSrc,KFbxPlug* pDst)
00162                 : mType(pType)
00163                 , mSrc(pSrc)
00164                 , mDst(pDst)
00165             {
00166 
00167             }
00169 
00174         public:
00175             inline EPlugEventType   GetType() const { return mType; }
00176             inline KFbxPlug*        GetSrc()  const { return mSrc;  }
00177             inline KFbxPlug*        GetDst()  const { return mDst;  }
00179 
00180         private:
00181             EPlugEventType   mType;
00182             KFbxPlug*        mSrc;
00183             KFbxPlug*        mDst;
00184     };
00185 
00190     class KFBX_DLL KFbxPlug
00191     {
00192         KFBXPLUG_DECLARE(KFbxPlug);
00193 
00198         public:
00201             virtual void Destroy(bool pRecursive = false, bool pDependents = false);
00203 
00204 
00209         public:
00213             virtual KFbxSdkManager* GetFbxSdkManager() { return 0; }
00218             virtual bool                    Is(kFbxClassId pClassId) const          { return GetNewFbxClassId().Is(pClassId);   }
00219             template < class T >inline bool Is(T *pFBX_TYPE) const                  { return Is(T::ClassId); }
00220             virtual bool                    IsRuntime(kFbxClassId pClassId) const   { return GetRuntimeClassId().Is(pClassId);  }
00221             virtual bool            SetRuntimeClassId(kFbxClassId pClassId);
00222             virtual kFbxClassId  GetRuntimeClassId() const;
00224 
00229 
00235             virtual void SetUserDataPtr(void* pUserData);
00236 
00241             virtual void* GetUserDataPtr();
00242         
00244 
00249             // SrcObjects
00250             int                                 GetSrcObjectCount   (kFbxClassId pClassId) const;                                           
00251             inline int                          GetSrcObjectCount   () const                { return GetSrcObjectCount(kFbxClassId()); }
00252             template < class T > inline int     GetSrcObjectCount   (T const *pFBX_TYPE) const { return GetSrcObjectCount(T::ClassId); }
00253             KFbxObject*                         GetSrcObject        (kFbxClassId pClassId,int pIndex=0) const;                          
00254             inline KFbxObject*                  GetSrcObject        (int pIndex=0) const                    { return GetSrcObject(kFbxClassId(),pIndex); }
00255             template < class T > inline T*      GetSrcObject        (T const *pFBX_TYPE,int pIndex=0) const { return (T *)GetSrcObject(T::ClassId,pIndex); }
00256             KFbxObject*                         FindSrcObject       (kFbxClassId pClassId,const char *pName,int pStartIndex=0) const;   
00257             inline KFbxObject*                  FindSrcObject       (const char *pName,int pStartIndex=0) const { return FindSrcObject(kFbxClassId(),pName,pStartIndex); }
00258             template < class T > inline T*      FindSrcObject       (T const *pFBX_TYPE,const char *pName,int pStartIndex=0) const  { return (T *)FindSrcObject(pName,T::ClassId,pStartIndex); }
00259             bool                                ConnectSrcObject    (KFbxObject* pObject);                                                              
00260             bool                                IsConnectedSrcObject(KFbxObject* pObject);                                                              
00261             bool                                DisconnectSrcObject (KFbxObject* pObject);                                                              
00262             bool                                DisconnectAllSrcObject(kFbxClassId pClassId);
00263             inline bool                         DisconnectAllSrcObject()                        { return DisconnectAllSrcObject(kFbxClassId()); }
00264             template < class T > inline bool    DisconnectAllSrcObject(T const *pFBX_TYPE)      { return DisconnectAllSrcObject(T::ClassId); }
00265 
00266             // DstObjects
00267             int                                 GetDstObjectCount   (kFbxClassId pClassId) const;                                           
00268             inline int                          GetDstObjectCount   () const                { return GetDstObjectCount(kFbxClassId()); }
00269             template < class T > inline int     GetDstObjectCount   (T const *pFBX_TYPE) const { return GetDstObjectCount(T::ClassId); }
00270             KFbxObject*                         GetDstObject        (kFbxClassId pClassId,int pIndex=0) const;                          
00271             inline KFbxObject*                  GetDstObject        (int pIndex=0) const                    { return GetDstObject(kFbxClassId(),pIndex); }
00272             template < class T > inline T*      GetDstObject        (T const *pFBX_TYPE,int pIndex=0) const { return (T *)GetDstObject(T::ClassId,pIndex); }
00273             KFbxObject*                         FindDstObject       (kFbxClassId pClassId,const char *pName,int pStartIndex=0) const;   
00274             inline KFbxObject*                  FindDstObject       (const char *pName,int pStartIndex=0) const { return FindDstObject(kFbxClassId(),pName,pStartIndex); }
00275             template < class T > inline T*      FindDstObject       (T const *pFBX_TYPE,const char *pName,int pStartIndex=0) const  { return (T *)FindDstObject(pName,T::ClassId,pStartIndex); }
00276             bool                                ConnectDstObject    (KFbxObject* pObject);                                                              
00277             bool                                IsConnectedDstObject(KFbxObject* pObject);                                                              
00278             bool                                DisconnectDstObject (KFbxObject* pObject);                                                              
00279             bool                                DisconnectAllDstObject(kFbxClassId pClassId);
00280             inline bool                         DisconnectAllDstObject()                        { return DisconnectAllDstObject(kFbxClassId()); }
00281             template < class T > inline bool    DisconnectAllDstObject(T const *pFBX_TYPE)      { return DisconnectAllDstObject(T::ClassId); }
00283 
00288         public:
00289             int         GetFbxSrcCount      (kFbxClassId pClassId=kFbxClassId()) const;
00290             KFbxPlug*   GetFbxSrc           (int pIndex=0,kFbxClassId pClassId=kFbxClassId()) const;
00291             KFbxPlug*   FindFbxSrc          (const char *pName,kFbxClassId pClassId=kFbxClassId(),int pStartIndex=0) const;
00292             int         FindFbxSrcIndex     (KFbxPlug* pPlug) const;
00293             int         GetFbxDstCount      (kFbxClassId pClassId=kFbxClassId()) const;
00294             KFbxPlug*   GetFbxDst           (int pIndex=0,kFbxClassId pClassId=kFbxClassId()) const;
00295             KFbxPlug*   FindFbxDst          (const char *pName,kFbxClassId pClassId=kFbxClassId(),int pStartIndex=0) const;
00296             int         FindFbxDstIndex     (KFbxPlug* pPlug) const;
00297             bool        ConnectFbxSrc       (KFbxPlug* pPlug);
00298             bool        ConnectFbxDst       (KFbxPlug* pPlug);
00299             bool        IsConnectedFbxSrc   (KFbxPlug const* pPlug) const;
00300             bool        IsConnectedFbxDst   (KFbxPlug const* pPlug) const;
00301             bool        DisconnectFbxSrc    (KFbxPlug* pPlug);
00302             bool        DisconnectFbxDst    (KFbxPlug* pPlug);
00304 
00309             virtual bool FbxPlugNotify(KFbxPlugEvent const &pEvent);
00311 
00312 
00313 
00315         //
00316         //  WARNING!
00317         //
00318         //  Anything beyond these lines may not be documented accurately and is 
00319         //  subject to change without notice.
00320         //
00322         #ifndef DOXYGEN_SHOULD_SKIP_THIS
00323             protected:
00324                 inline KFbxPlug() { }
00325                 inline KFbxPlug(KFbxSdkManager& pManager, char const* pName) { }
00326                 virtual ~KFbxPlug() {}
00327 
00328                 virtual void        Construct();
00329                 virtual void        Destruct(bool pRecursive, bool pDependents);
00330                 virtual void        SetNewFbxClassId(kFbxClassId pClassId) {}
00331                 static char const*  GetNamePrefix() { return 0; }
00332 
00333             // Internal Connection Management
00334             // based on plugs for the time being
00335             public:
00336                 virtual KPlug*      GetInternalPlug(bool pCreateOnDemand=false) { return 0; }
00337                 virtual KPlug const* GetInternalPlug(bool pCreateOnDemand=false) const { return 0; }
00338                 static  KFbxPlug*   GetFbxPlug(KPlug*);
00339 
00340             private:
00341                 
00342         #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
00343     };
00344 
00345     #define FBX_TYPE(class)     ((class const*)0)
00346     #define FBX_CLASSID(class)  (class::ClassId)
00347 
00348     template < class T > inline T* KFbxCast(KFbxPlug *pPlug) {
00349         return pPlug && pPlug->Is(FBX_CLASSID(T)) ? (T *)pPlug : 0;
00350     }
00351 
00352     template < class T > inline T const* KFbxCast(KFbxPlug const*pPlug) {
00353         return pPlug && pPlug->Is(FBX_CLASSID(T)) ? (T const*)pPlug : 0;
00354     }
00355 
00356     /**********************************************************************
00357     * Plug Iterator
00358     **********************************************************************/
00359     class KFbxIteratorSrcBase
00360     {
00361     protected:
00362         KFbxPlug*       mPlug;
00363         kFbxClassId mClassId;
00364         int     mSize;
00365         int     mIndex;
00366     public:
00367         inline KFbxIteratorSrcBase(KFbxPlug* pPlug,kFbxClassId pClassId) :
00368             mClassId(pClassId),
00369             mPlug(pPlug),
00370             mSize(0),
00371             mIndex(-1)
00372         {
00373             ResetToBegin();
00374         }
00375         inline KFbxPlug* GetFirst()
00376         {
00377             ResetToBegin();
00378             return GetNext();
00379         }
00380         inline KFbxPlug* GetNext()
00381         {
00382             mIndex++;
00383             return ((mIndex>=0) && (mIndex<mSize)) ? mPlug->GetFbxSrc(mIndex,mClassId) : NULL;
00384         }
00385         inline KFbxPlug* GetSafeNext()
00386         {
00387             mSize = mPlug->GetFbxSrcCount(mClassId);
00388             return GetNext();
00389         }
00390         inline KFbxPlug* GetLast()
00391         {
00392             ResetToEnd();
00393             return GetPrevious();
00394         }
00395         inline KFbxPlug* GetPrevious()
00396         {
00397             mIndex--;
00398             return ((mIndex>=0) && (mIndex<mSize)) ? mPlug->GetFbxSrc(mIndex,mClassId) : NULL;
00399         }
00400         inline KFbxPlug* GetSafePrevious()
00401         {
00402             mSize = mPlug->GetFbxSrcCount(mClassId);
00403             while (mIndex>mSize) mIndex--;
00404             return GetPrevious();
00405         }
00406 
00407 
00408     // Internal Access Function
00409     protected:
00410         inline void ResetToBegin()
00411         {
00412             mSize = mPlug ? mPlug->GetFbxSrcCount(mClassId) : 0;
00413             mIndex = -1;
00414         }
00415         inline void ResetToEnd()
00416         {
00417             mSize = mPlug ? mPlug->GetFbxSrcCount(mClassId) : 0;
00418             mIndex = mSize;
00419         }
00420     };
00421      
00422     template<class Type> class KFbxIteratorSrc : protected KFbxIteratorSrcBase
00423     {
00424     public:
00425         inline KFbxIteratorSrc(KFbxPlug* pPlug) : KFbxIteratorSrcBase(pPlug,Type::ClassId) {}
00426         inline Type *GetFirst()         { return (Type *)KFbxIteratorSrcBase::GetFirst(); }
00427         inline Type *GetNext()          { return (Type *)KFbxIteratorSrcBase::GetNext(); }
00428         inline Type *GetSafeNext()      { return (Type *)KFbxIteratorSrcBase::GetSafeNext(); }
00429         inline Type *GetLast()          { return (Type *)KFbxIteratorSrcBase::GetLast(); }
00430         inline Type *GetPrevious()      { return (Type *)KFbxIteratorSrcBase::GetPrevious(); }
00431         inline Type *GetSafePrevious()  { return (Type *)KFbxIteratorSrcBase::GetSafePrevious(); }
00432 
00433     // Internal Access Function
00434     protected:
00435     };
00436 
00437     class KFbxIteratorDstBase
00438     {
00439     protected:
00440         KFbxPlug*       mPlug;
00441         kFbxClassId mClassId;
00442         int             mSize;  
00443         int             mIndex;
00444     public:
00445         inline KFbxIteratorDstBase(KFbxPlug* pPlug,kFbxClassId pClassId) :
00446             mClassId(pClassId),
00447             mPlug(pPlug),
00448             mSize(0),
00449             mIndex(-1)
00450         {
00451             ResetToBegin();
00452         }
00453         inline KFbxPlug* GetFirst()
00454         {
00455             ResetToBegin();
00456             return GetNext();
00457         }
00458         inline KFbxPlug* GetNext()
00459         {
00460             mIndex++;
00461             return ((mIndex>=0) && (mIndex<mSize)) ? mPlug->GetFbxDst(mIndex,mClassId) : NULL;
00462         }
00463         inline KFbxPlug* GetSafeNext()
00464         {
00465             mSize = mPlug->GetFbxDstCount(mClassId);
00466             return GetNext();
00467         }
00468         inline KFbxPlug* GetLast()
00469         {
00470             ResetToEnd();
00471             return GetPrevious();
00472         }
00473         inline KFbxPlug* GetPrevious()
00474         {
00475             mIndex--;
00476             return ((mIndex>=0) && (mIndex<mSize)) ? mPlug->GetFbxDst(mIndex,mClassId) : NULL;
00477         }
00478         inline KFbxPlug* GetSafePrevious()
00479         {
00480             mSize = mPlug->GetFbxDstCount(mClassId);
00481             while (mIndex>mSize) mIndex--;
00482             return GetPrevious();
00483         }
00484 
00485     // Internal Access Function
00486     protected:
00487         inline void ResetToBegin()
00488         {
00489             mSize = mPlug->GetFbxDstCount(mClassId);
00490             mIndex = -1;
00491         }
00492         inline void ResetToEnd()
00493         {
00494             mSize = mPlug->GetFbxDstCount(mClassId);
00495             mIndex = mSize;
00496         }
00497     };
00498      
00499     template<class Type> class KFbxIteratorDst : protected KFbxIteratorDstBase
00500     {
00501     public:
00502         inline KFbxIteratorDst(KFbxPlug* pPlug) : KFbxIteratorDstBase(pPlug,Type::ClassId) {}
00503         inline Type *GetFirst()         { return (Type *)KFbxIteratorDstBase::GetFirst(); }
00504         inline Type *GetNext()          { return (Type *)KFbxIteratorDstBase::GetNext(); }
00505         inline Type *GetSafeNext()      { return (Type *)KFbxIteratorDstBase::GetSafeNext(); }
00506         inline Type *GetLast()          { return (Type *)KFbxIteratorDstBase::GetLast(); }
00507         inline Type *GetPrevious()      { return (Type *)KFbxIteratorDstBase::GetPrevious(); }
00508         inline Type *GetSafePrevious()  { return (Type *)KFbxIteratorDstBase::GetSafePrevious(); }
00509 
00510     // Internal Access Function
00511     protected:
00512     };
00513 
00514     #define KFbxForEach(Iterator,Plug) for ( (Plug)=(Iterator).GetFirst(); (Plug)!=NULL; (Plug)=(Iterator).GetNext() ) 
00515     #define KFbxReverseForEach(Iterator,Plug) for ( Plug=(Iterator).GetLast(); Plug;  Plug=(Iterator).GetPrevious() ) 
00516     #define KFbxForEach_Safe(Iterator,Plug) for ( Plug=(Iterator).GetFirst(); Plug; Plug=(Iterator).GetSafeNext() ) 
00517     #define KFbxReverseForEach_Safe(Iterator,Plug) for ( Plug=(Iterator).GetLast(); Plug;  Plug=(Iterator).GetSafePrevious() ) 
00518 
00519 
00520 
00521 #include <fbxfilesdk_nsend.h>
00522 
00523 #endif // #ifndef _FBXSDK_PLUG_H_
00524 
00525