Use castle for vecmath (doesn't work fully yet)

This commit is contained in:
2026-01-04 17:13:58 +01:00
parent 21c1d2e139
commit fed1e982d2
23 changed files with 424 additions and 1894 deletions

View File

@@ -6,6 +6,7 @@ const glfw = @import("zglfw");
const math = @import("math.zig");
const shaders = @import("shaders.zig");
const vk = @import("vulkan");
const vm = @import("vecmath");
const worldgen = @import("worldgen.zig");
const Blocks = @import("assets/Blocks.zig");
@@ -15,17 +16,11 @@ const CommandBuffer = @import("engine/CommandBuffer.zig");
const Engine = @import("engine/Engine.zig");
const Iterator2 = math.Iterator2;
const Materials = @import("assets/Materials.zig");
const Matrix4x4 = math.Matrix4x4;
const Player = @import("Player.zig");
const Quaternion = math.Quaternion;
const Skybox = @import("engine/Skybox.zig");
const StagingBuffer = @import("engine/StagingBuffer.zig");
const Swapchain = @import("engine/Swapchain.zig");
const Textures = @import("assets/Textures.zig");
const Vector2 = math.Vector2;
const Vector2x8 = math.Vector2x8;
const Vector3 = math.Vector3;
const Vector3Int = math.Vector3Int;
allocator: std.mem.Allocator,
engine: *Engine,
@@ -545,7 +540,7 @@ pub fn init(allocator: std.mem.Allocator, engine: *Engine, swapchain: *Swapchain
while (it.next()) |chunk_coords2| {
const chunk_coords3 = chunk_coords2 ++ [_]i16{0};
const origin = Vector3.init(
const origin = vm.Vector3.init(
@floatFromInt(chunk_coords3[0]),
@floatFromInt(chunk_coords3[1]),
@floatFromInt(chunk_coords3[2]),
@@ -564,14 +559,14 @@ pub fn init(allocator: std.mem.Allocator, engine: *Engine, swapchain: *Swapchain
var y: usize = 0;
while (y < 16) : (y += 1) {
const fpos0 = Vector2x8.initScalars(
const fpos0 = vm.Vector2x8.init(
.{ 0, 1, 2, 3, 4, 5, 6, 7 },
@splat(@floatFromInt(y)),
).add(.initVector(origin.asVector2()));
const fpos1 = Vector2x8.initScalars(
).add(.splat(origin.dropZ()));
const fpos1 = vm.Vector2x8.init(
.{ 8, 9, 10, 11, 12, 13, 14, 15 },
@splat(@floatFromInt(y)),
).add(.initVector(origin.asVector2()));
).add(.splat(origin.dropZ()));
const iheight0 = worldgen.heightIv(world_seed, fpos0);
const iheight1 = worldgen.heightIv(world_seed, fpos1);
@@ -596,7 +591,7 @@ pub fn init(allocator: std.mem.Allocator, engine: *Engine, swapchain: *Swapchain
}
}
const player_position_vx = Vector3Int.init(0, 0, worldgen.heightI(world_seed, .zero) + 1);
const player_position_vx = vm.Vector3Int.init(0, 0, worldgen.heightI(world_seed, .zero) + 1);
const player_position_sv = player_position_vx
.mulScalar(c.sv_per_vx)
.add(.init(c.sv_per_vx / 2, c.sv_per_vx / 2, 0));
@@ -623,8 +618,8 @@ pub fn init(allocator: std.mem.Allocator, engine: *Engine, swapchain: *Swapchain
const directional_lights_data: []const shaders.DirectionalLight = &.{
.{
.directionWS = .{ 0, 0, -1 },
.color = .{ 0.3, 0.3, 0.3 },
.directionWS = .unit_nz,
.color = .init(0.3, 0.3, 0.3),
},
};
try directional_lights.write(engine, .{
@@ -765,30 +760,33 @@ fn render(self: *Game) !void {
const extent = self.swapchain.extent;
const framebuffer_size = Vector2.init(
const framebuffer_size = vm.Vector2.init(
@floatFromInt(extent.width),
@floatFromInt(extent.height),
);
const camera_position = self.player.position_sv
.asVector3()
const camera_position = vm.Vector3.init(
@floatFromInt(self.player.position_sv.x),
@floatFromInt(self.player.position_sv.y),
@floatFromInt(self.player.position_sv.z),
)
.divScalar(c.sv_per_vx)
.add(.init(0, 0, Player.camera_height_vx));
const camera_rotation = Quaternion.mulQuaternion(
.initRotationXY(self.player.yaw_rad),
.initRotationYZ(self.player.pitch_rad),
const camera_rotation = vm.Quaternion.mulQuaternion(
.initRotation(.XY, self.player.yaw_turns),
.initRotation(.YZ, self.player.pitch_turns),
);
const camera_aspect_ratio = framebuffer_size.getX() / framebuffer_size.getY();
const camera_aspect_ratio = framebuffer_size.x / framebuffer_size.y;
const camera_yscale = 1.0 / @tan(0.5 * self.player.vertical_fov_deg * std.math.rad_per_deg);
const camera_xscale = camera_yscale / camera_aspect_ratio;
const matrix_ws_to_vs = Matrix4x4.mulMatrix(
Matrix4x4.initRotation(camera_rotation.conjugate()),
Matrix4x4.initTranslation(camera_position.negate()),
const matrix_ws_to_vs = vm.Matrix4x4.mulMatrixAffine(
.initRotation(camera_rotation.inverseUnit()),
.initTranslation(camera_position.negate()),
);
// zig fmt: off
const matrix_vs_to_cs = Matrix4x4.init(
const matrix_vs_to_cs = vm.Matrix4x4.init(
camera_xscale, 0, 0, 0,
0, 0, 0, 1,
0, -camera_yscale, 0, 0,
@@ -796,12 +794,12 @@ fn render(self: *Game) !void {
);
// zig fmt: on
const ambient_light = Vector3.init(0.01, 0.01, 0.01);
const ambient_light = vm.Vector3.init(0.01, 0.01, 0.01);
const global_uniforms_data: shaders.GlobalUniforms = .{
.matrixWStoVS = matrix_ws_to_vs.asArray(),
.matrixVStoCS = matrix_vs_to_cs.asArray(),
.ambientLight = ambient_light.asArray(),
.matrixWStoVS = matrix_ws_to_vs,
.matrixVStoCS = matrix_vs_to_cs,
.ambientLight = ambient_light,
};
const staging_memory = try self.global_uniforms_staging_buffer.map(self.engine);