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