1#ifndef TATOOINE_FLOWEXPLORER_NODES_RECTILINEAR_GRID_H
2#define TATOOINE_FLOWEXPLORER_NODES_RECTILINEAR_GRID_H
4#include <tatooine/flowexplorer/line_shader.h>
21 auto& shader = line_shader::get();
23 shader.set_projection_matrix(P);
24 shader.set_modelview_matrix(V);
25 shader.set_color(0.8, 0.8, 0.8, 1);
27 shader.set_color(0, 0, 0, 1);
32 m_inner_geometry.
clear();
33 m_outer_geometry.
clear();
34 auto const& dim0 = this->
template dimension<0>();
35 auto const& dim1 = this->
template dimension<1>();
40 vec3f{
static_cast<float>(dim0.front()),
41 static_cast<float>(dim1.front()), 0.0f});
43 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(dim1.back()),
49 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.front()),
52 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.back()),
58 vec3f{
static_cast<float>(dim0.front()),
59 static_cast<float>(dim1.front()), 0.0f});
61 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.front()),
67 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(dim1.back()),
70 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.back()),
76 for (
size_t i = 1; i < dim0.size() - 1; ++i) {
77 auto const x = dim0[i];
79 vec3f{
static_cast<float>(x),
static_cast<float>(dim1.front()), 0.0f});
81 vec3f{
static_cast<float>(x),
static_cast<float>(dim1.back()), 0.0f});
85 for (
size_t i = 1; i < dim1.size() - 1; ++i) {
86 auto const x = dim1[i];
88 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(x), 0.0f});
90 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(x), 0.0f});
108 auto& shader = line_shader::get();
110 shader.set_projection_matrix(P);
111 shader.set_modelview_matrix(V);
113 shader.set_color(0.8, 0.8, 0.8, 1);
114 auto const& dim0 = this->
template dimension<0>();
115 auto const& dim1 = this->
template dimension<1>();
116 auto const& dim2 = this->
template dimension<2>();
118 vec3f left{dim0.front(), (dim1.front() + dim1.back()) * 2,
119 (dim2.front() + dim2.back()) * 2};
120 vec3f right{dim0.back(), (dim1.front() + dim1.back()) * 2,
121 (dim2.front() + dim2.back()) * 2};
122 vec3f bottom{(dim0.front() + dim0.back()) * 2, dim1.front(),
123 (dim2.front() + dim2.back()) * 2};
124 vec3f top{(dim0.front() + dim0.back()) * 2, dim1.back(),
125 (dim2.front() + dim2.back()) * 2};
127 (dim1.front() + dim1.back()) * 2, dim2.front()};
128 vec3f back{(dim0.front() + dim0.back()) * 2,
129 (dim1.front() + dim1.back()) * 2, dim2.back()};
149 shader.set_color(0, 0, 0, 1);
154 m_left_geometry.
clear();
155 m_right_geometry.
clear();
156 m_bottom_geometry.
clear();
157 m_top_geometry.
clear();
158 m_front_geometry.
clear();
159 m_back_geometry.
clear();
160 m_outer_geometry.
clear();
161 auto const& dim0 = this->
template dimension<0>();
162 auto const& dim1 = this->
template dimension<1>();
163 auto const& dim2 = this->
template dimension<2>();
168 static_cast<float>(dim0.front()),
static_cast<float>(dim1.front()),
169 static_cast<float>(dim2.front())});
171 static_cast<float>(dim0.front()),
static_cast<float>(dim1.front()),
172 static_cast<float>(dim2.back())});
177 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(dim1.back()),
178 static_cast<float>(dim2.front())});
180 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(dim1.back()),
181 static_cast<float>(dim2.back())});
186 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.front()),
187 static_cast<float>(dim2.front())});
189 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.front()),
190 static_cast<float>(dim2.back())});
195 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.back()),
196 static_cast<float>(dim2.front())});
198 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.back()),
199 static_cast<float>(dim2.back())});
205 static_cast<float>(dim0.front()),
static_cast<float>(dim1.front()),
206 static_cast<float>(dim2.front())});
208 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(dim1.back()),
209 static_cast<float>(dim2.front())});
214 static_cast<float>(dim0.front()),
static_cast<float>(dim1.front()),
215 static_cast<float>(dim2.back())});
217 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(dim1.back()),
218 static_cast<float>(dim2.back())});
223 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.front()),
224 static_cast<float>(dim2.front())});
226 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.back()),
227 static_cast<float>(dim2.front())});
232 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.front()),
233 static_cast<float>(dim2.back())});
235 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.back()),
236 static_cast<float>(dim2.back())});
242 static_cast<float>(dim0.front()),
static_cast<float>(dim1.front()),
243 static_cast<float>(dim2.front())});
245 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.front()),
246 static_cast<float>(dim2.front())});
251 static_cast<float>(dim0.front()),
static_cast<float>(dim1.front()),
252 static_cast<float>(dim2.back())});
254 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.front()),
255 static_cast<float>(dim2.back())});
260 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(dim1.back()),
261 static_cast<float>(dim2.front())});
263 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.back()),
264 static_cast<float>(dim2.front())});
269 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(dim1.back()),
270 static_cast<float>(dim2.back())});
272 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(dim1.back()),
273 static_cast<float>(dim2.back())});
278 for (
size_t i = 1; i < dim0.size() - 1; ++i) {
279 auto const x = dim0[i];
281 vec3f{
static_cast<float>(x),
static_cast<float>(dim1.front()),
284 vec3f{
static_cast<float>(x),
static_cast<float>(dim1.back()),
289 for (
size_t i = 1; i < dim1.size() - 1; ++i) {
290 auto const x = dim1[i];
292 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(x),
295 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(x),
301 for (
size_t i = 1; i < dim0.size() - 1; ++i) {
302 auto const x = dim0[i];
304 vec3f{
static_cast<float>(x),
static_cast<float>(dim1.front()),
307 static_cast<float>(x),
static_cast<float>(dim1.back()), dim2.back()});
311 for (
size_t i = 1; i < dim1.size() - 1; ++i) {
312 auto const x = dim1[i];
314 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(x),
317 static_cast<float>(dim0.back()),
static_cast<float>(x), dim2.back()});
323 for (
size_t i = 1; i < dim0.size() - 1; ++i) {
324 auto const x = dim0[i];
326 vec3f{
static_cast<float>(x),
static_cast<float>(dim1.front()),
329 vec3f{
static_cast<float>(x),
static_cast<float>(dim1.front()),
334 for (
size_t i = 1; i < dim2.size() - 1; ++i) {
335 auto const x = dim2[i];
337 vec3f{
static_cast<float>(dim0.front()), dim1.front(),
338 static_cast<float>(x)});
340 vec3f{
static_cast<float>(dim0.back()), dim1.front(),
341 static_cast<float>(x)});
346 for (
size_t i = 1; i < dim0.size() - 1; ++i) {
347 auto const x = dim0[i];
349 vec3f{
static_cast<float>(x),
static_cast<float>(dim1.back()),
352 static_cast<float>(x),
static_cast<float>(dim1.back()), dim2.back()});
356 for (
size_t i = 1; i < dim2.size() - 1; ++i) {
357 auto const x = dim2[i];
359 vec3f{
static_cast<float>(dim0.front()), dim1.back(),
360 static_cast<float>(x)});
362 static_cast<float>(dim0.back()), dim1.back(),
static_cast<float>(x)});
368 for (
size_t i = 1; i < dim1.size() - 1; ++i) {
369 auto const x = dim1[i];
371 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(x),
374 vec3f{
static_cast<float>(dim0.front()),
static_cast<float>(x),
379 for (
size_t i = 1; i < dim2.size() - 1; ++i) {
380 auto const x = dim2[i];
382 vec3f{
static_cast<float>(dim0.front()), dim1.front(),
383 static_cast<float>(x)});
385 vec3f{
static_cast<float>(dim0.front()), dim1.back(),
386 static_cast<float>(x)});
391 for (
size_t i = 1; i < dim1.size() - 1; ++i) {
392 auto const x = dim1[i];
394 vec3f{
static_cast<float>(dim0.back()),
static_cast<float>(x),
397 static_cast<float>(dim0.back()),
static_cast<float>(x), dim2.back()});
401 for (
size_t i = 1; i < dim2.size() - 1; ++i) {
402 auto const x = dim2[i];
404 vec3f{
static_cast<float>(dim0.back()), dim1.front(),
405 static_cast<float>(x)});
407 static_cast<float>(dim0.back()), dim1.back(),
static_cast<float>(x)});
420 "Rectilinear Grid", s,
423 for (
size_t i = 0; i < N; ++i) {
425 &this->
template insert_input_pin<linspace<real_type>>(
"dim");
430 if (!all_pins_linked()) {
433 for (
size_t i = 0; i < N; ++i) {
434 if (dimension(i).
size() < 1) {
438 if constexpr (N == 3) {
446 bool all_linked =
true;
447 for (
size_t i = 0; i < N; ++i) {
448 if (!m_input_pins[i]->is_linked()) {
459 return this->
template dimension<0>();
462 return this->
template dimension<1>();
464 if constexpr (N > 2) {
466 return this->
template dimension<2>();
469 return this->
template dimension<0>();
474 for (
auto ptr : m_input_pins) {
476 if (pin.is_linked()) {
478 auto& data = pin.template get_linked_as<linspace<real_type>>();
479 auto& d = dimension(i);
481 boost::copy(data, std::back_inserter(d));
486 if (all_pins_linked()) {
487 for (
size_t i = 0; i < N; ++i) {
488 if (dimension(i).
size() < 1) {
492 this->update_geometry();
493 this->notify_property_changed(
false);
498 for (
size_t i = 0; i < N; ++i) {
499 if (&p == m_input_pins[i]) {
502 auto& d = dimension(i);
504 boost::copy(data, std::back_inserter(d));
510 if (all_pins_linked()) {
511 for (
size_t i = 0; i < N; ++i) {
512 if (dimension(i).
size() < 1) {
516 this->update_geometry();
517 this->notify_property_changed(
false);
522 if (!this->vertex_properties().empty()) {
525 ImGui::Text(
"Vertex Properties");
527 for (
auto const& [name, prop] : this->vertex_properties()) {
528 ImGui::TextUnformatted(name.data());
537 ImGui::Text(
"Write to file");
539 bool write_pushed = ImGui::Button(
"write to file");
541 this->
scene().
window().open_file_explorer_write(*
this);
551 for (
auto pin : m_input_pins) {
552 if (!pin->is_linked()) {
Definition: indexeddata.h:13
auto indexbuffer() -> auto &
Definition: indexeddata.h:145
void clear()
Definition: indexeddata.h:71
void draw_lines() const
Definition: indexeddata.h:95
auto vertexbuffer() -> auto &
Definition: indexeddata.h:148
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))
auto write(Lines const &lines, filesystem::path const &path) -> void
Definition: write.h:218
auto vertices(pointset< Real, NumDimensions > const &ps)
Definition: vertex_container.h:278
detail::rectilinear_grid::creator_t< std::vector< Real >, N > nonuniform_rectilinear_grid
Definition: rectilinear_grid.h:1922
constexpr auto normalize(base_tensor< Tensor, T, N > const &t_in) -> vec< T, N >
Definition: tensor_operations.h:100
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148
constexpr auto dot(base_tensor< Tensor0, T0, N > const &lhs, base_tensor< Tensor1, T1, N > const &rhs)
Definition: tensor_operations.h:120
auto back(linspace< Real > const &l)
Definition: linspace.h:136
auto front(linspace< Real > const &l)
Definition: linspace.h:126
auto update_geometry()
Definition: rectilinear_grid.h:31
auto render(mat4f const &P, mat4f const &V) -> void
Definition: rectilinear_grid.h:20
gl::indexeddata< vec3f > m_inner_geometry
Definition: rectilinear_grid.h:17
gl::indexeddata< vec3f > m_outer_geometry
Definition: rectilinear_grid.h:18
gl::indexeddata< vec3f > m_left_geometry
Definition: rectilinear_grid.h:100
gl::indexeddata< vec3f > m_bottom_geometry
Definition: rectilinear_grid.h:103
auto update_geometry()
Definition: rectilinear_grid.h:153
gl::indexeddata< vec3f > m_outer_geometry
Definition: rectilinear_grid.h:99
gl::indexeddata< vec3f > m_top_geometry
Definition: rectilinear_grid.h:102
gl::indexeddata< vec3f > m_back_geometry
Definition: rectilinear_grid.h:105
auto render(mat4f const &P, mat4f const &V, vec3f const &eye) -> void
Definition: rectilinear_grid.h:107
gl::indexeddata< vec3f > m_right_geometry
Definition: rectilinear_grid.h:101
gl::indexeddata< vec3f > m_front_geometry
Definition: rectilinear_grid.h:104
Definition: rectilinear_grid.h:13
Definition: rectilinear_grid.h:415
rectilinear_grid(flowexplorer::scene &s)
Definition: rectilinear_grid.h:418
auto all_pins_linked() const -> bool
Definition: rectilinear_grid.h:445
auto all_input_pins_linked() -> bool
Definition: rectilinear_grid.h:550
std::array< ui::input_pin *, N > m_input_pins
Definition: rectilinear_grid.h:416
auto dimension(size_t i) -> auto &
Definition: rectilinear_grid.h:457
auto on_pin_connected(ui::input_pin &p, ui::output_pin &) -> void override
Definition: rectilinear_grid.h:497
auto draw_properties() -> bool override
Definition: rectilinear_grid.h:521
auto render(mat4f const &P, mat4f const &V) -> void override
Definition: rectilinear_grid.h:429
auto on_property_changed() -> void override
Definition: rectilinear_grid.h:472
auto on_path_selected(std::string const &path) -> void override
Definition: rectilinear_grid.h:547
Definition: renderable.h:42
auto window() const -> auto const &
Definition: scene.h:51
auto render()
Definition: axis_aligned_bounding_box2.h:59