69 addQuad(
mesh, {x0, y0, z1}, {x1, y0, z1}, {x1, y1, z1}, {x0, y1, z1}, {0, 0, 1});
70 addQuad(
mesh, {x1, y0, z0}, {x0, y0, z0}, {x0, y1, z0}, {x1, y1, z0}, {0, 0, -1});
71 addQuad(
mesh, {x0, y0, z0}, {x0, y0, z1}, {x0, y1, z1}, {x0, y1, z0}, {-1, 0, 0});
72 addQuad(
mesh, {x1, y0, z1}, {x1, y0, z0}, {x1, y1, z0}, {x1, y1, z1}, {1, 0, 0});
73 addQuad(
mesh, {x0, y1, z1}, {x1, y1, z1}, {x1, y1, z0}, {x0, y1, z0}, {0, 1, 0});
74 addQuad(
mesh, {x0, y0, z0}, {x1, y0, z0}, {x1, y0, z1}, {x0, y0, z1}, {0, -1, 0});
126 const float radius = (radiusBottom + radiusTop) * 0.5f;
127 for (
int i = 0; i <
sides; ++i) {
128 const float a0 = 2.0f * kPi * float(i) / float(
sides);
129 const float a1 = 2.0f * kPi * float(i + 1) / float(
sides);
130 const Vec3 p0{
center.
x + std::cos(a0) * radiusBottom, y0,
center.
z + std::sin(a0) * radiusBottom};
131 const Vec3 p1{
center.
x + std::cos(a1) * radiusBottom, y0,
center.
z + std::sin(a1) * radiusBottom};
132 const Vec3 p2{
center.
x + std::cos(a1) * radiusTop, y1,
center.
z + std::sin(a1) * radiusTop};
133 const Vec3 p3{
center.
x + std::cos(a0) * radiusTop, y1,
center.
z + std::sin(a0) * radiusTop};
135 const uint32_t
side =
static_cast<uint32_t
>(
mesh.getVertexCount());
142 const uint32_t
bottom =
static_cast<uint32_t
>(
mesh.getVertexCount());
144 addVertex(
mesh, p1, {0, -1, 0}, p1.x, p1.z);
145 addVertex(
mesh, p0, {0, -1, 0}, p0.x, p0.z);
147 const uint32_t
top =
static_cast<uint32_t
>(
mesh.getVertexCount());
149 addVertex(
mesh, p3, {0, 1, 0}, p3.x, p3.z);
150 addVertex(
mesh, p2, {0, 1, 0}, p2.x, p2.z);
157 rings = std::clamp(rings, 2, 32);
159 const uint32_t base =
static_cast<uint32_t
>(
mesh.getVertexCount());
160 for (
int ring = 0; ring <= rings; ++ring) {
161 const float v = float(ring) / float(rings);
162 const float phi =
v * kPi;
165 const float theta =
u * 2.0f * kPi;
166 const Vec3 n{std::sin(
phi) * std::cos(theta), std::cos(
phi), std::sin(
phi) * std::sin(theta)};
167 const float horizontalRadius = (
radii.
x +
radii.
z) * 0.5f;
169 theta * horizontalRadius,
phi *
radii.
y);
172 for (
int ring = 0; ring < rings; ++ring) {
174 const uint32_t
a = base + uint32_t(ring * (
sides + 1) +
side);
175 const uint32_t
b =
a + uint32_t(
sides + 1);
177 mesh.addTriangle(
a + 1,
b + 1,
b);
185 majorSegments = std::clamp(majorSegments, 3, 64);
186 minorSegments = std::clamp(minorSegments, 3, 32);
187 const uint32_t base =
static_cast<uint32_t
>(
mesh.getVertexCount());
188 for (
int major = 0; major <= majorSegments; ++major) {
189 const float u = float(major) / float(majorSegments);
190 const float a = 2.0f * kPi *
u;
191 for (
int minor = 0; minor <= minorSegments; ++minor) {
192 const float v = float(minor) / float(minorSegments);
193 const float b = 2.0f * kPi *
v;
194 const Vec3 n{std::cos(
a) * std::cos(
b), std::sin(
b), std::sin(
a) * std::cos(
b)};
195 const float radial = majorRadius + minorRadius * std::cos(
b);
199 n,
a * majorRadius,
b * minorRadius);
202 for (
int major = 0; major < majorSegments; ++major) {
203 for (
int minor = 0; minor < minorSegments; ++minor) {
204 const uint32_t
a = base + uint32_t(major * (minorSegments + 1) + minor);
205 const uint32_t
b =
a + uint32_t(minorSegments + 1);
207 mesh.addTriangle(
a + 1,
b + 1,
b);