Unravel Engine C++ Reference
Loading...
Searching...
No Matches
repeat_path.hpp
Go to the documentation of this file.
1#ifndef GENERATOR_REPEATPATH_HPP
2#define GENERATOR_REPEATPATH_HPP
3
4#include "edge.hpp"
5#include "path_vertex.hpp"
6#include "utils.hpp"
7
8namespace generator
9{
10
14template<typename path_t>
16{
17public:
18 class edges_t
19 {
20 public:
21 bool done() const noexcept
22 {
23 return index_ >= repeat_path_->instances_;
24 }
25
27 {
28 edge_t temp = edges_.generate();
29 temp.vertices += delta_;
30 return temp;
31 }
32
33 void next() noexcept
34 {
35 edges_.next();
36
37 if(edges_.done())
38 {
39 ++index_;
40 delta_ += repeat_path_->vertex_count_;
41 edges_ = repeat_path_->path_.edges();
42 }
43 }
44
45 private:
46 const repeat_path_t* repeat_path_;
47
49
50 int index_;
51
52 int delta_;
53
54 explicit edges_t(const repeat_path_t* repeatPath) noexcept
55 : repeat_path_{repeatPath}
56 , edges_{repeatPath->path_.edges()}
57 , index_{repeatPath->vertex_count_ > 0 ? 0 : repeatPath->instances_}
58 , delta_{0}
59 {
60 }
61
62 friend class repeat_path_t;
63 };
64
66 {
67 public:
68 bool done() const noexcept
69 {
70 return index_ >= repeat_path_->instances_;
71 }
72
74 {
75 path_vertex_t temp = vertices_.generate();
76 temp.position += delta_;
77 return temp;
78 }
79
80 void next()
81 {
82 vertices_.next();
83
84 if(vertices_.done())
85 {
86 ++index_;
87 delta_ += repeat_path_->delta_;
88 vertices_ = repeat_path_->path_.vertices();
89 }
90 }
91
92 private:
93 explicit vertices_t(const repeat_path_t* repeatPath)
94 : repeat_path_{repeatPath}
95 , vertices_{repeatPath->path_.vertices()}
96 , index_{repeatPath->vertex_count_ > 0 ? 0 : repeatPath->instances_}
97 , delta_{}
98 {
99 }
100
101 const repeat_path_t* repeat_path_;
102
103 typename vertex_generator_type<path_t>::type vertices_;
104
105 int index_;
106
107 gml::dvec3 delta_;
108
109 int countvertices_t() const noexcept
110 {
111 if(repeat_path_->instances_ < 1)
112 return 0;
113
114 return repeat_path_->vertex_count_ * (repeat_path_->instances_ - index_ - 1) + count(vertices_);
115 }
116
117 friend int count(const vertices_t& generator) noexcept
118 {
119 return generator.countvertices_t();
120 }
121
122 friend class repeat_path_t;
123 };
124
128 explicit repeat_path_t(path_t path, int instances, const gml::dvec3& delta) noexcept
129 : path_{std::move(path)}
130 , instances_{instances}
131 , delta_{delta}
132 , vertex_count_{count(path_.vertices())}
133 {
134 }
135
136 edges_t edges() const noexcept
137 {
138 return edges_t{this};
139 }
140
141 vertices_t vertices() const noexcept
142 {
143 return vertices_t{this};
144 }
145
146private:
147 path_t path_;
148
149 int instances_;
150
151 gml::dvec3 delta_;
152
153 int vertex_count_;
154};
155
156template<typename path_t>
157repeat_path_t<path_t> repeat_path(path_t path, int instances, const gml::dvec3& delta) noexcept
158{
159 return repeat_path_t<path_t>{std::move(path), instances, delta};
160}
161} // namespace generator
162
163#endif
gml::ivec2 vertices
Definition edge.hpp:12
friend int count(const vertices_t &generator) noexcept
vertices_t vertices() const noexcept
edges_t edges() const noexcept
repeat_path_t(path_t path, int instances, const gml::dvec3 &delta) noexcept
repeat_path_t< path_t > repeat_path(path_t path, int instances, const gml::dvec3 &delta) noexcept
int count(const generator_t &generator) noexcept
Counts the number of steps left in the generator.
Definition utils.hpp:70