1#ifndef TATOOINE_FLOWEXPLORER_UI_NODE_H
2#define TATOOINE_FLOWEXPLORER_UI_NODE_H
4#include <imgui-node-editor/imgui_node_editor.h>
48 template <
typename... Ts>
55 template <
typename Prop>
97 changed |= prop_link->update();
116 virtual auto
update(std::chrono::duration<
double> const& ) ->
void {}
126 toml::table serialized_node;
129 using var_t = std::decay_t<
decltype(var)>;
130 if constexpr (is_same<size_t, var_t>) {
131 serialized_node.insert(name, (
int)var);
132 }
else if constexpr (is_same<std::string, var_t>) {
133 serialized_node.insert(name, var);
134 }
else if constexpr (std::is_arithmetic_v<var_t>) {
135 serialized_node.insert(name, var);
136 }
else if constexpr (is_same<std::array<int, 2>, var_t> ||
137 is_same<std::array<float, 2>, var_t> ||
138 is_same<std::array<double, 2>, var_t> ||
139 is_same<vec<int, 2>, var_t> ||
140 is_same<vec<float, 2>, var_t> ||
141 is_same<vec<double, 2>, var_t>) {
142 serialized_node.insert(name, toml::array{var.at(0), var.at(1)});
143 }
else if constexpr (is_same<std::array<int, 3>, var_t> ||
144 is_same<std::array<float, 3>, var_t> ||
145 is_same<std::array<double, 3>, var_t> ||
146 is_same<vec<int, 3>, var_t> ||
147 is_same<vec<float, 3>, var_t> ||
148 is_same<vec<double, 3>, var_t>) {
149 serialized_node.insert(name,
150 toml::array{var.at(0), var.at(1), var.at(2)});
151 }
else if constexpr (is_same<std::array<int, 4>, var_t> ||
152 is_same<std::array<float, 4>, var_t> ||
153 is_same<std::array<double, 4>, var_t> ||
154 is_same<vec<int, 4>, var_t> ||
155 is_same<vec<float, 4>, var_t> ||
156 is_same<vec<double, 4>, var_t>) {
157 serialized_node.insert(
158 name, toml::array{var.at(0), var.at(1), var.at(2), var.at(3)});
159 }
else if constexpr (
161 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>> ||
163 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>> ||
165 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>>) {
166 serialized_node.insert(name, toml::array{var[0], var[1]});
167 }
else if constexpr (
169 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>> ||
171 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>> ||
173 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>>) {
174 serialized_node.insert(name, toml::array{var[0], var[1], var[2]});
175 }
else if constexpr (
177 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>> ||
179 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>> ||
181 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>>) {
182 serialized_node.insert(name,
183 toml::array{var[0], var[1], var[2], var[3]});
186 return serialized_node;
189 auto deserialize(T& t, toml::table
const& serialized_node) ->
void {
191 using var_t = std::decay_t<
decltype(var)>;
192 if constexpr (is_same<size_t, var_t>) {
193 var = (size_t)serialized_node[name].as_integer()->get();
194 }
else if constexpr (is_same<std::string, var_t>) {
195 var = serialized_node[name].as_string()->get();
196 }
else if constexpr (is_same<bool, var_t>) {
197 var = serialized_node[name].as_boolean()->get();
198 }
else if constexpr (std::is_integral_v<var_t>) {
199 var = serialized_node[name].as_integer()->get();
200 }
else if constexpr (std::is_floating_point_v<var_t>) {
201 var = serialized_node[name].as_floating_point()->get();
202 }
else if constexpr (is_same<std::array<int, 2>, var_t> ||
203 is_same<vec<int, 2>, var_t>) {
204 auto const& arr = *serialized_node[name].as_array();
206 var.at(0) = arr[0].as_integer()->get();
207 var.at(1) = arr[1].as_integer()->get();
208 }
else if constexpr (is_same<std::array<int, 3>, var_t> ||
209 is_same<vec<int, 3>, var_t>) {
210 auto const& arr = *serialized_node[name].as_array();
212 var.at(0) = arr[0].as_integer()->get();
213 var.at(1) = arr[1].as_integer()->get();
214 var.at(2) = arr[2].as_integer()->get();
215 }
else if constexpr (is_same<std::array<int, 4>, var_t> ||
216 is_same<vec<int, 4>, var_t>) {
217 auto const& arr = *serialized_node[name].as_array();
219 var.at(0) = arr[0].as_integer()->get();
220 var.at(1) = arr[1].as_integer()->get();
221 var.at(2) = arr[2].as_integer()->get();
222 var.at(3) = arr[3].as_integer()->get();
224 }
else if constexpr (is_same<std::array<float, 2>, var_t> ||
225 is_same<std::array<double, 2>, var_t>) {
226 auto const& arr = *serialized_node[name].as_array();
228 var[0] = arr[0].as_floating_point()->get();
229 var[1] = arr[1].as_floating_point()->get();
230 }
else if constexpr (is_same<vec<float, 2>, var_t> ||
231 is_same<vec<double, 2>, var_t>) {
232 auto const& arr = *serialized_node[name].as_array();
234 var(0) = arr[0].as_floating_point()->get();
235 var(1) = arr[1].as_floating_point()->get();
236 }
else if constexpr (is_same<std::array<float, 3>, var_t> ||
237 is_same<std::array<double, 3>, var_t> ||
238 is_same<vec<float, 3>, var_t> ||
239 is_same<vec<double, 3>, var_t>) {
240 auto const& arr = *serialized_node[name].as_array();
242 var.at(0) = arr[0].as_floating_point()->get();
243 var.at(1) = arr[1].as_floating_point()->get();
244 var.at(2) = arr[2].as_floating_point()->get();
245 }
else if constexpr (is_same<std::array<float, 4>, var_t> ||
246 is_same<std::array<double, 4>, var_t> ||
247 is_same<vec<float, 4>, var_t> ||
248 is_same<vec<double, 4>, var_t>) {
249 auto const& arr = *serialized_node[name].as_array();
251 var.at(0) = arr[0].as_floating_point()->get();
252 var.at(1) = arr[1].as_floating_point()->get();
253 var.at(2) = arr[2].as_floating_point()->get();
254 var.at(3) = arr[3].as_floating_point()->get();
255 }
else if constexpr (
is_same<
int[2],
256 std::remove_cv_t<std::remove_reference_t<
258 auto const& arr = *serialized_node[name].as_array();
260 var[0] = arr[0].as_integer()->get();
261 var[1] = arr[1].as_integer()->get();
262 }
else if constexpr (
is_same<
int[3],
263 std::remove_cv_t<std::remove_reference_t<
265 auto const& arr = *serialized_node[name].as_array();
267 var[0] = arr[0].as_integer()->get();
268 var[1] = arr[1].as_integer()->get();
269 var[2] = arr[2].as_integer()->get();
270 }
else if constexpr (
is_same<
int[4],
271 std::remove_cv_t<std::remove_reference_t<
273 auto const& arr = *serialized_node[name].as_array();
275 var[0] = arr[0].as_integer()->get();
276 var[1] = arr[1].as_integer()->get();
277 var[2] = arr[2].as_integer()->get();
278 var[3] = arr[3].as_integer()->get();
280 }
else if constexpr (
282 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>> ||
284 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>>) {
285 auto const& arr = *serialized_node[name].as_array();
287 var.at[0] = arr[0].as_floating_point()->get();
288 var.at[1] = arr[1].as_floating_point()->get();
289 }
else if constexpr (
291 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>> ||
293 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>>) {
294 auto const& arr = *serialized_node[name].as_array();
296 var[0] = arr[0].as_floating_point()->get();
297 var[1] = arr[1].as_floating_point()->get();
298 var[2] = arr[2].as_floating_point()->get();
299 }
else if constexpr (
301 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>> ||
303 std::remove_cv_t<std::remove_reference_t<
decltype(var)>>>) {
304 auto const& arr = *serialized_node[name].as_array();
306 var[0] = arr[0].as_floating_point()->get();
307 var[1] = arr[1].as_floating_point()->get();
308 var[2] = arr[2].as_floating_point()->get();
309 var[3] = arr[3].as_floating_point()->get();
315 bool changed =
false;
317 using var_t = std::decay_t<
decltype(var)>;
318 if constexpr (is_same<std::string, var_t>) {
319 changed |= ImGui::InputText(name, &var);
321 }
else if constexpr (is_same<size_t, var_t>) {
325 }
else if constexpr (is_same<float, var_t>) {
326 changed |= ImGui::DragFloat(name, &var, 0.1f);
327 }
else if constexpr (is_same<std::array<float, 2>, var_t>) {
328 changed |= ImGui::DragFloat2(name, var.data(), 0.1f);
330 }
else if constexpr (is_same<std::array<float, 3>, var_t>) {
331 changed |= ImGui::DragFloat3(name, var.data(), 0.1f);
332 }
else if constexpr (is_same<std::array<float, 4>, var_t>) {
333 changed |= ImGui::DragFloat4(name, var.data(), 0.1f);
334 }
else if constexpr (is_same<vec<float, 2>, var_t>) {
335 changed |= ImGui::DragFloat2(name, var.data(), 0.1f);
336 }
else if constexpr (is_same<vec<float, 3>, var_t>) {
337 changed |= ImGui::DragFloat3(name, var.data(), 0.1f);
338 }
else if constexpr (is_same<vec<float, 4>, var_t>) {
339 changed |= ImGui::DragFloat4(name, var.data(), 0.1f);
342 }
else if constexpr (is_same<double, var_t>) {
344 }
else if constexpr (is_same<std::array<double, 2>, var_t>) {
346 }
else if constexpr (is_same<std::array<double, 3>, var_t>) {
348 }
else if constexpr (is_same<std::array<double, 4>, var_t>) {
350 }
else if constexpr (is_same<vec<double, 2>, var_t>) {
352 }
else if constexpr (is_same<vec<double, 3>, var_t>) {
354 }
else if constexpr (is_same<vec<double, 4>, var_t>) {
358 }
else if constexpr (is_same<int, var_t>) {
359 changed |= ImGui::DragInt(name, &var, 1);
360 }
else if constexpr (is_same<std::array<int, 2>, var_t>) {
361 changed |= ImGui::DragInt2(name, var.data(), 1);
362 }
else if constexpr (is_same<std::array<int, 3>, var_t>) {
363 changed |= ImGui::DragInt3(name, var.data(), 1);
364 }
else if constexpr (is_same<std::array<int, 4>, var_t>) {
365 changed |= ImGui::DragInt4(name, var.data(), 1);
366 }
else if constexpr (is_same<vec<int, 2>, var_t>) {
367 changed |= ImGui::DragInt2(name, var.data(), 1);
368 }
else if constexpr (is_same<vec<int, 3>, var_t>) {
369 changed |= ImGui::DragInt3(name, var.data(), 1);
370 }
else if constexpr (is_same<vec<int, 4>, var_t>) {
371 changed |= ImGui::DragInt4(name, var.data(), 1);
378 return reflection::name<T>();
381template <
typename Child>
390 auto deserialize(toml::table
const& serialized_node) ->
void override {
399 auto type_name() const -> std::string_view override final {
407 using F = std::string_view (*)();
412 using F = tatooine::flowexplorer::ui::base::
417#define TATOOINE_FLOWEXPLORER_REGISTER_NAME(registered_function_, sec) \
418 static registration_name_t ptr_##registered_function_ \
419 __attribute((used, section(#sec))) = { \
420 .f = registered_function_, \
423#define TATOOINE_FLOWEXPLORER_REGISTER_FACTORY(registered_function_, sec) \
424 static registration_factory_t ptr_##registered_function_ \
425 __attribute((used, section(#sec))) = { \
426 .f = registered_function_, \
429#define TATOOINE_FLOWEXPLORER_REGISTER_NODE(type, ...) \
430 TATOOINE_MAKE_ADT_REFLECTABLE(type, ##__VA_ARGS__) \
431 namespace tatooine::flowexplorer::registration::type { \
432 static auto factory(::tatooine::flowexplorer::scene& s, \
433 std::string_view const& node_type_name) \
434 -> ::tatooine::flowexplorer::ui::base::node* { \
435 if (node_type_name == #type) { \
436 return s.nodes().emplace_back(new ::type{s}).get(); \
440 static constexpr auto name() -> std::string_view { return #type; } \
441 TATOOINE_FLOWEXPLORER_REGISTER_FACTORY(factory, factory_); \
442 TATOOINE_FLOWEXPLORER_REGISTER_NAME(name, name_); \
445#define TATOOINE_FLOWEXPLORER_REGISTER_RENDERABLE(type, ...) \
446 TATOOINE_MAKE_ADT_REFLECTABLE(type, ##__VA_ARGS__) \
447 namespace tatooine::flowexplorer::registration::type { \
448 static auto factory(::tatooine::flowexplorer::scene& s, \
449 std::string_view const& node_type_name) \
450 -> ::tatooine::flowexplorer::ui::base::node* { \
451 if (node_type_name == #type) { \
452 return s.renderables().emplace_back(new ::type{s}).get(); \
456 static constexpr auto name() -> std::string_view { return #type; } \
457 TATOOINE_FLOWEXPLORER_REGISTER_FACTORY(factory, factory_); \
458 TATOOINE_FLOWEXPLORER_REGISTER_NAME(name, name_); \
461#define iterate_registered_factories(elem) \
462 for (registration_factory_t* elem = &__start_factory_; \
463 elem != &__stop_factory_; ++elem)
465#define iterate_registered_names(elem) \
466 for (registration_name_t* elem = &__start_name_; elem != &__stop_name_; \
DLL_API auto DragSizeT(char const *label, std::size_t *v, std::size_t v_speed=1, std::size_t v_min=0, std::size_t v_max=std::numeric_limits< std::size_t >::max()) -> bool
DLL_API auto DragDouble(const char *label, double *v, double v_speed=1.0, double v_min=0.0, double v_max=0.0, const char *format="%.3lf", float power=1.0) -> bool
DLL_API auto DragDouble2(const char *label, double v[2], double v_speed=1.0, double v_min=0.0, double v_max=0.0, const char *format="%.3lf", float power=1.0) -> bool
DLL_API auto DragDouble3(const char *label, double v[3], double v_speed=1.0, double v_min=0.0, double v_max=0.0, const char *format="%.3lf", float power=1.0) -> bool
DLL_API auto DragDouble4(const char *label, double v[4], double v_speed=1.0, double v_min=0.0, double v_max=0.0, const char *format="%.3lf", float power=1.0) -> bool
Definition: draw_icon.h:6
auto make_output_pin(base::node &n, std::string const &title, T &t, icon_type const it=icon_type::flow) -> std::unique_ptr< output_pin >
Definition: pin.h:174
icon_type
Definition: draw_icon.h:8
Definition: directories.h:6
auto insert_registered_element(scene &s, std::string_view const &name) -> ui::base::node *
constexpr auto for_each(T &&t, V &&v)
Iterate over each registered member.
Definition: reflection.h:48
static constexpr auto is_same
Definition: type_traits.h:42
registration_factory_t __start_factory_
registration_name_t __start_name_
registration_factory_t __stop_factory_
registration_name_t __stop_name_
tatooine::flowexplorer::ui::base::node *(*)(tatooine::flowexplorer::scene &, std::string_view const &) F
Definition: node.h:413
F f
Definition: node.h:414
F f
Definition: node.h:408
std::string_view(*)() F
Definition: node.h:407
auto draw_properties() -> bool final
auto serialize() const -> toml::table override
Definition: renderable.h:46
Definition: serializable.h:8
Definition: toggleable.h:6
node(std::string const &title, flowexplorer::scene &s, T &ref)
Definition: node.h:41
virtual auto on_pin_connected(output_pin &, input_pin &) -> void
Definition: node.h:111
auto title() -> auto &
Definition: node.h:70
virtual auto on_pin_connected(input_pin &, output_pin &) -> void
Definition: node.h:109
auto input_pins() -> auto &
Definition: node.h:83
auto scene() const -> auto const &
Definition: node.h:72
node(std::string const &title, flowexplorer::scene &s)
auto set_title(std::string const &title)
Definition: node.h:75
flowexplorer::scene * m_scene
Definition: node.h:26
auto output_pins() -> auto &
Definition: node.h:86
std::vector< std::unique_ptr< input_pin_property_link > > m_property_links
Definition: node.h:29
auto input_pins() const -> auto const &
Definition: node.h:82
auto node_position() const -> ImVec2
auto title() const -> auto const &
Definition: node.h:69
auto update_property_links() -> void
Definition: node.h:94
virtual auto on_property_changed() -> void
Definition: node.h:107
virtual auto on_pin_disconnected(output_pin &) -> void
Definition: node.h:114
virtual auto update(std::chrono::duration< double > const &) -> void
Definition: node.h:116
virtual auto on_pin_disconnected(input_pin &) -> void
Definition: node.h:113
auto insert_input_pin_property_link(input_pin &pin, Prop &prop) -> auto &
Definition: node.h:56
node(flowexplorer::scene &s, T &ref)
Definition: node.h:36
virtual auto on_path_selected(std::string const &) -> void
Definition: node.h:117
auto self_pin() -> auto &
Definition: node.h:80
auto scene() -> auto &
Definition: node.h:73
std::vector< std::unique_ptr< input_pin > > m_input_pins
Definition: node.h:27
auto has_self_pin() const -> bool
Definition: node.h:77
virtual auto type_name() const -> std::string_view=0
auto insert_input_pin(std::string const &title, icon_type const t=icon_type::flow) -> auto &
Definition: node.h:49
virtual auto draw_properties() -> bool=0
auto self_pin() const -> auto const &
Definition: node.h:79
std::vector< std::unique_ptr< output_pin > > m_output_pins
Definition: node.h:28
auto output_pins() const -> auto const &
Definition: node.h:85
std::string m_title
Definition: node.h:25
node(flowexplorer::scene &s)
auto insert_output_pin(std::string const &title, T &ref, icon_type const t=icon_type::flow) -> auto &
Definition: node.h:63
virtual auto on_title_changed(std::string const &) -> void
Definition: node.h:108
std::unique_ptr< output_pin > m_self_pin
Definition: node.h:30
auto notify_property_changed(bool const notify_self=true) -> void
auto serialize(T const &t) const -> toml::table
Definition: node.h:125
auto draw_properties(T &t) -> bool
Definition: node.h:314
auto deserialize(T &t, toml::table const &serialized_node) -> void
Definition: node.h:189
constexpr auto type_name() const -> std::string_view
Definition: node.h:377
auto deserialize(toml::table const &serialized_node) -> void override
Definition: node.h:390
auto type_name() const -> std::string_view override final
Definition: node.h:399
auto draw_properties() -> bool override
Definition: node.h:395
auto serialize() const -> toml::table override final
Definition: node.h:386
auto set_icon_type(icon_type const t)
Definition: pin.h:35
Definition: uuid_holder.h:11