Tatooine
rectilinear_grid.h
Go to the documentation of this file.
1#ifndef TATOOINE_FLOWEXPLORER_NODES_RECTILINEAR_GRID_H
2#define TATOOINE_FLOWEXPLORER_NODES_RECTILINEAR_GRID_H
3//==============================================================================
4#include <tatooine/flowexplorer/line_shader.h>
7#include <tatooine/linspace.h>
9//==============================================================================
11//==============================================================================
12template <size_t N>
14template <>
19 //----------------------------------------------------------------------------
20 auto render(mat4f const& P, mat4f const& V) -> void {
21 auto& shader = line_shader::get();
22 shader.bind();
23 shader.set_projection_matrix(P);
24 shader.set_modelview_matrix(V);
25 shader.set_color(0.8, 0.8, 0.8, 1);
26 m_inner_geometry.draw_lines();
27 shader.set_color(0, 0, 0, 1);
28 m_outer_geometry.draw_lines();
29 }
30 //----------------------------------------------------------------------------
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>();
36
37 size_t j = 0;
38 // left
39 m_outer_geometry.vertexbuffer().push_back(
40 vec3f{static_cast<float>(dim0.front()),
41 static_cast<float>(dim1.front()), 0.0f});
42 m_outer_geometry.vertexbuffer().push_back(
43 vec3f{static_cast<float>(dim0.front()), static_cast<float>(dim1.back()),
44 0.0f});
45 m_outer_geometry.indexbuffer().push_back(j++);
46 m_outer_geometry.indexbuffer().push_back(j++);
47 // right
48 m_outer_geometry.vertexbuffer().push_back(
49 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.front()),
50 0.0f});
51 m_outer_geometry.vertexbuffer().push_back(
52 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.back()),
53 0.0f});
54 m_outer_geometry.indexbuffer().push_back(j++);
55 m_outer_geometry.indexbuffer().push_back(j++);
56 // bottom
57 m_outer_geometry.vertexbuffer().push_back(
58 vec3f{static_cast<float>(dim0.front()),
59 static_cast<float>(dim1.front()), 0.0f});
60 m_outer_geometry.vertexbuffer().push_back(
61 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.front()),
62 0.0f});
63 m_outer_geometry.indexbuffer().push_back(j++);
64 m_outer_geometry.indexbuffer().push_back(j++);
65 // top
66 m_outer_geometry.vertexbuffer().push_back(
67 vec3f{static_cast<float>(dim0.front()), static_cast<float>(dim1.back()),
68 0.0f});
69 m_outer_geometry.vertexbuffer().push_back(
70 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.back()),
71 0.0f});
72 m_outer_geometry.indexbuffer().push_back(j++);
73 m_outer_geometry.indexbuffer().push_back(j++);
74
75 j = 0;
76 for (size_t i = 1; i < dim0.size() - 1; ++i) {
77 auto const x = dim0[i];
78 m_inner_geometry.vertexbuffer().push_back(
79 vec3f{static_cast<float>(x), static_cast<float>(dim1.front()), 0.0f});
80 m_inner_geometry.vertexbuffer().push_back(
81 vec3f{static_cast<float>(x), static_cast<float>(dim1.back()), 0.0f});
82 m_inner_geometry.indexbuffer().push_back(j++);
83 m_inner_geometry.indexbuffer().push_back(j++);
84 }
85 for (size_t i = 1; i < dim1.size() - 1; ++i) {
86 auto const x = dim1[i];
87 m_inner_geometry.vertexbuffer().push_back(
88 vec3f{static_cast<float>(dim0.front()), static_cast<float>(x), 0.0f});
89 m_inner_geometry.vertexbuffer().push_back(
90 vec3f{static_cast<float>(dim0.back()), static_cast<float>(x), 0.0f});
91 m_inner_geometry.indexbuffer().push_back(j++);
92 m_inner_geometry.indexbuffer().push_back(j++);
93 }
94 }
95};
96template <>
106 //----------------------------------------------------------------------------
107 auto render(mat4f const& P, mat4f const& V, vec3f const& eye) -> void {
108 auto& shader = line_shader::get();
109 shader.bind();
110 shader.set_projection_matrix(P);
111 shader.set_modelview_matrix(V);
112
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>();
117
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};
126 vec3f front{(dim0.front() + dim0.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()};
130 if (dot(normalize(left - eye), vec3f{-1, 0, 0}) < 0) {
131 m_left_geometry.draw_lines();
132 }
133 if (dot(normalize(right - eye), vec3f{1, 0, 0}) < 0) {
134 m_right_geometry.draw_lines();
135 }
136 if (dot(normalize(bottom - eye), vec3f{0, -1, 0}) < 0) {
137 m_bottom_geometry.draw_lines();
138 }
139 if (dot(normalize(top - eye), vec3f{0, 1, 0}) < 0) {
140 m_top_geometry.draw_lines();
141 }
142 if (dot(normalize(front - eye), vec3f{0, 0, -1}) < 0) {
143 m_front_geometry.draw_lines();
144 }
145 if (dot(normalize(back - eye), vec3f{0, 0, 1}) < 0) {
146 m_back_geometry.draw_lines();
147 }
148
149 shader.set_color(0, 0, 0, 1);
150 m_outer_geometry.draw_lines();
151 }
152 //----------------------------------------------------------------------------
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>();
164
165 size_t j = 0;
166 // left
167 m_outer_geometry.vertexbuffer().push_back(vec3f{
168 static_cast<float>(dim0.front()), static_cast<float>(dim1.front()),
169 static_cast<float>(dim2.front())});
170 m_outer_geometry.vertexbuffer().push_back(vec3f{
171 static_cast<float>(dim0.front()), static_cast<float>(dim1.front()),
172 static_cast<float>(dim2.back())});
173 m_outer_geometry.indexbuffer().push_back(j++);
174 m_outer_geometry.indexbuffer().push_back(j++);
175 // left
176 m_outer_geometry.vertexbuffer().push_back(
177 vec3f{static_cast<float>(dim0.front()), static_cast<float>(dim1.back()),
178 static_cast<float>(dim2.front())});
179 m_outer_geometry.vertexbuffer().push_back(
180 vec3f{static_cast<float>(dim0.front()), static_cast<float>(dim1.back()),
181 static_cast<float>(dim2.back())});
182 m_outer_geometry.indexbuffer().push_back(j++);
183 m_outer_geometry.indexbuffer().push_back(j++);
184 // left
185 m_outer_geometry.vertexbuffer().push_back(
186 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.front()),
187 static_cast<float>(dim2.front())});
188 m_outer_geometry.vertexbuffer().push_back(
189 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.front()),
190 static_cast<float>(dim2.back())});
191 m_outer_geometry.indexbuffer().push_back(j++);
192 m_outer_geometry.indexbuffer().push_back(j++);
193 // left
194 m_outer_geometry.vertexbuffer().push_back(
195 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.back()),
196 static_cast<float>(dim2.front())});
197 m_outer_geometry.vertexbuffer().push_back(
198 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.back()),
199 static_cast<float>(dim2.back())});
200 m_outer_geometry.indexbuffer().push_back(j++);
201 m_outer_geometry.indexbuffer().push_back(j++);
202
203 // left
204 m_outer_geometry.vertexbuffer().push_back(vec3f{
205 static_cast<float>(dim0.front()), static_cast<float>(dim1.front()),
206 static_cast<float>(dim2.front())});
207 m_outer_geometry.vertexbuffer().push_back(
208 vec3f{static_cast<float>(dim0.front()), static_cast<float>(dim1.back()),
209 static_cast<float>(dim2.front())});
210 m_outer_geometry.indexbuffer().push_back(j++);
211 m_outer_geometry.indexbuffer().push_back(j++);
212 // left
213 m_outer_geometry.vertexbuffer().push_back(vec3f{
214 static_cast<float>(dim0.front()), static_cast<float>(dim1.front()),
215 static_cast<float>(dim2.back())});
216 m_outer_geometry.vertexbuffer().push_back(
217 vec3f{static_cast<float>(dim0.front()), static_cast<float>(dim1.back()),
218 static_cast<float>(dim2.back())});
219 m_outer_geometry.indexbuffer().push_back(j++);
220 m_outer_geometry.indexbuffer().push_back(j++);
221 // left
222 m_outer_geometry.vertexbuffer().push_back(
223 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.front()),
224 static_cast<float>(dim2.front())});
225 m_outer_geometry.vertexbuffer().push_back(
226 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.back()),
227 static_cast<float>(dim2.front())});
228 m_outer_geometry.indexbuffer().push_back(j++);
229 m_outer_geometry.indexbuffer().push_back(j++);
230 // left
231 m_outer_geometry.vertexbuffer().push_back(
232 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.front()),
233 static_cast<float>(dim2.back())});
234 m_outer_geometry.vertexbuffer().push_back(
235 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.back()),
236 static_cast<float>(dim2.back())});
237 m_outer_geometry.indexbuffer().push_back(j++);
238 m_outer_geometry.indexbuffer().push_back(j++);
239
240 // left
241 m_outer_geometry.vertexbuffer().push_back(vec3f{
242 static_cast<float>(dim0.front()), static_cast<float>(dim1.front()),
243 static_cast<float>(dim2.front())});
244 m_outer_geometry.vertexbuffer().push_back(
245 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.front()),
246 static_cast<float>(dim2.front())});
247 m_outer_geometry.indexbuffer().push_back(j++);
248 m_outer_geometry.indexbuffer().push_back(j++);
249 // left
250 m_outer_geometry.vertexbuffer().push_back(vec3f{
251 static_cast<float>(dim0.front()), static_cast<float>(dim1.front()),
252 static_cast<float>(dim2.back())});
253 m_outer_geometry.vertexbuffer().push_back(
254 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.front()),
255 static_cast<float>(dim2.back())});
256 m_outer_geometry.indexbuffer().push_back(j++);
257 m_outer_geometry.indexbuffer().push_back(j++);
258 // left
259 m_outer_geometry.vertexbuffer().push_back(
260 vec3f{static_cast<float>(dim0.front()), static_cast<float>(dim1.back()),
261 static_cast<float>(dim2.front())});
262 m_outer_geometry.vertexbuffer().push_back(
263 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.back()),
264 static_cast<float>(dim2.front())});
265 m_outer_geometry.indexbuffer().push_back(j++);
266 m_outer_geometry.indexbuffer().push_back(j++);
267 // left
268 m_outer_geometry.vertexbuffer().push_back(
269 vec3f{static_cast<float>(dim0.front()), static_cast<float>(dim1.back()),
270 static_cast<float>(dim2.back())});
271 m_outer_geometry.vertexbuffer().push_back(
272 vec3f{static_cast<float>(dim0.back()), static_cast<float>(dim1.back()),
273 static_cast<float>(dim2.back())});
274 m_outer_geometry.indexbuffer().push_back(j++);
275 m_outer_geometry.indexbuffer().push_back(j++);
276
277 j = 0;
278 for (size_t i = 1; i < dim0.size() - 1; ++i) {
279 auto const x = dim0[i];
280 m_front_geometry.vertexbuffer().push_back(
281 vec3f{static_cast<float>(x), static_cast<float>(dim1.front()),
282 dim2.front()});
283 m_front_geometry.vertexbuffer().push_back(
284 vec3f{static_cast<float>(x), static_cast<float>(dim1.back()),
285 dim2.front()});
286 m_front_geometry.indexbuffer().push_back(j++);
287 m_front_geometry.indexbuffer().push_back(j++);
288 }
289 for (size_t i = 1; i < dim1.size() - 1; ++i) {
290 auto const x = dim1[i];
291 m_front_geometry.vertexbuffer().push_back(
292 vec3f{static_cast<float>(dim0.front()), static_cast<float>(x),
293 dim2.front()});
294 m_front_geometry.vertexbuffer().push_back(
295 vec3f{static_cast<float>(dim0.back()), static_cast<float>(x),
296 dim2.front()});
297 m_front_geometry.indexbuffer().push_back(j++);
298 m_front_geometry.indexbuffer().push_back(j++);
299 }
300 j = 0;
301 for (size_t i = 1; i < dim0.size() - 1; ++i) {
302 auto const x = dim0[i];
303 m_back_geometry.vertexbuffer().push_back(
304 vec3f{static_cast<float>(x), static_cast<float>(dim1.front()),
305 dim2.back()});
306 m_back_geometry.vertexbuffer().push_back(vec3f{
307 static_cast<float>(x), static_cast<float>(dim1.back()), dim2.back()});
308 m_back_geometry.indexbuffer().push_back(j++);
309 m_back_geometry.indexbuffer().push_back(j++);
310 }
311 for (size_t i = 1; i < dim1.size() - 1; ++i) {
312 auto const x = dim1[i];
313 m_back_geometry.vertexbuffer().push_back(
314 vec3f{static_cast<float>(dim0.front()), static_cast<float>(x),
315 dim2.back()});
316 m_back_geometry.vertexbuffer().push_back(vec3f{
317 static_cast<float>(dim0.back()), static_cast<float>(x), dim2.back()});
318 m_back_geometry.indexbuffer().push_back(j++);
319 m_back_geometry.indexbuffer().push_back(j++);
320 }
321
322 j = 0;
323 for (size_t i = 1; i < dim0.size() - 1; ++i) {
324 auto const x = dim0[i];
325 m_bottom_geometry.vertexbuffer().push_back(
326 vec3f{static_cast<float>(x), static_cast<float>(dim1.front()),
327 dim2.front()});
328 m_bottom_geometry.vertexbuffer().push_back(
329 vec3f{static_cast<float>(x), static_cast<float>(dim1.front()),
330 dim2.back()});
331 m_bottom_geometry.indexbuffer().push_back(j++);
332 m_bottom_geometry.indexbuffer().push_back(j++);
333 }
334 for (size_t i = 1; i < dim2.size() - 1; ++i) {
335 auto const x = dim2[i];
336 m_bottom_geometry.vertexbuffer().push_back(
337 vec3f{static_cast<float>(dim0.front()), dim1.front(),
338 static_cast<float>(x)});
339 m_bottom_geometry.vertexbuffer().push_back(
340 vec3f{static_cast<float>(dim0.back()), dim1.front(),
341 static_cast<float>(x)});
342 m_bottom_geometry.indexbuffer().push_back(j++);
343 m_bottom_geometry.indexbuffer().push_back(j++);
344 }
345 j = 0;
346 for (size_t i = 1; i < dim0.size() - 1; ++i) {
347 auto const x = dim0[i];
348 m_top_geometry.vertexbuffer().push_back(
349 vec3f{static_cast<float>(x), static_cast<float>(dim1.back()),
350 dim2.front()});
351 m_top_geometry.vertexbuffer().push_back(vec3f{
352 static_cast<float>(x), static_cast<float>(dim1.back()), dim2.back()});
353 m_top_geometry.indexbuffer().push_back(j++);
354 m_top_geometry.indexbuffer().push_back(j++);
355 }
356 for (size_t i = 1; i < dim2.size() - 1; ++i) {
357 auto const x = dim2[i];
358 m_top_geometry.vertexbuffer().push_back(
359 vec3f{static_cast<float>(dim0.front()), dim1.back(),
360 static_cast<float>(x)});
361 m_top_geometry.vertexbuffer().push_back(vec3f{
362 static_cast<float>(dim0.back()), dim1.back(), static_cast<float>(x)});
363 m_top_geometry.indexbuffer().push_back(j++);
364 m_top_geometry.indexbuffer().push_back(j++);
365 }
366
367 j = 0;
368 for (size_t i = 1; i < dim1.size() - 1; ++i) {
369 auto const x = dim1[i];
370 m_left_geometry.vertexbuffer().push_back(
371 vec3f{static_cast<float>(dim0.front()), static_cast<float>(x),
372 dim2.front()});
373 m_left_geometry.vertexbuffer().push_back(
374 vec3f{static_cast<float>(dim0.front()), static_cast<float>(x),
375 dim2.back()});
376 m_left_geometry.indexbuffer().push_back(j++);
377 m_left_geometry.indexbuffer().push_back(j++);
378 }
379 for (size_t i = 1; i < dim2.size() - 1; ++i) {
380 auto const x = dim2[i];
381 m_left_geometry.vertexbuffer().push_back(
382 vec3f{static_cast<float>(dim0.front()), dim1.front(),
383 static_cast<float>(x)});
384 m_left_geometry.vertexbuffer().push_back(
385 vec3f{static_cast<float>(dim0.front()), dim1.back(),
386 static_cast<float>(x)});
387 m_left_geometry.indexbuffer().push_back(j++);
388 m_left_geometry.indexbuffer().push_back(j++);
389 }
390 j = 0;
391 for (size_t i = 1; i < dim1.size() - 1; ++i) {
392 auto const x = dim1[i];
393 m_right_geometry.vertexbuffer().push_back(
394 vec3f{static_cast<float>(dim0.back()), static_cast<float>(x),
395 dim2.front()});
396 m_right_geometry.vertexbuffer().push_back(vec3f{
397 static_cast<float>(dim0.back()), static_cast<float>(x), dim2.back()});
398 m_right_geometry.indexbuffer().push_back(j++);
399 m_right_geometry.indexbuffer().push_back(j++);
400 }
401 for (size_t i = 1; i < dim2.size() - 1; ++i) {
402 auto const x = dim2[i];
403 m_right_geometry.vertexbuffer().push_back(
404 vec3f{static_cast<float>(dim0.back()), dim1.front(),
405 static_cast<float>(x)});
406 m_right_geometry.vertexbuffer().push_back(vec3f{
407 static_cast<float>(dim0.back()), dim1.back(), static_cast<float>(x)});
408 m_right_geometry.indexbuffer().push_back(j++);
409 m_right_geometry.indexbuffer().push_back(j++);
410 }
411 }
412};
413template <size_t N>
416 std::array<ui::input_pin*, N> m_input_pins;
417 //============================================================================
420 "Rectilinear Grid", s,
422 this)} {
423 for (size_t i = 0; i < N; ++i) {
424 m_input_pins[i] =
425 &this->template insert_input_pin<linspace<real_type>>("dim");
426 }
427 }
428 //----------------------------------------------------------------------------
429 auto render(mat4f const& P, mat4f const& V) -> void override {
430 if (!all_pins_linked()) {
431 return;
432 }
433 for (size_t i = 0; i < N; ++i) {
434 if (dimension(i).size() < 1) {
435 return;
436 }
437 }
438 if constexpr (N == 3) {
439 rectilinear_grid_renderer<N>::render(P, V, this->scene().camera().eye());
440 } else {
442 }
443 }
444 //----------------------------------------------------------------------------
445 auto all_pins_linked() const -> bool {
446 bool all_linked = true;
447 for (size_t i = 0; i < N; ++i) {
448 if (!m_input_pins[i]->is_linked()) {
449 all_linked = false;
450 break;
451 }
452 }
453 return all_linked;
454 }
455 //----------------------------------------------------------------------------
456 using nonuniform_rectilinear_grid<real_type, N>::dimension;
457 auto dimension(size_t i) -> auto& {
458 if (i == 0) {
459 return this->template dimension<0>();
460 }
461 if (i == 1) {
462 return this->template dimension<1>();
463 }
464 if constexpr (N > 2) {
465 if (i == 2) {
466 return this->template dimension<2>();
467 }
468 }
469 return this->template dimension<0>();
470 }
471 //----------------------------------------------------------------------------
472 auto on_property_changed() -> void override {
473 size_t i = 0;
474 for (auto ptr : m_input_pins) {
475 auto& pin = *ptr;
476 if (pin.is_linked()) {
477 if (pin.linked_type() == typeid(linspace<real_type>)) {
478 auto& data = pin.template get_linked_as<linspace<real_type>>();
479 auto& d = dimension(i);
480 d.clear();
481 boost::copy(data, std::back_inserter(d));
482 }
483 }
484 ++i;
485 }
486 if (all_pins_linked()) {
487 for (size_t i = 0; i < N; ++i) {
488 if (dimension(i).size() < 1) {
489 return;
490 }
491 }
492 this->update_geometry();
493 this->notify_property_changed(false);
494 }
495 }
496 //----------------------------------------------------------------------------
497 auto on_pin_connected(ui::input_pin& p, ui::output_pin&) -> void override {
498 for (size_t i = 0; i < N; ++i) {
499 if (&p == m_input_pins[i]) {
500 if (p.linked_type() == typeid(linspace<real_type>)) {
501 auto& data = p.get_linked_as<linspace<real_type>>();
502 auto& d = dimension(i);
503 d.clear();
504 boost::copy(data, std::back_inserter(d));
505 }
506 break;
507 }
508 }
509
510 if (all_pins_linked()) {
511 for (size_t i = 0; i < N; ++i) {
512 if (dimension(i).size() < 1) {
513 return;
514 }
515 }
516 this->update_geometry();
517 this->notify_property_changed(false);
518 }
519 }
520 //----------------------------------------------------------------------------
521 auto draw_properties() -> bool override {
522 if (!this->vertex_properties().empty()) {
523 ImGui::BeginGroup();
524 this->scene().window().push_header2_font();
525 ImGui::Text("Vertex Properties");
526 this->scene().window().pop_font();
527 for (auto const& [name, prop] : this->vertex_properties()) {
528 ImGui::TextUnformatted(name.data());
529 }
530 ImGui::EndGroup();
531 ImGui::Separator();
532 }
533
534 if (all_pins_linked() && this->vertices().size() > 0) {
535 ImGui::BeginGroup();
536 this->scene().window().push_header2_font();
537 ImGui::Text("Write to file");
538 this->scene().window().pop_font();
539 bool write_pushed = ImGui::Button("write to file");
540 if (write_pushed) {
541 this->scene().window().open_file_explorer_write(*this);
542 }
543 ImGui::EndGroup();
544 }
545 return false;
546 }
547 auto on_path_selected(std::string const& path) -> void override {
548 this->write(path);
549 }
550 auto all_input_pins_linked() -> bool {
551 for (auto pin : m_input_pins) {
552 if (!pin->is_linked()) {
553 return false;
554 }
555 }
556 return true;
557 }
558};
559//==============================================================================
562//==============================================================================
563} // namespace tatooine::flowexplorer::nodes
564//==============================================================================
569#endif
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))
Definition: abcflow.h:7
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: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
Definition: scene.h:17
auto window() const -> auto const &
Definition: scene.h:51
Definition: mat.h:14
Definition: vec.h:12