summaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig85
1 files changed, 48 insertions, 37 deletions
diff --git a/src/main.zig b/src/main.zig
index 89ce7d8..ffaf130 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1,6 +1,7 @@
const std = @import("std");
const matrix = @import("matrix.zig");
const sdl = @import("sdl.zig");
+const ArenaAllocator = std.heap.ArenaAllocator;
const Cube = struct {
points: [8]Point,
@@ -57,10 +58,19 @@ pub fn center_point(point: Point, offset: f32) Point {
};
}
-pub fn rotate_cube(cube: Cube, alpha: f32, beta: f32) Cube {
+pub fn rotate_cube(arena: *ArenaAllocator, cube: Cube, alpha: f32, beta: f32) Cube {
var rotated_cube = Cube{ .points = undefined };
+ for (cube.points) |point, i| {
+ rotated_cube.points[i] = rotate_point(arena, point, alpha, beta);
+ }
+
+ return rotated_cube;
+}
+
+pub fn rotate_point(arena: *ArenaAllocator, point: Point, alpha: f32, beta: f32) Point {
var a = matrix.new(
+ arena,
3,
3,
&[_]f32{
@@ -71,6 +81,7 @@ pub fn rotate_cube(cube: Cube, alpha: f32, beta: f32) Cube {
);
var b = matrix.new(
+ arena,
3,
3,
&[_]f32{
@@ -80,45 +91,43 @@ pub fn rotate_cube(cube: Cube, alpha: f32, beta: f32) Cube {
},
);
- for (cube.points) |point, i| {
- var m = matrix.multiply(
- matrix.multiply(a, b),
- matrix.new(3, 1, &[3]f32{ point.x, point.y, point.z }),
- ).x.items;
- rotated_cube.points[i].x = m[0];
- rotated_cube.points[i].y = m[1];
- rotated_cube.points[i].z = m[2];
- }
+ var m = matrix.multiply(
+ arena,
+ matrix.multiply(arena, a, b),
+ matrix.new(arena, 3, 1, &[3]f32{ point.x, point.y, point.z }),
+ );
- return rotated_cube;
+ return Point{
+ .x = m.x.items[0],
+ .y = m.x.items[1],
+ .z = m.x.items[2],
+ };
}
-pub fn project_cube(cube: Cube) Cube {
+pub fn project_cube(arena: *ArenaAllocator, cube: Cube) Cube {
var projected_cube = Cube{ .points = undefined };
for (cube.points) |point, i| {
- projected_cube.points[i] = project_point(point);
+ projected_cube.points[i] = project_point(arena, point);
}
return projected_cube;
}
-pub fn project_point(p: Point) Point {
+pub fn project_point(arena: *ArenaAllocator, p: Point) Point {
var cx = [_]f32{
1, 0, 0,
0, 1, 0,
0, 0, 0,
};
- var c = matrix.new(3, 3, &cx);
- var m = matrix.multiply(c, matrix.new(3, 1, &[3]f32{ p.x, p.y, p.z })).x.items;
+ var c = matrix.new(arena, 3, 3, &cx);
+ var m = matrix.multiply(arena, c, matrix.new(arena, 3, 1, &[3]f32{ p.x, p.y, p.z }));
- var projected_point = Point{
- .x = m[0],
- .y = m[1],
- .z = m[2],
+ return Point{
+ .x = m.x.items[0],
+ .y = m.x.items[1],
+ .z = m.x.items[2],
};
-
- return projected_point;
}
pub fn scale_cube(cube: Cube, scale: f32) Cube {
@@ -131,21 +140,21 @@ pub fn scale_cube(cube: Cube, scale: f32) Cube {
return scaled_cube;
}
-pub fn draw_axis(instance: sdl.instance) void {
+pub fn draw_axis(arena: *ArenaAllocator, instance: sdl.instance) void {
var o = center_point(
- project_point(Point{ .x = 00, .y = 00, .z = 00 }),
+ project_point(arena, Point{ .x = 00, .y = 00, .z = 00 }),
250,
);
var x = center_point(
- project_point(Point{ .x = 50, .y = 00, .z = 00 }),
+ project_point(arena, Point{ .x = 50, .y = 00, .z = 00 }),
250,
);
var y = center_point(
- project_point(Point{ .x = 00, .y = 50, .z = 00 }),
+ project_point(arena, Point{ .x = 00, .y = 50, .z = 00 }),
250,
);
var z = center_point(
- project_point(Point{ .x = 00, .y = 00, .z = 50 }),
+ project_point(arena, Point{ .x = 00, .y = 00, .z = 50 }),
250,
);
@@ -178,6 +187,7 @@ pub fn main() anyerror!void {
var beta: f32 = 0;
var alpha: f32 = 0;
while (true) {
+ var arena = ArenaAllocator.init(std.heap.page_allocator);
var event = sdl.get_event();
if (event.mode == sdl.modes.quit) {
break;
@@ -191,37 +201,38 @@ pub fn main() anyerror!void {
sdl.draw_color(instance, 0, 0, 0, 0);
sdl.clear(instance);
- var cube = rotate_cube(unit_cube, alpha, beta);
+ draw_axis(&arena, instance);
+
+ var cube = rotate_cube(&arena, unit_cube, alpha, beta);
cube = scale_cube(cube, 50);
- cube = project_cube(cube);
+ cube = project_cube(&arena, cube);
cube = center_cube(cube, 250);
draw_cube(instance, cube);
- cube = rotate_cube(unit_cube, alpha + 90, beta + 90);
+ cube = rotate_cube(&arena, unit_cube, alpha + 90, beta + 90);
cube = scale_cube(cube, 25);
- cube = project_cube(cube);
+ cube = project_cube(&arena, cube);
cube = center_cube(cube, 250);
draw_cube(instance, cube);
cube = shift_cube(unit_cube, 5, 0, 0);
- cube = rotate_cube(cube, 2 * alpha, 2 * beta);
+ cube = rotate_cube(&arena, cube, 2 * alpha, 2 * beta);
cube = scale_cube(cube, 25);
- cube = project_cube(cube);
+ cube = project_cube(&arena, cube);
cube = center_cube(cube, 250);
draw_cube(instance, cube);
cube = shift_cube(unit_cube, -5, 0, 0);
- cube = rotate_cube(cube, 2 * alpha, 2 * beta);
+ cube = rotate_cube(&arena, cube, 2 * alpha, 2 * beta);
cube = scale_cube(cube, 25);
- cube = project_cube(cube);
+ cube = project_cube(&arena, cube);
cube = center_cube(cube, 250);
draw_cube(instance, cube);
- draw_axis(instance);
-
beta += 0.01;
alpha += 0.01;
+ arena.deinit();
sdl.present(instance);
sdl.delay(10);
}