Tatooine
random_pathlines.h
Go to the documentation of this file.
1#ifndef TATOOINE_FLOWEXPLORER_NODES_RANDOM_PATHLINES_H
2#define TATOOINE_FLOWEXPLORER_NODES_RANDOM_PATHLINES_H
3//==============================================================================
7#include <tatooine/gpu/line_shader.h>
8
9#include <mutex>
10//==============================================================================
12//==============================================================================
13template <size_t N>
14struct random_pathlines : renderable<random_pathlines<N>> {
15 //----------------------------------------------------------------------------
16 // typedefs
17 //----------------------------------------------------------------------------
20 //----------------------------------------------------------------------------
21
22 vectorfield_t const* m_v = nullptr;
25 std::unique_ptr<gpu::line_shader> m_shader;
27
28 double m_btau, m_ftau;
30 float m_line_color[3];
39 bool m_play;
43 float m_time;
44 float m_speed;
46 //----------------------------------------------------------------------------
48 : renderable<random_pathlines<N>>{"Random Path Lines", s},
49 m_shader{std::make_unique<gpu::line_shader>(
54 m_btau{-10},
55 m_ftau{10},
56 m_num_pathlines{100},
57 m_line_color{1.0f, 0.0f, 0.0f},
58 m_contour_color{0.0f, 0.0f, 0.0f},
59 m_line_width{0.04f},
60 m_contour_width{0.005f},
61 m_ambient_factor{0.1f},
62 m_diffuse_factor{0.9f},
64 m_shininess{20.0f},
65 m_animate{false},
66 m_play{false},
67 m_fade_length{1.0f},
68 m_general_alpha{1.0f},
70 m_time{0.0f},
71 m_speed{1.0f} {
72 this->template insert_input_pin<vectorfield_t>("3D Vector Field");
73 this->template insert_input_pin<axis_aligned_bounding_box<N>>(
74 "Bounding Box");
75 }
76 //----------------------------------------------------------------------------
77 void render(mat<float, 4, 4> const& projection_matrix,
78 mat<float, 4, 4> const& view_matrix) override {
80 update_shader(projection_matrix, view_matrix);
81 m_shader->bind();
82 m_gpu_data.draw_lines();
83 }
84 }
85 //----------------------------------------------------------------------------
86 void update(std::chrono::duration<double> const& dt) override {
87 auto ms = static_cast<float>(
88 std::chrono::duration_cast<std::chrono::milliseconds>(dt).count());
89 if (m_animate) {
90 if (m_play) {
91 m_time += m_speed * ms / 1000;
92 while (m_time > m_ftau + m_fade_length) {
93 m_time = m_btau;
94 }
95 }
96 } else {
97 m_time = m_btau;
98 }
99 }
100 //----------------------------------------------------------------------------
101 auto draw_properties() -> bool override {
102 ImGui::DragInt("number of path lines", &m_num_pathlines, 1, 10, 1000);
103 ImGui::DragDouble("backward tau", &m_btau, 0.1, -100, 0);
104 ImGui::DragDouble("forward tau", &m_ftau, 0.1, 0, 100);
105 ImGui::SliderFloat("line width", &m_line_width, 0.0f, 0.1f);
106 ImGui::SliderFloat("contour width", &m_contour_width, 0.0f,
107 m_line_width / 2);
108 ImGui::SliderFloat("ambient factor", &m_ambient_factor, 0.0f, 1.0f);
109 ImGui::SliderFloat("diffuse factor", &m_diffuse_factor, 0.0f, 1.0f);
110 ImGui::SliderFloat("specular factor", &m_specular_factor, 0.0f, 1.0f);
111 ImGui::SliderFloat("shininess", &m_shininess, 1.0f, 80.0f);
112 ImGui::ColorEdit3("line color", m_line_color);
113 ImGui::ColorEdit3("contour color", m_contour_color);
114 ImGui::Checkbox("animate", &m_animate);
115 if (m_animate) {
116 ImGui::Checkbox("play", &m_play);
117 ImGui::SliderFloat("animation_min_alpha", &m_animation_min_alpha, 0.0f,
118 1.0f);
119 ImGui::SliderFloat("fade_length", &m_fade_length, 0.1f, 10.0f);
120 ImGui::SliderFloat("speed", &m_speed, 0.1f, 10.0f);
121 ImGui::SliderFloat("time", &m_time, m_btau, m_ftau);
122 } else {
123 ImGui::SliderFloat("general_alpha", &m_general_alpha, 0.0f, 1.0f);
124 }
125 return false;
126 }
127 //----------------------------------------------------------------------------
128 void update_shader(mat4f const& projection_matrix, mat4f const& view_matrix) {
129 m_shader->set_modelview_matrix(view_matrix);
130 m_shader->set_projection_matrix(projection_matrix);
131 m_shader->set_line_color(m_line_color[0], m_line_color[1], m_line_color[2]);
132 m_shader->set_contour_color(m_contour_color[0], m_contour_color[1],
133 m_contour_color[2]);
134 m_shader->set_line_width(m_line_width);
135 m_shader->set_contour_width(m_contour_width);
136 m_shader->set_ambient_factor(m_ambient_factor);
137 m_shader->set_diffuse_factor(m_diffuse_factor);
138 m_shader->set_specular_factor(m_specular_factor);
139 m_shader->set_shininess(m_shininess);
140 m_shader->set_animate(m_animate);
141 m_shader->set_general_alpha(m_general_alpha);
142 m_shader->set_animation_min_alpha(m_animation_min_alpha);
143 m_shader->set_fade_length(m_fade_length);
144 m_shader->set_time(m_time);
145 }
146 //----------------------------------------------------------------------------
149 return;
150 }
152 auto work = [rp = this] {
153 size_t index = 0;
154 bool insert_segment = false;
155 auto callback = [rp, &index, &insert_segment](auto const& y, auto const t,
156 auto const& dy) {
157 //std::lock_guard lock{rp->m_gpu_data.mutex()};
158 rp->m_gpu_data.vertexbuffer().push_back(
159 vec<GLfloat, 3>{static_cast<GLfloat>(y(0)),
160 static_cast<GLfloat>(y(1)),
161 static_cast<GLfloat>(y(2))},
162 vec<GLfloat, 3>{static_cast<GLfloat>(dy(0)),
163 static_cast<GLfloat>(dy(1)),
164 static_cast<GLfloat>(dy(2))},
165 static_cast<GLfloat>(t));
166 if (insert_segment) {
167 rp->m_gpu_data.indexbuffer().push_back(index - 1);
168 rp->m_gpu_data.indexbuffer().push_back(index);
169 } else {
170 insert_segment = true;
171 }
172 ++index;
173 };
174 {
175 //std::lock_guard lock{rp->m_gpu_data.mutex()};
176 rp->m_gpu_data.clear();
177 }
178 for (size_t i = 0; i < static_cast<size_t>(rp->m_num_pathlines); ++i) {
179 auto const x0 = rp->m_boundingbox->random_point();
180 double const t0 = 0;
181 insert_segment = false;
182 rp->m_integrator.solve(*rp->m_v, x0, t0, rp->m_btau, callback);
183 insert_segment = false;
184 rp->m_integrator.solve(*rp->m_v, x0, t0, rp->m_ftau, callback);
185 }
186 rp->m_integration_going_on = false;
187 };
188 //work();
189 this->scene().window().do_async(work);
190 }
191 //----------------------------------------------------------------------------
192 void on_pin_connected(ui::input_pin& /*this_pin*/,
193 ui::output_pin& other_pin) override {
194 if (other_pin.type() == typeid(axis_aligned_bounding_box<N>)) {
196 dynamic_cast<axis_aligned_bounding_box<N>*>(&other_pin.node());
197 } else if ((other_pin.type() == typeid(vectorfield_t))) {
198 m_v = dynamic_cast<vectorfield_t*>(&other_pin.node());
199 }
200 if (m_boundingbox != nullptr && m_v != nullptr) {
202 }
203 }
204 //----------------------------------------------------------------------------
205 void on_pin_disconnected(ui::input_pin& /*this_pin*/) override {
206 m_gpu_data.clear();
207 }
208 //----------------------------------------------------------------------------
209 bool is_transparent() const override {
210 return m_animate || m_general_alpha < 1;
211 }
212};
214//==============================================================================
215} // namespace tatooine::flowexplorer::nodes
216//==============================================================================
219 TATOOINE_REFLECTION_INSERT_METHOD(number_of_path_lines, m_num_pathlines),
220 TATOOINE_REFLECTION_INSERT_METHOD(backward_tau, m_btau),
221 TATOOINE_REFLECTION_INSERT_METHOD(forward_tau, m_ftau),
222 TATOOINE_REFLECTION_INSERT_METHOD(line_width, m_line_width),
223 TATOOINE_REFLECTION_INSERT_METHOD(contour_width, m_contour_width),
224 TATOOINE_REFLECTION_INSERT_METHOD(ambient_factor, m_ambient_factor),
225 TATOOINE_REFLECTION_INSERT_METHOD(diffuse_factor, m_diffuse_factor),
226 TATOOINE_REFLECTION_INSERT_METHOD(specular_factor, m_specular_factor),
227 TATOOINE_REFLECTION_INSERT_METHOD(shininess, m_shininess),
228 TATOOINE_REFLECTION_INSERT_METHOD(line_color, m_line_color),
229 TATOOINE_REFLECTION_INSERT_METHOD(contour_color, m_contour_color),
230 TATOOINE_REFLECTION_INSERT_METHOD(animate, m_animate),
231 TATOOINE_REFLECTION_INSERT_METHOD(play, m_play),
232 TATOOINE_REFLECTION_INSERT_METHOD(animation_min_alpha,
233 m_animation_min_alpha),
234 TATOOINE_REFLECTION_INSERT_METHOD(fade_length, m_fade_length),
235 TATOOINE_REFLECTION_INSERT_METHOD(speed, m_speed),
236 TATOOINE_REFLECTION_INSERT_METHOD(time, m_time),
237 TATOOINE_REFLECTION_INSERT_METHOD(general_alpha, m_general_alpha))
238#endif
Definition: indexeddata.h:13
TATOOINE_FLOWEXPLORER_REGISTER_RENDERABLE(tatooine::flowexplorer::nodes::aabb2d, TATOOINE_REFLECTION_INSERT_GETTER(min), TATOOINE_REFLECTION_INSERT_GETTER(max), TATOOINE_REFLECTION_INSERT_GETTER(line_width), TATOOINE_REFLECTION_INSERT_GETTER(line_color))
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
Definition: abcflow.h:7
auto constexpr index(handle< Child, Int > const h)
Definition: handle.h:119
Definition: axis_aligned_bounding_box.h:15
Definition: random_pathlines.h:14
float m_line_color[3]
Definition: random_pathlines.h:30
bool m_animate
Definition: random_pathlines.h:38
std::unique_ptr< gpu::line_shader > m_shader
Definition: random_pathlines.h:25
void on_pin_connected(ui::input_pin &, ui::output_pin &other_pin) override
Definition: random_pathlines.h:192
bool m_play
Definition: random_pathlines.h:39
gl::indexeddata< vec< float, 3 >, vec< float, 3 >, float > m_gpu_data
Definition: random_pathlines.h:26
int m_num_pathlines
Definition: random_pathlines.h:29
void update(std::chrono::duration< double > const &dt) override
Definition: random_pathlines.h:86
float m_fade_length
Definition: random_pathlines.h:40
float m_ambient_factor
Definition: random_pathlines.h:34
float m_time
Definition: random_pathlines.h:43
axis_aligned_bounding_box< N > * m_boundingbox
Definition: random_pathlines.h:23
float m_shininess
Definition: random_pathlines.h:37
float m_contour_width
Definition: random_pathlines.h:33
void update_shader(mat4f const &projection_matrix, mat4f const &view_matrix)
Definition: random_pathlines.h:128
vectorfield_t const * m_v
Definition: random_pathlines.h:22
float m_speed
Definition: random_pathlines.h:44
float m_contour_color[3]
Definition: random_pathlines.h:31
float m_line_width
Definition: random_pathlines.h:32
float m_specular_factor
Definition: random_pathlines.h:36
float m_animation_min_alpha
Definition: random_pathlines.h:42
float m_general_alpha
Definition: random_pathlines.h:41
void on_pin_disconnected(ui::input_pin &) override
Definition: random_pathlines.h:205
void render(mat< float, 4, 4 > const &projection_matrix, mat< float, 4, 4 > const &view_matrix) override
Definition: random_pathlines.h:77
double m_ftau
Definition: random_pathlines.h:28
double m_btau
Definition: random_pathlines.h:28
void integrate_lines()
Definition: random_pathlines.h:147
bool m_integration_going_on
Definition: random_pathlines.h:45
bool is_transparent() const override
Definition: random_pathlines.h:209
float m_diffuse_factor
Definition: random_pathlines.h:35
auto draw_properties() -> bool override
Definition: random_pathlines.h:101
integrator_t m_integrator
Definition: random_pathlines.h:24
random_pathlines(flowexplorer::scene &s)
Definition: random_pathlines.h:47
Definition: renderable.h:42
Definition: scene.h:17
auto scene() const -> auto const &
Definition: node.h:72
virtual auto type() const -> std::type_info const &=0
auto node() const -> auto const &
Definition: pin.h:29
Definition: mat.h:14
Definition: field.h:13
Definition: vec.h:12