Unravel Engine C++ Reference
Loading...
Searching...
No Matches
repeat_mesh.hpp
Go to the documentation of this file.
1#ifndef GENERATOR_REPEATMESH_HPP
2#define GENERATOR_REPEATMESH_HPP
3
4#include "mesh_vertex.hpp"
5#include "triangle.hpp"
6#include "utils.hpp"
7
8namespace generator
9{
10
14template<typename mesh_t>
16{
17public:
19 {
20 public:
21 bool done() const noexcept
22 {
23 return index_ >= repeat_mesh_->instances_;
24 }
25
27 {
28 triangle_t temp = triangles_.generate();
29 temp.vertices += delta_;
30 return temp;
31 }
32
33 void next() noexcept
34 {
35 triangles_.next();
36
37 if(triangles_.done())
38 {
39 ++index_;
40 delta_ += repeat_mesh_->vertex_count_;
41 triangles_ = repeat_mesh_->mesh_.triangles();
42 }
43 }
44
45 private:
46 const repeat_mesh_t* repeat_mesh_;
47
48 typename triangle_generator_type<mesh_t>::type triangles_;
49
50 int index_;
51
52 int delta_;
53
54 explicit triangles_t(const repeat_mesh_t* repeatMesh) noexcept
55 : repeat_mesh_{repeatMesh}
56 , triangles_{repeatMesh->mesh_.triangles()}
57 , index_{repeatMesh->vertex_count_ > 0 ? 0 : repeatMesh->instances_}
58 , delta_{0}
59 {
60 }
61
62 int counttriangles_t() const noexcept
63 {
64 if(repeat_mesh_->instances_ < 1)
65 return 0;
66
67 return count(repeat_mesh_->mesh_.triangles()) * (repeat_mesh_->instances_ - index_ - 1) + count(triangles_);
68 }
69
70 friend int count(const triangles_t& generator) noexcept
71 {
72 return generator.counttriangles_t();
73 }
74
75 friend class repeat_mesh_t;
76 };
77
79 {
80 public:
81 bool done() const noexcept
82 {
83 return index_ >= repeat_mesh_->instances_;
84 }
85
87 {
88 mesh_vertex_t temp = vertices_.generate();
89 temp.position += delta_;
90 return temp;
91 }
92
93 void next()
94 {
95 vertices_.next();
96
97 if(vertices_.done())
98 {
99 ++index_;
100 delta_ += repeat_mesh_->delta_;
101 vertices_ = repeat_mesh_->mesh_.vertices();
102 }
103 }
104
105 private:
106 explicit vertices_t(const repeat_mesh_t* repeatMesh)
107 : repeat_mesh_{repeatMesh}
108 , vertices_{repeatMesh->mesh_.vertices()}
109 , index_{repeatMesh->vertex_count_ > 0 ? 0 : repeatMesh->instances_}
110 , delta_{}
111 {
112 }
113
114 const repeat_mesh_t* repeat_mesh_;
115
116 typename vertex_generator_type<mesh_t>::type vertices_;
117
118 int index_;
119
120 gml::dvec3 delta_;
121
122 int countvertices_t() const noexcept
123 {
124 if(repeat_mesh_->instances_ < 1)
125 return 0;
126
127 return repeat_mesh_->vertex_count_ * (repeat_mesh_->instances_ - index_ - 1) + count(vertices_);
128 }
129
130 friend int count(const vertices_t& generator) noexcept
131 {
132 return generator.countvertices_t();
133 }
134
135 friend class repeat_mesh_t;
136 };
137
141 explicit repeat_mesh_t(mesh_t mesh, int instances, const gml::dvec3& delta) noexcept
142 : mesh_{std::move(mesh)}
143 , instances_{instances}
144 , delta_{delta}
145 , vertex_count_{count(mesh_.vertices())}
146 {
147 }
148
149 triangles_t triangles() const noexcept
150 {
151 return triangles_t{this};
152 }
153
154 vertices_t vertices() const noexcept
155 {
156 return vertices_t{this};
157 }
158
159private:
160 mesh_t mesh_;
161
162 int instances_;
163
164 gml::dvec3 delta_;
165
166 int vertex_count_;
167};
168
169template<typename mesh_t>
170repeat_mesh_t<mesh_t> repeat_mesh(mesh_t mesh, int instances, const gml::dvec3& delta) noexcept
171{
172 return repeat_mesh_t<mesh_t>{std::move(mesh), instances, delta};
173}
174} // namespace generator
175
176#endif
friend int count(const triangles_t &generator) noexcept
friend int count(const vertices_t &generator) noexcept
repeat_mesh_t(mesh_t mesh, int instances, const gml::dvec3 &delta) noexcept
vertices_t vertices() const noexcept
triangles_t triangles() const noexcept
gml::ivec3 vertices
Zero based indices of the triangle vertices in counterclockwise order.
Definition triangle.hpp:13
int count(const generator_t &generator) noexcept
Counts the number of steps left in the generator.
Definition utils.hpp:70
repeat_mesh_t< mesh_t > repeat_mesh(mesh_t mesh, int instances, const gml::dvec3 &delta) noexcept