84 std::vector<f32> vertices = {
86 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
87 -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
88 -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f,0.0f, 0.0f, 0.0f, 1.0f,
89 0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
92 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
93 -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,0.0f, 1.0f, 0.0f,
94 -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
95 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
98 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
99 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,
100 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
101 0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,1.0f, 0.0f, 0.0f,
104 -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f,
105 -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f,
106 -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,
107 -0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f,
110 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 0.0f,
111 -0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f,
112 -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,0.0f, -1.0f, 0.0f,
113 0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f,
116 -0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, -1.0f,
117 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f,
118 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f,
119 -0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,0.0f, 0.0f, -1.0f,
123 std::vector<uint32_t> indices = {
162 auto result = std::make_shared<Mesh>(layout, vertices, indices);
211 const glm::vec3 half = extents * 0.5f;
213 const float ux = extents.x;
214 const float uy = extents.y;
215 const float uz = extents.z;
216 std::vector<float> vertices = {
220 half.x, half.y, half.z, 1.0f, 0.0f, 0.0f, ux, uy, 0.0f, 0.0f, 1.0f,
221 -half.x, half.y, half.z, 0.0f, 1.0f, 0.0f, 0.0f, uy, 0.0f, 0.0f, 1.0f,
222 -half.x, -half.y, half.z, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
223 half.x, -half.y, half.z, 1.0f, 1.0f, 0.0f, ux, 0.0f, 0.0f, 0.0f, 1.0f,
226 half.x, half.y, -half.z, 1.0f, 0.0f, 0.0f, ux, uz, 0.0f, 1.0f, 0.0f,
227 -half.x, half.y, -half.z, 0.0f, 1.0f, 0.0f, 0.0f, uz, 0.0f, 1.0f, 0.0f,
228 -half.x, half.y, half.z, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
229 half.x, half.y, half.z, 1.0f, 1.0f, 0.0f, ux, 0.0f, 0.0f, 1.0f, 0.0f,
232 half.x, half.y, -half.z, 1.0f, 0.0f, 0.0f, uz, uy, 1.0f, 0.0f, 0.0f,
233 half.x, half.y, half.z, 0.0f, 1.0f, 0.0f, 0.0f, uy, 1.0f, 0.0f, 0.0f,
234 half.x, -half.y, half.z, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
235 half.x, -half.y, -half.z, 1.0f, 1.0f, 0.0f, uz, 0.0f, 1.0f, 0.0f, 0.0f,
238 -half.x, half.y, half.z, 1.0f, 0.0f, 0.0f, uz, uy, -1.0f, 0.0f, 0.0f,
239 -half.x, half.y, -half.z, 0.0f, 1.0f, 0.0f, 0.0f, uy, -1.0f, 0.0f, 0.0f,
240 -half.x, -half.y, -half.z, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
241 -half.x, -half.y, half.z, 1.0f, 1.0f, 0.0f, uz, 0.0f, -1.0f, 0.0f, 0.0f,
244 half.x, -half.y, half.z, 1.0f, 0.0f, 0.0f, ux, uz, 0.0f, -1.0f, 0.0f,
245 -half.x, -half.y, half.z, 0.0f, 1.0f, 0.0f, 0.0f, uz, 0.0f, -1.0f, 0.0f,
246 -half.x, -half.y, -half.z, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f,
247 half.x, -half.y, -half.z, 1.0f, 1.0f, 0.0f, ux, 0.0f, 0.0f, -1.0f, 0.0f,
250 -half.x, half.y, -half.z, 1.0f, 0.0f, 0.0f, ux, uy, 0.0f, 0.0f, -1.0f,
251 half.x, half.y, -half.z, 0.0f, 1.0f, 0.0f, 0.0f, uy, 0.0f, 0.0f, -1.0f,
252 half.x, -half.y, -half.z, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f,
253 -half.x, -half.y, -half.z, 1.0f, 1.0f, 0.0f, ux, 0.0f, 0.0f, 0.0f, -1.0f
256 std::vector<unsigned int> indices =
312 auto result = std::make_shared<mnd::Mesh>(vertexLayout, vertices, indices);
398 const f32 safeRadius = std::max(0.001f, radius);
399 const f32 safeHeight = std::max(safeRadius * 2.0f, height);
400 const f32 straightHeight = std::max(0.0f, safeHeight - safeRadius * 2.0f);
401 const f32 halfStraight = straightHeight * 0.5f;
402 const int safeSectors = std::max(3, sectors);
403 const int safeStacks = std::max(2, hemisphereStacks);
411 std::vector<Ring> rings;
412 rings.reserve(
static_cast<size_t>(safeStacks * 2 + 2));
414 for (
int i = 0; i <= safeStacks; ++i)
416 const f32 theta = (
static_cast<f32>(i) /
static_cast<f32>(safeStacks)) * (
kPI * 0.5f);
417 rings.push_back({halfStraight + safeRadius * std::cos(theta), safeRadius * std::sin(theta)});
419 for (
int i = 0; i <= safeStacks; ++i)
421 const f32 theta = (
kPI * 0.5f) + (
static_cast<f32>(i) /
static_cast<f32>(safeStacks)) * (
kPI * 0.5f);
422 rings.push_back({-halfStraight + safeRadius * std::cos(theta), safeRadius * std::sin(theta)});
425 std::vector<f32> vertices;
426 vertices.reserve(rings.size() *
static_cast<size_t>(safeSectors + 1) * 8);
428 for (
const auto &ring : rings)
430 for (
int j = 0; j <= safeSectors; ++j)
432 const f32 sectorAngle =
static_cast<f32>(j) * (2.0f *
kPI /
static_cast<f32>(safeSectors));
433 const f32 x = ring.r * std::cos(sectorAngle);
434 const f32 z = ring.r * std::sin(sectorAngle);
435 const f32 centerY = ring.y > halfStraight ? halfStraight : (ring.y < -halfStraight ? -halfStraight : ring.y);
436 glm::vec3 normal = glm::normalize(glm::vec3(x, ring.y - centerY, z));
438 vertices.push_back(x);
439 vertices.push_back(ring.y);
440 vertices.push_back(z);
441 vertices.push_back(normal.x);
442 vertices.push_back(normal.y);
443 vertices.push_back(normal.z);
444 vertices.push_back(
static_cast<f32>(j) /
static_cast<f32>(safeSectors));
445 vertices.push_back((ring.y + safeHeight * 0.5f) / safeHeight);
449 std::vector<u32> indices;
450 for (
int i = 0; i < static_cast<int>(rings.size()) - 1; ++i)
452 int k1 = i * (safeSectors + 1);
453 int k2 = k1 + safeSectors + 1;
454 for (
int j = 0; j < safeSectors; ++j, ++k1, ++k2)
456 indices.push_back(k1);
457 indices.push_back(k2);
458 indices.push_back(k1 + 1);
460 indices.push_back(k1 + 1);
461 indices.push_back(k2);
462 indices.push_back(k2 + 1);
472 return std::make_shared<Mesh>(vertexLayout, vertices, indices);