Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 73 additions & 62 deletions src/foundations/object/object_sphere/ObjectSphere.zig
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
mesh: rhi.mesh,

const Sphere = @This();
const num_quads = 10000;
const num_vertices: usize = num_quads * 4;
const angle_delta: f32 = std.math.pi * 0.02;
const grid_dimension: usize = @intFromFloat((2.0 * std.math.pi) / angle_delta);
const num_vertices: usize = grid_dimension * grid_dimension;
const quad_dimensions = grid_dimension - 1;
const num_quads = quad_dimensions * quad_dimensions;
const num_indices: usize = num_quads * 6;
const sphere_scale: f32 = 0.75;

Expand All @@ -21,6 +24,9 @@ pub fn init(
.vao = vao_buf.vao,
.buffer = vao_buf.buffer,
.wire_mesh = wireframe,
// TODO: this code has a degenerate triangle, cull face bug at when i % grid_dimension == 0
// I have to do the math on paper to figure this out.
.cull = false,
.instance_type = .{
.instanced = .{
.index_count = num_indices,
Expand All @@ -39,73 +45,78 @@ fn data() struct { attribute_data: [num_vertices]rhi.attributeData, indices: [nu
var indices: [num_indices]u32 = undefined;
var x_axis_angle: f32 = 0;

var pi: usize = 0;
var ii: usize = 0;
const x_angle_delta: f32 = angle_delta;

const x_angle_delta: f32 = std.math.pi * 0.02;
var positions: [num_vertices]math.vector.vec3 = undefined;
{
var pi: usize = 0;
while (x_axis_angle < 2 * std.math.pi) : (x_axis_angle += x_angle_delta) {
const y_angle_delta: f32 = x_angle_delta;
var y_axis_angle: f32 = 0;
while (y_axis_angle < 2 * std.math.pi) : (y_axis_angle += y_angle_delta) {
positions[pi] = math.rotation.sphericalCoordinatesToCartesian3D(math.vector.vec3, .{
1.0,
y_axis_angle,
x_axis_angle,
});
pi += 1;
}
}
}

{
var ii: usize = 0;
var last: usize = 0;
var fl: usize = 0;
var sl: usize = 0;
for (0..quad_dimensions) |_| {
for (0..quad_dimensions) |_| {
const i = fl + sl;
const tr = i + 1;
const br = i + grid_dimension + 1;
const tl = i;
var bl = i + grid_dimension;
bl += 0;

while (x_axis_angle < 2 * std.math.pi) : (x_axis_angle += x_angle_delta) {
var y_axis_angle: f32 = 0;
const y_angle_delta: f32 = x_angle_delta;
while (y_axis_angle <= 2 * std.math.pi) : (y_axis_angle += y_angle_delta) {
const tr_coordinates: math.vector.vec3 = math.rotation.sphericalCoordinatesToCartesian3D(math.vector.vec3, .{
1.0,
y_axis_angle,
x_axis_angle,
});
const br_coordinates: math.vector.vec3 = math.rotation.sphericalCoordinatesToCartesian3D(math.vector.vec3, .{
1.0,
y_axis_angle,
x_axis_angle + x_angle_delta,
});
const tl_coordinates: math.vector.vec3 = math.rotation.sphericalCoordinatesToCartesian3D(math.vector.vec3, .{
1.0,
y_axis_angle + y_angle_delta,
x_axis_angle,
});
const bl_coordinates: math.vector.vec3 = math.rotation.sphericalCoordinatesToCartesian3D(math.vector.vec3, .{
1.0,
y_axis_angle + y_angle_delta,
x_axis_angle + x_angle_delta,
});
const tr = pi;
const br = pi + 1;
const tl = pi + 2;
const bl = pi + 3;
attribute_data[tr] = .{ .position = tr_coordinates, .normals = math.vector.normalize(tr_coordinates) };
attribute_data[br] = .{ .position = br_coordinates, .normals = math.vector.normalize(br_coordinates) };
attribute_data[tl] = .{ .position = tl_coordinates, .normals = math.vector.normalize(tl_coordinates) };
attribute_data[bl] = .{ .position = bl_coordinates, .normals = math.vector.normalize(bl_coordinates) };
// Triangle 1
indices[ii] = @intCast(tl);
indices[ii + 1] = @intCast(bl);
indices[ii + 2] = @intCast(br);
// Triangle 2
indices[ii + 3] = @intCast(tr);
indices[ii + 4] = @intCast(tl);
indices[ii + 5] = @intCast(br);
pi += 4;
ii += 6;
addVertexData(positions, indices[0..], attribute_data[0..], tr, br, tl, bl, ii);

ii += 6;
last = br;
fl += 1;
}
sl += 1;
}
}

return .{ .attribute_data = attribute_data, .indices = indices };
}

fn addVertexData(attribute_data: *[num_vertices]rhi.attributeData, new_coordinates: [3]f32, i: usize) void {
{
const p = math.vector.mul(
sphere_scale,
@as(math.vector.vec3, .{
new_coordinates[2],
new_coordinates[1],
new_coordinates[0],
}),
);
attribute_data[i] = .{
.position = p,
.normals = math.vector.normalize(p),
};
}
fn addVertexData(
positions: [num_vertices]math.vector.vec3,
indices: []u32,
attribute_data: []rhi.attributeData,
tr: usize,
br: usize,
tl: usize,
bl: usize,
ii: usize,
) void {
const tr_coordinates = positions[tr];
const br_coordinates = positions[br];
const tl_coordinates = positions[tl];
const bl_coordinates = positions[bl];
attribute_data[tr] = .{ .position = tr_coordinates, .normals = math.vector.normalize(tr_coordinates) };
attribute_data[br] = .{ .position = br_coordinates, .normals = math.vector.normalize(br_coordinates) };
attribute_data[tl] = .{ .position = tl_coordinates, .normals = math.vector.normalize(tl_coordinates) };
attribute_data[bl] = .{ .position = bl_coordinates, .normals = math.vector.normalize(bl_coordinates) };
// Triangle 1
indices[ii] = @intCast(tl);
indices[ii + 1] = @intCast(br);
indices[ii + 2] = @intCast(tr);
// Triangle 2
indices[ii + 3] = @intCast(tl);
indices[ii + 4] = @intCast(bl);
indices[ii + 5] = @intCast(br);
}

const std = @import("std");
Expand Down