Unravel Engine C++ Reference
Loading...
Searching...
No Matches
triangle_mesh.cpp
Go to the documentation of this file.
1#include "triangle_mesh.hpp"
2
3#include <stdexcept>
4
5using namespace generator;
6
7triangle_mesh_t::triangles_t::triangles_t(const triangle_mesh_t& mesh) : mesh_{&mesh}, row_{0}, col_{0}, i_{0}
8{
9}
10
12{
13 return row_ == mesh_->segments_;
14}
15
17{
18 if(done())
19 throw std::out_of_range("Done!");
20
21 triangle_t triangle;
22
23 if(col_ % 2 == 0)
24 {
25 triangle.vertices[0] = i_;
26 triangle.vertices[1] = i_ + 1;
27 triangle.vertices[2] = i_ + 1 + mesh_->segments_ - row_;
28 }
29 else
30 {
31 triangle.vertices[0] = i_;
32 triangle.vertices[1] = i_ + 1 + mesh_->segments_ - row_;
33 triangle.vertices[2] = i_ + mesh_->segments_ - row_;
34 }
35
36 return triangle;
37}
38
40{
41 if(done())
42 throw std::out_of_range("Done!");
43
44 if(col_ % 2 == 0)
45 ++i_;
46
47 ++col_;
48 if(col_ == 2 * (mesh_->segments_ - row_) - 1)
49 {
50 ++i_;
51 col_ = 0;
52 ++row_;
53 }
54}
55
56triangle_mesh_t::vertices_t::vertices_t(const triangle_mesh_t& mesh) : mesh_{&mesh}, row_{0}, col_{0}
57{
58}
59
61{
62 return row_ > mesh_->segments_;
63}
64
66{
67 if(done())
68 throw std::out_of_range("Done!");
69
70 mesh_vertex_t vertex;
71
72 if(row_ == mesh_->segments_)
73 {
74 vertex.position = mesh_->v2_;
75 vertex.tex_coord = gml::dvec2{0.5, 1.0};
76 }
77 else
78 {
79 const double t = 1.0 / mesh_->segments_ * row_;
80 const double t2 = 1.0 / (mesh_->segments_ - row_) * col_;
81
82 const auto e1 = gml::mix(mesh_->v0_, mesh_->v2_, t);
83 const auto e2 = gml::mix(mesh_->v1_, mesh_->v2_, t);
84
85 vertex.position = gml::mix(e1, e2, t2);
86
87 vertex.tex_coord[0] = t2;
88 vertex.tex_coord[1] = t;
89 }
90
91 vertex.normal = mesh_->normal_;
92 return vertex;
93}
94
96{
97 if(done())
98 throw std::out_of_range("Done!");
99
100 ++col_;
101 if(col_ > mesh_->segments_ - row_)
102 {
103 col_ = 0;
104 ++row_;
105 }
106}
107
109 : triangle_mesh_t{radius * gml::normalize(gml::dvec3{-1.0, -1.0, 0.0}),
110 radius * gml::normalize(gml::dvec3{1.0, -1.0, 0.0}),
111 gml::dvec3{0.0, radius, 0.0},
112 segments}
113{
114}
115
116triangle_mesh_t::triangle_mesh_t(const gml::dvec3& v0, const gml::dvec3& v1, const gml::dvec3& v2, int segments)
117 : v0_{v0}
118 , v1_{v1}
119 , v2_{v2}
120 , normal_{gml::normal(v0, v1, v2)}
121 , segments_{segments}
122{
123}
124
126{
127 return triangles_t{*this};
128}
129
131{
132 return vertices_t{*this};
133}
btVector3 normal
gml::dvec2 tex_coord
UV texture coordinates.
gml::dvec3 normal
Unit vector perpendicular to the surface.
vertices_t vertices() const noexcept
triangle_mesh_t(double radius=1.0, int segments=4)
triangles_t triangles() const noexcept
gml::ivec3 vertices
Zero based indices of the triangle vertices in counterclockwise order.
Definition triangle.hpp:13
Definition math.hpp:13
const segment_list * segments