From cd66fbb4570b8dac8b1829c67983fb26da08070f Mon Sep 17 00:00:00 2001 From: Peter Li Date: Fri, 18 Apr 2025 23:41:16 -0700 Subject: [PATCH] > sdl_gpu mesh pipeline and shader reloading --- engine/rend/shaders/meshes.vert.hlsl | 9 +++--- engine/rend/src/camera/CameraComponent.zig | 27 ++++++++++-------- engine/rend/src/camera/camera.zig | 5 ---- engine/rend/src/sgpu/renderer.zig | 15 ++++++++-- lib/p2/src/utils/shell.zig | 18 ++++++------ .../content/_shaders/dxil/meshes.vert.dxil | Bin 5224 -> 5216 bytes projects/content/_shaders/msl/meshes.vert.msl | 2 +- projects/content/_shaders/spv/meshes.vert.spv | Bin 1524 -> 1492 bytes projects/sampleGame/main.zig | 26 ++++++++++++++--- 9 files changed, 65 insertions(+), 37 deletions(-) delete mode 100644 engine/rend/src/camera/camera.zig diff --git a/engine/rend/shaders/meshes.vert.hlsl b/engine/rend/shaders/meshes.vert.hlsl index a41c58c..62596ed 100644 --- a/engine/rend/shaders/meshes.vert.hlsl +++ b/engine/rend/shaders/meshes.vert.hlsl @@ -7,7 +7,7 @@ struct Input uint Bones : TEXCOORD4; uint weights : TEXCOORD5; - uint InstanceIndex : SV_InstanceID; + uint Instance : SV_InstanceID; }; struct Output @@ -30,13 +30,14 @@ cbuffer Uniforms : register(b0, space1) float time; }; -#define IDENTITY_MATRIX float4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1) - Output main(Input input) { Output output; output.TexCoord = input.UV; - output.Position = mul(mul(float4(input.Position, 1.0), transpose(scene[input.InstanceIndex].Model)), transpose(ViewProjection)); + // output.TexCoord[0] += scene[input.Instance].Model[0][0] * 0.0001; + + //output.Position = mul(ViewProjection, float4(input.Position - float3(1 * sin(time + 0.05 * input.Position[0]),0, 1 * cos(time + 0.05 * input.Position[0])), 1.0)); + output.Position = mul(ViewProjection, mul(scene[input.Instance].Model, float4(input.Position, 1.0))); return output; } diff --git a/engine/rend/src/camera/CameraComponent.zig b/engine/rend/src/camera/CameraComponent.zig index 814b5e1..a611dd1 100644 --- a/engine/rend/src/camera/CameraComponent.zig +++ b/engine/rend/src/camera/CameraComponent.zig @@ -32,18 +32,21 @@ pub fn initECS(self: *@This(), handle: core.SetHandle) void { self.entity = core.Entity.fromHandle(handle); } -pub fn updateProjections(self: *@This()) core.Transform { - self.projection = zm.perspectiveFovRh(core.radians(self.fov), 16.0 / 9.0, 0.1, 200000); - self.projection[1][1] *= -1; +pub fn updateProjections(self: *@This()) void { + self.projection = zm.perspectiveFovLh(core.radians(self.fov), 16.0 / 9.0, 0.1, 200000); + // self.projection[1][1] *= -1; - self.projectionAlt = zm.perspectiveFovRh(core.radians(self.altFov), 16.0 / 9.0, 0.01, 200000); + self.projectionAlt = zm.perspectiveFovLh(core.radians(self.altFov), 16.0 / 9.0, 0.01, 200000); self.projectionAlt[1][1] *= -1; } pub fn resolve(self: *@This()) void { const scene = self.entity.get(core.Scene).?; - const position = scene.getPosition(); + self.updateProjections(); + + var position = scene.getPosition(); + position.z = -position.z; { var base = core.zm.identity(); base = mul(core.zm.rotationY(-self.yaw), base); @@ -59,20 +62,20 @@ pub fn resolve(self: *@This()) void { // calculate viewProjections { - var base = core.zm.rotationY(self.yaw + core.radians(180.0)); - base = mul(base, core.zm.rotationX(self.pitch)); - base = mul(base, core.zm.rotationZ(self.roll)); - self.transform = base; + // var base = core.zm.rotationY(self.yaw + core.radians(180.0)); + // base = mul(base, core.zm.rotationX(self.pitch)); + // base = mul(base, core.zm.rotationZ(self.roll)); + self.transform = core.zm.identity(); - self.transform = mul(zm.translationV(position.fmul(-1).toZm()), self.transform); + self.transform = mul(zm.translationV(position.toZm()), self.transform); self.final = mul(self.transform, self.projection); - core.engine_log("{any}", .{self.final}); + // core.engine_log("{any}", .{self.final}); self.finalAlt = mul(self.transform, self.projectionAlt); } } fn makePerspective(fov: f32, aspect: f32, near: f32, far: f32) Mat { - const proj = core.zm.perspectiveFovRh( + const proj = core.zm.perspectiveFovLh( core.radians(fov), aspect, near, diff --git a/engine/rend/src/camera/camera.zig b/engine/rend/src/camera/camera.zig deleted file mode 100644 index 8a15cf2..0000000 --- a/engine/rend/src/camera/camera.zig +++ /dev/null @@ -1,5 +0,0 @@ -fov: f32 = 70.0, -altFov: f32 = 70.0, -aspect: f32 = 16.0 / 9.0, -near_clipping: f32 = 0.1, -far_clipping: f32 = 10000.0, diff --git a/engine/rend/src/sgpu/renderer.zig b/engine/rend/src/sgpu/renderer.zig index 528db70..142228b 100644 --- a/engine/rend/src/sgpu/renderer.zig +++ b/engine/rend/src/sgpu/renderer.zig @@ -66,7 +66,7 @@ pub const Renderer = struct { var gci = std.mem.zeroes(gpu.GPUTextureCreateInfo); gci.type = .texturetype2d; - gci.format = .textureformatD16Unorm; + gci.format = .textureformatD32Float; gci.width = @intCast(self.scissor.w); gci.height = @intCast(self.scissor.h); gci.layer_count_or_depth = 1; @@ -158,7 +158,7 @@ pub const Renderer = struct { pci.depth_stencil_state.write_mask = 0xff; pci.target_info.has_depth_stencil_target = true; - pci.target_info.depth_stencil_format = .textureformatD16Unorm; + pci.target_info.depth_stencil_format = .textureformatD32Float; pci.target_info.num_color_targets = 1; pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{ .{ @@ -223,7 +223,7 @@ pub const Renderer = struct { pci.target_info.num_color_targets = 1; pci.target_info.has_depth_stencil_target = true; - pci.target_info.depth_stencil_format = .textureformatD16Unorm; + pci.target_info.depth_stencil_format = .textureformatD32Float; pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{ .{ .format = self.device.getGPUSwapchainTextureFormat(self.window), @@ -359,6 +359,8 @@ pub const Renderer = struct { depthTarget.texture = self.depthTexture; depthTarget.load_op = .loadopClear; depthTarget.store_op = .storeopDontCare; + depthTarget.stencil_load_op = .loadopDontCare; + depthTarget.stencil_store_op = .storeopDontCare; depthTarget.clear_depth = 1.0; depthTarget.clear_stencil = 0; @@ -435,6 +437,13 @@ const ShaderLoadArgs = sdl3.shaderTypes.ShaderLoadArgs; pub const mesh_pool = @import("mesh-pool.zig"); pub const MeshPool = mesh_pool.MeshPool; +// debug api + +pub fn reloadShaders() !void { + _ = try core.shell.runCmd(gRenderer.allocator, &.{ "python", "../tools/scripts/cookShaders.py" }, "."); + try gRenderer.createMeshPipeline(); +} + // ====== renderer API ======= pub fn start() !void { gRenderer = try core.createObject(Renderer, .{ .can_tick = true, .isCore = true }); diff --git a/lib/p2/src/utils/shell.zig b/lib/p2/src/utils/shell.zig index 00d3ddf..c978bdc 100644 --- a/lib/p2/src/utils/shell.zig +++ b/lib/p2/src/utils/shell.zig @@ -87,16 +87,18 @@ pub const ShellProcess = struct { } }; -pub fn runCmd(allocator: std.mem.allocator, cmd: []const []const u8, cwd: []const u8) ![]const u8 { +pub fn runCmd(allocator: std.mem.Allocator, cmd: []const []const u8, cwd: []const u8) ![]u8 { var proc: ChildProcess = ChildProcess.init(cmd, allocator); proc.cwd = cwd; - // const result = try std.process.Child.run(.{ - // .argv = cmd, - // .allocator = allocator, - // .cwd = p2.getFolder(cwd), - // .max_output_bytes = 150 * 1024 * 1024, - // }); + const result = try std.process.Child.run(.{ + .argv = cmd, + .allocator = allocator, + .cwd = p2.getFolder(cwd), + .max_output_bytes = 150 * 1024 * 1024, + }); - // return result.; + allocator.free(result.stdout); + + return result.stdout; } diff --git a/projects/content/_shaders/dxil/meshes.vert.dxil b/projects/content/_shaders/dxil/meshes.vert.dxil index b5c86356f7194765ae5f13aefc449141fb6e9509..f401411b1562745c922c0a6cd3808a06c76eb722 100644 GIT binary patch delta 611 zcmaE%@jye;CBn)1z~eVfJlh`lh41K@q|vA^!N|bCkg!qm0H?*Ghp&}d-u)`rdQnk5 z{QWeS2v45^E}$d>Bf}gf1_lrx$Yc-zYKQ=e1C6?;$iu)ed9xswHX9@RW?KPiruys) z8Yj|^Ffcj@@GPo&z?vb_B*@Id;AqhCW}*0kKn|UT1<4mQ;VNnv*k8a^d{LBH5DZbF z1y@n0z@8xrGvm)fnFXN`720qW6CBuIz*QKzD9J7e2PrX5Dqv9HVDtA}a9FqDNQM(b zj~d6pj6(`NY66El4l*_se6U}#DZ_*>uNsS%S9DFrul zgG1*j9+qmaXQ^!61O9xeR$_>c$NWkv=DhK!Ap2RJR{mbE8X-1hkqa!bn(1r9cU+Xsg<4;;>LV(3xhIGAxrp+`;NaK}N$1_cS5Ul+L7B=9fhWHgwiz_OUL z*wuBjg!3JYOu(>qNj)eeCdC3ZX{M{UPl^E4!V)n(#zvrp6F?SrMQve;oY3m`0 zNS{X5MWGZ&F|$T~Wj0QrBNnW1^`62S`NG8*uHFTx-d6=h`hkm~2(rAZ9}5RCu`mDt D-Db>A diff --git a/projects/content/_shaders/msl/meshes.vert.msl b/projects/content/_shaders/msl/meshes.vert.msl index f737c00..88a175b 100644 --- a/projects/content/_shaders/msl/meshes.vert.msl +++ b/projects/content/_shaders/msl/meshes.vert.msl @@ -35,7 +35,7 @@ vertex main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniform { main0_out out = {}; out.out_var_TEXCOORD0 = in.in_var_TEXCOORD3; - out.gl_Position = transpose(transpose(Uniforms.ViewProjection)) * (transpose(transpose(scene._m0[gl_InstanceIndex].Model)) * float4(in.in_var_TEXCOORD0, 1.0)); + out.gl_Position = Uniforms.ViewProjection * (scene._m0[gl_InstanceIndex].Model * float4(in.in_var_TEXCOORD0, 1.0)); return out; } diff --git a/projects/content/_shaders/spv/meshes.vert.spv b/projects/content/_shaders/spv/meshes.vert.spv index 7c9992f56e8737f7f446501a19f396f612a5dcd3..4a648e5a37d89067bde06e0465205946aec4a605 100644 GIT binary patch delta 231 zcmeyueTAEsnMs+Qfq{{Mfq{=fZzJz@mRv^$Rt9+>Uj>M{!Qu=IwhSx`LO`}ERNRq) z9jrzT$mfKrQHIhmwdz1VNIno~9zT%Q0AfWT1_79u=43`zVP7qv2uOwrhy#Eo3j%3v tAO`8s1Y(f901!_Ango*50b-Cm$Of30E>v7~@wU=C@h%r~_Uz@9cR|b~U<|mIX|^=` I@wX@P2k2oEPXGV_ diff --git a/projects/sampleGame/main.zig b/projects/sampleGame/main.zig index 90dfcaa..db308df 100644 --- a/projects/sampleGame/main.zig +++ b/projects/sampleGame/main.zig @@ -51,10 +51,13 @@ pub fn prepare(self: *@This()) !void { _ = self.camera.addComponent(core.Scene).?; const camera = self.camera.addComponent(rend.CameraComponent).?; - const lostEmpire = try core.createEntity(); - _ = lostEmpire.addComponent(core.Scene); - const empireMesh = lostEmpire.addComponent(rend.MeshComponent).?; - empireMesh.setMesh("m_empire"); + { + const lostEmpire = try core.createEntity(); + const scene = lostEmpire.addComponent(core.Scene).?; + scene.setPosition(.{ .y = -20 }); + const empireMesh = lostEmpire.addComponent(rend.MeshComponent).?; + empireMesh.setMesh("m_empire"); + } rend.setActiveCamera(camera); @@ -74,6 +77,21 @@ pub fn prepare(self: *@This()) !void { _ = verticalInput.data.addListener(self, verticalMovement); verticalInput.activate(); + + { + const shaderReload = try core.ActionBinding.create(core.MakeName("shaderReload")); + shaderReload.addKey(.r, .keyDown); + _ = shaderReload.data.addListener(null, onShaderReload); + shaderReload.activate(); + } +} + +fn onShaderReload(ctx: ?*anyopaque, action: core.ActionEvent) void { + _ = ctx; + _ = action; + + core.engine_log("reloading shaders, this is gonna cause some leaks but thats ok", .{}); + rend.renderer.reloadShaders() catch unreachable; } fn verticalMovement(ctx: ?*anyopaque, axis: f32) void {