fbxconnectionpoint.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. /****************************************************************************************
  2. Copyright (C) 2015 Autodesk, Inc.
  3. All rights reserved.
  4. Use of this software is subject to the terms of the Autodesk license agreement
  5. provided at the time of installation or download, or which otherwise accompanies
  6. this software in either electronic or hard copy form.
  7. ****************************************************************************************/
  8. //! \file fbxconnectionpoint.h
  9. #ifndef _FBXSDK_CORE_CONNECTION_POINT_H_
  10. #define _FBXSDK_CORE_CONNECTION_POINT_H_
  11. #include <fbxsdk/fbxsdk_def.h>
  12. #include <fbxsdk/core/base/fbxarray.h>
  13. #include <fbxsdk/fbxsdk_nsbegin.h>
  14. class FBXSDK_DLL FbxConnection
  15. {
  16. public:
  17. enum EType
  18. {
  19. eNone = 0,
  20. // System or user
  21. eSystem = 1 << 0,
  22. eUser = 1 << 1,
  23. eSystemOrUser = eUser | eSystem,
  24. // Type of Link
  25. eReference = 1 << 2,
  26. eContains = 1 << 3,
  27. eData = 1 << 4,
  28. eLinkType = eReference | eContains | eData,
  29. eDefault = eUser | eReference,
  30. eUnidirectional = 1 << 7
  31. };
  32. };
  33. class FbxConnectionPointFilter;
  34. class FBXSDK_DLL FbxConnectionPoint
  35. {
  36. public:
  37. enum EDirection
  38. {
  39. eDirSrc = 1 << 0, // Contains sources
  40. eDirDst = 1 << 1, // Contains destinations
  41. eDirUni = 1 << 2, // Connection is not 2 ways
  42. eDirBoth = eDirSrc | eDirDst,
  43. eDirMask = eDirSrc | eDirDst | eDirUni
  44. };
  45. enum EType
  46. {
  47. eStandard = 0,
  48. eSubConnection = 1 << 3, // Connect is a sub Connect of another
  49. eTypeMask = eSubConnection
  50. };
  51. enum EAttribute
  52. {
  53. eDefault = 0,
  54. eCache = 1 << 4,
  55. eAttributeMask = eCache
  56. };
  57. enum EAllocFlag
  58. {
  59. eNotAllocated = 0,
  60. eAllocated = 1 << 5,
  61. eAllocFlagMask = eAllocated
  62. };
  63. enum ECleanedFlag
  64. {
  65. eNotCleaned = 0,
  66. eCleaned = 1 << 6,
  67. eCleanedFlagMask = eCleaned
  68. };
  69. enum EEvent
  70. {
  71. eSrcConnectRequest,
  72. eDstConnectRequest,
  73. eSrcConnect,
  74. eDstConnect,
  75. eSrcConnected,
  76. eDstConnected,
  77. eSrcDisconnect,
  78. eDstDisconnect,
  79. eSrcDisconnected,
  80. eDstDisconnected,
  81. eSrcReplaceBegin,
  82. eSrcReplaceEnd,
  83. eDstReplaceBegin,
  84. eDstReplaceEnd,
  85. eSrcReorder,
  86. eSrcReordered
  87. };
  88. // Constructor/Destructor
  89. FbxConnectionPoint(void* pData=0);
  90. virtual ~FbxConnectionPoint();
  91. void SetFilter(FbxConnectionPointFilter* pConnectFilter, EType pType=eStandard);
  92. void InternalClear();
  93. //! Clear the ConnectList without any regards to what is connected
  94. void WipeConnectionList();
  95. void Destroy();
  96. void SubConnectRemoveAll();
  97. inline FbxConnectionPoint* GetSubOwnerConnect(){ return GetConnectType() == eSubConnection ? mOwner : NULL; }
  98. inline FbxConnectionPointFilter* GetFilter(){ return mFilter; }
  99. virtual bool IsInReplace(FbxConnectionPoint* p1, FbxConnectionPoint* p2);
  100. inline void SetConnectType(EType pType){ mFlags = (mFlags & ~eTypeMask) | pType; }
  101. inline EType GetConnectType(){ return EType(mFlags & eTypeMask); }
  102. inline void SetDirection(int pDirections){ mFlags = (mFlags & ~eDirMask) | pDirections; }
  103. inline EDirection GetDirection(){ return EDirection(mFlags & eDirMask); }
  104. inline void SetAttribute(int pAttributes){ mFlags = (mFlags & ~eAttributeMask) | pAttributes; }
  105. inline EAttribute GetAttribute(){ return EAttribute(mFlags & eAttributeMask); }
  106. inline void SetAllocatedFlag(bool pBool){ mFlags = ( pBool ) ? mFlags | eAllocated : mFlags & ~eAllocFlagMask; }
  107. inline bool GetAllocatedFlag(){ return ( mFlags & eAllocFlagMask ) ? true : false; }
  108. inline void SetCleanedFlag(bool pBool){ mFlags = ( pBool ) ? mFlags | eCleaned : mFlags & ~eCleanedFlagMask; }
  109. inline bool GetCleanedFlag(){ return ( mFlags & eCleanedFlagMask ) ? true : false; }
  110. bool IsValidSrc(FbxConnectionPoint* pConnect);
  111. bool IsValidDst(FbxConnectionPoint* pConnect);
  112. bool IsValidSrcConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType);
  113. bool IsValidDstConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType);
  114. bool RequestValidSrcConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType );
  115. bool RequestValidDstConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType );
  116. bool ConnectSrc(FbxConnectionPoint* pSrc,FbxConnection::EType pConnectionType=FbxConnection::eNone);
  117. bool ConnectDst(FbxConnectionPoint* pDst,FbxConnection::EType pConnectionType=FbxConnection::eNone);
  118. bool ConnectSrcAt(int pDst_SrcIndex, FbxConnectionPoint* pSrc, FbxConnection::EType pConnectionType=FbxConnection::eNone);
  119. bool ConnectDstAt(int pSrc_DstIndex, FbxConnectionPoint* pDst, FbxConnection::EType pConnectionType=FbxConnection::eNone);
  120. static bool ConnectConnect(FbxConnectionPoint* pSrc,FbxConnectionPoint* pDst,FbxConnection::EType pConnectionType);
  121. static bool ConnectAt(FbxConnectionPoint* pSrc, int pSrc_DstIndex, FbxConnectionPoint* pDst, int pDst_SrcIndex, FbxConnection::EType pConnectionType);
  122. bool DisconnectDst(FbxConnectionPoint* pSrc);
  123. bool DisconnectSrc(FbxConnectionPoint* pSrc);
  124. void DisconnectAllSrc();
  125. void DisconnectAllDst();
  126. static bool DisconnectConnect(FbxConnectionPoint* pSrc,FbxConnectionPoint* pDst);
  127. bool DisconnectDstAt(int pIndex);
  128. bool DisconnectSrcAt(int pIndex);
  129. bool ReplaceInDst(FbxConnectionPoint* pDstOld, FbxConnectionPoint* pDstNew, int pIndexInNew);
  130. bool ReplaceInSrc(FbxConnectionPoint* pSrcOld, FbxConnectionPoint* pSrcNew, int pIndexInNew);
  131. bool ReplaceDstAt(int pIndex, FbxConnectionPoint* pDst);
  132. bool ReplaceSrcAt(int pIndex, FbxConnectionPoint* pSrc);
  133. bool SwapSrc(int pIndexA, int pIndexB);
  134. /** Change the position of a source Connect.
  135. * \param pIndex Position of the Connect to move.
  136. * \param pAtIndex Position where to move the Connect.
  137. * \return \c True if the Connect was moved.
  138. * \remarks After the move, the Connect will be precisely at position pAtIndex.
  139. */
  140. bool MoveSrcAt(int pIndex, int pAtIndex);
  141. /** Change the position of a source Connect.
  142. * \param pSrc Connect to move.
  143. * \param pAtSrc Connect at which position to move.
  144. * \return \c True if the Connect was moved.
  145. * \remarks After the move, the Connect will be precisely at the position where pAtSrc was before the move.
  146. */
  147. bool MoveSrcAt(FbxConnectionPoint* pSrc, FbxConnectionPoint* pAtSrc);
  148. // Access services
  149. bool IsConnectedSrc(FbxConnectionPoint*);
  150. bool IsConnectedDst(FbxConnectionPoint*);
  151. inline bool IsConnected(FbxConnectionPoint* pConnect) { return IsConnectedSrc(pConnect) || IsConnectedDst(pConnect); }
  152. inline int GetSrcCount() const { return mConnectionList.GetSrcCount(); }
  153. inline FbxConnectionPoint* GetSrc(int pIndex) const { return mConnectionList.GetSrc(pIndex);}
  154. inline FbxConnection::EType GetSrcType(int pIndex) const { return mConnectionList.GetSrcType(pIndex);}
  155. inline int GetDstCount() const { return mConnectionList.GetDstCount(); }
  156. inline FbxConnectionPoint* GetDst(int pIndex) const { return mConnectionList.GetDst(pIndex);}
  157. inline FbxConnection::EType GetDstType(int pIndex) const { return mConnectionList.GetDstType(pIndex);}
  158. inline int FindSrc(FbxConnectionPoint* pConnect){ return mConnectionList.FindSrc(pConnect); }
  159. inline int FindDst(FbxConnectionPoint* pConnect){ return mConnectionList.FindDst(pConnect); }
  160. // Filtered versions
  161. inline int GetSrcCount(FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrcCount() : GetSrcCount(); }
  162. inline FbxConnectionPoint* GetSrc(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrc(pIndex) : GetSrc(pIndex); }
  163. inline FbxConnection::EType GetSrcType(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrcType(pIndex) : GetSrcType(pIndex); }
  164. inline int GetDstCount(FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDstCount() : GetDstCount(); }
  165. inline FbxConnectionPoint* GetDst(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDst(pIndex): GetDst(pIndex); }
  166. inline FbxConnection::EType GetDstType(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDstType(pIndex) : GetDstType(pIndex); }
  167. void* GetData(){ return mData; }
  168. /*****************************************************************************************************************************
  169. ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
  170. *****************************************************************************************************************************/
  171. #ifndef DOXYGEN_SHOULD_SKIP_THIS
  172. protected:
  173. class ConnectionList
  174. {
  175. public:
  176. ConnectionList();
  177. ~ConnectionList();
  178. void Clear();
  179. void InsertSrcAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pType);
  180. void AddSrc(FbxConnectionPoint* pConnect, FbxConnection::EType pType);
  181. void RemoveSrcAt(int pIndex);
  182. int FindSrc(FbxConnectionPoint* pConnect) const;
  183. int GetSrcCount() const;
  184. FbxConnectionPoint* GetSrc(int pIndex) const;
  185. FbxConnection::EType GetSrcType(int pIndex) const;
  186. void InsertDstAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pType);
  187. void AddDst(FbxConnectionPoint* pConnect, FbxConnection::EType pType);
  188. void RemoveDstAt(int pIndex);
  189. int FindDst(FbxConnectionPoint* pConnect) const;
  190. int GetDstCount() const;
  191. FbxConnectionPoint* GetDst(int pIndex) const;
  192. FbxConnection::EType GetDstType(int pIndex) const;
  193. protected:
  194. struct Connection {
  195. Connection(FbxConnectionPoint* pPoint, FbxConnection::EType pType) : mPoint(pPoint), mType(pType){}
  196. FbxConnectionPoint* mPoint; FbxConnection::EType mType;
  197. };
  198. FbxArray<Connection> mSrcList;
  199. FbxArray<Connection> mDstList;
  200. };
  201. void SubConnectAdd(FbxConnectionPoint* pConnect);
  202. void SubConnectRemove(FbxConnectionPoint* pConnect);
  203. FbxConnectionPoint* SubConnectFind(FbxConnectionPointFilter* pFilter);
  204. FbxConnectionPoint* SubConnectGetOrCreate(FbxConnectionPointFilter* pFilter);
  205. void SubConnectFill(FbxConnectionPoint* pConnect);
  206. virtual bool ConnectNotify(EEvent pAction, FbxConnectionPoint* pThis, int pIndex, FbxConnectionPoint* pConnect=NULL, FbxConnection::EType pConnectionType=FbxConnection::eNone, FbxConnectionPoint* pNewConnect=NULL);
  207. virtual void ConnectCleanUp(FbxConnectionPoint* pThis);
  208. int FindSrcIndexFromOwnerConnectIndex(FbxConnectionPoint* pOwner, int pOwnerIndex);
  209. int FindDstIndexFromOwnerConnectIndex(FbxConnectionPoint* pOwner, int pOwnerIndex);
  210. bool InternalMoveSrcBefore(int pIndex, int pBeforeIndex);
  211. private:
  212. inline void InsertSrcAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType){ mConnectionList.InsertSrcAt(pIndex, pConnect, pConnectionType); }
  213. inline void InsertDstAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType){ mConnectionList.InsertDstAt(pIndex, pConnect, pConnectionType); }
  214. inline void RemoveSrcAt(int pIndex){ mConnectionList.RemoveSrcAt(pIndex); }
  215. inline void RemoveDstAt(int pIndex){ mConnectionList.RemoveDstAt(pIndex); }
  216. static bool InternalConnectBefore(FbxConnectionPoint* pSrc, FbxConnectionPoint* pSrc_BeforeDst, FbxConnectionPoint* pDst, FbxConnectionPoint* pDst_BeforeSrc, FbxConnection::EType pConnectionType);
  217. static bool UserConnectBefore(FbxConnectionPoint* pSrc, FbxConnectionPoint* pSrc_BeforeDst, FbxConnectionPoint* pDst, FbxConnectionPoint* pDst_BeforeSrc, FbxConnection::EType pConnectionType);
  218. static bool EmitReplaceNotify(FbxConnectionPoint* pDstOwner, FbxConnectionPoint* pSrcOwner, FbxConnectionPoint* pDst, FbxConnectionPoint* pSrc, EEvent pConnectAction, FbxConnectionPoint* pNew);
  219. virtual bool SetOwnerConnect(FbxConnectionPoint* pConnect);
  220. inline FbxConnectionPoint* GetOwnerConnect(){ return mOwner; }
  221. bool ConnectOwnedConnect(FbxConnectionPoint* pConnect);
  222. bool DisconnectOwnedConnect(FbxConnectionPoint* pConnect);
  223. void* mData;
  224. int mFlags;
  225. FbxConnectionPoint* mOwner;
  226. ConnectionList mConnectionList;
  227. FbxArray<FbxConnectionPoint*> mSubConnectList;
  228. FbxArray<FbxConnectionPoint*> mSubConnectCreatedList;
  229. FbxConnectionPointFilter* mFilter;
  230. #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
  231. };
  232. /** Class to manage Connect Filter */
  233. class FBXSDK_DLL FbxConnectionPointFilter
  234. {
  235. public:
  236. virtual ~FbxConnectionPointFilter() {};
  237. //! Return reference ConnectionPoint filter.
  238. virtual FbxConnectionPointFilter* Ref();
  239. //! Cancel reference
  240. virtual void Unref();
  241. //! Get unique filter ID
  242. virtual FbxInt GetUniqueId() const { return 0; }
  243. /** Judge if the given Connection Point is valid
  244. * \param pConnect The given Connection Point.
  245. * \return \c True if valid, \c false if not valid. */
  246. virtual bool IsValid(FbxConnectionPoint* pConnect) const;
  247. /** Judge if the given Connection Point is a valid connection
  248. * \param pConnect The given Connection Point.
  249. * \param pType Connection type.
  250. * \return \c True if valid, \c false if not valid. */
  251. virtual bool IsValidConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pType) const;
  252. /** Judge if it is equal with the given ConnectionPoint filter.
  253. * \param pConnectFilter The given ConnectionPoint filter.
  254. * \return \c True if equal, \c false if unequal. */
  255. virtual bool IsEqual(FbxConnectionPointFilter* pConnectFilter) const;
  256. };
  257. #include <fbxsdk/fbxsdk_nsend.h>
  258. #endif /* _FBXSDK_CORE_CONNECTION_POINT_H_ */