diff --git a/engine/rend/shaders/debug.vert.hlsl b/engine/rend/shaders/debug.vert.hlsl index 032bcf0..43f1679 100644 --- a/engine/rend/shaders/debug.vert.hlsl +++ b/engine/rend/shaders/debug.vert.hlsl @@ -14,7 +14,7 @@ struct Output struct Scene { float4x4 Model; - float3 Color; + float4 Color; }; StructuredBuffer scene: register(t0, space0); @@ -31,7 +31,7 @@ Output main(Input input) float4 pos = float4(input.Position, 1.0); output.Position = mul(ViewProjection, mul(scene[input.Instance].Model, pos)); - output.Color = scene[input.Instance].Color; + output.Color = scene[input.Instance].Color.xyz; return output; } diff --git a/engine/rend/shaders/debug.vert.json b/engine/rend/shaders/debug.vert.json index f3b65c7..24d64b6 100644 --- a/engine/rend/shaders/debug.vert.json +++ b/engine/rend/shaders/debug.vert.json @@ -18,7 +18,7 @@ }, { "name" : "Color", - "type" : "vec3", + "type" : "vec4", "offset" : 64 } ] diff --git a/engine/rend/shaders/lit_mesh.frag.hlsl b/engine/rend/shaders/lit_mesh.frag.hlsl index eeffff9..2ed0b54 100644 --- a/engine/rend/shaders/lit_mesh.frag.hlsl +++ b/engine/rend/shaders/lit_mesh.frag.hlsl @@ -59,19 +59,25 @@ float4 main( float3 Normal: TEXCOORD2 ) : SV_Target0 { + float4 s = Texture.Sample(Sampler, UV); + float alpha = s.w; + + if(alpha < 0.01) + { + discard; + } float3 lightPos = float3(0, 20 + -4, -5); float3 lightColor = float3(0.8, 0.8, 0.5); float3 ambient = lerp(float3(0.01, 0.01, 0.003), float3(0.004, 0.004, 0.06), dot(Normal, float3(0.0,1.0,0.0)) ); - float4 s = Texture.Sample(Sampler, UV); - float alpha = s.w; float3 col = s.xyz; float3 c2 = col * ambient + col * BlinnPhong(Normal, WorldPos, lightPos, lightColor); float4 rv = float4(pow(c2, 1.0 / 2.2), alpha); + return rv; } diff --git a/engine/rend/src/camera/CameraComponent.zig b/engine/rend/src/camera/CameraComponent.zig index b29a911..5182c72 100644 --- a/engine/rend/src/camera/CameraComponent.zig +++ b/engine/rend/src/camera/CameraComponent.zig @@ -51,6 +51,7 @@ pub fn resolve(self: *@This()) void { position.z = -position.z; position.y = -position.y; + position.x = -position.x; { var base = core.zm.identity(); base = mul(core.zm.rotationY(-self.yaw), base); diff --git a/engine/rend/src/sgpu/DebugDrawSystem.zig b/engine/rend/src/sgpu/DebugDrawSystem.zig index 807bc43..8cf20e4 100644 --- a/engine/rend/src/sgpu/DebugDrawSystem.zig +++ b/engine/rend/src/sgpu/DebugDrawSystem.zig @@ -95,7 +95,7 @@ pub fn onUpload(p: *anyopaque, copyPass: *gpu.GPUCopyPass) void { var primitive: DebugPrimitive = self.debugDraws.pop().?; uploadMapped[offset] = .{ .Model = primitive.resolve(), - .Color = @bitCast(primitive.color), + .Color = @bitCast(primitive.color.toZm()), }; self.drawsThisFrame.append(self.allocator, primitive) catch unreachable; diff --git a/projects/content/_shaders/dxil/lit_mesh.frag.dxil b/projects/content/_shaders/dxil/lit_mesh.frag.dxil index 779aff1..13e8612 100644 Binary files a/projects/content/_shaders/dxil/lit_mesh.frag.dxil and b/projects/content/_shaders/dxil/lit_mesh.frag.dxil differ diff --git a/projects/content/_shaders/msl/debug.vert.msl b/projects/content/_shaders/msl/debug.vert.msl index 482ac8a..8dd4b36 100644 --- a/projects/content/_shaders/msl/debug.vert.msl +++ b/projects/content/_shaders/msl/debug.vert.msl @@ -6,7 +6,7 @@ using namespace metal; struct Scene { float4x4 Model; - float3 Color; + float4 Color; }; struct type_StructuredBuffer_Scene @@ -33,7 +33,7 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], const device type_StructuredBuffer_Scene& scene [[buffer(1)]], uint gl_InstanceIndex [[instance_id]]) { main0_out out = {}; - out.out_var_TEXCOORD0 = scene._m0[gl_InstanceIndex].Color; + out.out_var_TEXCOORD0 = scene._m0[gl_InstanceIndex].Color.xyz; 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/msl/lit_mesh.frag.msl b/projects/content/_shaders/msl/lit_mesh.frag.msl index 766471f..7586c69 100644 --- a/projects/content/_shaders/msl/lit_mesh.frag.msl +++ b/projects/content/_shaders/msl/lit_mesh.frag.msl @@ -24,11 +24,16 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], texture2d Texture [[texture(0)]], sampler Sampler [[sampler(0)]]) { main0_out out = {}; - float4 _56 = Texture.sample(Sampler, in.in_var_TEXCOORD0); - float3 _59 = float3(0.0, 16.0, -5.0) - in.in_var_TEXCOORD1; - float3 _60 = fast::normalize(_59); - float _76 = 0.5 / length(_59); - out.out_var_SV_Target0 = float4(powr(_56.xyz * (mix(float3(0.00999999977648258209228515625, 0.00999999977648258209228515625, 0.0030000000260770320892333984375), float3(0.0040000001899898052215576171875, 0.0040000001899898052215576171875, 0.0599999986588954925537109375), float3(in.in_var_TEXCOORD2.y)) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * precise::max(dot(_60, in.in_var_TEXCOORD2), 0.0)) * _76) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * powr(precise::max(dot(in.in_var_TEXCOORD2, fast::normalize(_60 + fast::normalize(in.in_var_TEXCOORD1 - float3(Uniforms.viewPos)))), 0.0), 30.0)) * 2.0) * _76))), float3(0.4545454680919647216796875)), _56.w); + float4 _54 = Texture.sample(Sampler, in.in_var_TEXCOORD0); + float _55 = _54.w; + if (_55 < 0.00999999977648258209228515625) + { + discard_fragment(); + } + float3 _63 = float3(0.0, 16.0, -5.0) - in.in_var_TEXCOORD1; + float3 _64 = fast::normalize(_63); + float _80 = 0.5 / length(_63); + out.out_var_SV_Target0 = float4(powr(_54.xyz * (mix(float3(0.00999999977648258209228515625, 0.00999999977648258209228515625, 0.0030000000260770320892333984375), float3(0.0040000001899898052215576171875, 0.0040000001899898052215576171875, 0.0599999986588954925537109375), float3(in.in_var_TEXCOORD2.y)) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * precise::max(dot(_64, in.in_var_TEXCOORD2), 0.0)) * _80) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * powr(precise::max(dot(in.in_var_TEXCOORD2, fast::normalize(_64 + fast::normalize(in.in_var_TEXCOORD1 - float3(Uniforms.viewPos)))), 0.0), 30.0)) * 2.0) * _80))), float3(0.4545454680919647216796875)), _55); return out; } diff --git a/projects/content/_shaders/spv/debug.vert.spv b/projects/content/_shaders/spv/debug.vert.spv index ea987d8..16f3db5 100644 Binary files a/projects/content/_shaders/spv/debug.vert.spv and b/projects/content/_shaders/spv/debug.vert.spv differ diff --git a/projects/content/_shaders/spv/lit_mesh.frag.spv b/projects/content/_shaders/spv/lit_mesh.frag.spv index a77c143..e6a567c 100644 Binary files a/projects/content/_shaders/spv/lit_mesh.frag.spv and b/projects/content/_shaders/spv/lit_mesh.frag.spv differ diff --git a/projects/sampleGame/main.zig b/projects/sampleGame/main.zig index 4ca14c4..7a4d3a7 100644 --- a/projects/sampleGame/main.zig +++ b/projects/sampleGame/main.zig @@ -62,6 +62,14 @@ pub fn prepare(self: *@This()) !void { _ = exitInput.data.addListener(null, onExit); exitInput.activate(); + { + const inp = try core.ActionBinding.create(core.MakeName("slow")); + inp.addKey(.lshift, .keyDown); + inp.addKey(.lshift, .keyUp); + _ = inp.data.addListener(self, slowDown); + inp.activate(); + } + self.camera = try core.createEntity(); const cameraScene = self.camera.addComponent(core.Scene).?; cameraScene.setPosition(.{ .z = -15 }); @@ -131,6 +139,17 @@ fn onShaderReload(ctx: ?*anyopaque, action: core.ActionEvent) void { rend.renderer.reloadShaders() catch unreachable; } +fn slowDown(ctx: ?*anyopaque, action: core.ActionEvent) void { + const self: *@This() = @ptrCast(@alignCast(ctx)); + + if (action == .keyUp) { + self.cameraSpeed = 10.0; + } + if (action == .keyDown) { + self.cameraSpeed = 4.0; + } +} + fn verticalMovement(ctx: ?*anyopaque, axis: f32) void { const self: *@This() = @ptrCast(@alignCast(ctx)); self.verticalMove = axis; @@ -138,7 +157,7 @@ fn verticalMovement(ctx: ?*anyopaque, axis: f32) void { fn onMove(ctx: ?*anyopaque, axis: core.Vector2f) void { const self: *@This() = @ptrCast(@alignCast(ctx)); - self.moveVector = .{ .x = -axis.x, .z = axis.y, .y = 0.0 }; + self.moveVector = .{ .x = axis.x, .z = axis.y, .y = 0.0 }; } pub fn onExit(ctx: ?*anyopaque, action: core.ActionEvent) void { @@ -153,11 +172,14 @@ pub fn tick(self: *@This(), dt: f64) void { if (self.camera.fetch(core.Scene)) |scene| { const vector = core.Vectorf{ .x = self.moveVector.x, .z = self.moveVector.z, .y = self.verticalMove }; scene.getPosRot().position = scene.getPosRot().position.add(vector.fmul(self.cameraSpeed * fdt)); - // core.engine_log(" camera position >> {any}", .{scene.getPosRot().position}); + core.debugSphere(scene.getPosRot().position.add(.{ .z = 2 }), 0.3, .{}); + core.debugSphere( + scene.getPosRot().position.add(.{ .z = 2 }), + 0.1, + .{ .color = .{ .x = 1.0 } }, + ); } - core.debugSphere(.{ .y = 0 }, 4, .{}); - var show: bool = true; ig.showDemoWindow(&show);