TuttleOFX
1
|
00001 #ifndef _TUTTLE_HOST_PROCESSVERTEXATTIMEDATA_HPP_ 00002 #define _TUTTLE_HOST_PROCESSVERTEXATTIMEDATA_HPP_ 00003 00004 #include "ProcessVertexData.hpp" 00005 00006 #include <tuttle/host/ofx/attribute/OfxhClipImage.hpp> 00007 #include <tuttle/host/ofx/OfxhCore.hpp> 00008 00009 #include <string> 00010 00011 namespace tuttle { 00012 namespace host { 00013 namespace graph { 00014 00015 class ProcessEdgeAtTime; 00016 00017 class ProcessVertexAtTimeInfo 00018 { 00019 typedef ProcessVertexAtTimeInfo This; 00020 00021 public: 00022 ProcessVertexAtTimeInfo() 00023 : _nodes( 0 ) 00024 , _memory( 0 ) 00025 {} 00026 00027 std::size_t _nodes; 00028 std::size_t _memory; 00029 00030 ProcessVertexAtTimeInfo& operator+=( const ProcessVertexAtTimeInfo& p ) 00031 { 00032 _nodes += p._nodes; 00033 _memory += p._memory; 00034 return *this; 00035 } 00036 00037 public: 00038 friend std::ostream& operator<<( std::ostream& os, const This& g ); 00039 }; 00040 00041 class ProcessVertexAtTimeData 00042 { 00043 typedef ProcessVertexAtTimeData This; 00044 00045 public: 00046 ProcessVertexAtTimeData() 00047 : _nodeData( NULL ) 00048 , _time( 0 ) 00049 , _isFinalNode( false ) 00050 , _outDegree( 0 ) 00051 , _inDegree( 0 ) 00052 { 00053 _localInfos._nodes = 1; // local infos can contain only 1 node by definition... 00054 } 00055 00056 ProcessVertexAtTimeData( const ProcessVertexData& nodeData, const OfxTime time ) 00057 : _nodeData( &nodeData ) 00058 , _time( time ) 00059 , _isFinalNode( false ) 00060 , _outDegree( 0 ) 00061 , _inDegree( 0 ) 00062 { 00063 _localInfos._nodes = 1; // local infos can contain only 1 node by definition... 00064 } 00065 00066 ProcessVertexAtTimeData( const This& other ) 00067 : _nodeData( other._nodeData ) 00068 { 00069 operator=( other ); 00070 } 00071 ~ProcessVertexAtTimeData() {} 00072 00073 This& operator=( const This& v ) 00074 { 00075 _nodeData = v._nodeData; 00076 00077 _time = v._time; 00078 _isFinalNode = v._isFinalNode; 00079 _outDegree = v._outDegree; 00080 _inDegree = v._inDegree; 00081 _localInfos = v._localInfos; 00082 _inputsInfos = v._inputsInfos; 00083 _globalInfos = v._globalInfos; 00084 00085 _apiImageEffect = v._apiImageEffect; 00086 00087 return *this; 00088 } 00089 00090 inline const ProcessEdgeAtTime& getInputEdgeByClipName( const std::string& inputClipName ) const 00091 { 00092 ProcessEdgeAtTimeByClipName::const_iterator it = _inEdges.find(inputClipName); 00093 if( it == _inEdges.end() ) 00094 BOOST_THROW_EXCEPTION( exception::Bug() 00095 << exception::dev() + "No input clip " + quotes(inputClipName) + " inside input edges map." ); 00096 return *(it->second); 00097 } 00098 00099 public: 00100 friend std::ostream& operator<<( std::ostream& os, const This& vData ); 00101 00102 public: 00103 const ProcessVertexData* _nodeData; 00104 00105 OfxTime _time; 00106 bool _isFinalNode; 00107 00108 typedef std::map<std::string, const ProcessEdgeAtTime*> ProcessEdgeAtTimeByClipName; 00109 ProcessEdgeAtTimeByClipName _inEdges; 00110 std::vector<const ProcessEdgeAtTime*> _outEdges; 00111 00112 std::size_t _outDegree; ///< number of connected input clips 00113 std::size_t _inDegree; ///< number of nodes using the output of this node 00114 00115 ProcessVertexAtTimeInfo _localInfos; 00116 ProcessVertexAtTimeInfo _inputsInfos; 00117 ProcessVertexAtTimeInfo _globalInfos; 00118 00119 /// @group API Specific datas 00120 /// @{ 00121 /** 00122 * @brief imageEffect specific process datas 00123 */ 00124 struct ImageEffect 00125 { 00126 std::string _field; 00127 OfxRectD _renderRoD; // is it a good thing to store this here ? 00128 OfxRectD _renderRoI; 00129 00130 typedef std::map<tuttle::host::ofx::attribute::OfxhClipImage*, OfxRectD> MapClipImageRod; 00131 MapClipImageRod _inputsRoI; ///<< in which the plugin set the RoI it needs for each input clip 00132 00133 } _apiImageEffect; 00134 /// @} 00135 00136 }; 00137 00138 } 00139 } 00140 } 00141 00142 #endif 00143