fbxplug.h

Go to the documentation of this file.
00001 /****************************************************************************************
00002  
00003    Copyright (C) 2012 Autodesk, Inc.
00004    All rights reserved.
00005  
00006    Use of this software is subject to the terms of the Autodesk license agreement
00007    provided at the time of installation or download, or which otherwise accompanies
00008    this software in either electronic or hard copy form.
00009  
00010 ****************************************************************************************/
00011 
00013 #ifndef _FBXSDK_CORE_PLUG_H_
00014 #define _FBXSDK_CORE_PLUG_H_
00015 
00016 #include <fbxsdk/fbxsdk_def.h>
00017 
00018 #include <fbxsdk/core/fbxemitter.h>
00019 
00020 #include <fbxsdk/fbxsdk_nsbegin.h>
00021 
00022 class FbxPlug;
00023 class FbxManager;
00024 class FbxClassIdInfo;
00025 class FbxObject;
00026 class FbxPropertyHandle;
00027 
00029 typedef FbxPlug* (*FbxPlugCreateProc)(FbxManager& pManager, const char* pName, const FbxPlug* pFrom, const char* pFBXType, const char* pFBXSubType);
00030 
00046 class FBXSDK_DLL FbxClassId
00047 {
00048 public:
00050     FbxClassId();
00051 
00059     FbxClassId(const char* pClassName, const FbxClassId& pParentClassId, FbxPlugCreateProc pConstructor=0, const char* pFBXType=NULL, const char* pFBXSubType=NULL);
00060 
00062     void Destroy();
00063 
00067     const char* GetName() const;
00068 
00072     FbxClassId GetParent() const;
00073 
00080     FbxPlug* Create(FbxManager& pManager, const char* pName, const FbxPlug* pFrom);
00081 
00086     bool Override(FbxPlugCreateProc pConstructor);
00087 
00093     bool Is(FbxClassId const pId) const;
00094 
00100     bool operator==(const FbxClassId& pClassId) const;
00101 
00107     bool operator!=(const FbxClassId& pClassId) const;
00108 
00109 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00110 
00113     inline FbxClassIdInfo* GetClassIdInfo() { return mClassInfo; }
00114 
00118     inline const FbxClassIdInfo* GetClassIdInfo() const { return mClassInfo; }
00119 #endif 
00120     
00125     const char* GetFbxFileTypeName(bool pAskParent=false) const;
00126 
00131     const char* GetFbxFileSubTypeName() const;
00132 
00136     inline bool IsValid() const { return mClassInfo ? true : false; }
00137     
00143     void SetObjectTypePrefix(const char* pObjectTypePrefix);
00144 
00148     const char* GetObjectTypePrefix();
00149    
00154     FbxPropertyHandle* GetRootClassDefaultPropertyHandle();
00155 
00159     int ClassInstanceIncRef();
00160 
00164     int ClassInstanceDecRef();
00165      
00169     int GetInstanceRef();
00170 
00172 //
00173 //  WARNING!
00174 //
00175 //  Anything beyond these lines may not be documented accurately and is 
00176 //  subject to change without notice.
00177 //
00179 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00180 private:
00181     FbxClassId(FbxClassIdInfo* mClassInfo);
00182 
00183     bool SetFbxFileTypeName(const char* pName);
00184     bool SetFbxFileSubTypeName(const char* pName);
00185 
00186     FbxClassIdInfo* mClassInfo;
00187 
00188     friend class FbxManager;
00189 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
00190 };
00191 
00193 #define FBXSDK_PLUG_DECLARE(Class)                                                      \
00194 public:                                                                                 \
00195     FBXSDK_FRIEND_NEW();                                                                \
00196     static FbxClassId ClassId;                                                          \
00197     static Class* Create(FbxManager* pManager, const char* pName);                      \
00198     static Class* ManagerCreate(FbxManager* pManager, const char* pName, Class* pFrom)  \
00199     {                                                                                   \
00200         Class* lClass = FbxNew< Class >(*pManager, pName);                              \
00201         lClass->Construct(pFrom);                                                       \
00202         return lClass;                                                                  \
00203     }                                                                                   \
00204     virtual FbxClassId GetClassId() const { return ClassId; }                           \
00205     friend class FBXSDK_NAMESPACE::FbxManager;                                          \
00206 
00207 
00208 #define FBXSDK_ABSTRACT_PLUG_DECLARE(Class)                                             \
00209 public:                                                                                 \
00210     static FbxClassId ClassId;                                                          \
00211     static Class* Create(FbxManager* pManager, const char* pName);                      \
00212     static FbxPlugCreateProc ManagerCreate;                                             \
00213     virtual FbxClassId  GetClassId() const { return ClassId; }                          \
00214     friend class FBXSDK_NAMESPACE::FbxManager;                                          \
00215 
00216 
00217 #define FBXSDK_PLUG_IMPLEMENT(Class)                                                    \
00218     FbxClassId Class::ClassId;                                                          \
00219     Class* Class::Create(FbxManager* pManager, const char* pName)                       \
00220     {                                                                                   \
00221         Class* ClassPtr;                                                                \
00222         ClassPtr = 0;                                                                   \
00223         return (Class*)pManager->CreateNewObjectFromClassId(Class::ClassId, pName);     \
00224     }                                                                                   \
00225     
00226 
00227 #define FBXSDK_ABSTRACT_PLUG_IMPLEMENT(Class)                                           \
00228     FbxClassId Class::ClassId;                                                          \
00229     FbxPlugCreateProc Class::ManagerCreate = 0;                                         \
00230     Class* Class::Create(FbxManager* pManager, const char* pName)                       \
00231     {                                                                                   \
00232         Class* ClassPtr;                                                                \
00233         ClassPtr = 0;                                                                   \
00234         return (Class*)pManager->CreateNewObjectFromClassId(Class::ClassId, pName);     \
00235     }                                                                                   \
00236     
00237 
00241 class FBXSDK_DLL FbxPlug : public FbxEmitter
00242 {
00243     FBXSDK_PLUG_DECLARE(FbxPlug);
00244 
00245 public:
00251     virtual void Destroy(bool pRecursive=false, bool pDependents=false);
00252 
00257     virtual FbxManager* GetFbxManager() const { return 0; }
00258 
00264     virtual bool Is(FbxClassId pClassId) const { return GetClassId().Is(pClassId); }
00265 
00271     template < class T >inline bool Is(T* pFBX_TYPE) const                  { return Is(T::ClassId); }
00272 
00279     virtual bool IsRuntime(FbxClassId pClassId) const { return GetRuntimeClassId().Is(pClassId); }
00280 
00288     virtual bool SetRuntimeClassId(FbxClassId pClassId);
00289 
00293     virtual FbxClassId GetRuntimeClassId() const;
00294 
00298     virtual bool IsRuntimePlug() const { return !( GetRuntimeClassId() == GetClassId() ); }
00299 
00301 //
00302 //  WARNING!
00303 //
00304 //  Anything beyond these lines may not be documented accurately and is 
00305 //  subject to change without notice.
00306 //
00308 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00309     inline static void SetWipeMode(bool pState) { FbxPlug::sgWipeMode = pState; }
00310     inline static bool GetWipeMode() { return FbxPlug::sgWipeMode; }
00311 
00312 private:
00313     // used as global flag to modify the behavior of FbxObject::Destruct() during a ForceKill() on the scene.
00314     // This is for internal use
00315     static bool sgWipeMode;
00316 
00317 protected:
00318     inline FbxPlug() {}
00319     inline FbxPlug(FbxManager& /*pManager*/, const char* /*pName*/) {}
00320     virtual ~FbxPlug() {}
00321 
00322     virtual void Construct(const FbxPlug* pFrom);
00323     virtual void Destruct(bool pRecursive, bool pDependents);
00324     friend class FbxProperty;
00325     friend class FbxObject;
00326 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
00327 };
00328 
00336 #define FBX_TYPE(class) ((const class*)0)
00337 
00344 template < class T > inline T* FbxCast(FbxPlug* pPlug)
00345 {
00346     return pPlug && pPlug->Is(T::ClassId) ? (T*)pPlug : 0;
00347 }
00348 
00355 template < class T > inline const T* FbxCast(const FbxPlug* pPlug)
00356 {
00357     return pPlug && pPlug->Is(T::ClassId) ? (const T*)pPlug : 0;
00358 }
00359 
00360 #include <fbxsdk/fbxsdk_nsend.h>
00361 
00362 #endif /* _FBXSDK_CORE_PLUG_H_ */