54 const float z_bottom = -config.
size.z / 2.0f;
55 const float z_delta = config.
size.z / config.
edges_z;
57 const float x_left = -config.
size.x / 2.0f;
58 const float x_delta = config.
size.x / config.
edges_x;
60 const float y_front = -config.
size.y / 2.0f;
61 const float y_delta = config.
size.y / config.
edges_y;
68 const float z_pos = z_bottom + z_delta *
z;
70 const float y_pos = y_front + y_delta *
y;
72 const float x_pos = x_left + x_delta *
x;
73 positions[vert_index++] =
float3(x_pos, y_pos, z_pos);
81 const float y_pos = y_front + y_delta *
y;
82 const float z_pos = z_bottom + z_delta *
z;
84 const float x_pos = x_left + x_delta *
x;
85 positions[vert_index++] =
float3(x_pos, y_pos, z_pos);
90 const float x_pos = x_left;
91 const float y_pos = y_front + y_delta *
y;
92 const float z_pos = z_bottom + z_delta *
z;
93 positions[vert_index++] =
float3(x_pos, y_pos, z_pos);
94 const float x_pos2 = x_left + x_delta * config.
edges_x;
95 positions[vert_index++] =
float3(x_pos2, y_pos, z_pos);
124 const int xy_cross_section_vert_count = config.
verts_x * config.
verts_y -
128 int vert_1_start = 0;
132 const int vert_1 = vert_1_start +
x;
133 const int vert_2 = vert_1_start + config.
verts_x +
x;
134 const int vert_3 = vert_2 + 1;
135 const int vert_4 = vert_1 + 1;
137 define_quad(corner_verts, loop_index, vert_1, vert_2, vert_3, vert_4);
140 vert_1_start += config.
verts_x;
152 vert_1_start + x + 1,
153 vert_2_start + x + 1,
157 vert_1_start = vert_2_start;
165 vert_2_start = vert_1_start + config.
verts_x;
172 vert_1_start + x + 1,
173 vert_2_start + x + 1,
177 vert_2_start += config.
verts_x;
178 vert_1_start += config.
verts_x;
183 vert_2_start = vert_1_start + xy_cross_section_vert_count;
194 vert_2_start + x + 1,
195 vert_1_start + x + 1);
198 vert_2_start += xy_cross_section_vert_count;
199 vert_1_start += xy_cross_section_vert_count;
213 if (
z == 0 || y == 0) {
214 vert_1 = vert_1_start + config.
verts_x *
y;
215 vert_4 = vert_1 + config.
verts_x;
218 vert_1 = vert_1_start + 2 *
y;
223 if (y == 0 ||
z == (config.
edges_z - 1)) {
224 vert_2 = vert_2_start + config.
verts_x *
y;
225 vert_3 = vert_2 + config.
verts_x;
228 vert_2 = vert_2_start + 2 *
y;
233 define_quad(corner_verts, loop_index, vert_1, vert_2, vert_3, vert_4);
240 vert_1_start += xy_cross_section_vert_count;
242 vert_2_start += xy_cross_section_vert_count;
251 int vert_1 = vert_1_start;
252 int vert_2 = vert_2_start;
253 int vert_3 = vert_2_start + 2;
254 int vert_4 = vert_1 + config.
verts_x;
257 vert_1 = vert_1_start + config.
verts_x *
y;
258 vert_4 = vert_1 + config.
verts_x;
261 vert_1 = vert_1_start + 2 *
y;
266 vert_2 = vert_2_start + config.
verts_x *
y;
267 vert_3 = vert_2 + config.
verts_x;
270 vert_2 = vert_2_start + 2 *
y;
274 if (y == (config.
edges_y - 1)) {
275 vert_3 = vert_2 + config.
verts_x;
276 vert_4 = vert_1 + config.
verts_x;
279 define_quad(corner_verts, loop_index, vert_1, vert_4, vert_3, vert_2);
286 vert_1_start += xy_cross_section_vert_count;
288 vert_2_start += xy_cross_section_vert_count;
308 uvs[loop_index++] =
float2(0.25f + x * x_delta, 0.375f - y * y_delta);
309 uvs[loop_index++] =
float2(0.25f + x * x_delta, 0.375f - (y + 1) * y_delta);
310 uvs[loop_index++] =
float2(0.25f + (x + 1) * x_delta, 0.375f - (y + 1) * y_delta);
311 uvs[loop_index++] =
float2(0.25f + (x + 1) * x_delta, 0.375f - y * y_delta);
318 uvs[loop_index++] =
float2(0.25f + x * x_delta, 0.375f +
z * z_delta);
319 uvs[loop_index++] =
float2(0.25f + (x + 1) * x_delta, 0.375f +
z * z_delta);
320 uvs[loop_index++] =
float2(0.25f + (x + 1) * x_delta, 0.375f + (
z + 1) * z_delta);
321 uvs[loop_index++] =
float2(0.25f + x * x_delta, 0.375f + (
z + 1) * z_delta);
328 uvs[loop_index++] =
float2(0.25f + x * x_delta, 0.625f + y * y_delta);
329 uvs[loop_index++] =
float2(0.25f + (x + 1) * x_delta, 0.625f + y * y_delta);
330 uvs[loop_index++] =
float2(0.25f + (x + 1) * x_delta, 0.625f + (y + 1) * y_delta);
331 uvs[loop_index++] =
float2(0.25f + x * x_delta, 0.625f + (y + 1) * y_delta);
338 uvs[loop_index++] =
float2(1.0f - x * x_delta, 0.375f +
z * z_delta);
339 uvs[loop_index++] =
float2(1.0f - x * x_delta, 0.375f + (
z + 1) * z_delta);
340 uvs[loop_index++] =
float2(1.0f - (x + 1) * x_delta, 0.375f + (
z + 1) * z_delta);
341 uvs[loop_index++] =
float2(1.0f - (x + 1) * x_delta, 0.375f +
z * z_delta);
348 uvs[loop_index++] =
float2(0.25f - y * y_delta, 0.375f +
z * z_delta);
349 uvs[loop_index++] =
float2(0.25f - y * y_delta, 0.375f + (
z + 1) * z_delta);
350 uvs[loop_index++] =
float2(0.25f - (y + 1) * y_delta, 0.375f + (
z + 1) * z_delta);
351 uvs[loop_index++] =
float2(0.25f - (y + 1) * y_delta, 0.375f +
z * z_delta);
358 uvs[loop_index++] =
float2(0.50f + y * y_delta, 0.375f +
z * z_delta);
359 uvs[loop_index++] =
float2(0.50f + (y + 1) * y_delta, 0.375f +
z * z_delta);
360 uvs[loop_index++] =
float2(0.50f + (y + 1) * y_delta, 0.375f + (
z + 1) * z_delta);
361 uvs[loop_index++] =
float2(0.50f + y * y_delta, 0.375f + (
z + 1) * z_delta);
372 const std::optional<StringRef> &uv_id)
374 const CuboidConfig config(size, verts_x, verts_y, verts_z);
390 const float3 bounds = size * 0.5f;
391 mesh->bounds_set_eager({-bounds, bounds});
392 mesh->tag_loose_verts_none();
393 mesh->tag_overlapping_none();