From 77a118ee8d930e778b8ba000638656162dd14d5b Mon Sep 17 00:00:00 2001 From: Peter Li Date: Tue, 6 May 2025 16:23:50 -0700 Subject: [PATCH] HDR color targets! --- engine/backlog.zig | 2 +- engine/core/src/math.zig | 8 + engine/imgui/src/sgpu/backend_impl.zig | 2 +- engine/rend/build.zig | 3 + engine/rend/shaders/lit_mesh.frag.hlsl | 11 +- engine/rend/shaders/postProc.frag.hlsl | 12 ++ engine/rend/shaders/postProc.frag.json | 38 +++++ engine/rend/shaders/postProc.vert.hlsl | 26 ++++ engine/rend/shaders/postProc.vert.json | 27 ++++ engine/rend/src/sgpu/DebugDrawSystem.zig | 2 +- engine/rend/src/sgpu/SkyboxSystem.zig | 5 +- engine/rend/src/sgpu/embedded/screenPlane.obj | 15 ++ engine/rend/src/sgpu/renderer.zig | 121 +++++++++++++-- extras/doomplayer/src/doom.zig | 145 +++++++++++------- extras/gameExtras/src/objectSpawner.zig | 4 + .../content/_shaders/dxil/lit_mesh.frag.dxil | Bin 7628 -> 7668 bytes .../content/_shaders/dxil/postProc.frag.dxil | Bin 0 -> 3684 bytes .../content/_shaders/dxil/postProc.vert.dxil | Bin 0 -> 3104 bytes .../content/_shaders/msl/lit_mesh.frag.msl | 113 +++++++------- .../content/_shaders/msl/postProc.frag.msl | 24 +++ .../content/_shaders/msl/postProc.vert.msl | 25 +++ .../content/_shaders/spv/lit_mesh.frag.spv | Bin 7072 -> 7108 bytes .../content/_shaders/spv/postProc.frag.spv | Bin 0 -> 824 bytes .../content/_shaders/spv/postProc.vert.spv | Bin 0 -> 656 bytes projects/sampleGame/main.zig | 37 +---- 25 files changed, 468 insertions(+), 152 deletions(-) create mode 100644 engine/rend/shaders/postProc.frag.hlsl create mode 100644 engine/rend/shaders/postProc.frag.json create mode 100644 engine/rend/shaders/postProc.vert.hlsl create mode 100644 engine/rend/shaders/postProc.vert.json create mode 100644 engine/rend/src/sgpu/embedded/screenPlane.obj create mode 100644 projects/content/_shaders/dxil/postProc.frag.dxil create mode 100644 projects/content/_shaders/dxil/postProc.vert.dxil create mode 100644 projects/content/_shaders/msl/postProc.frag.msl create mode 100644 projects/content/_shaders/msl/postProc.vert.msl create mode 100644 projects/content/_shaders/spv/postProc.frag.spv create mode 100644 projects/content/_shaders/spv/postProc.vert.spv diff --git a/engine/backlog.zig b/engine/backlog.zig index 6544ca1..8842d7b 100644 --- a/engine/backlog.zig +++ b/engine/backlog.zig @@ -15,7 +15,7 @@ const modulelist = @import("modulelist.zig").list; const std = @import("std"); pub const NwArgs = struct { - useGPA: bool = true, // slower zig based memory allocator, provides detailed tracking of leaks and memory violations + useGPA: bool = false, // slower zig based memory allocator, provides detailed tracking of leaks and memory violations vulkanValidation: bool = true, fastTest: bool = false, dmt: bool = false, // detailed memory tracking, implements a timeline for tracking all memory allocations diff --git a/engine/core/src/math.zig b/engine/core/src/math.zig index 1ec005c..f0ba558 100644 --- a/engine/core/src/math.zig +++ b/engine/core/src/math.zig @@ -557,6 +557,14 @@ pub const Rotation = struct { return .{}; } + pub fn add(self: @This(), other: @This()) Rotation { + const m1 = zm.quatToMat(self.quat); + const m2 = zm.quatToMat(other.quat); + + const r = zm.mul(m1, m2); + return .{ .quat = zm.matToQuat(r) }; + } + pub fn eulerX(o: f32) @This() { return .{ .quat = zm.matToQuat(zm.rotationX((o))), diff --git a/engine/imgui/src/sgpu/backend_impl.zig b/engine/imgui/src/sgpu/backend_impl.zig index f0098d1..41e6913 100644 --- a/engine/imgui/src/sgpu/backend_impl.zig +++ b/engine/imgui/src/sgpu/backend_impl.zig @@ -57,7 +57,7 @@ pub const Impl = struct { //const renderpass = cmd.beginGPURenderPass(color_target_infos: [*c]const GPUColorTargetInfo, num_color_targets: u32, depth_stencil_target_info: [*c]const GPUDepthStencilTargetInfo); var targetInfo: gpu.GPUColorTargetInfo = std.mem.zeroes(gpu.GPUColorTargetInfo); - targetInfo.texture = rend.context().state.swapchainTexture.?; + targetInfo.texture = rend.context().state.swapchainTargetTexture.?; targetInfo.clear_color = .{ .r = 0.0, .g = 0.0, .b = 0.0, .a = 0.0 }; targetInfo.load_op = .loadopLoad; targetInfo.store_op = .storeopStore; diff --git a/engine/rend/build.zig b/engine/rend/build.zig index 40a4efc..832ab05 100644 --- a/engine/rend/build.zig +++ b/engine/rend/build.zig @@ -44,6 +44,9 @@ pub fn build(b: *std.Build) void { sdl3.shaderDefintion(b, mod, "../../lib/sdl3", optimize, "skybox.frag", b.path("shaders/skybox.frag.json")); sdl3.shaderDefintion(b, mod, "../../lib/sdl3", optimize, "skybox.vert", b.path("shaders/skybox.vert.json")); + sdl3.shaderDefintion(b, mod, "../../lib/sdl3", optimize, "postProc.frag", b.path("shaders/postProc.frag.json")); + sdl3.shaderDefintion(b, mod, "../../lib/sdl3", optimize, "postProc.vert", b.path("shaders/postProc.vert.json")); + // ========== tests ========== const tests = b.addTest(.{ .target = target, diff --git a/engine/rend/shaders/lit_mesh.frag.hlsl b/engine/rend/shaders/lit_mesh.frag.hlsl index b711fe6..4ba7820 100644 --- a/engine/rend/shaders/lit_mesh.frag.hlsl +++ b/engine/rend/shaders/lit_mesh.frag.hlsl @@ -154,7 +154,6 @@ float shadowCalculationPCF(float3 fragPos, float4 DirectionalShadowFragPos) float3 DirectionalLight(float3 normal, float3 fragPos, float4 DirectionalShadowFragPos) { - float3 lightDir = directionalLight.xyz; float diff = max(dot(lightDir, normal), 0.0); float3 diffuse = diff * directionalLightColor.xyz; @@ -174,6 +173,14 @@ float3 DirectionalLight(float3 normal, float3 fragPos, float4 DirectionalShadow return diffuse; } +float3 reinhard2(float3 x) { + const float L_white = 4.0; + + const float3 a = 1.0 + x / (L_white * L_white); + const float3 x2 = x * a; + const float3 x3 = 1.0 + x; + return x2 / x3; +} float4 main( @@ -242,7 +249,7 @@ float4 main( if((texMode & 0x2) > 0) // full bright no lighting bit { - c2 = col; + c2 = col * 4; } diff --git a/engine/rend/shaders/postProc.frag.hlsl b/engine/rend/shaders/postProc.frag.hlsl new file mode 100644 index 0000000..0d2452a --- /dev/null +++ b/engine/rend/shaders/postProc.frag.hlsl @@ -0,0 +1,12 @@ +Texture2D Texture0 : register(t0, space2); +SamplerState Sampler0 : register(s0, space2); + +float4 main(float2 UV : TEXCOORD0) : SV_Target0 +{ + float2 uv = UV; + uv.y *= -1; + + float4 color = Texture0.Sample(Sampler0, uv); + + return color; +} diff --git a/engine/rend/shaders/postProc.frag.json b/engine/rend/shaders/postProc.frag.json new file mode 100644 index 0000000..e0a47ec --- /dev/null +++ b/engine/rend/shaders/postProc.frag.json @@ -0,0 +1,38 @@ +{ + "entryPoints" : [ + { + "name" : "main", + "mode" : "frag" + } + ], + "inputs" : [ + { + "type" : "vec2", + "name" : "in.var.TEXCOORD0", + "location" : 0 + } + ], + "outputs" : [ + { + "type" : "vec4", + "name" : "out.var.SV_Target0", + "location" : 0 + } + ], + "separate_images" : [ + { + "type" : "texture2D", + "name" : "Texture0", + "set" : 2, + "binding" : 0 + } + ], + "separate_samplers" : [ + { + "type" : "sampler", + "name" : "Sampler0", + "set" : 2, + "binding" : 0 + } + ] +} \ No newline at end of file diff --git a/engine/rend/shaders/postProc.vert.hlsl b/engine/rend/shaders/postProc.vert.hlsl new file mode 100644 index 0000000..16650ab --- /dev/null +++ b/engine/rend/shaders/postProc.vert.hlsl @@ -0,0 +1,26 @@ +struct Input +{ + float3 Position : TEXCOORD0; + float3 Normal : TEXCOORD1; + float4 Color : TEXCOORD2; + float2 UV : TEXCOORD3; + uint Bones : TEXCOORD4; + uint weights : TEXCOORD5; + + uint Instance : SV_InstanceID; +}; + +struct Output +{ + float2 UV : TEXCOORD0; + float4 Position : SV_Position; +}; + +Output main(Input input) +{ + Output output; + output.Position = float4(input.Position, 1.0); + output.UV = input.UV; + + return output; +} diff --git a/engine/rend/shaders/postProc.vert.json b/engine/rend/shaders/postProc.vert.json new file mode 100644 index 0000000..9d09f1a --- /dev/null +++ b/engine/rend/shaders/postProc.vert.json @@ -0,0 +1,27 @@ +{ + "entryPoints" : [ + { + "name" : "main", + "mode" : "vert" + } + ], + "inputs" : [ + { + "type" : "vec3", + "name" : "in.var.TEXCOORD0", + "location" : 0 + }, + { + "type" : "vec2", + "name" : "in.var.TEXCOORD3", + "location" : 3 + } + ], + "outputs" : [ + { + "type" : "vec2", + "name" : "out.var.TEXCOORD0", + "location" : 0 + } + ] +} \ No newline at end of file diff --git a/engine/rend/src/sgpu/DebugDrawSystem.zig b/engine/rend/src/sgpu/DebugDrawSystem.zig index e0a2bda..a93de37 100644 --- a/engine/rend/src/sgpu/DebugDrawSystem.zig +++ b/engine/rend/src/sgpu/DebugDrawSystem.zig @@ -197,7 +197,7 @@ pub fn createPipeline(self: *@This()) !*gpu.GPUGraphicsPipeline { pci.target_info.num_color_targets = 1; pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{ .{ - .format = self.device.getGPUSwapchainTextureFormat(rend.context().window), + .format = rend.context().hdrTextureFormat, .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), }, }; diff --git a/engine/rend/src/sgpu/SkyboxSystem.zig b/engine/rend/src/sgpu/SkyboxSystem.zig index 255afcf..8ff755b 100644 --- a/engine/rend/src/sgpu/SkyboxSystem.zig +++ b/engine/rend/src/sgpu/SkyboxSystem.zig @@ -61,7 +61,7 @@ fn createPipeline(self: *@This()) !void { pci.target_info.num_color_targets = 1; pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{ .{ - .format = self.device.getGPUSwapchainTextureFormat(ctx.window), + .format = ctx.hdrTextureFormat, .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), }, }; @@ -85,7 +85,7 @@ pub fn destroy(self: *@This()) void { pub fn render(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { const targetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ - .texture = rend.context().state.swapchainTexture.?, + .texture = rend.context().state.targetTexture, .clear_color = self.skyboxColor, .load_op = .loadopClear, .store_op = .storeopStore, @@ -102,6 +102,7 @@ pub fn render(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { } const renderpass = cmd.beginGPURenderPass(&targetInfo, 1, null); + if (self.skyboxTexture) |skyboxTexture| { if (self.skyboxMesh) |skyboxMesh| { const ctx = rend.context(); diff --git a/engine/rend/src/sgpu/embedded/screenPlane.obj b/engine/rend/src/sgpu/embedded/screenPlane.obj new file mode 100644 index 0000000..7467525 --- /dev/null +++ b/engine/rend/src/sgpu/embedded/screenPlane.obj @@ -0,0 +1,15 @@ +# Blender 4.4.3 +# www.blender.org +o Plane +v -1.000000 1.000000 0.000000 +v 1.000000 1.000000 0.000000 +v -1.000000 -1.000000 -0.000000 +v 1.000000 -1.000000 -0.000000 +vn -0.0000 1.0000 -0.0000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +s 0 +f 1/1/1 2/2/1 4/3/1 3/4/1 + diff --git a/engine/rend/src/sgpu/renderer.zig b/engine/rend/src/sgpu/renderer.zig index 15ab3e8..c781c51 100644 --- a/engine/rend/src/sgpu/renderer.zig +++ b/engine/rend/src/sgpu/renderer.zig @@ -72,6 +72,12 @@ pub const Renderer = struct { state: RendererState = .{}, // swapchainTexture: ?*gpu.GPUTexture = undefined, + swapchainTargetFormat: gpu.GPUTextureFormat = undefined, + hdrTextureFormat: gpu.GPUTextureFormat = undefined, + postProcessingPipeline: *gpu.GPUGraphicsPipeline = undefined, + + screenPlane: ?rend.IndexedMesh = null, + pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This()); pub const MaxObjectCount = 50000; @@ -86,9 +92,28 @@ pub const Renderer = struct { try core.defineComponent(rend.MeshComponent, allocator); try core.defineComponent(rend.CameraComponent, allocator); + self.hdrTextureFormat = .textureformatR16g16b16a16Float; return self; } + pub fn createHDRTexture(self: *@This()) !void { + var gci = std.mem.zeroes(gpu.GPUTextureCreateInfo); + + gci.type = .texturetype2d; + gci.format = self.hdrTextureFormat; + gci.width = @intCast(platform.getInstance().windowExtent.x); + gci.height = @intCast(platform.getInstance().windowExtent.y); + gci.layer_count_or_depth = 1; + gci.num_levels = 1; + gci.sample_count = .samplecount1; + gci.usage = .{ + .textureusageSampler = true, + .textureusageColorTarget = true, + }; + + self.state.targetTexture = self.device.createGPUTexture(&gci); + } + pub fn startRenderer(self: *@This()) !void { self.device = gpu.createGPUDevice(.{ .shaderformatSpirv = true, @@ -110,6 +135,8 @@ pub const Renderer = struct { try self.createMeshPipeline(); try self.createBuffers(); try self.createDepthTexture(); + try self.createHDRTexture(); + try self.createPostProcessingPipeline(); self.meshPool = try self.createRendererObject(MeshPool); self.textureList = try self.createRendererEngineObject(TextureList); @@ -141,6 +168,8 @@ pub const Renderer = struct { _ = try core.fs().installFileBytesMount("embedded:plane.obj", @constCast(&plane_obj), true); + _ = try core.fs().installFileBytesMount("embedded:screenPlane.obj", @constCast(&screenPlane_obj), true); + try assets.load( assets.MakeImportRefOptions( "Mesh", @@ -148,6 +177,49 @@ pub const Renderer = struct { .{ .path = "embedded:plane.obj" }, ), ); + + try assets.load( + assets.MakeImportRefOptions( + "Mesh", + "m_screenPlane", + .{ .path = "embedded:screenPlane.obj" }, + ), + ); + } + + pub fn createPostProcessingPipeline(self: *@This()) !void { + const vertex = try self.loadShader("postProc.vert", postProcVert.LoadArgs); + const fragment = try self.loadShader("postProc.frag", postProcFrag.LoadArgs); + + var pci = std.mem.zeroes(gpu.GPUGraphicsPipelineCreateInfo); + pci.vertex_shader = vertex; + pci.fragment_shader = fragment; + + var attributes = try self.generateVertexAttributeList(); + defer attributes.deinit(); + + pci.vertex_input_state = .{ + .num_vertex_buffers = 1, + .vertex_buffer_descriptions = &[_]gpu.GPUVertexBufferDescription{ + .{ .slot = 0, .pitch = @sizeOf(rend.MeshVertex), .input_rate = .vertexinputrateVertex, .instance_step_rate = 0 }, + }, + .num_vertex_attributes = @intCast(attributes.items.len), + .vertex_attributes = @ptrCast(attributes.items.ptr), + }; + + core.graphics_log("hdr texture format format: {any}", .{self.hdrTextureFormat}); + pci.target_info.num_color_targets = 1; + pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{ + .{ + .format = self.swapchainTargetFormat, + .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), + }, + }; + + pci.rasterizer_state.cull_mode = .cullmodeNone; + pci.rasterizer_state.fill_mode = .fillmodeFill; + + self.postProcessingPipeline = self.device.createGPUGraphicsPipeline(&pci); } pub fn createDirectionalShadowsPipeline(self: *@This()) !void { @@ -340,12 +412,14 @@ pub const Renderer = struct { pci.depth_stencil_state.enable_depth_write = true; pci.depth_stencil_state.write_mask = 0xff; + self.swapchainTargetFormat = self.device.getGPUSwapchainTextureFormat(self.window); + core.graphics_log("swapchain format: {any}", .{self.swapchainTargetFormat}); pci.target_info.has_depth_stencil_target = true; pci.target_info.depth_stencil_format = self.depthFormat; pci.target_info.num_color_targets = 1; pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{ .{ - .format = self.device.getGPUSwapchainTextureFormat(self.window), + .format = self.hdrTextureFormat, .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), }, }; @@ -606,8 +680,8 @@ pub const Renderer = struct { pub fn draw(self: *@This()) void { const cmd = self.state.cmd.?; - if (cmd.waitAndAcquireGPUSwapchainTexture(self.window, @ptrCast(&self.state.swapchainTexture), null, null)) { - if (self.state.swapchainTexture == null) { + if (cmd.waitAndAcquireGPUSwapchainTexture(self.window, @ptrCast(&self.state.swapchainTargetTexture), null, null)) { + if (self.state.swapchainTargetTexture == null) { _ = cmd.submitGPUCommandBuffer(); return; } @@ -623,7 +697,7 @@ pub const Renderer = struct { // can cache this const targetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ - .texture = self.state.swapchainTexture.?, + .texture = self.state.targetTexture, .load_op = .loadopLoad, .store_op = .storeopStore, }); @@ -640,6 +714,8 @@ pub const Renderer = struct { self.state.pass = cmd.beginGPURenderPass(&targetInfo, 1, &depthTarget); const renderpass = self.state.pass.?; + renderpass.setGPUScissor(&self.scissor); + //renderpass.bindGPUGraphicsPipeline(self.testPipeline); renderpass.bindGPUFragmentSamplers(1, &.{ .sampler = self.blockySampler, .texture = self.defaultTexture.texture }, 1); renderpass.bindGPUFragmentSamplers(2, &.{ .sampler = self.blockySampler, .texture = self.defaultTexture.texture }, 1); @@ -654,8 +730,6 @@ pub const Renderer = struct { renderpass.bindGPUFragmentSamplers(self.shadowDepthTextureSlot, &.{ .texture = self.shadowDepthTexture, .sampler = self.blockySampler }, 1); // todo move into materials system - renderpass.setGPUScissor(&self.scissor); - try self.uploadUniforms(cmd); //rendering each mesh { @@ -686,15 +760,35 @@ pub const Renderer = struct { for (self.postMesh.items) |interface| { interface.func(interface.ptr, cmd, renderpass); } - renderpass.endGPURenderPass(); + { + const postProcTargetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ + .texture = self.state.swapchainTargetTexture.?, + .load_op = .loadopDontCare, + .store_op = .storeopStore, + }); + + const postProcPass = cmd.beginGPURenderPass(&postProcTargetInfo, 1, null); + + postProcPass.bindGPUGraphicsPipeline(self.postProcessingPipeline); + postProcPass.bindGPUFragmentSamplers(0, &.{ .sampler = self.blockySampler, .texture = self.state.targetTexture }, 1); + + // post processing + hdr etc... + if (self.screenPlane == null) { + self.screenPlane = getMesh("m_screenPlane"); + } + + if (self.screenPlane) |mesh| { + postProcPass.drawGPUIndexedPrimitives(mesh.index.size, 1, mesh.index.start, @intCast(mesh.vertex.start), 0); + } + + postProcPass.endGPURenderPass(); + } + for (self.postRenders.items) |interface| { interface.func(interface.ptr, cmd); } - - // renderpass.drawGPUPrimitives(3, 1, 0, 0); - } _ = cmd.submitGPUCommandBuffer(); @@ -734,6 +828,9 @@ const lit_mesh_frag = @import("lit_mesh.frag"); const depthOnly = @import("depthOnly.frag"); const sample_vert = @import("sample.vert"); +const postProcVert = @import("postProc.vert"); +const postProcFrag = @import("postProc.frag"); + const MeshVertices = meshes_vert.Scene; const MeshUniforms = meshes_vert.Uniforms; @@ -801,10 +898,12 @@ pub const RendererState = struct { copyPass: ?*gpu.GPURenderPass = null, pass: ?*gpu.GPURenderPass = null, cmd: ?*gpu.GPUCommandBuffer = null, - swapchainTexture: ?*gpu.GPUTexture = null, + swapchainTargetTexture: ?*gpu.GPUTexture = null, + targetTexture: *gpu.GPUTexture = undefined, }; pub const CustomMeshRenderFunc = *const fn (?*anyopaque) void; pub const GPUTextureType = gpu.GPUTexture; const plane_obj align(8) = @embedFile("embedded/plane.obj").*; +const screenPlane_obj align(8) = @embedFile("embedded/screenPlane.obj").*; diff --git a/extras/doomplayer/src/doom.zig b/extras/doomplayer/src/doom.zig index 8140b3e..fad5491 100644 --- a/extras/doomplayer/src/doom.zig +++ b/extras/doomplayer/src/doom.zig @@ -7,18 +7,75 @@ texture: *gpu.GPUTexture = undefined, width: u32, height: u32, - inputEnabled: bool = false, sensitivity: f32 = 1.0, -entity: core.Entity, - fn log(comptime fmt: []const u8, args: anytype) void { core.engine_log("[Doomplayer] " ++ fmt, args); } -pub fn create(allocator: std.mem.Allocator) !*@This() { +pub const DoomCanvas = struct { + data: core.GameObjectData = undefined, + entity: core.Entity, + first: bool = false, + + pub fn create(alloc: std.mem.Allocator) !*@This() { + var first: bool = false; + if (gDoom == null) { + first = true; + gDoom = try createDoom(alloc); + } + + if (gDoom) |doomCtx| { + const self = try alloc.create(@This()); + self.first = first; + + const entity = try core.createEntity(); + const scene = entity.addComponent(core.Scene).?; + const size = 5.0; + const h: f32 = @floatFromInt(doomCtx.height); + const w: f32 = @floatFromInt(doomCtx.width); + + scene.setScale(size, size, size * (h / w)); + scene.setRotation(core.Rotation.eulerX(core.radians(90.0))); + scene.setPosition(.{ .z = 30 }); + + if (entity.addComponent(rend.MeshComponent)) |mesh| { + mesh.cmrf = bindVideoTextures; + mesh.cmrf_ctx = doomCtx; + mesh.textureMode.fullbright = true; + mesh.textureMode.noSrgb = true; + mesh.setMesh("m_plane"); + } + self.entity = entity; + + return self; + } + + return error.ContextNotReady; + } + + pub fn tick(self: *@This(), dt: f64) void { + if (self.first) { + gDoom.?.tick(dt); + } + } + + pub fn getEntity(self: *@This()) core.Entity { + return self.entity; + } + + pub fn destroy(self: *@This()) void { + self.entity.destroy(); + if (self.first) { + gDoom.?.destroy(); + } + self.data.release(self); + } +}; + +pub fn createDoom(allocator: std.mem.Allocator) !*@This() { const self = try allocator.create(@This()); self.* = .{ .allocator = allocator, @@ -28,8 +85,6 @@ pub fn create(allocator: std.mem.Allocator) !*@This() { log("initialized", .{}); - try self.setup(); - self.sensitivity = core.configVar(f32, "doomplayer.sensitivity", 1.0); gDoom = self; @@ -44,11 +99,13 @@ pub fn create(allocator: std.mem.Allocator) !*@This() { c.doom_set_default_int("mouse_move", 0); // Mouse will not move forward c.doom_init(1, @constCast(@ptrCast(@alignCast(&.{"doom"}))), 8); - - self.entity = try self.createEntity(); return self; } +pub fn getEntity(self: *@This()) core.Entity { + return self.entity; +} + fn sdlToDoomButton(button: c_uint) c_uint { switch (button) { sdl3_c.SDL_BUTTON_LEFT => { @@ -290,34 +347,36 @@ fn sdlToDoomScancode(sdlScancode: c_uint) c_int { return c.DOOM_KEY_UNKNOWN; } -var gDoom: *@This() = undefined; +pub var gDoom: ?*@This() = null; pub fn processFunc(e: *sdl3.Event) void { - if (!gDoom.inputEnabled) { - return; - } + if (gDoom) |ctx| { + if (!ctx.inputEnabled) { + return; + } - switch (e.type) { - else => {}, - sdl3_c.SDL_EVENT_MOUSE_MOTION => { - c.doom_mouse_move(@intFromFloat(e.motion.xrel * 4 * gDoom.sensitivity), @intFromFloat(e.motion.yrel * 4 * gDoom.sensitivity)); - }, - sdl3_c.SDL_EVENT_MOUSE_BUTTON_DOWN => { - c.doom_button_down(sdlToDoomButton(e.button.button)); - }, - sdl3_c.SDL_EVENT_MOUSE_BUTTON_UP => { - c.doom_button_up(sdlToDoomButton(e.button.button)); - }, - sdl3_c.SDL_EVENT_KEY_DOWN => { - if (!e.key.repeat) { - c.doom_key_down(sdlToDoomScancode(e.key.scancode)); - } - }, - sdl3_c.SDL_EVENT_KEY_UP => { - if (!e.key.repeat) { - c.doom_key_up(sdlToDoomScancode(e.key.scancode)); - } - }, + switch (e.type) { + else => {}, + sdl3_c.SDL_EVENT_MOUSE_MOTION => { + c.doom_mouse_move(@intFromFloat(e.motion.xrel * 4 * ctx.sensitivity), @intFromFloat(e.motion.yrel * 4 * ctx.sensitivity)); + }, + sdl3_c.SDL_EVENT_MOUSE_BUTTON_DOWN => { + c.doom_button_down(sdlToDoomButton(e.button.button)); + }, + sdl3_c.SDL_EVENT_MOUSE_BUTTON_UP => { + c.doom_button_up(sdlToDoomButton(e.button.button)); + }, + sdl3_c.SDL_EVENT_KEY_DOWN => { + if (!e.key.repeat) { + c.doom_key_down(sdlToDoomScancode(e.key.scancode)); + } + }, + sdl3_c.SDL_EVENT_KEY_UP => { + if (!e.key.repeat) { + c.doom_key_up(sdlToDoomScancode(e.key.scancode)); + } + }, + } } } @@ -418,26 +477,6 @@ fn bindVideoTextures(p: ?*anyopaque) void { } // creates a video player entity -pub fn createEntity(self: *@This()) !core.Entity { - const entity = try core.createEntity(); - const scene = entity.addComponent(core.Scene).?; - const size = 5.0; - const h: f32 = @floatFromInt(self.height); - const w: f32 = @floatFromInt(self.width); - - scene.setScale(size, size, size * (h / w)); - scene.setRotation(core.Rotation.eulerX(core.radians(90.0))); - scene.setPosition(.{ .z = 30 }); - - if (entity.addComponent(rend.MeshComponent)) |mesh| { - mesh.cmrf = bindVideoTextures; - mesh.cmrf_ctx = self; - mesh.textureMode.fullbright = true; - mesh.textureMode.noSrgb = true; - mesh.setMesh("m_plane"); - } - return entity; -} pub fn destroy(self: *@This()) void { core.engine_logs("[Videoplayer] destroying player"); diff --git a/extras/gameExtras/src/objectSpawner.zig b/extras/gameExtras/src/objectSpawner.zig index c7e1533..da4f059 100644 --- a/extras/gameExtras/src/objectSpawner.zig +++ b/extras/gameExtras/src/objectSpawner.zig @@ -3,6 +3,7 @@ objectList: *core.GameObjectList, windowOpen: bool = true, spawnFuncs: std.ArrayListUnmanaged(SpawnEntry) = .{}, spawnPosition: core.Vectorf = .{}, +spawnRotation: core.Rotation = .{}, pub const SpawnEntry = struct { typeName: []const u8, @@ -44,6 +45,9 @@ pub fn addSpawnFunction(self: *@This(), comptime name: []const u8, comptime T: t pub fn prepareEntity(self: *@This(), entity: core.Entity) void { if (entity.fetch(core.Scene)) |scene| { scene.setPosition(self.spawnPosition); + scene.setRotation(scene.getRotation().add(self.spawnRotation)); + + _ = scene.getAndResolveTransform(); } } diff --git a/projects/content/_shaders/dxil/lit_mesh.frag.dxil b/projects/content/_shaders/dxil/lit_mesh.frag.dxil index 177d655b483f95cc327519aa7ac5aff34b6b9f8a..1a192f488f516b5185e826a7dab01738a817eb41 100644 GIT binary patch delta 1235 zcmY+EeN02yyY|u++QNiO%jhjdETdE?vxQNceo+w6R1`--r<6O!S7l^iCJPZ- zU=CIS?8bx*6ABn)TZSbi4&2l-7*quLa505d1X2+fAPpl<$Ru7q_6O&$=lz}Myze>5 zlQWUHl^CqaQmONWuSx4J1>89q5>KbehU!580Jd6!Imgy~0RZYtNF%;_jtT%dIKDvu z08Q3g=>YCw;&nRCRcglqj}8FM_FF`h2!>!StRO6$!bUn@5UG_`L8__YIt&WTVnJ<& zz(nA6lUJjes(c^?`-#Pc@Fo>700d$tiWXF2PRa?;fvr%CVeV?*v!VLAGhbxioNLoR zag$6|38MMy?1&fS5Mo-9{voU!GJ-YO5(I-?*beku2KY%xw-lYx!pTM`ll9y5uh{V! zQU|lfM-@xv5OU4B<{|RZcM>5fs^1*-fFPvX6ay-u5xU}|dKZhPMuV+bHkAYA+js>L z&@ndl88s4Yz=Q@zsD6Gfh!fm6*l+(P;dEGe-lrcKFBr~gR>!?RxEDP05s(J9^`w<` zwLL-l)QJPbi4L{QIV_u2hdfrJjNvyI)pC7RrpvW9ub*{}yH~qO%2&j)p!?#%!G7tz zNN}c>KJ`dsne0t3N!2~(4VT?e)A&(X@nwD#+UAesIlX$%_{zdl&*=C{H>p@xPoJt2 zF?xm0$@NB&MYKNoaY+M0{aW|=UYomXqIzS4$kJ;}ZKi&LAH@fHHm&f&ta}wd{dBsH zK9#q2_m@U|T1jd%!_GbKL%39krT8Tduf2SJ>j2{Ni!f?@@0_Aulc^Z$+r@0 zXVnk^WsFPVk<53>wE={jQ%Xo1KsJml0tzNw;y>3ou-Y_J3&3wP%`>&i!%G(>m7`4a zz0zyn!m;st?@Uh`;X}T|RYhv~2W(}f5cZ%TpBn&gyByB3Zcr}q_4XCw69qgjN2iiY zthJTreZDd^C>aQ!-2-m{;?Bb&HfFD1ak2}A59GDv`IquevKzG-q#l%b!8vwip?T`6 z39LroEQ6Rkyf4qdS-Gl14QHVlxKt8whoImhSH8>_i!E?C0GUnZi04au`E1z3Biph5 PN45$4QzrZu*<1euXpF!J delta 1188 zcmexjea2eSCBn(sbb9gGU&*PSho(6y$bDJ=n2~{j;mkxyY1SvaK-NY}Z)VjPE(V4K zAZI!g1A|M1rw;>AjR27E0u*<0K5$Qwhk>DQ^GfDqW=84ByzGX~_6t_9cP$cGq0uSW zprq04q|qv*A&`{SaF0o`gstI!-~0#3gv4wmFBTC^gV_k3pu59ps|$_3=E=^ zTiM+h87H4%mu1{A`4xK(z(iLXKumCq*`Crlh8To`Y-;cbVz1 zXm4rK-ovEBv%z79lTHpt8>f@wWJ4}p#wnBIxuiMLHYjGOaU7ML+{C5H$TfKlmux+= z=?w*emm3x;w1zscn+32dB^4#+C1<1-o1D3E@6d~9Y8)=dmCok&<>fUwRH$6K0}?sn zo~-xwO?Pk4v6x#ougk~^?lRh=ziqpLky1%&MSNa$Gxm$|mm?R<750HR0jTGYeZMPCaS5cjDBIzMK<` zQY!R{Qj7CTi;`1|gPTlOxU@ZYn$8|B_TdbnoI77x_oX%`C|Mlgha{7a%&5s^4Nx4GOkQj@_Zzq+EPC*& z9;|W)P_RLPKe|tfkLqHWDj^(|nOJ@1^rRRA@6lFxf!z zE#ra7a#GO(34Djl?>2Dn6bLc6P~ftVZ*r%U6W;>9Bj%?kXfz&WvN~~GX!1>|AV!DH zI?@V^>{*KQjoCIgOb(XusZVGW{{4c}| z$&8UcKtU9FL2*tL>CA~U9Du0}2mnXPuHFCu diff --git a/projects/content/_shaders/dxil/postProc.frag.dxil b/projects/content/_shaders/dxil/postProc.frag.dxil new file mode 100644 index 0000000000000000000000000000000000000000..2948cb9c8e9bd5058475b35859df76b90d92a262 GIT binary patch literal 3684 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 Texture0 [[texture(0)]], texture2d Texture1 [[texture(1)]], texture2d Texture2 [[texture(2)]], texture2d DirectionalShadowDepthMap [[texture(3)]], sampler Sampler0 [[sampler(0)]], sampler Sampler1 [[sampler(1)]], sampler Sampler2 [[sampler(2)]], sampler DirectionalShadowSampler [[sampler(3)]]) { main0_out out = {}; - int _98 = int(scene._m0[in.in_var_TEXCOORD4].textureMode); - int _99 = _98 & 240; - float4 _133; - if (_99 == 16) + int _97 = int(scene._m0[in.in_var_TEXCOORD4].textureMode); + int _98 = _97 & 240; + float4 _132; + if (_98 == 16) { - float3 _120 = float3(Texture0.sample(Sampler0, in.in_var_TEXCOORD0).x, Texture1.sample(Sampler1, in.in_var_TEXCOORD0).x, Texture2.sample(Sampler2, in.in_var_TEXCOORD0).x) + float3(-0.0625, -0.5, -0.5); - _133 = float4(dot(_120, float3(1.164000034332275390625, 0.0, 1.7929999828338623046875)), dot(_120, float3(1.164000034332275390625, -0.212999999523162841796875, -0.53299999237060546875)), dot(_120, float3(1.164000034332275390625, 2.111999988555908203125, 0.0)), 1.0); + float3 _119 = float3(Texture0.sample(Sampler0, in.in_var_TEXCOORD0).x, Texture1.sample(Sampler1, in.in_var_TEXCOORD0).x, Texture2.sample(Sampler2, in.in_var_TEXCOORD0).x) + float3(-0.0625, -0.5, -0.5); + _132 = float4(dot(_119, float3(1.164000034332275390625, 0.0, 1.7929999828338623046875)), dot(_119, float3(1.164000034332275390625, -0.212999999523162841796875, -0.53299999237060546875)), dot(_119, float3(1.164000034332275390625, 2.111999988555908203125, 0.0)), 1.0); } else { - float4 _132; - if (_99 == 0) + float4 _131; + if (_98 == 0) { - _132 = Texture0.sample(Sampler0, in.in_var_TEXCOORD0); + _131 = Texture0.sample(Sampler0, in.in_var_TEXCOORD0); } else { - _132 = _86; + _131 = _86; } - _133 = _132; + _132 = _131; } - float4 _139; - if ((_98 & 1) == 1) + float4 _138; + if ((_97 & 1) == 1) { - _139 = powr(_133, float4(2.2000000476837158203125)); + _138 = powr(_132, float4(2.2000000476837158203125)); } else { - _139 = _133; + _138 = _132; } - if (_139.w < 0.00999999977648258209228515625) + if (_138.w < 0.00999999977648258209228515625) { discard_fragment(); } - float3 _193; + float3 _192; do { - float3 _150 = Uniforms.lightPosition.xyz - in.in_var_TEXCOORD1; - float _151 = length(_150); - float _152 = _151 * _151; - float _158; - if (_151 > 2.0) + float3 _149 = Uniforms.lightPosition.xyz - in.in_var_TEXCOORD1; + float _150 = length(_149); + float _151 = _150 * _150; + float _157; + if (_150 > 2.0) { - _158 = 0.5 / _152; + _157 = 0.5 / _151; } else { - _158 = 1.0 / _152; + _157 = 1.0 / _151; } - float _163; - if (_151 > 4.0) + float _162; + if (_150 > 4.0) { - _163 = _158 * 0.5; + _162 = _157 * 0.5; } else { - _163 = _158; + _162 = _157; } - float _165 = (_151 > 15.0) ? 0.0 : _163; - float _167 = (_165 > 1.0) ? 1.0 : _165; + float _164 = (_150 > 15.0) ? 0.0 : _162; + float _166 = (_164 > 1.0) ? 1.0 : _164; if (length(in.in_var_TEXCOORD2) < 0.100000001490116119384765625) { - _193 = (in.in_var_TEXCOORD1 * float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5)) * _167; + _192 = (in.in_var_TEXCOORD1 * float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5)) * _166; break; } - float3 _174 = fast::normalize(_150); - _193 = ((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * precise::max(dot(_174, in.in_var_TEXCOORD2), 0.0)) * _167) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * powr(precise::max(dot(in.in_var_TEXCOORD2, fast::normalize(_174 + fast::normalize(in.in_var_TEXCOORD1 - Uniforms.viewPos.xyz))), 0.0), 30.0)) * 2.0) * _167); + float3 _173 = fast::normalize(_149); + _192 = ((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * precise::max(dot(_173, in.in_var_TEXCOORD2), 0.0)) * _166) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * powr(precise::max(dot(in.in_var_TEXCOORD2, fast::normalize(_173 + fast::normalize(in.in_var_TEXCOORD1 - Uniforms.viewPos.xyz))), 0.0), 30.0)) * 2.0) * _166); break; } while(false); - float3 _210 = ((in.in_var_TEXCOORD3.xyz / float3(in.in_var_TEXCOORD3.w)) * 0.5) + float3(0.5); - float3 _212; - _212.x = _210.x; - float2 _213 = _212.xy; - _213.y = -_210.y; + float3 _209 = ((in.in_var_TEXCOORD3.xyz / float3(in.in_var_TEXCOORD3.w)) * 0.5) + float3(0.5); + float3 _211; + _211.x = _209.x; + float2 _212 = _211.xy; + _212.y = -_209.y; + float _219; + int _222; + int _224; + _219 = 0.0; + _222 = 0; + _224 = -4; float _220; int _223; - int _225; - _220 = 0.0; - _223 = 0; - _225 = -4; - float _221; - int _224; - for (; _225 <= 4; _220 = _221, _223 = _224, _225++) + for (; _224 <= 4; _219 = _220, _222 = _223, _224++) { - _224 = _223; - _221 = _220; - for (int _234 = -4; _234 <= 4; ) + _223 = _222; + _220 = _219; + for (int _233 = -4; _233 <= 4; ) { - _224++; - _221 += float((in.in_var_TEXCOORD3.z - 0.004999999888241291046142578125) > DirectionalShadowDepthMap.sample(DirectionalShadowSampler, (_213 + float2(float(_234) * 0.000244140625, float(_225) * 0.000244140625))).x); - _234++; + _223++; + _220 += float((in.in_var_TEXCOORD3.z - 0.004999999888241291046142578125) > DirectionalShadowDepthMap.sample(DirectionalShadowSampler, (_212 + float2(float(_233) * 0.000244140625, float(_224) * 0.000244140625))).x); + _233++; continue; } } - out.out_var_SV_Target0 = float4(powr(select(_139.xyz * ((float3(0.100000001490116119384765625) + _193) + ((Uniforms.directionalLightColor.xyz * precise::max(dot(Uniforms.directionalLight.xyz, in.in_var_TEXCOORD2), 0.0)) * (1.0 - (_220 / float(_223))))), _139.xyz, bool3((_98 & 2) > 0)), float3(0.4545454680919647216796875)), _139.w); + float3 _262; + if ((_97 & 2) > 0) + { + _262 = _138.xyz * 4.0; + } + else + { + _262 = _138.xyz * ((float3(0.100000001490116119384765625) + _192) + ((Uniforms.directionalLightColor.xyz * precise::max(dot(Uniforms.directionalLight.xyz, in.in_var_TEXCOORD2), 0.0)) * (1.0 - (_219 / float(_222))))); + } + out.out_var_SV_Target0 = float4(powr(_262, float3(0.4545454680919647216796875)), _138.w); return out; } diff --git a/projects/content/_shaders/msl/postProc.frag.msl b/projects/content/_shaders/msl/postProc.frag.msl new file mode 100644 index 0000000..6d2534e --- /dev/null +++ b/projects/content/_shaders/msl/postProc.frag.msl @@ -0,0 +1,24 @@ +#include +#include + +using namespace metal; + +struct main0_out +{ + float4 out_var_SV_Target0 [[color(0)]]; +}; + +struct main0_in +{ + float2 in_var_TEXCOORD0 [[user(locn0)]]; +}; + +fragment main0_out main0(main0_in in [[stage_in]], texture2d Texture0 [[texture(0)]], sampler Sampler0 [[sampler(0)]]) +{ + main0_out out = {}; + float2 _19 = in.in_var_TEXCOORD0; + _19.y = -_19.y; + out.out_var_SV_Target0 = Texture0.sample(Sampler0, _19); + return out; +} + diff --git a/projects/content/_shaders/msl/postProc.vert.msl b/projects/content/_shaders/msl/postProc.vert.msl new file mode 100644 index 0000000..ecdc597 --- /dev/null +++ b/projects/content/_shaders/msl/postProc.vert.msl @@ -0,0 +1,25 @@ +#include +#include + +using namespace metal; + +struct main0_out +{ + float2 out_var_TEXCOORD0 [[user(locn0)]]; + float4 gl_Position [[position]]; +}; + +struct main0_in +{ + float3 in_var_TEXCOORD0 [[attribute(0)]]; + float2 in_var_TEXCOORD3 [[attribute(3)]]; +}; + +vertex main0_out main0(main0_in in [[stage_in]]) +{ + main0_out out = {}; + out.out_var_TEXCOORD0 = in.in_var_TEXCOORD3; + out.gl_Position = float4(in.in_var_TEXCOORD0, 1.0); + return out; +} + diff --git a/projects/content/_shaders/spv/lit_mesh.frag.spv b/projects/content/_shaders/spv/lit_mesh.frag.spv index fe17a6aecd384842ebfcafe9d4ec8e663e39bab1..e72f745e6eaa52e637a03eaa3c6b1773fa885413 100644 GIT binary patch literal 7108 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 literal 7072 zcmZvf37nQy6^GxMVP@Dwzy%eg0U}FiAO!{4W>|s>Vr1Afw~_gPso9ztK+STfD?vv~Tc^BMxoS`Y zI3ODeMq|-Wy^4R@H$qh7H4M4$^6pao8Ljng9W7f*=+*oi&b+pCS>LvvQhv6+Bf_`0 zrK7vO)PtJ)j%02wQ^~hFI|eSTe_r^FI_fvT9edR8jPM(M)Gu+vs7;nFZR;s*>TB!j zY-w-a+S1y!V`-_oZ|ka-ZfwefTu zx~iLpy8EjeySnSt-Amnd>c*(vPrIYY+5d73xQD*C~K-MekRC$j4^nCpORL(a1PJ42s@jj?wec6+Rku}mimb>prB`iWTg zOyq|T?^+c4RCGt^&qA)*`QW11=QMQJ=%+3Go{fCVg!AtT{W<8j^$gt`>rO{^oqpQF zZyIvtwAzO7n~tuZyk}U;=Q7s;hwIeqbFHjf>lwg18T-!6?fnCJ`LW!;Z)Ah@@#AQH zhJfjORn+|`>QjV!xwjuhYZ-gbMjn3Ol=-2bg}#5^%7L@aMrRDvYz~S(LR+kxi@bl| zz6Fu{Ip}hM@S6uWW6whi!*4#iTp;`w!0`*y82Z9o&l*Bslv|<5vS5k-?#RO$i7>3_k01fd&;T5 zkhuc5ulkFU-k5a17uqK$eO1yuPyZJ)dv{!a96PUOo&@7}MOmM7nLX1r$0My_9*>XT z73--_GqXPKGY{Pw`upZkw|4%XIl_KSSsk$Zd*ukbzfX=>@3+Pg_AzC3z&^I1TYGUj5}>cT`&0T?EWa-Tqz-%&U?A+V@L;{4sX z8O}Uf6Yp=wV???CoG#{Qki-pAO#3t1oe*uNWDe(?S;htuYW{d+EI)Yv?Qq&0P3iY@2eNs2w)UOmYX2_-+NOYADgVn8e_DaNB5|h|xK|`@ zI&%~E!J1wPT(7_OncxX}WgqRCy^CJI64^U29@y(wF+1$FwyS`g>y)Eb{m8{$??f;5 z`qk+A$VaWNMwX9S8B^@-{78!bHORg@<8+PZ7UMUM@Vy4ve7%RRbDy}|uSNF0`yL|S z*CETxneVmC4)fLadLU=M$|F-uZ$Pd9z8TLv6BtwYI!8=zOg_fxI`@fteI2s)DsTtA zUc>w*AU_)z)Ah^_W776!AZJXN9gUb3cOYxeLHe zsfHg#mY)h-8@?Yy)@IGZ_v6U&a@wK~pFoa2T!O zH+vB^`zEqJ#XE5?x_;J7yETh5zlH3Xvp}5rZDjd4^E=3L!VzaieZC8)kLSdieaIIj zFb%Bn+;!;tK@Es=y}RE_eEjx*KXLNH@04}@0dRlq5yKA??>8iB{3B%fB_MuFevB;d zSd-q@Pmtv|N-|c{zeeVt0&T)!-m%Zmkljb_D&D>E-v{K~*Y!V7ocrh(x&H#$+@sH~ z{Uwn1F8zwxZ-8@r|L#Y&Z@a*+!Eb;z@A_}Sc%bb7DB6C9z7}ZveX`w79oHcL0cc+g z9wmndm|g4eTc-U%Aa6X%#`njhJ4Xx$kc~s1KY@op#BRLCukFtuY{vco0G7%3Y}!|3G$a{KotfS#ARepM%KeA3py=meZ$+8Z|Qi8@N`R z?_(JAf54cek6?Znj0N61*E|C3y=&v|;75^Nr*Hgi_ZYIg{*Jg?k0Wby_>J{`JOR8T zOF{gWJ(+m@@1E>TbGJ`!SAL#xGKD-NGTVhIzoEti`C-hhPGY4(^70iB)<;*$|%bRL) ZH1JPSu!FiBo|@Q=-p}mtzp8#I{{w5LH6#E4 literal 0 HcmV?d00001 diff --git a/projects/content/_shaders/spv/postProc.vert.spv b/projects/content/_shaders/spv/postProc.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..30bf6dbc24d8af1d4cb718ea47f8a34878d22961 GIT binary patch literal 656 zcmZXRze@u_5QWD(&-gPjMiVQESPCH^NI=v=#WE@uX;Y>!f~d8BwvFKTZEh{h!raW8 zH}ht8uPja)5i1eVj6=Sjb`*7{Ojx!R8-MZ3bT$_hm=&v7mEtn_2}Bi*#Lwn~&*|IX z`EGJE9zWd=eeB$KZTj_rU8!=Irf*eF5j2m*2$8t0{I5u{&75jkn&scn7am#?2b5)1j+{Kc-?A zZ+t|yGQ-K&GC^+>OG*~hH$ o