Unravel Engine C++ Reference
Loading...
Searching...
No Matches
parametric_mesh.cpp
Go to the documentation of this file.
1#include "parametric_mesh.hpp"
2
3using namespace generator;
4
5parametric_mesh_t::triangles_t::triangles_t(const parametric_mesh_t& mesh) : mesh_{&mesh}, i_{0}, even_{false}
6{
7}
8
10{
11 if(done())
12 throw std::out_of_range("Done!");
13
14 triangle_t triangle;
15
16 const int base = i_[1] * (mesh_->segments_[0] + 1) + i_[0];
17
18 if(!even_)
19 {
20 triangle.vertices = {base, base + 1, base + mesh_->segments_[0] + 1};
21 }
22 else
23 {
24 triangle.vertices = {base + 1, base + mesh_->segments_[0] + 2, base + mesh_->segments_[0] + 1};
25 }
26
27 return triangle;
28}
29
31{
32 if(mesh_->segments_[0] == 0 || mesh_->segments_[1] == 0)
33 return true;
34 return i_[1] == mesh_->segments_[1];
35}
36
38{
39 if(done())
40 throw std::out_of_range("Done!");
41
42 even_ = !even_;
43
44 if(!even_)
45 {
46 ++i_[0];
47 if(i_[0] == mesh_->segments_[0])
48 {
49 i_[0] = 0;
50 ++i_[1];
51 }
52 }
53}
54
55parametric_mesh_t::vertices_t::vertices_t(const parametric_mesh_t& mesh) : mesh_{&mesh}, i_{0}
56{
57}
58
60{
61 if(done())
62 throw std::out_of_range("Done!");
63
64 return mesh_->eval_({i_[0] * mesh_->delta_[0], i_[1] * mesh_->delta_[1]});
65}
66
68{
69 if(mesh_->segments_[0] == 0 || mesh_->segments_[1] == 0)
70 return true;
71 return i_[1] > mesh_->segments_[1];
72}
73
75{
76 if(done())
77 throw std::out_of_range("Done!");
78
79 ++i_[0];
80 if(i_[0] > mesh_->segments_[0])
81 {
82 i_[0] = 0;
83 ++i_[1];
84 }
85}
86
87parametric_mesh_t::parametric_mesh_t(const std::function<mesh_vertex_t(const gml::dvec2& t)>& eval,
88 const gml::ivec2& segments) noexcept
89 : eval_{std::move(eval)}
90 , segments_{segments}
91 , delta_{1.0 / segments[0], 1.0 / segments[1]}
92{
93}
94
99
101{
102 return vertices_t{*this};
103}
A mesh with values evaluated using a callback function.
vertices_t vertices() const noexcept
triangles_t triangles() const noexcept
parametric_mesh_t(const std::function< mesh_vertex_t(const gml::dvec2 &t)> &eval, const gml::ivec2 &segments={16, 16}) noexcept
gml::ivec3 vertices
Zero based indices of the triangle vertices in counterclockwise order.
Definition triangle.hpp:13
const segment_list * segments