Unravel Engine C++ Reference
Loading...
Searching...
No Matches
subdivide_shape.hpp
Go to the documentation of this file.
1
#ifndef GENERATOR_SUBDIVIDESHAPE_HPP
2
#define GENERATOR_SUBDIVIDESHAPE_HPP
3
4
#include "
edge.hpp
"
5
#include "
shape_vertex.hpp
"
6
#include "
utils.hpp
"
7
8
namespace
generator
9
{
10
12
template
<
typename
shape_t>
13
class
subdivide_shape_t
14
{
15
public
:
16
class
edges_t
17
{
18
public
:
19
bool
done
() const noexcept
20
{
21
return
edges_.done();
22
}
23
24
edge_t
generate
()
const
25
{
26
edge_t
edge_ = edges_.generate();
27
28
if
(i_ % 2 == 0)
29
return
edge_t
{{edge_.
vertices
[0],
static_cast<
int
>
(shape_->vertex_cache_.size()) + i_ / 2}};
30
31
return
edge_t
{{
static_cast<
int
>
(shape_->vertex_cache_.size()) + i_ / 2, edge_.
vertices
[1]}};
32
}
33
34
void
next
()
35
{
36
++i_;
37
if
(i_ % 2 == 0)
38
edges_.next();
39
}
40
41
private
:
42
const
subdivide_shape_t
* shape_;
43
44
typename
edge_generator_type<shape_t>::type
edges_;
45
46
int
i_;
47
48
explicit
edges_t
(
const
subdivide_shape_t
& shape) : shape_{&shape}, edges_{shape.shape_.
edges
()}, i_{0}
49
{
50
}
51
52
friend
class
subdivide_shape_t
;
53
};
54
55
class
vertices_t
56
{
57
public
:
58
bool
done
() const noexcept
59
{
60
return
vertex_index_ == shape_->vertex_cache_.size() && edges_.done();
61
}
62
63
shape_vertex_t
generate
()
const
64
{
65
if
(vertex_index_ < shape_->vertex_cache_.size())
66
return
shape_->vertex_cache_[vertex_index_];
67
68
const
edge_t
edge = edges_.generate();
69
const
shape_vertex_t
& v1 = shape_->vertex_cache_[edge.
vertices
[0]];
70
const
shape_vertex_t
& v2 = shape_->vertex_cache_[edge.
vertices
[1]];
71
72
shape_vertex_t
vertex;
73
vertex.
position
= gml::mix(v1.
position
, v2.
position
, 0.5);
74
vertex.
tangent
= gml::normalize(gml::mix(v1.
tangent
, v2.
tangent
, 0.5));
75
vertex.
tex_coord
= 0.5 * v1.
tex_coord
+ 0.5 * v2.
tex_coord
;
76
return
vertex;
77
}
78
79
void
next
()
80
{
81
if
(vertex_index_ < shape_->vertex_cache_.size())
82
++vertex_index_;
83
else
84
edges_.next();
85
}
86
87
private
:
88
const
subdivide_shape_t
* shape_;
89
90
int
vertex_index_;
91
92
typename
edge_generator_type<shape_t>::type
edges_;
93
94
explicit
vertices_t
(
const
subdivide_shape_t
& shape)
95
: shape_{&shape}
96
, vertex_index_{0}
97
, edges_{shape.shape_.
edges
()}
98
{
99
}
100
101
friend
class
subdivide_shape_t
;
102
};
103
104
subdivide_shape_t
(shape_t shape) : shape_(
std
::move(shape)), vertex_cache_{}
105
{
106
for
(
const
shape_vertex_t
& vertex : shape_.vertices())
107
{
108
vertex_cache_.push_back(vertex);
109
}
110
}
111
112
edges_t
edges
() const noexcept
113
{
114
return
edges_t
{*
this
};
115
}
116
117
vertices_t
vertices
() const noexcept
118
{
119
return
vertices_t
{*
this
};
120
}
121
122
private
:
123
shape_t shape_;
124
125
std::vector<shape_vertex_t> vertex_cache_;
126
};
127
}
// namespace generator
128
129
#endif
generator::edge_t
Definition
edge.hpp:10
generator::edge_t::vertices
gml::ivec2 vertices
Definition
edge.hpp:12
generator::shape_vertex_t
Definition
shape_vertex.hpp:12
generator::shape_vertex_t::tex_coord
double tex_coord
Definition
shape_vertex.hpp:20
generator::shape_vertex_t::tangent
gml::dvec2 tangent
Definition
shape_vertex.hpp:18
generator::shape_vertex_t::position
gml::dvec2 position
Definition
shape_vertex.hpp:14
generator::subdivide_shape_t::edges_t
Definition
subdivide_shape.hpp:17
generator::subdivide_shape_t::edges_t::next
void next()
Definition
subdivide_shape.hpp:34
generator::subdivide_shape_t::edges_t::generate
edge_t generate() const
Definition
subdivide_shape.hpp:24
generator::subdivide_shape_t::edges_t::done
bool done() const noexcept
Definition
subdivide_shape.hpp:19
generator::subdivide_shape_t::vertices_t
Definition
subdivide_shape.hpp:56
generator::subdivide_shape_t::vertices_t::generate
shape_vertex_t generate() const
Definition
subdivide_shape.hpp:63
generator::subdivide_shape_t::vertices_t::next
void next()
Definition
subdivide_shape.hpp:79
generator::subdivide_shape_t::vertices_t::done
bool done() const noexcept
Definition
subdivide_shape.hpp:58
generator::subdivide_shape_t
Cuts each edge in half.
Definition
subdivide_shape.hpp:14
generator::subdivide_shape_t::edges
edges_t edges() const noexcept
Definition
subdivide_shape.hpp:112
generator::subdivide_shape_t::vertices
vertices_t vertices() const noexcept
Definition
subdivide_shape.hpp:117
generator::subdivide_shape_t::subdivide_shape_t
subdivide_shape_t(shape_t shape)
Definition
subdivide_shape.hpp:104
edge.hpp
generator
Definition
any_generator.hpp:7
std
Definition
render_view_keys.h:37
shape_vertex.hpp
generator::edge_generator_type::type
void type
Definition
utils.hpp:29
utils.hpp
UnravelEngine
UnravelEngine
engine
engine
rendering
generator
subdivide_shape.hpp
Generated by
1.12.0