00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00013 #ifndef _FBXSDK_CORE_CONNECTION_POINT_H_
00014 #define _FBXSDK_CORE_CONNECTION_POINT_H_
00015
00016 #include <fbxsdk/fbxsdk_def.h>
00017
00018 #include <fbxsdk/core/base/fbxarray.h>
00019 #include <fbxsdk/core/base/fbxmemory.h>
00020
00021 #include <fbxsdk/fbxsdk_nsbegin.h>
00022
00023 class FBXSDK_DLL FbxConnection
00024 {
00025 public:
00026 enum EType
00027 {
00028 eNone = 0,
00029
00030 eSystem = 1 << 0,
00031 eUser = 1 << 1,
00032 eSystemOrUser = eUser | eSystem,
00033
00034 eReference = 1 << 2,
00035 eContains = 1 << 3,
00036 eData = 1 << 4,
00037 eLinkType = eReference | eContains | eData,
00038 eDefault = eUser | eReference,
00039 eUnidirectional = 1 << 7
00040 };
00041 };
00042
00043 class FbxConnectionPointFilter;
00044
00045 class FBXSDK_DLL FbxConnectionPoint
00046 {
00047 public:
00048 enum EDirection
00049 {
00050 eDirSrc = 1 << 0,
00051 eDirDst = 1 << 1,
00052 eDirUni = 1 << 2,
00053 eDirBoth = eDirSrc | eDirDst,
00054 eDirMask = eDirSrc | eDirDst | eDirUni
00055 };
00056
00057 enum EType
00058 {
00059 eStandard = 0,
00060 eSubConnection = 1 << 3,
00061 eTypeMask = eSubConnection
00062 };
00063
00064 enum EAttribute
00065 {
00066 eDefault = 0,
00067 eCache = 1 << 4,
00068 eAttributeMask = eCache
00069 };
00070
00071 enum EAllocFlag
00072 {
00073 eNotAllocated = 0,
00074 eAllocated = 1 << 5,
00075 eAllocFlagMask = eAllocated
00076 };
00077
00078 enum ECleanedFlag
00079 {
00080 eNotCleaned = 0,
00081 eCleaned = 1 << 6,
00082 eCleanedFlagMask = eCleaned
00083 };
00084
00085
00086
00087
00088 enum EEvent
00089 {
00090 eSrcConnectRequest,
00091 eDstConnectRequest,
00092
00093 eSrcConnect,
00094 eDstConnect,
00095 eSrcConnected,
00096 eDstConnected,
00097
00098 eSrcDisconnect,
00099 eDstDisconnect,
00100 eSrcDisconnected,
00101 eDstDisconnected,
00102
00103 eSrcReplaceBegin,
00104 eSrcReplaceEnd,
00105 eDstReplaceBegin,
00106 eDstReplaceEnd,
00107
00108 eSrcReorder,
00109 eSrcReordered
00110 };
00111
00112 class ConnectionList
00113 {
00114 public:
00115 ConnectionList();
00116 ~ConnectionList();
00117
00118 void Clear();
00119
00120
00121 void InsertSrcAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pType);
00122 void AddSrc(FbxConnectionPoint* pConnect, FbxConnection::EType pType);
00123 void RemoveSrcAt(int pIndex);
00124 int FindSrc(FbxConnectionPoint* pConnect) const;
00125 int GetSrcCount() const;
00126 FbxConnectionPoint* GetSrc(int pIndex) const;
00127 FbxConnection::EType GetSrcType(int pIndex) const;
00128
00129
00130 void InsertDstAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pType);
00131 void AddDst(FbxConnectionPoint* pConnect, FbxConnection::EType pType);
00132 void RemoveDstAt(int pIndex);
00133 int FindDst(FbxConnectionPoint* pConnect) const;
00134 int GetDstCount() const;
00135 FbxConnectionPoint* GetDst(int pIndex) const;
00136 FbxConnection::EType GetDstType(int pIndex) const;
00137
00138 protected:
00139 FbxArray<FbxConnectionPoint*> mList;
00140 FbxArray<char> mType;
00141 int mSrcCount, mDstCount;
00142 };
00143
00144
00145 FbxConnectionPoint(void* pData=0);
00146 virtual ~FbxConnectionPoint();
00147
00148 void SetFilter(FbxConnectionPointFilter* pConnectFilter, EType pType=eStandard);
00149 void InternalClear();
00150
00152 void WipeConnectionList();
00153 void Destroy();
00154 void SubConnectRemoveAll();
00155
00156 inline FbxConnectionPoint* GetSubOwnerConnect(){ return GetConnectType()==eSubConnection ? mOwner : NULL; }
00157 inline FbxConnectionPointFilter* GetFilter(){ return mFilter; }
00158
00159 virtual bool IsInReplace(FbxConnectionPoint* p1, FbxConnectionPoint* p2);
00160
00161 inline void SetConnectType(EType pType){ mFlags = (mFlags & ~eTypeMask) | pType; }
00162 inline EType GetConnectType(){ return EType(mFlags & eTypeMask); }
00163 inline void SetDirection(int pDirections){ mFlags = (mFlags & ~eDirMask) | pDirections; }
00164 inline EDirection GetDirection(){ return EDirection(mFlags & eDirMask); }
00165 inline void SetAttribute(int pAttributes){ mFlags = (mFlags & ~eAttributeMask) | pAttributes; }
00166 inline EAttribute GetAttribute(){ return EAttribute(mFlags & eAttributeMask); }
00167 inline void SetAllocatedFlag(bool pBool){ mFlags = ( pBool ) ? mFlags | eAllocated : mFlags & ~eAllocFlagMask; }
00168 inline bool GetAllocatedFlag(){ return ( mFlags & eAllocFlagMask ) ? true : false; }
00169 inline void SetCleanedFlag(bool pBool){ mFlags = ( pBool ) ? mFlags | eCleaned : mFlags & ~eCleanedFlagMask; }
00170 inline bool GetCleanedFlag(){ return ( mFlags & eCleanedFlagMask ) ? true : false; }
00171
00172 bool IsValidSrc(FbxConnectionPoint* pConnect);
00173 bool IsValidDst(FbxConnectionPoint* pConnect);
00174 bool IsValidSrcConnection(FbxConnectionPoint* pConnect,FbxConnection::EType pConnectionType);
00175 bool IsValidDstConnection(FbxConnectionPoint* pConnect,FbxConnection::EType pConnectionType);
00176 bool RequestValidSrcConnection(FbxConnectionPoint* pConnect,FbxConnection::EType pConnectionType );
00177 bool RequestValidDstConnection(FbxConnectionPoint* pConnect,FbxConnection::EType pConnectionType );
00178
00179
00180 bool ConnectSrc (FbxConnectionPoint* pSrc,FbxConnection::EType pConnectionType = FbxConnection::eNone );
00181 bool ConnectDst (FbxConnectionPoint* pDst,FbxConnection::EType pConnectionType = FbxConnection::eNone );
00182 bool ConnectSrcAt (int pDst_SrcIndex, FbxConnectionPoint* pSrc, FbxConnection::EType pConnectionType = FbxConnection::eNone );
00183 bool ConnectDstAt (int pSrc_DstIndex, FbxConnectionPoint* pDst, FbxConnection::EType pConnectionType = FbxConnection::eNone );
00184 static bool ConnectConnect (FbxConnectionPoint* pSrc,FbxConnectionPoint* pDst,FbxConnection::EType pConnectionType );
00185 static bool ConnectAt (FbxConnectionPoint* pSrc,int pSrc_DstIndex,FbxConnectionPoint* pDst,int pDst_SrcIndex,FbxConnection::EType pConnectionType );
00186
00187 bool DisconnectDst (FbxConnectionPoint* pSrc);
00188 bool DisconnectSrc (FbxConnectionPoint* pSrc);
00189 void DisconnectAllSrc ();
00190 void DisconnectAllDst ();
00191 static bool DisconnectConnect (FbxConnectionPoint* pSrc,FbxConnectionPoint* pDst);
00192 bool DisconnectDstAt (int pIndex);
00193 bool DisconnectSrcAt (int pIndex);
00194
00195 bool ReplaceInDst (FbxConnectionPoint* pDstOld,FbxConnectionPoint* pDstNew, int pIndexInNew);
00196 bool ReplaceInSrc (FbxConnectionPoint* pSrcOld,FbxConnectionPoint* pSrcNew, int pIndexInNew);
00197 bool ReplaceDstAt (int pIndex,FbxConnectionPoint* pDst);
00198 bool ReplaceSrcAt (int pIndex,FbxConnectionPoint* pSrc);
00199 bool SwapSrc (int pIndexA,int pIndexB);
00200
00207 bool MoveSrcAt(int pIndex, int pAtIndex);
00208
00215 bool MoveSrcAt(FbxConnectionPoint* pSrc, FbxConnectionPoint* pAtSrc);
00216
00217
00218 bool IsConnectedSrc(FbxConnectionPoint*);
00219 bool IsConnectedDst(FbxConnectionPoint*);
00220 inline bool IsConnected(FbxConnectionPoint* pConnect) { return IsConnectedSrc(pConnect) || IsConnectedDst(pConnect); }
00221
00222 inline int GetSrcCount() const { return mConnectionList.GetSrcCount(); }
00223 inline FbxConnectionPoint* GetSrc(int pIndex) const { return mConnectionList.GetSrc(pIndex);}
00224 inline FbxConnection::EType GetSrcType(int pIndex) const { return mConnectionList.GetSrcType(pIndex);}
00225 inline int GetDstCount() const { return mConnectionList.GetDstCount(); }
00226 inline FbxConnectionPoint* GetDst(int pIndex) const { return mConnectionList.GetDst(pIndex);}
00227 inline FbxConnection::EType GetDstType(int pIndex) const { return mConnectionList.GetDstType(pIndex);}
00228
00229 inline int FindSrc(FbxConnectionPoint* pConnect){ return mConnectionList.FindSrc(pConnect); }
00230 inline int FindDst(FbxConnectionPoint* pConnect){ return mConnectionList.FindDst(pConnect); }
00231
00232
00233 inline int GetSrcCount(FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrcCount() : GetSrcCount(); }
00234 inline FbxConnectionPoint* GetSrc(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrc(pIndex) : GetSrc(pIndex); }
00235 inline FbxConnection::EType GetSrcType(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrcType(pIndex) : GetSrcType(pIndex); }
00236 inline int GetDstCount(FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDstCount() : GetDstCount(); }
00237 inline FbxConnectionPoint* GetDst(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDst(pIndex): GetDst(pIndex); }
00238 inline FbxConnection::EType GetDstType(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDstType(pIndex) : GetDstType(pIndex); }
00239
00240 void* GetData(){ return mData; }
00241
00242 protected:
00243 void SubConnectAdd(FbxConnectionPoint* pConnect);
00244 void SubConnectRemove(FbxConnectionPoint* pConnect);
00245 FbxConnectionPoint* SubConnectFind(FbxConnectionPointFilter* pFilter);
00246 FbxConnectionPoint* SubConnectGetOrCreate(FbxConnectionPointFilter* pFilter);
00247 void SubConnectFill(FbxConnectionPoint* pConnect);
00248
00249
00250 virtual bool ConnectNotify(EEvent pAction,FbxConnectionPoint* pThis,int pIndex,FbxConnectionPoint* pConnect = NULL,FbxConnection::EType pConnectionType=FbxConnection::eNone,FbxConnectionPoint* pNewConnect=NULL );
00251 virtual void ConnectCleanUp(FbxConnectionPoint* pThis);
00252
00253 int FindSrcIndexFromOwnerConnectIndex(FbxConnectionPoint* pOwner,int pOwnerIndex);
00254 int FindDstIndexFromOwnerConnectIndex(FbxConnectionPoint* pOwner,int pOwnerIndex);
00255
00262 bool InternalMoveSrcBefore( int pIndex, int pBeforeIndex );
00263
00264
00265 private:
00266 inline void InsertSrcAt(int pIndex,FbxConnectionPoint* pConnect,FbxConnection::EType pConnectionType){ mConnectionList.InsertSrcAt(pIndex,pConnect,pConnectionType); }
00267 inline void InsertDstAt(int pIndex,FbxConnectionPoint* pConnect,FbxConnection::EType pConnectionType){ mConnectionList.InsertDstAt(pIndex,pConnect,pConnectionType); }
00268 inline void RemoveSrcAt(int pIndex){ mConnectionList.RemoveSrcAt(pIndex); }
00269 inline void RemoveDstAt(int pIndex){ mConnectionList.RemoveDstAt(pIndex); }
00270
00271 static bool InternalConnectBefore (FbxConnectionPoint* pSrc,FbxConnectionPoint* pSrc_BeforeDst,FbxConnectionPoint* pDst,FbxConnectionPoint* pDst_BeforeSrc,FbxConnection::EType pConnectionType );
00272 static bool UserConnectBefore (FbxConnectionPoint* pSrc,FbxConnectionPoint* pSrc_BeforeDst,FbxConnectionPoint* pDst,FbxConnectionPoint* pDst_BeforeSrc,FbxConnection::EType pConnectionType );
00273 static bool EmitReplaceNotify(FbxConnectionPoint* pDstOwner, FbxConnectionPoint* pSrcOwner, FbxConnectionPoint* pDst, FbxConnectionPoint* pSrc, EEvent pConnectAction, FbxConnectionPoint* pNew);
00274
00275
00276 virtual bool SetOwnerConnect(FbxConnectionPoint* pConnect);
00277 inline FbxConnectionPoint* GetOwnerConnect(){ return mOwner; }
00278 bool ConnectOwnedConnect(FbxConnectionPoint* pConnect);
00279 bool DisconnectOwnedConnect(FbxConnectionPoint* pConnect);
00280
00281
00282 void* mData;
00283 int mFlags;
00284 FbxConnectionPoint* mOwner;
00285 ConnectionList mConnectionList;
00286
00287
00288 FbxArray<FbxConnectionPoint*> mSubConnectList;
00289 FbxArray<FbxConnectionPoint*> mSubConnectCreatedList;
00290 FbxConnectionPointFilter* mFilter;
00291 };
00292
00296 class FBXSDK_DLL FbxConnectionPointFilter
00297 {
00298 public:
00303
00304 FbxConnectionPointFilter(){}
00305
00307 virtual ~FbxConnectionPointFilter();
00309
00314
00315 virtual FbxConnectionPointFilter* Ref();
00316
00318 virtual void Unref();
00319
00321 virtual FbxInt GetUniqueId() const { return 0; }
00322
00327 virtual bool IsValid(FbxConnectionPoint* pConnect) const;
00328
00334 virtual bool IsValidConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pType) const;
00335
00340 virtual bool IsEqual(FbxConnectionPointFilter* pConnectFilter) const;
00342 };
00343
00344 #include <fbxsdk/fbxsdk_nsend.h>
00345
00346 #endif