|
|
@ -100,3 +100,110 @@ pub fn createSquarePrimitive(width: f32) PrimitiveData { |
|
|
|
}, |
|
|
|
}, |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn createCirclePrimitive(radius: f32, comptime sides: usize) PrimitiveData { |
|
|
|
|
|
|
|
if (sides < 3) @compileError("sides must be at least 3"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var vertices: [sides]VertexData = undefined; |
|
|
|
|
|
|
|
for (&vertices, 0..) |*vertex, i| { |
|
|
|
|
|
|
|
const angle = std.math.tau / @as(f32, @floatFromInt(sides)) * @as(f32, @floatFromInt(i)); |
|
|
|
|
|
|
|
vertex.* = vert(@sin(angle) * radius, @cos(angle) * radius, 0.0); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var indices: [(sides - 2) * 3]u32 = undefined; |
|
|
|
|
|
|
|
for (0..(sides - 2)) |i| { |
|
|
|
|
|
|
|
indices[i * 3 + 0] = 0; |
|
|
|
|
|
|
|
indices[i * 3 + 1] = @as(u32, @intCast(i)) + 1; |
|
|
|
|
|
|
|
indices[i * 3 + 2] = @as(u32, @intCast(i)) + 2; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return createPrimitive(&vertices, &indices); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn createCubePrimitive(width: f32) PrimitiveData { |
|
|
|
|
|
|
|
const half_width = width / 2.0; |
|
|
|
|
|
|
|
return createPrimitive( |
|
|
|
|
|
|
|
// zig fmt: off |
|
|
|
|
|
|
|
&.{ |
|
|
|
|
|
|
|
// Right (+X) |
|
|
|
|
|
|
|
vert( half_width, half_width, -half_width), |
|
|
|
|
|
|
|
vert( half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
vert( half_width, half_width, half_width), |
|
|
|
|
|
|
|
vert( half_width, -half_width, half_width), |
|
|
|
|
|
|
|
// Left (-X) |
|
|
|
|
|
|
|
vert(-half_width, half_width, half_width), |
|
|
|
|
|
|
|
vert(-half_width, -half_width, half_width), |
|
|
|
|
|
|
|
vert(-half_width, half_width, -half_width), |
|
|
|
|
|
|
|
vert(-half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
// Top (+Y) |
|
|
|
|
|
|
|
vert( half_width, half_width, -half_width), |
|
|
|
|
|
|
|
vert( half_width, half_width, half_width), |
|
|
|
|
|
|
|
vert(-half_width, half_width, -half_width), |
|
|
|
|
|
|
|
vert(-half_width, half_width, half_width), |
|
|
|
|
|
|
|
// Bottom (-Y) |
|
|
|
|
|
|
|
vert(-half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
vert(-half_width, -half_width, half_width), |
|
|
|
|
|
|
|
vert( half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
vert( half_width, -half_width, half_width), |
|
|
|
|
|
|
|
// Front (+Z) |
|
|
|
|
|
|
|
vert( half_width, half_width, half_width), |
|
|
|
|
|
|
|
vert( half_width, -half_width, half_width), |
|
|
|
|
|
|
|
vert(-half_width, half_width, half_width), |
|
|
|
|
|
|
|
vert(-half_width, -half_width, half_width), |
|
|
|
|
|
|
|
// Back (-Z) |
|
|
|
|
|
|
|
vert(-half_width, half_width, -half_width), |
|
|
|
|
|
|
|
vert(-half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
vert( half_width, half_width, -half_width), |
|
|
|
|
|
|
|
vert( half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
&.{ |
|
|
|
|
|
|
|
0, 1, 2, 3, 2, 1, // Right |
|
|
|
|
|
|
|
4, 5, 6, 7, 6, 5, // Left |
|
|
|
|
|
|
|
8, 9, 10, 11, 10, 9, // Top |
|
|
|
|
|
|
|
12, 13, 14, 15, 14, 13, // Bottom |
|
|
|
|
|
|
|
16, 17, 18, 19, 18, 17, // Front |
|
|
|
|
|
|
|
20, 21, 22, 23, 22, 21, // Back |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
// zig fmt: on |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn createPyramidPrimitive(width: f32) PrimitiveData { |
|
|
|
|
|
|
|
const half_width = width / 2.0; |
|
|
|
|
|
|
|
return createPrimitive( |
|
|
|
|
|
|
|
// zig fmt: off |
|
|
|
|
|
|
|
&.{ |
|
|
|
|
|
|
|
// Right |
|
|
|
|
|
|
|
vert( 0.0, half_width, 0.0), |
|
|
|
|
|
|
|
vert( half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
vert( half_width, -half_width, half_width), |
|
|
|
|
|
|
|
// Left |
|
|
|
|
|
|
|
vert( 0.0, half_width, 0.0), |
|
|
|
|
|
|
|
vert(-half_width, -half_width, half_width), |
|
|
|
|
|
|
|
vert(-half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
// Front |
|
|
|
|
|
|
|
vert( 0.0, half_width, 0.0), |
|
|
|
|
|
|
|
vert( half_width, -half_width, half_width), |
|
|
|
|
|
|
|
vert(-half_width, -half_width, half_width), |
|
|
|
|
|
|
|
// Back |
|
|
|
|
|
|
|
vert( 0.0, half_width, 0.0), |
|
|
|
|
|
|
|
vert(-half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
vert( half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
// Bottom |
|
|
|
|
|
|
|
vert(-half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
vert(-half_width, -half_width, half_width), |
|
|
|
|
|
|
|
vert( half_width, -half_width, -half_width), |
|
|
|
|
|
|
|
vert( half_width, -half_width, half_width), |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
&.{ |
|
|
|
|
|
|
|
0, 1, 2, // Right |
|
|
|
|
|
|
|
3, 4, 5, // Left |
|
|
|
|
|
|
|
6, 7, 8, // Front |
|
|
|
|
|
|
|
9, 10, 11, // Back |
|
|
|
|
|
|
|
// Bottom |
|
|
|
|
|
|
|
12, 13, 14, |
|
|
|
|
|
|
|
15, 14, 13, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
// zig fmt: on |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|