Tatooine
vectorfield_to_gpu.h
Go to the documentation of this file.
1#ifndef TATOOINE_FLOWEXPLORER_NODES_VECTORFIELD_TO_GPU_H
2#define TATOOINE_FLOWEXPLORER_NODES_VECTORFIELD_TO_GPU_H
3//==============================================================================
6#include <tatooine/field.h>
8//==============================================================================
10//==============================================================================
11struct vectorfield_to_gpu : ui::node<vectorfield_to_gpu>, gl::tex2rg32f {
15 //----------------------------------------------------------------------------
16 vectorfield_t* m_v = nullptr;
17 bb_t* m_bb = nullptr;
20 //----------------------------------------------------------------------------
21 auto bounding_box() const { return m_bb; }
22 //----------------------------------------------------------------------------
23 auto resolution() const -> auto const& { return m_res; }
24 auto resolution() -> auto& { return m_res; }
25 //----------------------------------------------------------------------------
26 auto time() const { return m_t; }
27 auto time() -> auto& { return m_t; }
28 //----------------------------------------------------------------------------
30 : ui::node<vectorfield_to_gpu>{"Vectorfield to GPU", s,
31 *dynamic_cast<vectorfield_to_gpu*>(this)},
32 m_res{100, 100} {
33 insert_input_pin<vectorfield_t>("2D Vector Field");
34 insert_input_pin<bb_t>("2D Bounding Box");
35 }
36 virtual ~vectorfield_to_gpu() = default;
37 //----------------------------------------------------------------------------
38 auto upload() {
39 *dynamic_cast<tex_t*>(this) = gpu::upload_tex<float>(
41 *m_v,
43 linspace{m_bb->min(0), m_bb->max(0), static_cast<size_t>(m_res.at(0))},
44 linspace{m_bb->min(1), m_bb->max(1), static_cast<size_t>(m_res.at(1))}},
45 m_t),
46 m_res(0), m_res(1));
47 }
48 //----------------------------------------------------------------------------
50 ui::output_pin& other_pin) override {
51 if (std::find(begin(this_pin.types()), end(this_pin.types()),
52 &typeid(bb_t)) != end(this_pin.types())) {
53 m_bb = dynamic_cast<bb_t*>(&other_pin.node());
54 } else if (std::find(begin(this_pin.types()), end(this_pin.types()),
55 &typeid(vectorfield_t)) != end(this_pin.types())) {
56 m_v = dynamic_cast<vectorfield_t*>(&other_pin.node());
57 }
58 if (m_bb != nullptr && m_v != nullptr) {
59 upload();
60 }
61 }
62 //----------------------------------------------------------------------------
63 auto on_property_changed() -> void override {
64 if (m_v != nullptr && m_bb != nullptr) {
65 upload();
66 }
67 }
68};
69//==============================================================================
70} // namespace tatooine::flowexplorer::nodes
71//==============================================================================
74 TATOOINE_REFLECTION_INSERT_GETTER(resolution),
75 TATOOINE_REFLECTION_INSERT_GETTER(time));
76#endif
Definition: texture.h:61
Definition: abcflow.h:7
tex2rg< GLfloat > tex2rg32f
Definition: texture.h:939
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto end(Range &&range)
Definition: iterator_facade.h:322
detail::rectilinear_grid::creator_t< linspace< Real >, N > uniform_rectilinear_grid
Definition: rectilinear_grid.h:1904
auto sample_to_vector(polymorphic::field< VReal, NumDimensions, Tensor > const &f, rectilinear_grid< SpatialDimensions... > const &discretized_domain, arithmetic auto const t)
Definition: discretize_field.h:73
auto constexpr max() const -> auto const &
Definition: axis_aligned_bounding_box.h:156
auto constexpr min() const -> auto const &
Definition: axis_aligned_bounding_box.h:151
Definition: axis_aligned_bounding_box.h:15
Definition: vectorfield_to_gpu.h:11
auto time() const
Definition: vectorfield_to_gpu.h:26
vectorfield_t * m_v
Definition: vectorfield_to_gpu.h:16
vec< int, 2 > m_res
Definition: vectorfield_to_gpu.h:18
bb_t * m_bb
Definition: vectorfield_to_gpu.h:17
auto bounding_box() const
Definition: vectorfield_to_gpu.h:21
auto on_property_changed() -> void override
Definition: vectorfield_to_gpu.h:63
vectorfield_to_gpu(flowexplorer::scene &s)
Definition: vectorfield_to_gpu.h:29
auto resolution() -> auto &
Definition: vectorfield_to_gpu.h:24
void on_pin_connected(ui::input_pin &this_pin, ui::output_pin &other_pin) override
Definition: vectorfield_to_gpu.h:49
auto upload()
Definition: vectorfield_to_gpu.h:38
auto resolution() const -> auto const &
Definition: vectorfield_to_gpu.h:23
real_type m_t
Definition: vectorfield_to_gpu.h:19
auto time() -> auto &
Definition: vectorfield_to_gpu.h:27
Definition: scene.h:17
auto types() const -> auto const &
Definition: pin.h:52
Definition: node.h:382
auto node() const -> auto const &
Definition: pin.h:29
Definition: field.h:13
auto constexpr at(integral auto const ... is) -> decltype(auto)
Definition: tensor.h:38
Definition: vec.h:12
TATOOINE_FLOWEXPLORER_REGISTER_NODE(tatooine::flowexplorer::nodes::vectorfield_to_gpu, TATOOINE_REFLECTION_INSERT_GETTER(resolution), TATOOINE_REFLECTION_INSERT_GETTER(time))