Loading [MathJax]/extensions/TeX/AMSmath.js
Radium Engine  1.5.28
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
RaDataflow.hpp
1#pragma once
2#include <Core/CoreMacros.hpp>
3
5#if defined RA_DATAFLOW_CORE_EXPORTS
6# define RA_DATAFLOW_CORE_API DLL_EXPORT
7#elif defined RA_DATAFLOW_STATIC
8# define RA_DATAFLOW_CORE_API
9#else
10# define RA_DATAFLOW_CORE_API DLL_IMPORT
11#endif
12
13#if defined RA_DATAFLOW_GUI_EXPORTS
14# define RA_DATAFLOW_GUI_API DLL_EXPORT
15#elif defined RA_DATAFLOW_STATIC
16# define RA_DATAFLOW_GUI_API
17#else
18# define RA_DATAFLOW_GUI_API DLL_IMPORT
19#endif
20
21#include <Core/Containers/VectorArray.hpp>
22#include <Core/Types.hpp>
23#include <Core/Utils/Color.hpp>
24#include <Core/Utils/Log.hpp>
25#include <Core/Utils/TypesUtils.hpp>
26
27#include <nlohmann/json.hpp>
28
53// PREFIX/SUFFIX TYPE FACTORY NAMESPACE
54#define NODE_TYPES( FACTORY, NAMESPACE ) \
55 DATAFLOW_MACRO( Scalar, Scalar, FACTORY, NAMESPACE ); \
56 DATAFLOW_MACRO( Int, int, FACTORY, NAMESPACE ); \
57 DATAFLOW_MACRO( Color, Utils::Color, FACTORY, NAMESPACE ); \
58 DATAFLOW_MACRO( Vector2, Vector2, FACTORY, NAMESPACE ); \
59 DATAFLOW_MACRO( Vector3, Vector3, FACTORY, NAMESPACE ); \
60 DATAFLOW_MACRO( Vector4, Vector4, FACTORY, NAMESPACE );
61
62// add json serialization
63namespace nlohmann {
64
65// usual template <typename Derived> struct adl_serializer<Eigen::MatrixBase<Derived>>
66// do not find correct template substitution, see eg https://github.com/nlohmann/json/issues/3267
67
68template <typename Scalar, int Rows, int Cols>
69struct adl_serializer<Eigen::Matrix<Scalar, Rows, Cols>> {
70 static void to_json( nlohmann::json& j, const Eigen::Matrix<Scalar, Rows, Cols>& matrix ) {
71 for ( int row = 0; row < matrix.rows(); ++row ) {
72 nlohmann::json column = nlohmann::json::array();
73 for ( int col = 0; col < matrix.cols(); ++col ) {
74 column.push_back( matrix( row, col ) );
75 }
76 j.push_back( column );
77 }
78 }
79
80 static void from_json( const nlohmann::json& j, Eigen::Matrix<Scalar, Rows, Cols>& matrix ) {
81 for ( std::size_t row = 0; row < j.size(); ++row ) {
82 const auto& jrow = j.at( row );
83 for ( std::size_t col = 0; col < jrow.size(); ++col ) {
84 const auto& value = jrow.at( col );
85 value.get_to( matrix( row, col ) );
86 }
87 }
88 }
89};
90
91template <typename T>
92struct adl_serializer<Ra::Core::Utils::ColorBase<T>> {
94 static void to_json( json& j, const Color& value ) {
95 j.push_back( value( 0 ) );
96 j.push_back( value( 1 ) );
97 j.push_back( value( 2 ) );
98 j.push_back( value( 3 ) );
99 }
100 static void from_json( const json& j, Color& value ) {
101 j.at( 0 ).get_to( value( 0 ) );
102 j.at( 1 ).get_to( value( 1 ) );
103 j.at( 2 ).get_to( value( 2 ) );
104 j.at( 3 ).get_to( value( 3 ) );
105 }
106};
107
108} // namespace nlohmann
109
110/*******************************************************************************
111 * Node creation
112 */
113
120#define RA_NODE_PARAMETER( T, name, ... ) \
121 public: \
122 T& param_##name() noexcept { \
123 return m_param_##name->second; \
124 } \
125 const T& param_##name() const noexcept { \
126 return m_param_##name->second; \
127 } \
128 \
129 private: \
130 ParamHandle<T> m_param_##name { \
131 add_parameter<T>( std::string( #name ), __VA_ARGS__ ) \
132 }
133
134#define RA_NODE_PORT_IN_ACCESSOR( T, name ) \
135 public: \
136 PortInPtr<T> port_in_##name() { \
137 return m_port_in_##name; \
138 }
139
145#define RA_NODE_PORT_IN( T, name ) \
146 RA_NODE_PORT_IN_ACCESSOR( T, name ) \
147 \
148 private: \
149 PortInPtr<T> m_port_in_##name { \
150 add_input<T>( std::string( #name ) ) \
151 }
152
158#define RA_NODE_PORT_IN_WITH_DEFAULT( T, name, default_value ) \
159 RA_NODE_PORT_IN_ACCESSOR( T, name ) \
160 \
161 private: \
162 PortInPtr<T> m_port_in_##name { \
163 add_input<T>( std::string( #name ), default_value ) \
164 }
165
166#define RA_NODE_PORT_OUT_ACCESSOR( T, name ) \
167 public: \
168 PortOutPtr<T> port_out_##name() { \
169 return m_port_out_##name; \
170 }
171
177#define RA_NODE_PORT_OUT( T, name ) \
178 RA_NODE_PORT_OUT_ACCESSOR( T, name ) \
179 private: \
180 PortOutPtr<T> m_port_out_##name { \
181 add_output<T>( std::string( #name ) ) \
182 }
183
189#define RA_NODE_PORT_OUT_WITH_DATA( T, name ) \
190 RA_NODE_PORT_OUT_ACCESSOR( T, name ) \
191 private: \
192 T m_##name; \
193 PortOutPtr<T> m_port_out_##name { \
194 add_output<T>( &m_##name, std::string( #name ) ) \
195 }
hepler function to manage enum as underlying types in VariableSet
Definition Cage.cpp:4