fbxconnectionpoint.h

Go to the documentation of this file.
00001 /****************************************************************************************
00002  
00003    Copyright (C) 2013 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_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 
00020 #include <fbxsdk/fbxsdk_nsbegin.h>
00021 
00022 class FBXSDK_DLL FbxConnection
00023 {
00024 public:
00025     enum EType
00026     { 
00027         eNone = 0,
00028         // System or user
00029         eSystem = 1 << 0,
00030         eUser = 1 << 1,
00031         eSystemOrUser = eUser | eSystem,
00032         // Type of Link
00033         eReference = 1 << 2,
00034         eContains = 1 << 3,
00035         eData = 1 << 4,
00036         eLinkType = eReference | eContains | eData,
00037         eDefault = eUser | eReference,
00038         eUnidirectional = 1 << 7
00039     };
00040 };
00041 
00042 class FbxConnectionPointFilter;
00043 
00044 class FBXSDK_DLL FbxConnectionPoint
00045 {
00046 public:
00047     enum EDirection
00048     { 
00049         eDirSrc = 1 << 0,   // Contains sources
00050         eDirDst = 1 << 1,   // Contains destinations
00051         eDirUni = 1 << 2,   // Connection is not 2 ways
00052         eDirBoth = eDirSrc | eDirDst,
00053         eDirMask = eDirSrc | eDirDst | eDirUni
00054     };
00055 
00056     enum EType
00057     {
00058         eStandard = 0,
00059         eSubConnection = 1 << 3,        // Connect is a sub Connect of another
00060         eTypeMask = eSubConnection
00061     }; 
00062 
00063     enum EAttribute
00064     {
00065         eDefault = 0,
00066         eCache = 1 << 4,            
00067         eAttributeMask = eCache
00068     }; 
00069 
00070     enum EAllocFlag
00071     {
00072         eNotAllocated = 0,
00073         eAllocated = 1 << 5,
00074         eAllocFlagMask = eAllocated
00075     };
00076 
00077     enum ECleanedFlag
00078     {
00079         eNotCleaned = 0,
00080         eCleaned = 1 << 6,
00081         eCleanedFlagMask = eCleaned
00082     };
00083 
00084     enum EEvent
00085     {
00086         eSrcConnectRequest,
00087         eDstConnectRequest,
00088         eSrcConnect,
00089         eDstConnect,
00090         eSrcConnected,
00091         eDstConnected,
00092         eSrcDisconnect,
00093         eDstDisconnect,
00094         eSrcDisconnected,
00095         eDstDisconnected,
00096         eSrcReplaceBegin,
00097         eSrcReplaceEnd,
00098         eDstReplaceBegin,
00099         eDstReplaceEnd,
00100         eSrcReorder,
00101         eSrcReordered
00102     };
00103 
00104     // Constructor/Destructor   
00105     FbxConnectionPoint(void* pData=0);
00106     virtual ~FbxConnectionPoint();
00107 
00108     void SetFilter(FbxConnectionPointFilter* pConnectFilter, EType pType=eStandard);
00109     void InternalClear();
00110 
00112     void WipeConnectionList();
00113     void Destroy();
00114     void SubConnectRemoveAll();
00115 
00116     inline FbxConnectionPoint*          GetSubOwnerConnect(){ return GetConnectType() == eSubConnection ? mOwner : NULL; }
00117     inline FbxConnectionPointFilter*    GetFilter(){ return mFilter; }
00118 
00119     virtual bool        IsInReplace(FbxConnectionPoint* p1, FbxConnectionPoint* p2);
00120 
00121     inline void         SetConnectType(EType pType){ mFlags = (mFlags & ~eTypeMask) | pType; }
00122     inline EType        GetConnectType(){ return EType(mFlags & eTypeMask); }
00123     inline void         SetDirection(int pDirections){ mFlags = (mFlags & ~eDirMask) | pDirections; }
00124     inline EDirection   GetDirection(){ return EDirection(mFlags & eDirMask); }
00125     inline void         SetAttribute(int pAttributes){ mFlags = (mFlags & ~eAttributeMask) | pAttributes; }
00126     inline EAttribute   GetAttribute(){ return EAttribute(mFlags & eAttributeMask); }
00127     inline void         SetAllocatedFlag(bool pBool){ mFlags = ( pBool ) ? mFlags | eAllocated : mFlags & ~eAllocFlagMask; }
00128     inline bool         GetAllocatedFlag(){ return ( mFlags & eAllocFlagMask ) ? true : false; }
00129     inline void         SetCleanedFlag(bool pBool){ mFlags = ( pBool ) ? mFlags | eCleaned : mFlags & ~eCleanedFlagMask; }
00130     inline bool         GetCleanedFlag(){ return ( mFlags & eCleanedFlagMask ) ? true : false; }        
00131 
00132     bool                IsValidSrc(FbxConnectionPoint* pConnect);
00133     bool                IsValidDst(FbxConnectionPoint* pConnect);
00134     bool                IsValidSrcConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType);
00135     bool                IsValidDstConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType);
00136     bool                RequestValidSrcConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType );
00137     bool                RequestValidDstConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType );
00138 
00139     bool                ConnectSrc(FbxConnectionPoint* pSrc,FbxConnection::EType pConnectionType=FbxConnection::eNone);
00140     bool                ConnectDst(FbxConnectionPoint* pDst,FbxConnection::EType pConnectionType=FbxConnection::eNone);
00141     bool                ConnectSrcAt(int pDst_SrcIndex, FbxConnectionPoint* pSrc, FbxConnection::EType pConnectionType=FbxConnection::eNone);
00142     bool                ConnectDstAt(int pSrc_DstIndex, FbxConnectionPoint* pDst, FbxConnection::EType pConnectionType=FbxConnection::eNone);
00143     static bool         ConnectConnect(FbxConnectionPoint* pSrc,FbxConnectionPoint* pDst,FbxConnection::EType pConnectionType);
00144     static bool         ConnectAt(FbxConnectionPoint* pSrc, int pSrc_DstIndex, FbxConnectionPoint* pDst, int pDst_SrcIndex, FbxConnection::EType pConnectionType);
00145 
00146     bool                DisconnectDst(FbxConnectionPoint* pSrc);
00147     bool                DisconnectSrc(FbxConnectionPoint* pSrc);
00148     void                DisconnectAllSrc();
00149     void                DisconnectAllDst();
00150     static bool         DisconnectConnect(FbxConnectionPoint* pSrc,FbxConnectionPoint* pDst);
00151     bool                DisconnectDstAt(int pIndex);
00152     bool                DisconnectSrcAt(int pIndex);
00153 
00154     bool                ReplaceInDst(FbxConnectionPoint* pDstOld, FbxConnectionPoint* pDstNew, int pIndexInNew);
00155     bool                ReplaceInSrc(FbxConnectionPoint* pSrcOld, FbxConnectionPoint* pSrcNew, int pIndexInNew);
00156     bool                ReplaceDstAt(int pIndex, FbxConnectionPoint* pDst);
00157     bool                ReplaceSrcAt(int pIndex, FbxConnectionPoint* pSrc);
00158     bool                SwapSrc(int pIndexA, int pIndexB);
00159 
00166     bool MoveSrcAt(int pIndex, int pAtIndex);
00167 
00174     bool MoveSrcAt(FbxConnectionPoint* pSrc, FbxConnectionPoint* pAtSrc);
00175 
00176     // Access services
00177     bool IsConnectedSrc(FbxConnectionPoint*);
00178     bool IsConnectedDst(FbxConnectionPoint*);
00179     inline bool IsConnected(FbxConnectionPoint* pConnect) { return IsConnectedSrc(pConnect) || IsConnectedDst(pConnect); }
00180 
00181     inline int                  GetSrcCount() const { return mConnectionList.GetSrcCount(); }
00182     inline FbxConnectionPoint*  GetSrc(int pIndex) const { return mConnectionList.GetSrc(pIndex);}
00183     inline FbxConnection::EType GetSrcType(int pIndex) const { return mConnectionList.GetSrcType(pIndex);}
00184     inline int                  GetDstCount() const { return mConnectionList.GetDstCount(); }
00185     inline FbxConnectionPoint*  GetDst(int pIndex) const { return mConnectionList.GetDst(pIndex);}
00186     inline FbxConnection::EType GetDstType(int pIndex) const { return mConnectionList.GetDstType(pIndex);}
00187 
00188     inline int                  FindSrc(FbxConnectionPoint* pConnect){ return mConnectionList.FindSrc(pConnect); }
00189     inline int                  FindDst(FbxConnectionPoint* pConnect){ return mConnectionList.FindDst(pConnect); }
00190 
00191     // Filtered versions    
00192     inline int                  GetSrcCount(FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrcCount() : GetSrcCount(); }
00193     inline FbxConnectionPoint*  GetSrc(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrc(pIndex) : GetSrc(pIndex); }
00194     inline FbxConnection::EType GetSrcType(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrcType(pIndex) : GetSrcType(pIndex); }
00195     inline int                  GetDstCount(FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDstCount() : GetDstCount(); }
00196     inline FbxConnectionPoint*  GetDst(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDst(pIndex): GetDst(pIndex); }
00197     inline FbxConnection::EType GetDstType(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDstType(pIndex) : GetDstType(pIndex); }
00198 
00199     void* GetData(){ return mData; }
00200 
00201 /*****************************************************************************************************************************
00202 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
00203 *****************************************************************************************************************************/
00204 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00205 protected:
00206     class ConnectionList
00207     {
00208     public:
00209         ConnectionList();
00210         ~ConnectionList();
00211 
00212         void                    Clear();
00213 
00214         void                    InsertSrcAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pType);
00215         void                    AddSrc(FbxConnectionPoint* pConnect, FbxConnection::EType pType);
00216         void                    RemoveSrcAt(int pIndex);
00217         int                     FindSrc(FbxConnectionPoint* pConnect) const;
00218         int                     GetSrcCount() const; 
00219         FbxConnectionPoint*     GetSrc(int pIndex) const;
00220         FbxConnection::EType    GetSrcType(int pIndex) const;
00221 
00222         void                    InsertDstAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pType);
00223         void                    AddDst(FbxConnectionPoint* pConnect, FbxConnection::EType pType);
00224         void                    RemoveDstAt(int pIndex);
00225         int                     FindDst(FbxConnectionPoint* pConnect) const;
00226         int                     GetDstCount() const;
00227         FbxConnectionPoint*     GetDst(int pIndex) const;
00228         FbxConnection::EType    GetDstType(int pIndex) const;
00229 
00230     protected:
00231         struct Connection {
00232             Connection(FbxConnectionPoint* pPoint, FbxConnection::EType pType) : mPoint(pPoint), mType(pType){}
00233             FbxConnectionPoint* mPoint; FbxConnection::EType mType;
00234         };
00235         FbxArray<Connection>    mSrcList;
00236         FbxArray<Connection>    mDstList;
00237     };
00238 
00239     void                SubConnectAdd(FbxConnectionPoint* pConnect);
00240     void                SubConnectRemove(FbxConnectionPoint* pConnect);
00241     FbxConnectionPoint* SubConnectFind(FbxConnectionPointFilter* pFilter);
00242     FbxConnectionPoint* SubConnectGetOrCreate(FbxConnectionPointFilter* pFilter);
00243     void                SubConnectFill(FbxConnectionPoint*  pConnect);
00244 
00245     virtual bool        ConnectNotify(EEvent pAction, FbxConnectionPoint* pThis, int pIndex, FbxConnectionPoint* pConnect=NULL, FbxConnection::EType pConnectionType=FbxConnection::eNone, FbxConnectionPoint* pNewConnect=NULL);
00246     virtual void        ConnectCleanUp(FbxConnectionPoint* pThis);
00247 
00248     int                 FindSrcIndexFromOwnerConnectIndex(FbxConnectionPoint* pOwner, int pOwnerIndex);
00249     int                 FindDstIndexFromOwnerConnectIndex(FbxConnectionPoint* pOwner, int pOwnerIndex);
00250 
00251     bool                InternalMoveSrcBefore(int pIndex, int pBeforeIndex);
00252 
00253 private:
00254     inline void         InsertSrcAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType){ mConnectionList.InsertSrcAt(pIndex, pConnect, pConnectionType); }
00255     inline void         InsertDstAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType){ mConnectionList.InsertDstAt(pIndex, pConnect, pConnectionType); }
00256     inline void         RemoveSrcAt(int pIndex){ mConnectionList.RemoveSrcAt(pIndex); }
00257     inline void         RemoveDstAt(int pIndex){ mConnectionList.RemoveDstAt(pIndex); }     
00258 
00259     static bool         InternalConnectBefore(FbxConnectionPoint* pSrc, FbxConnectionPoint* pSrc_BeforeDst, FbxConnectionPoint* pDst, FbxConnectionPoint* pDst_BeforeSrc, FbxConnection::EType pConnectionType);
00260     static bool         UserConnectBefore(FbxConnectionPoint* pSrc, FbxConnectionPoint* pSrc_BeforeDst, FbxConnectionPoint* pDst, FbxConnectionPoint* pDst_BeforeSrc, FbxConnection::EType pConnectionType);
00261     static bool         EmitReplaceNotify(FbxConnectionPoint* pDstOwner, FbxConnectionPoint* pSrcOwner, FbxConnectionPoint* pDst, FbxConnectionPoint* pSrc, EEvent pConnectAction, FbxConnectionPoint* pNew);
00262 
00263     virtual bool                SetOwnerConnect(FbxConnectionPoint* pConnect);
00264     inline FbxConnectionPoint*  GetOwnerConnect(){ return mOwner;  }
00265     bool                        ConnectOwnedConnect(FbxConnectionPoint* pConnect);
00266     bool                        DisconnectOwnedConnect(FbxConnectionPoint* pConnect);
00267 
00268     void*                           mData;
00269     int                             mFlags;
00270     FbxConnectionPoint*             mOwner;
00271     ConnectionList                  mConnectionList;
00272     FbxArray<FbxConnectionPoint*>   mSubConnectList;
00273     FbxArray<FbxConnectionPoint*>   mSubConnectCreatedList;     
00274     FbxConnectionPointFilter*       mFilter;
00275 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
00276 };
00277 
00279 class FBXSDK_DLL FbxConnectionPointFilter
00280 {
00281 public: 
00282     virtual ~FbxConnectionPointFilter() {};
00283     
00285     virtual FbxConnectionPointFilter* Ref();
00286 
00288     virtual void Unref();
00289 
00291     virtual FbxInt GetUniqueId() const { return 0; }
00292 
00296     virtual bool IsValid(FbxConnectionPoint* pConnect) const;
00297 
00302     virtual bool IsValidConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pType) const;
00303 
00307     virtual bool IsEqual(FbxConnectionPointFilter* pConnectFilter) const;
00308 };
00309 
00310 #include <fbxsdk/fbxsdk_nsend.h>
00311 
00312 #endif /* _FBXSDK_CORE_CONNECTION_POINT_H_ */