00001
00004 #ifndef _FBXSDK_PLUG_H_
00005 #define _FBXSDK_PLUG_H_
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #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>
00049
00050 class KPlug;
00051
00052 #include <kbaselib_nsend.h>
00053 #ifndef MB_FBXSDK
00054 #include <kbaselib_nsuse.h>
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
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
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
00317
00318
00319
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
00334
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
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
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
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
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
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