1 #include "MeshDataBuilder.h"
7 MeshDataBuilder::MeshDataBuilder() :
MeshData() {
8 this->drawMode = MeshDrawMode::DYNAMIC;
11 void MeshDataBuilder::addVertex(
Vertex vertex,
bool addDuplicate) {
13 this->vertices.push_back(vertex);
14 this->indices.push_back(this->currentIndex);
15 this->currentIndex += 1;
18 if (
auto position = std::find(this->vertices.begin(), this->vertices.end(), vertex); position != this->vertices.end()) {
19 this->indices.push_back(
static_cast<Index
>(position - this->vertices.begin()));
25 void MeshDataBuilder::addTriangle(
Vertex v1,
Vertex v2,
Vertex v3,
bool addDuplicate) {
32 this->addTriangle(v1, v2, v3, addDuplicate);
33 this->addTriangle(v3, v4, v1, addDuplicate);
37 const float s1 = size.x / 2;
38 const float s2 = size.y / 2;
39 const glm::vec3 mid{center.position.x, center.position.y, center.position.z};
40 const glm::vec3 col{center.color.r, center.color.g, center.color.b};
43 using enum SignedAxis;
46 {{mid.x - s1, mid.y + offset, mid.z + s2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
47 {{mid.x + s1, mid.y + offset, mid.z + s2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
48 {{mid.x + s1, mid.y + offset, mid.z - s2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
49 {{mid.x - s1, mid.y + offset, mid.z - s2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
55 {{mid.x - s1, mid.y - offset, mid.z - s2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
56 {{mid.x + s1, mid.y - offset, mid.z - s2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
57 {{mid.x + s1, mid.y - offset, mid.z + s2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
58 {{mid.x - s1, mid.y - offset, mid.z + s2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
64 {{mid.x - s1, mid.y + s2, mid.z + offset}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
65 {{mid.x - s1, mid.y - s2, mid.z + offset}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
66 {{mid.x + s1, mid.y - s2, mid.z + offset}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
67 {{mid.x + s1, mid.y + s2, mid.z + offset}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
73 {{mid.x + s1, mid.y + s2, mid.z - offset}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
74 {{mid.x + s1, mid.y - s2, mid.z - offset}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
75 {{mid.x - s1, mid.y - s2, mid.z - offset}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
76 {{mid.x - s1, mid.y + s2, mid.z - offset}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
82 {{mid.x + offset, mid.y + s1, mid.z + s2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
83 {{mid.x + offset, mid.y - s1, mid.z + s2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
84 {{mid.x + offset, mid.y - s1, mid.z - s2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
85 {{mid.x + offset, mid.y + s1, mid.z - s2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
91 {{mid.x - offset, mid.y - s1, mid.z - s2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
92 {{mid.x - offset, mid.y - s1, mid.z + s2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
93 {{mid.x - offset, mid.y + s1, mid.z + s2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
94 {{mid.x - offset, mid.y + s1, mid.z - s2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
101 void MeshDataBuilder::addCube(
Vertex center, glm::vec3 size,
bool visibleOutside,
bool addDuplicate) {
102 const float x2 = size.x / 2;
103 const float y2 = size.y / 2;
104 const float z2 = size.z / 2;
105 const glm::vec3 mid{center.position.x, center.position.y, center.position.z};
106 const glm::vec3 col{center.color.r, center.color.g, center.color.b};
108 if (visibleOutside) {
110 {{mid.x - x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
111 {{mid.x + x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
112 {{mid.x + x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
113 {{mid.x - x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
117 {{mid.x - x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
118 {{mid.x + x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
119 {{mid.x + x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
120 {{mid.x - x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
124 {{mid.x - x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
125 {{mid.x - x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
126 {{mid.x + x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
127 {{mid.x + x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
131 {{mid.x + x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
132 {{mid.x + x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
133 {{mid.x - x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
134 {{mid.x - x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
138 {{mid.x + x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
139 {{mid.x + x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
140 {{mid.x + x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
141 {{mid.x + x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
145 {{mid.x - x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
146 {{mid.x - x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
147 {{mid.x - x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
148 {{mid.x - x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
153 {{mid.x - x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
154 {{mid.x + x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
155 {{mid.x + x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
156 {{mid.x - x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
160 {{mid.x - x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
161 {{mid.x + x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
162 {{mid.x + x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
163 {{mid.x - x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
167 {{mid.x + x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
168 {{mid.x + x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
169 {{mid.x - x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
170 {{mid.x - x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
174 {{mid.x - x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
175 {{mid.x - x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
176 {{mid.x + x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
177 {{mid.x + x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
181 {{mid.x + x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
182 {{mid.x + x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
183 {{mid.x + x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
184 {{mid.x + x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
188 {{mid.x - x2, mid.y + y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 0}},
189 {{mid.x - x2, mid.y + y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 0}},
190 {{mid.x - x2, mid.y - y2, mid.z + z2}, {0, 0, 0}, {col.x, col.y, col.z}, {1, 1}},
191 {{mid.x - x2, mid.y - y2, mid.z - z2}, {0, 0, 0}, {col.x, col.y, col.z}, {0, 1}},
197 void MeshDataBuilder::update() {
198 if (!this->initialized)
void addSquare(Vertex v1, Vertex v2, Vertex v3, Vertex v4, bool addDuplicate=false)
Vertex v4 forms a face with vertex v1 and v3.
void clear()
Does not call update().
void addVertex(Vertex vertex, bool addDuplicate=false)
Pass true to addDuplicate if you don't want to scan the entire vertex vector to calculate the index.
void updateMeshData()
Updates the vertex buffers with the current mesh data.
void setupForRendering()
Establishes the vertex buffers and copies the current mesh data into them.
void clearMeshData()
Does not call updateMeshData().