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