From 8647ac8bc9ddd6d698982c4fc56056095db08c7b Mon Sep 17 00:00:00 2001 From: Peter Li Date: Sun, 20 Apr 2025 17:09:51 -0700 Subject: [PATCH] > HOT LOADING FRAGMENT SHADERS AND TEXTURES ARE LOADED --- engine/rend/shaders/lit_mesh.frag.hlsl | 19 ++- engine/rend/shaders/lit_mesh.frag.json | 16 +++ engine/rend/shaders/meshes.vert.hlsl | 3 + engine/rend/shaders/meshes.vert.json | 17 ++- engine/rend/src/meshes/MeshComponent.zig | 28 +++-- engine/rend/src/rend.zig | 1 + engine/rend/src/sgpu/renderer.zig | 119 +++++++++++++----- lib/sdl3/spvreflect/reflected.zig | 24 +--- lib/sdl3/spvreflect/spvreflect.py | 3 + .../content/_shaders/dxil/lit_mesh.frag.dxil | Bin 2808 -> 3848 bytes .../content/_shaders/dxil/meshes.vert.dxil | Bin 5216 -> 5380 bytes .../content/_shaders/msl/lit_mesh.frag.msl | 6 +- projects/content/_shaders/msl/meshes.vert.msl | 6 +- .../content/_shaders/spv/lit_mesh.frag.spv | Bin 488 -> 896 bytes projects/content/_shaders/spv/meshes.vert.spv | Bin 1492 -> 1676 bytes projects/sampleGame/main.zig | 9 +- .../content/_shaders/dxil/lit_mesh.frag.dxil | Bin 0 -> 3660 bytes .../content/_shaders/dxil/meshes.vert.dxil | Bin 0 -> 5216 bytes .../content/_shaders/dxil/sample.frag.dxil | Bin 0 -> 2816 bytes .../content/_shaders/dxil/sample.vert.dxil | Bin 0 -> 3780 bytes .../content/_shaders/dxil/test.vert.dxil | Bin 0 -> 3800 bytes .../content/_shaders/msl/lit_mesh.frag.msl | 22 ++++ .../content/_shaders/msl/meshes.vert.msl | 41 ++++++ .../content/_shaders/msl/sample.frag.msl | 22 ++++ .../content/_shaders/msl/sample.vert.msl | 66 ++++++++++ .../content/_shaders/msl/test.vert.msl | 66 ++++++++++ .../content/_shaders/spv/lit_mesh.frag.spv | Bin 0 -> 756 bytes .../content/_shaders/spv/meshes.vert.spv | Bin 0 -> 1492 bytes .../content/_shaders/spv/sample.frag.spv | Bin 0 -> 372 bytes .../content/_shaders/spv/sample.vert.spv | Bin 0 -> 1848 bytes .../content/_shaders/spv/test.vert.spv | Bin 0 -> 1568 bytes 31 files changed, 394 insertions(+), 74 deletions(-) create mode 100644 tools/scripts/content/_shaders/dxil/lit_mesh.frag.dxil create mode 100644 tools/scripts/content/_shaders/dxil/meshes.vert.dxil create mode 100644 tools/scripts/content/_shaders/dxil/sample.frag.dxil create mode 100644 tools/scripts/content/_shaders/dxil/sample.vert.dxil create mode 100644 tools/scripts/content/_shaders/dxil/test.vert.dxil create mode 100644 tools/scripts/content/_shaders/msl/lit_mesh.frag.msl create mode 100644 tools/scripts/content/_shaders/msl/meshes.vert.msl create mode 100644 tools/scripts/content/_shaders/msl/sample.frag.msl create mode 100644 tools/scripts/content/_shaders/msl/sample.vert.msl create mode 100644 tools/scripts/content/_shaders/msl/test.vert.msl create mode 100644 tools/scripts/content/_shaders/spv/lit_mesh.frag.spv create mode 100644 tools/scripts/content/_shaders/spv/meshes.vert.spv create mode 100644 tools/scripts/content/_shaders/spv/sample.frag.spv create mode 100644 tools/scripts/content/_shaders/spv/sample.vert.spv create mode 100644 tools/scripts/content/_shaders/spv/test.vert.spv diff --git a/engine/rend/shaders/lit_mesh.frag.hlsl b/engine/rend/shaders/lit_mesh.frag.hlsl index 797ad2b..fd63573 100644 --- a/engine/rend/shaders/lit_mesh.frag.hlsl +++ b/engine/rend/shaders/lit_mesh.frag.hlsl @@ -1,5 +1,20 @@ -float4 main(float2 UV : TEXCOORD0) : SV_Target0 +Texture2D Texture : register(t0, space2); +SamplerState Sampler : register(s0, space2); + +cbuffer Uniforms : register(b0, space3) { - return float4(UV, 0.0, 1.0); + float time; +}; + +float4 main(float2 UV : TEXCOORD0, float3 WorldPos: TEXCOORD1) : SV_Target0 +{ + float4 col = pow(Texture.Sample(Sampler, UV), 0.4545); + + float SPEEEEEEEEEEEEEED = 0; + float strength = 0.0; + + col.r = col.r + strength * sin(time * SPEEEEEEEEEEEEEED) * WorldPos.x + strength * cos(time * SPEEEEEEEEEEEEEED) * WorldPos.y; + + return col; } diff --git a/engine/rend/shaders/lit_mesh.frag.json b/engine/rend/shaders/lit_mesh.frag.json index 4cbde78..46ff298 100644 --- a/engine/rend/shaders/lit_mesh.frag.json +++ b/engine/rend/shaders/lit_mesh.frag.json @@ -18,5 +18,21 @@ "name" : "out.var.SV_Target0", "location" : 0 } + ], + "separate_images" : [ + { + "type" : "texture2D", + "name" : "Texture", + "set" : 2, + "binding" : 0 + } + ], + "separate_samplers" : [ + { + "type" : "sampler", + "name" : "Sampler", + "set" : 2, + "binding" : 0 + } ] } \ No newline at end of file diff --git a/engine/rend/shaders/meshes.vert.hlsl b/engine/rend/shaders/meshes.vert.hlsl index 850f667..3d1f56a 100644 --- a/engine/rend/shaders/meshes.vert.hlsl +++ b/engine/rend/shaders/meshes.vert.hlsl @@ -13,6 +13,7 @@ struct Input struct Output { float2 TexCoord : TEXCOORD0; + float3 WorldPos : TEXCOORD1; float4 Position : SV_Position; }; @@ -36,11 +37,13 @@ Output main(Input input) output.TexCoord = input.UV; float4 pos = float4(input.Position, 1.0); + pos.y = pos.y - 50; // pos.x += 0.2 * sin(time * 0.5 ) * pos.y * 0.5; // pos.y += 0.2 * cos(time * 0.5 ) * pos.z * 0.5; output.Position = mul(ViewProjection, mul(scene[input.Instance].Model, pos)); + output.WorldPos = pos.xyz; return output; } diff --git a/engine/rend/shaders/meshes.vert.json b/engine/rend/shaders/meshes.vert.json index 279e031..9abb29a 100644 --- a/engine/rend/shaders/meshes.vert.json +++ b/engine/rend/shaders/meshes.vert.json @@ -6,7 +6,7 @@ } ], "types" : { - "_8" : { + "_9" : { "name" : "Scene", "members" : [ { @@ -18,12 +18,12 @@ } ] }, - "_7" : { + "_8" : { "name" : "type.StructuredBuffer.Scene", "members" : [ { "name" : "_m0", - "type" : "_8", + "type" : "_9", "array" : [ 0 ], @@ -35,7 +35,7 @@ } ] }, - "_10" : { + "_11" : { "name" : "type.Uniforms", "members" : [ { @@ -70,11 +70,16 @@ "type" : "vec2", "name" : "out.var.TEXCOORD0", "location" : 0 + }, + { + "type" : "vec3", + "name" : "out.var.TEXCOORD1", + "location" : 1 } ], "ssbos" : [ { - "type" : "_7", + "type" : "_8", "name" : "scene", "readonly" : true, "block_size" : 0, @@ -84,7 +89,7 @@ ], "ubos" : [ { - "type" : "_10", + "type" : "_11", "name" : "type.Uniforms", "block_size" : 68, "set" : 1, diff --git a/engine/rend/src/meshes/MeshComponent.zig b/engine/rend/src/meshes/MeshComponent.zig index 84f9ed1..7637fda 100644 --- a/engine/rend/src/meshes/MeshComponent.zig +++ b/engine/rend/src/meshes/MeshComponent.zig @@ -1,10 +1,12 @@ -mesh: ?meshes.IndexedMesh = null, textureId: ?u32 = null, visibility: bool = true, textureName: core.Name = core.NameInvalid, meshName: core.Name = core.NameInvalid, +mesh: ?meshes.IndexedMesh = null, +texture: ?*Texture = null, + entity: core.Entity = undefined, pub var BaseContainer: *MeshSet = undefined; @@ -30,6 +32,12 @@ pub fn updateMesh(self: *@This()) void { } } +pub fn updateTexture(self: *@This()) void { + if (self.textureName.handle() != 0) { + self.setMeshByName(&self.textureName); + } +} + pub fn setMeshByName(self: *@This(), meshName: *core.Name) void { self.mesh = rend.getMeshByName(meshName); self.meshName = meshName.*; @@ -41,16 +49,15 @@ pub fn setMesh(self: *@This(), meshName: []const u8) void { self.setMeshByName(&name); } -// pub fn setTextureByName(self: *@This(), n: []const u8) void { -// var name = core.MakeName(n); -// self.mesh = rend.getTextureByName(&name); -// self.textureName = name; -// } +pub fn setTextureByName(self: *@This(), name: *core.Name) void { + self.texture = rend.getTexture(name); + self.textureName = name.*; +} -// pub fn setTexture(self: *@This(), n: []const u8) void { -// var name = core.MakeName(n); -// self.textureName = rend.getTextureByName(&name); -// } +pub fn setTexture(self: *@This(), n: []const u8) void { + var name = core.MakeName(n); + self.setTextureByName(&name); +} // animator: ?*Animator = null, todo.. implement animator pub const MeshSet = core.SparseSet(@This()); @@ -59,3 +66,4 @@ const meshes = @import("meshes.zig"); const core = @import("core"); const std = @import("std"); const rend = @import("../rend.zig"); +const Texture = rend.Texture; diff --git a/engine/rend/src/rend.zig b/engine/rend/src/rend.zig index 4118561..07d8f76 100644 --- a/engine/rend/src/rend.zig +++ b/engine/rend/src/rend.zig @@ -32,6 +32,7 @@ pub const registerRendererObject = renderer.registerRendererObject; pub const getTexture = renderer.getTexture; pub const texture = @import("texture/texture.zig"); +pub const Texture = texture.Texture; var rendAllocator: std.mem.Allocator = undefined; pub fn getAllocator() std.mem.Allocator { diff --git a/engine/rend/src/sgpu/renderer.zig b/engine/rend/src/sgpu/renderer.zig index f7a8ed7..536fd33 100644 --- a/engine/rend/src/sgpu/renderer.zig +++ b/engine/rend/src/sgpu/renderer.zig @@ -39,9 +39,13 @@ pub const Renderer = struct { textureList: *TextureList = undefined, + blockySampler: *gpu.GPUSampler = undefined, + // transients DO NOT TOUCH swapchainTexture: *gpu.GPUTexture = undefined, + defaultTexture: *rend.Texture = undefined, + pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This()); pub const MaxObjectCount = 50000; @@ -59,6 +63,55 @@ pub const Renderer = struct { return self; } + pub fn startRenderer(self: *@This()) !void { + self.device = gpu.createGPUDevice(.{ + .shaderformatSpirv = true, + .shaderformatDxil = true, + .shaderformatMsl = true, + }, true, null); + + self.window = platform.getInstance().window; + + if (!self.device.claimWindowForGPUDevice(self.window)) + return error.UnableToClaimGpu; + + try self.discoverFormats(); + + core.engine_log("sgpu device created, using shader format: {s}", .{self.shaderSuffix}); + + // try self.createPipeline(); + try self.createMeshPipeline(); + try self.createDepthTexture(); + + self.meshPool = try self.createRendererObject(MeshPool); + self.textureList = try self.createRendererEngineObject(TextureList); + + try self.createSamplers(); + + try assets.load( + assets.MakeImportRefOptions( + "Texture", + "t_default", + .{ .path = "textures/texture_sample.png" }, + ), + ); + + var defaultTextureName = core.MakeName("t_default"); + self.defaultTexture = getTexture(&defaultTextureName).?; + } + + pub fn createSamplers(self: *@This()) !void { + core.engine_log("creating blocky sampler", .{}); + self.blockySampler = self.device.createGPUSampler(&std.mem.zeroInit(gpu.GPUSamplerCreateInfo, .{ + .min_filter = .filterNearest, + .mag_filter = .filterNearest, + .mipmap_mode = .samplermipmapmodeNearest, + .address_mode_u = .sampleraddressmodeRepeat, + .address_mode_v = .sampleraddressmodeRepeat, + .address_mode_w = .sampleraddressmodeRepeat, + })); + } + // registers a pre-existing render object, does not add to destroys pub fn registerRendererObject(self: *@This(), T: type, object: *anyopaque) !void { if (@hasDecl(T, "onUpload")) { @@ -109,30 +162,6 @@ pub const Renderer = struct { self.depthTexture = self.device.createGPUTexture(&gci); } - pub fn startRenderer(self: *@This()) !void { - self.device = gpu.createGPUDevice(.{ - .shaderformatSpirv = true, - .shaderformatDxil = true, - .shaderformatMsl = true, - }, true, null); - - self.window = platform.getInstance().window; - - if (!self.device.claimWindowForGPUDevice(self.window)) - return error.UnableToClaimGpu; - - try self.discoverFormats(); - - core.engine_log("sgpu device created, using shader format: {s}", .{self.shaderSuffix}); - - // try self.createPipeline(); - try self.createMeshPipeline(); - try self.createDepthTexture(); - - self.meshPool = try self.createRendererObject(MeshPool); - self.textureList = try self.createRendererEngineObject(TextureList); - } - pub fn discoverFormats(self: *@This()) !void { const formats = self.device.getGPUShaderFormats(); @@ -324,15 +353,24 @@ pub const Renderer = struct { } pub fn uploadUniforms(self: *@This(), cmd: *gpu.GPUCommandBuffer) !void { - var data = std.mem.zeroes([@sizeOf(meshes_vert.Uniforms) / 8 + 1]usize); - const ptr: *meshes_vert.Uniforms = @ptrCast(@alignCast(&data)); - if (self.activeCamera) |camera| { - ptr.ViewProjection = @bitCast(camera.final); + { + var data = std.mem.zeroes([@sizeOf(meshes_vert.Uniforms) / 8 + 1]usize); + const ptr: *meshes_vert.Uniforms = @ptrCast(@alignCast(&data)); + if (self.activeCamera) |camera| { + ptr.ViewProjection = @bitCast(camera.final); + } + + ptr.time = @floatCast(self.totalTime); + + cmd.pushGPUVertexUniformData(0, &data, @sizeOf(meshes_vert.Uniforms)); } + { + var data = std.mem.zeroes([@sizeOf(lit_mesh_frag.Uniforms) / 8 + 1]usize); + const ptr: *lit_mesh_frag.Uniforms = @ptrCast(@alignCast(&data)); - ptr.time = @floatCast(self.totalTime); - - cmd.pushGPUVertexUniformData(0, &data, @sizeOf(meshes_vert.Uniforms)); + ptr.time = @floatCast(self.totalTime); + cmd.pushGPUFragmentUniformData(0, &data, @sizeOf(lit_mesh_frag.Uniforms)); + } } pub fn frameUploads(self: *@This()) void { @@ -408,9 +446,11 @@ pub const Renderer = struct { renderpass.bindGPUVertexStorageBuffers(0, &self.ssboScene, 1); renderpass.bindGPUVertexBuffers(0, &.{ .buffer = self.meshPool.vertexBuffer, .offset = 0 }, 1); renderpass.bindGPUIndexBuffer(&.{ .buffer = self.meshPool.indexBuffer, .offset = 0 }, .indexelementsize32bit); + // todo move into materials system renderpass.setGPUScissor(&self.scissor); + //SDL_BindGPUFragmentSamplers(renderPass, 0, &(SDL_GPUTextureSamplerBinding){ .texture = Texture, .sampler = Samplers[CurrentSamplerIndex] }, 1); //rendering each mesh { const container = rend.MeshComponent.BaseContainer; @@ -419,10 +459,21 @@ pub const Renderer = struct { // core.engine_log("pushing draw {d}", .{i}); const component = &container.dense.items[i].value; + // todo move this to slow tick? only update once every 1 second or so? if (component.mesh == null) { component.updateMesh(); } + if (component.texture == null) { + component.updateTexture(); + } + + var t = component.texture; + if (t == null) { + t = self.defaultTexture; + } + renderpass.bindGPUFragmentSamplers(0, &.{ .texture = t.?.texture, .sampler = self.blockySampler }, 1); + if (component.mesh) |mesh| { // core.engine_log("pushing draw for instance {d}", .{i}); renderpass.drawGPUIndexedPrimitives(mesh.index.size, 1, mesh.index.start, @intCast(mesh.vertex.start), @intCast(i)); @@ -464,6 +515,7 @@ pub var gAllocator: std.mem.Allocator = undefined; const rend = @import("../rend.zig"); const std = @import("std"); +const assets = @import("assets"); const core = @import("core"); const platform = @import("platform"); const sdl3 = @import("sdl3"); @@ -523,7 +575,10 @@ pub fn registerRendererObject(comptime T: type, object: *anyopaque) !void { pub const getMesh = mesh_pool.getMesh; pub const getMeshByName = mesh_pool.getMeshByName; - pub const pushMeshUpdate = mesh_pool.pushMeshUpdate; +pub fn getTexture(name: *core.Name) ?*rend.Texture { + return gRenderer.textureList.map.get(name.handle()); +} + pub const GPUTextureType = gpu.GPUTexture; diff --git a/lib/sdl3/spvreflect/reflected.zig b/lib/sdl3/spvreflect/reflected.zig index 976654f..daed2f3 100644 --- a/lib/sdl3/spvreflect/reflected.zig +++ b/lib/sdl3/spvreflect/reflected.zig @@ -11,31 +11,15 @@ pub const mat4 = shaderTypes.mat4; pub const float = shaderTypes.float; pub const BufferInfo = shaderTypes.BufferInfo; -pub const Scene = struct { - color: vec4, - - pub const Buffer: BufferInfo = .{ .storage = 0 }; -}; - -pub const Scene2 = struct { - color: vec4, - lmfao: vec4, - - pub const Buffer: BufferInfo = .{ .storage = 1 }; -}; - -pub const TransformBuffer = struct { - modelMatrix: mat4, - viewMatrix: mat4, - projectionMatrix: mat4, +pub const Uniforms = struct { time: float, pub const Buffer: BufferInfo = .{ .uniform = 0 }; }; pub const LoadArgs = shaderTypes.ShaderLoadArgs{ - .num_samplers = 0, // The number of samplers defined in the shader. + .num_samplers = 1, // The number of samplers defined in the shader. .num_storage_textures = 0, // The number of storage textures defined in the shader. - .num_storage_buffers = 2, // The number of storage buffers defined in the shader. - .num_uniform_buffers = 0, // The number of uniform buffers defined in the shader. + .num_storage_buffers = 0, // The number of storage buffers defined in the shader. + .num_uniform_buffers = 1, // The number of uniform buffers defined in the shader. }; diff --git a/lib/sdl3/spvreflect/spvreflect.py b/lib/sdl3/spvreflect/spvreflect.py index 6b9c7e5..338d83b 100644 --- a/lib/sdl3/spvreflect/spvreflect.py +++ b/lib/sdl3/spvreflect/spvreflect.py @@ -65,6 +65,9 @@ pub const BufferInfo = shaderTypes.BufferInfo; zs = parseTypeToZig(types, uniform['type'], "uniform", uniform['binding']) ostring += zs + "\n" + if 'separate_samplers' in reflect: + samplerIndex += len(reflect['separate_samplers']) + zs = "pub const LoadArgs = shaderTypes.ShaderLoadArgs{" zs += f""" diff --git a/projects/content/_shaders/dxil/lit_mesh.frag.dxil b/projects/content/_shaders/dxil/lit_mesh.frag.dxil index dba1c0acdaa246394ae8eb7117edbaf6de8a0b97..7c2a3129ce32d6d114a97482a239825aaca64728 100644 GIT binary patch literal 3848 zcmeHKdr(u^89#Y&?+t|H0$DeZki9$yT*kdbr+@Sh z&*Yr*o$ve3?>pyw_nzNPdcIOMjo;k70<~Z0W0YG6dgH;2o4OS1V zc4+iM0~Z4zSG|^m-Se_GcTIc(9L>*P)W$rw0>E07S&KqmM!stO`kZuHz5d_Kl|%c| zT)3?HlDlzRp3YEKQUgcXxf@A0?CIFwRsI1Bt!FUk-@g`LIAp>qgq60@@>1a~3Uurj z^-D5N+n;ZuQn$To0fSc4wxw7MpaiU?N%Q)2oW`X0va}y4g4{esUI7At7Rq!I((~79 zXb>7J9qN@T_w6t)04-4GXCda-6a;OkIigiD!d{Eu(v$-XiW}vF1xwib3Qd9xrt*NF z@+dA9BxAyLzS109rb9re)V5 zsGQm3PkCvPMO2c_wD20>^nkU{kKRL&MXMw<7+f6ydkDBr*h|ARIYe<2`(XG{3O0AC zE{7mcv)ArN9o69a2oMDXrC=6wYg<6z!zltI6O-8+y?C7&L|Od9&AQ5TXrrX#E|QQET0Wp$%FV z>0-SFSZ~RdpVaI)&}|Eh{+W-nEG)d18O`*e41qWZ5*Xap8m%?4+*)7Gg0lZd*}Tee zUIT0azkx&zF4Rb%l@4C@l2ErKRBKV%VI2AD1-Du`jEmNcBeOVKyWpwiL4*a*S!i;h z(5Lba58^B$%xhF1%qN#l768pM1b_aFa_eyduonzK_)U!b`GB0MH_g8uv{5?}!C;V! zZt`Uqpx+Ux#3=|4&^YXz=rzM^Rd^K1%;sif2bN?@nl>af$&W>YG#n9g}YTit((!)%3aC5`d~QJ`|OuuzMYsk|CI zVc+Gve35v|;VFc&MK%jDt%|H92;hpwn7xci694@tVeUk3m)>+4XXvzj{#_z!X3V-s&BS1B1B2>rB6TuS=PyETf&SZO1wG&?J8tj=De zM|WdreWq2fM;r94+B&PAum+C>@a7!6X_8+>^6z?i-fZ4V+!J~`OgtGz-vOoMp49V= zspG1YK9=l!ql{vuj(G*OT6A|gnpAEzz}95dJFI#wS{sAbKJ|gHyG+(?n6+AHH8|nR zZ;pH9UHbN3se>y2LYG;<5R5N+%u-6MM{|qdMew4pqvCD#bb9o*hbVQzhG2 zscl1Vz@Xn+QYTocy+ihqF!YCdmI1dK^(=ZXTC0AD_e)g92h!rA^F04eJ`M$@Rx|?^S<}$Vu=SLnfeYTtCo5zd%a{(stMgEz3fq(j5^3O~D`EU7W@!5mj|Ac@1A<%d64}K||9kl_u zr}!T7p}8jy&i&81$4THLh>nbLUxidqJYy)9kxWkF6ysp*i8qdu{lAi)gItt_`);>Dj-#$|6XQI>isJEVRWLpkT!D>i zhX`alsEFy+_%C<)iaNJ;t_#_GSoB33(W7ksW8tRgr1mGXiBUv{W4eE`>EoM+u4HlS ztBdPa7|V6VC5EgW#U&NFmZRL@5B3$@oZ9l!sr;K$ZKmTYIJbRcZF_oR#;fX0iBY`| z;QY4!>sRh6E*$H>el?3TL8q2J*O&MH|JS{*BLGmt+yt=|arA!)`ukq62K2OnRzvKe z948~DUl}7?ULr3-w0463`Q+aKh(I{Nq9t|?_f?MB6igE#%)G787pyFF00KjXh2pK7 zq85C#4#t=DEz&|SZFpZucnEg$*FV}9-+_Z893|O7Vn;Y0vQSH#eM2-Jo0$R8Vz$cz zA`k?|aP=rM>_Q>HEap?lG94B1T7=}8ka6X*E%VJq54Typ=n;sD;uoOyiuFrS#&HNm xFV{4oKvBI3@hq&E*f~DH5Ss?bg+*tE*60CRM%aasFc>2T4Hdf?%i!72<)6KUuA=|| delta 1457 zcmdUvZA@Eb6vv-?xs+SlZnrO!wuI%<7FH0Nwv?8UYI<+WDA3I^%Iu8E%8OBAVQz?t ze4#A`FRZw-lF)!Ll)=J>xs1ZbD2X!Y41=+;$QI0WPQk?(Ur-Z+U(}}zlZjvSqbK=4 z=eg&c=j7z%m&@$m+E;9G(&h$Tb<5BXa&a(tG5D#q!&j8lQM0c@> zGaFBy$RxAzk^+hh@a9??op{4=?(3KF)CWYp?ZU+m$L2O}FMgAacN9>{_u1$vH=#N? zPrHRLR+>xgUvz>tuAcjn7^J6W36g-T_p!dzV4z4s+T8H!33t5^lSMTBZ~aI@&W%g9Ce`=LjpZg?=6v%wr*7ie(4aunvatE` zd}yh?wW9g_;Glq^(zM3@@u^}%OgjyqNGFbPpGVpfn}0^l>;KXC`&XcS&A7Ue zHr0sUd*ip;>lGm(Us?Fvb_8HaBoCHuo0Y1vigxZFu?pPAs{@@UPv5EETAf`>U>V=R zRI>}yi%(&yggK6n49y_2{|&6`?5ANRcEiflD%*eFO)6Yd0#^EOu!c$E2CGJ`oLxRl z;C1sJMI5U+rN@>q3RovQMyL6a+&O7$>p9r~DY}V8?0PJ|4QqUy8XDtqelqpyctU=4 zI(p`2-@UZz@Mp&*pJNf%6OMyC^a|vdyEyXN3d1}g-c0XYO45sZenC!{{v~(fe{ffp z0lAx*jLs;cIS{*O&h?`ZxzSraM^t;i&0p?mYAWAEChT0}eFX|eao17Zcp d!hJ|>hNuI3Qtxr5loamNllQ4gwimVs;7>QF$`t?r diff --git a/projects/content/_shaders/dxil/meshes.vert.dxil b/projects/content/_shaders/dxil/meshes.vert.dxil index f401411b1562745c922c0a6cd3808a06c76eb722..ecdaf5adf54ceb3840d4875cd1268c3cfc2e8227 100644 GIT binary patch delta 1976 zcmYjS4@?tR9DaA#URyZIAy5tlIS_<6)K(D?WV?e}@edBAN*B@Gb>dK=f}moew)9Fx z9V*s@WcUZzG)|4dF&DR(rC?{wPzR1_1!k&oNSr1lMv^Tq*?Y7_Uh?bR`+nd1-h03A zcd0MUF)v4N$}jjWcRcc9(!W<~A6rJa`!%O90DvqS00n$5gRut2AdE7YxP$``7Xm)qj6(DmMlJ%yQYtSMZ=8O=}FK|CiqyTsbu~0kP-G(2>iHu*@xzgpcV?^Nq zc#91xSjhG$hPDB)p8?=nwC5}m-u#I6v!f9N~E2Ui$cc#~AryjYZ(v0om zoe7O0D~o5-G}|q;b+wVQ&Q4wH-icofhR+wgdA;-aapmUNr!nmCCgzE(q02OQ;m3jd zRf18BHg!aoVf*E3jhWY&J6tMts`Y5j*7^mt72?+N-9@{$mRFYG-%zpVj+H$b*>rZq z^kn3;a9Qtsncu1?)w~#;FvLurJZm{EExuIXd}(goxVKfGxje>Dnwe54A+2&t-R}Lx zyS7{EYD;kASibY+qKSO@=(V4$YhH$yJC4J-O5!5wa79J#vuBnMvMJXcM@D0LK7#puLKmG#J^j z%O%Q}xbU#M#gmRW*9?ycl+)sM+xkxb5i>YkHgoe(+pw&|Jy)s!o*#c9+%}Wd?R(1N zs2YJBj;mybd|_k4Z8y0Gtf70^VV2(4)p1js+dl46s;h``0J`_8?_gF9?2t$qpN={w z6h=lfpmjuX*@a?ddFgKXdQQGEtlV*c_>}}7Mk=Z~vQ4Er@X995(s6*6NmtZQIn}KJ2e`x! zN5Bt>*WMiG)L*fbArfz=EGsA)$a;K3QjQH@#1tuQt8T^n7xsmZ3n34L3~M4ds*?iX zM^O{*kU=3M5xj~GV#lK1v!O!>TQx6;{T-Fx5b8tN<(we4I=b*#=qSQMRyPLpu0*fp zDLfZ#JmeJuhq22yq)BWzI^eP_uQhP$Z5`45tWQEW(b|HVeHuXwvwwotClO1%0qSm1 zGs4o1h`P8vNIe!)nW(m}N7VI1ZjgE?F=mYACaIb3Aa!+I{WGkG}e+Di20w#->il-QF3bMJ2L53&%Iq2{+OjC^i3YK!#%R!24#wfV%rwCJ&W_=EK zEy&Q%cm;Y8<7|XPK&$K5CdF6t$*___2Cp!W1!T?a#6K!Onw^OaX^;H6fuqg znVHdLqn=5fJIcqcGDD{fkq)bnA<~A(Ceh;q98Jw`b04l1j=vQZCShaj-7h=C>(^M-dyWg@VcW?5Ug^a)R z($d%FKg0VT`ZcYvmd(po8MjScQZp~2nGbBS?z5|Uf^4X%V$TPZ9(1N?mnaRBea+^F zwzfZDgSzv#;7O9;VbS(cKh&$bwV~(w4@XGot0?w9Pr28dUY(R+pk~1OaN@Dn?9gtX zs^S2nD}+@c8s~3$o_-HceI-sQ9DxdFyQV1|>P@fjjQzk*h5S<=Hh}56&S`R~_spp{ J{BxTe{{w3@J%0cI delta 1864 zcmZ8h4NOy46uz%NuPqjQ&{9iVu>2!}K6JoD=lZZBOc@Z60H8 zT|zB5WMWzf(=F4K;2bQH^tDx|LP8m$6Er0{$2PXHZ1HE)WcSgQvEAgRJ>U7xIrrZ0 zoM%e)rR2yfayL02%o@3ue6K48%qLO|tAz*vK*OXYsr2#O^0bqt> z$vG3QgeU|68*XalTU0#Db8dKv-vm@9I^2kL9g>WsSXD>@p9bhu$l@ijoz#IgEoAOab7H6boO zNRmMuKEVB0E&wC_URoQCj^8M@YM3$02p@f;kIrTQ{nER&^ZAYn0r<=s8=Bca#wA}(O$#&-8;E=b;3sZ~~hI@S6pQxO@?e`Kbg%EBp~|0jksi7mfK%=wh= zH3No;g9q@-q~i*S+Cv{I-A=TgQbG!qIOMPo;5oKgo7Krmww?^zjLgC#Uqy5**dIIw zkw*0h>~jM^UJ5bFH!v$k8*%fDLYR-up=Ty z!0JQBdkGQSZ|OZqCRzv3iDrVPmkNdT#eJm6L}u2s0x26sqbv3~(U>e~>7bbxUA=D< z-P!t)FafZQ1{JGAJb(x_{!Gd#;xT#vM|VW+*T$o4SXVnjh!cqHP7GwK*VpK&gdayc z5uTpZYj1}PCPWR-B8Fq?#2(1rNf25^5 z30VkLs;)RlRji(JNf>7->Miu0Al1;g>JDL}sM`JbY#-@3i@IY(+y-4OK5HQz$Gm=;n)(|Fy>%|?io$_=1mVkWEi*mT_01!H-^Jc6M;9++Lzf%*lBv( z&e0VMjQ0R*W`Xf%ti)F8XQVDLK9I6Bk-;3#?K+8VyPvXhfzm2t%`8ylanUvf#aLUT zrKBz@u({Lq9w@ariA`!;QgagKZYB{Z`G!<)*kxq|yd&NzW%O_w@lF{x9%aFvnY(P- zU~=a}rJNcgW=`U|G_(w}Py%#pBe{w9L>ZQv0UxY~lZ$ua>>iFsSt?vO&uP$dZAl&% z0}N6+*3w#WNf~&LF06&VWH^=n%q*0`&Lzfq39&5%?(a!UQJd)xroYRu7p8)gYGtKp zA*Vyua)S$>K{x-Fp18#B40fP|Xi2-qDa9{@K3wb1R8r|+e2S9(R+86xBgUiP&{3m+ zbv133sWG#EaJmKQgg|ZQJ;VKDcD(8$qq4QB(C79~VM?7hVizIE@&3y%NfW45yzBq* Rzg)7&FHl=}2sQK6`UmI-PS^kd diff --git a/projects/content/_shaders/msl/lit_mesh.frag.msl b/projects/content/_shaders/msl/lit_mesh.frag.msl index a07b1a6..ff5140b 100644 --- a/projects/content/_shaders/msl/lit_mesh.frag.msl +++ b/projects/content/_shaders/msl/lit_mesh.frag.msl @@ -13,10 +13,12 @@ struct main0_in float2 in_var_TEXCOORD0 [[user(locn0)]]; }; -fragment main0_out main0(main0_in in [[stage_in]]) +fragment main0_out main0(main0_in in [[stage_in]], texture2d Texture [[texture(0)]], sampler Sampler [[sampler(0)]]) { main0_out out = {}; - out.out_var_SV_Target0 = float4(in.in_var_TEXCOORD0, 0.0, 1.0); + float4 _27 = powr(Texture.sample(Sampler, in.in_var_TEXCOORD0), float4(0.4544999897480010986328125)); + _27.x = _27.x; + out.out_var_SV_Target0 = _27; return out; } diff --git a/projects/content/_shaders/msl/meshes.vert.msl b/projects/content/_shaders/msl/meshes.vert.msl index 88a175b..1853618 100644 --- a/projects/content/_shaders/msl/meshes.vert.msl +++ b/projects/content/_shaders/msl/meshes.vert.msl @@ -22,6 +22,7 @@ struct type_Uniforms struct main0_out { float2 out_var_TEXCOORD0 [[user(locn0)]]; + float3 out_var_TEXCOORD1 [[user(locn1)]]; float4 gl_Position [[position]]; }; @@ -34,8 +35,11 @@ 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 = {}; + float4 _42 = float4(in.in_var_TEXCOORD0, 1.0); + _42.y = in.in_var_TEXCOORD0.y - 50.0; out.out_var_TEXCOORD0 = in.in_var_TEXCOORD3; - out.gl_Position = Uniforms.ViewProjection * (scene._m0[gl_InstanceIndex].Model * float4(in.in_var_TEXCOORD0, 1.0)); + out.out_var_TEXCOORD1 = _42.xyz; + out.gl_Position = Uniforms.ViewProjection * (scene._m0[gl_InstanceIndex].Model * _42); return out; } diff --git a/projects/content/_shaders/spv/lit_mesh.frag.spv b/projects/content/_shaders/spv/lit_mesh.frag.spv index f634fcaca104d8833de91169aedb57cc6c8656ad..82899a96be5fcfae1dbabcab002a42befa2a8bb4 100644 GIT binary patch literal 896 zcmYk3UrPc}5XEnrT50~t($osA$6|@7C?a1fd=VrS^DP!!L`V}|qrO)ks*li1(D~im z*nx58%$z+lcZ^1k62`0;W76h8zgW&hY$a*pHa41_rZe{k&iTbD{j`Y^Y%gOHW>tAa zK6XbF>U61Pl~LCKWl%y55B3*R<7z2~kw8+yLF%nR=gcU|1j zy#M7I;xZ$+5g6StX7@umn)JanIR<9ua337>3sT<@uF8+aB~Qw)Kfmfl;goV}%skPa z;7vK4u$S}#ZVQ)xm0bb@V^yi7|5D2>i^ZL(XO?v^bF+$Qp+i5Xhz@n|mLhjypS)Ok z#hNPH78_Gh&Q00rMttUS7Yxii?tp>OM~@j`^m#M2OR1nAyonj#LOY7LVzE;}4j0VK zqMUhP-n1)cUQb>2D#_tce-e{-l;zaX!cxn7SCq3CeVqG0N{9RG$?0S5rOv+caJ{b0 McnkF(DP75b0RYE4XaE2J literal 488 zcmYk2OG^V$429!N$NKC;L3dJdStzbV5bHw4WqlOsPG%v}g)Nlo+Mn%4@cV9O#6TuF zIXOx0lm1)KiwxdS`rNFgRxTjK+exApKonYlM; zHC|8X>*^5JJMD31k8Fcj-!H#e@vE7Q*aExH`aY^{;xUySqWMKN!+FjT*BW(aTw|Y{ yrtX_LyTnU+y{Cn%e@L(Qf3IqUzgnlNIp-dg_jGZ4<$Sa69CDj`<$lhJHv6o-*S^jPm2$goRx-0Wd#Yc~f|UzPCC7N@?ex)oxSxywWeJQxQkB#s zN+w$+$9p1F?WCQME&K5`j&`$j($6Moe6TSY4B|A}?Z=~7oIoryhsZ;eJMYE^@fTg; zoRU7wBfz!1qdf1&Q8E~(!$bLN>cDks_9=QtWaX(AO>X^Lvm?ukyv6L)TJ0m@l zLY8_yTQZ8i?WfU)w|j4Ty`9Zf$FJuzAM-u&KK3x4Wd8+{ll>g`J(7*t=*jPOOPHO~ zYexcRuYN8tyKhK1V7>zw4W^G-KefTs!Ot#R5{}1B2Xo9$@OwVk`@72SzfZe}nYGdD zIZ0P_Jdb&(b5@#O)+EI6HaOEf!I5o6_AN~Whq>VU9ZdOC+iYFWqppu*7UI?<t4bKKn^*P`xWj?FF#U(lTxdRfu$k~B7O zL%G=zwrjexA24?228UuUOVca1hA_PoP>0xa9YxC-)1j_nTdCZ4a^L@Gmq(+ zdr5+y9+}5udSr(l(EZFh9XMjdavTiD3Gt&Z5)Jqhvf@$_oj10liQwOt zU?+~;>*BVgA4u3CZQ?DvbZP@==HXCu(8$w#S8?ygj{0 hcEukcJcL6}%=bzgY;GgS@ z;P<;Tw;A-p$+_Qm_A{5%YrU4)jG4_@tY6Ne)k>!BG1hrIe|8@oCu2ZOf=482NSYqk z{ryPBhRvFiTmIv#ix2W_GRP;HJ9#}B4qX->4BXhsC$e+$DG)gt9*eTw^u&FU#%EUg z)JK4uz8jzSaGVU&Y;-DnQ`L$t%|0dW`+k;wc7r@g)h&6kF-x9|oRpY`U68J%5YzH= zCFA(paTb4kcl2g&@59^2g@4P>`;YBOu(5-5lK&S-|I`h8+ZJYL)b2~b><-KUv)i^u z1!m7+GTiH9(FXYQ!x)SPvnQKErE--WVB-DGaT&G!AT=*F4z|b&;SWK&B?O}HYPik;CLVe1%;ZzR1^R`#0Q{rR?#{w8-$G| zhH{$m-jm?~n4v7pOwN5%6x3m+_-2itw+k*pGu~IX#&xbT%*P*J<)ij&aLW6E7tP&4&}guAS5|#!efi=AI0< z&ax08E2u^mECzy;U>&q$#}H-K)1;OUzYc)?BmfMonLN zCP$dHQ%jV^gG3UXuqIdMdnOWhuT2v0u+A&N&hUL0i zALQK@=l4y11fHa3^?%o!xZfG#TfP2HPUTpiMXg@;H|`IzsDo z2$I$g@R%iu6jz65>mo~aahLP?h3kuXZhmMd;lBZhBOJHtTQcG%QV;h_74%(%Xq`FS zsQ&lxw`U&a;RypFSF%r_IRhaWFWWJll!Wd~`bBCfLud(mu~{vVT1_J)!3#OxE#Ov_ zON3SzSrjEYC0F&V={_UinxI*UMV%&%q~DYj>-jsGSuH^|T`4S*#=LcS6t&tD8YO%^ zLsgI@a3}G(9?l3w{QjKGtH3RX@`y7(U_8xbVH;}V>CM(vPoE}ar)iSk7to)T^X&qf zlSlANEfl)lV~|}C;eBcxT|s({xPn*eEg5`pV5#=eFCDwhx~wQG-A)qMPy;@!_tEe7 z+E4>PnMH)&gG#xI5z3{J0%_<6HI`6)^R!}Zdb);`EUMYHb6a^y+Vt%km!|J0@v|7~ zY5eiEhk2(f5H40lVnZT}RWtbQ+6b7mIl5CYF;rUS_w+UuyT#P;#A`dnLOCDu@h)a|uZlD6of2;q#AJ%zg|(ZsB9 zRwrCZ^vB+l#f->e`wVeAsQnoiEExf2^;tx9!J@Jv8AG$;Iz6_p3`;MwRm0L~t905b z^;lgpR`)CfhTUVdZR6XjB(`dot=?ryeKae4G$#DQE1aQ_V*k;Y$)hntbLFTZW>6N> zZ;Bl>pr1P79m1@3&6VeU%2q~cM>1M{%VDQqnKOow43E#@mtpTzBGrVgrV?StqPJE0 zZF^2)4K9;v(kR-k7EJ|&vv9tuNB|;XokNDVJyu;JBD`5v^~zLhh}Jii@#Ehry`)04 z>iOl0yC7}rr6^$}KY+^P~h_yr`HohWDN|*@3a0EE#U}wv&9Y|6@;D`jX)D zFUtD!!=(5|qtQi*Z}Ln<3jUwE46?I7`s;<>cqKJLSUD{zA1psbb$=x9naeCqWo9)c zwcf-Psr{1jl0X#`O^imD^8(>%z{E9S#W?I3&;y@laq7b92K6 zpf`dB1;&FukRCyy0%ZG^3eC1{&*vbeWiRJ9H1F0myi${&gCN^L9a`Xr*l-A1xO$s2jRk6 z9u*lFK$|4gKYG6)1jIspxQhxYDX?EI>VGPF-D`pR!a3pdQlN!%pok_g*O4I`imI2_ z0GJSz!*U>21P4G+1o*?j;26!}azSxRKo7SdF8EAPhXQ?%O6hiXdj(i~Er@sxB*>}A zFN8(G+El;}cH%8LSd+`Z7G5iB34GB+JWt^CvoGARim5|e$-a%Vr5k&Bmr35R<^YM+J6 zL#R0Y0_ze~xwM{Xhsxs!uOG<=I5=-2vsO(Pk~mP2P8vbhgFZ9K#-pp-Fj4XeE4bXY zx*X!zLc2Z6>Mx{hUQ)$FB5RQa(xd$zvg)FW%3&QPd^2q`($o6_Vx zd$#1l*21?Nr)`pUo%4%hb6-EPC{OtptXC&59v7SCGV`(L`F@5kz8r&HFo63NeGTzX ze|tDl{dKu|XXmBo8l)>QmdaU`J}f6c#yP@w-nYdnzU@<}rR_GyiSMqCOj4ulO@@<^ zg1$91m-iV*D_s9jbdUPUG~Fi3h>iW&bgq(KAXO+L5;u7|c56G7bsc-_xIh>Ds92~U z7w!XBBzhl1G&zZ8n$SChjbUX^SZUM}5HODa@)1~zirA+mc8}u=6wwkyYK0&|5V-(c zP6A-`vqBIj6d_>I99urL2-2R7Q*es}guj;xZVEV(e4VCR1~T(|je(;CJ=zfwio!hw z#pCGUaI^sxL5%XBM_``N0NFtUZ6#=#i9M3Im_mo0r+Drnrb*hW#hjASK8m~FNsT&X zTl*01=y7JW*s1DI>x?mGrkS5lGpU^);A!d9*R{yqBPeb7FqNIwc(=G4gxfde{Y>RzCp}=2NoJz0JP=yp(ZC0g7 zt)?lO!Xo~2h{ti&ON7=Qy8abURl|p4AJv;x>C#yB4zfy1YBl49)F+HqbBHLv_rjfb zYwszpD>txokAVEGikp$+X;kaZtC}I!AX@G1>6$6#w}+o0-p+hm0=NX#uRk|?L6aNw;?I~iV|7B=%vL|?ZzHj zd;@2vmFbxDv`Ko-B;^}agRHEcJk3+P^wc`NFVoFR2feaEuZplpC($FT{{2TOXE%M! zoE`XaN*_->P((#GSeydsyT2AL8HKkzg7)me8CA5B-=rm4-8%V{Q!q0txT|$?hXubf z{nR67q<{9nPCC%ZpSJx~P9-9@}BP7tf$u=HqU;^d3H z($8nQJmQZ5$bSCn&;&?c#M6QU2KOrD`L(1`=AV<*iqXwB%|@%wt~L^T_YloJjr;{9 z`b$dqd!ukIU!6GYP57BhR?9>LU>4~Zck_s5vz@znY>$1nfoLU(y?Gr51F_G*ZQ0Xd zpgZEmVuXth;T#j)z(n6(5-t@B*HZq3TXNZyJYiUuSj%)~owH<(Yc`$cW}mZUTe(?d zOX3!=nsvm6x{fArHFg*r9R@AYl18*VhyY>VGIqR7b~H*lntD3+_L$PYS`vOWEBu2; zxX5s;MqILamuxI>ozclgE-Om*ygYLzF3)!->-%eRFeXMm&X3ZepBWzh?DiTV zW4o*=0!*M_V4VN@0E!%R|$yL^e7xYrZ zi{wG7Lh{(sJTX*&yxBMR>m=(}e>D8Zg#3x}-@FUC)&K|}a_@V9%OB<53SbX&?>oTv zPwxE(=HB4;f!F_Y?u`XW0QZXjo_p#2uJp(ZCx6sMj#~B~l%Q#rq_no!G%Pa8`biwZ z`E+M22B`K~qY6PDIQ4;VGx+{`9mMgR#(kBaGplg_GP)Xi$>oP2BRhEp|GjhS0w$vifNV>f7^?`^Pl8eTvk-sB3 z4`A}s?9!~(mpN#<*0_r~=XGE3;x56w*5|>SA;Zyt;ofw+2AOA^i_S>tk(Z7X#P2vP z{k)6rSGWJ7s$8)Fej=pOy^vDc25xj;D&pCn0W8&Ar>m}MD%w?DQ(tO6!H+xkoyr?C zFCLw#xG~eE{Q)4VszYThhjNr#9?LCPruIWh>KdB3bca2EatLrJZ}Fde^Z%W1bTs(C z4170;Fg6{2YlEKykeo3@TrTfY-{`J1iHl7uw#rxR^oqB8SLDu#%jPE50ct^#aUNpU zsy_1GcA@cDXf%LMo@C?6;K=Al*W<4v_%$2LG13xAbMb&T-s)Xn#}g{_9z0PQ z9OWid>c{a{9N(3sAf(x(BYLERsH83!NIS#c!*?oTY9G07lKcPfngNWIF+785YFxz2<&S(0av92;LY^8+p}_pel;rw{JG0PHc_=KN+x$ZPE3Z zvxH1HI$s%IwT$={Lfl&`&YErY<$-1L)R`%}fI^Vj$9Za|mm!by{Mu528LCt_>ZmCsE4H@;+L VwN7;DZ`>P8{>FVkgu=59<*(=vTqpnl literal 0 HcmV?d00001 diff --git a/tools/scripts/content/_shaders/dxil/sample.frag.dxil b/tools/scripts/content/_shaders/dxil/sample.frag.dxil new file mode 100644 index 0000000000000000000000000000000000000000..6115e3aa4c6a978c12a4780e1c16ac3ab588aaa8 GIT binary patch literal 2816 zcmeHJdvFtV9{(k~&2DJA*)&lSnszpQO(+$X6kB>tXPT!eq(f>$jh>E4p@>Rr+LX|T zGq*|8Zoq)CREgAK2o)^g_<}i!qEnh!LtDJ^IOGn8p;D^eAlGqpM&}&$w@J%*j^o_@ zarc+s$@lU5zV`Rn{p4qK=nX4Z9(}dJPVi0O%!4`|thTY^aY}jzWksEFJjoKO*zf;R4 zLuzPz)b473thoc)wuVMJ1U2{UU!xx(aef|;`~5pDSs0R>zB8c~*W<0}b#QJjwphml zMu6}+Z<^qk8Db) zQW(R01<&b{Xsv+MR1WY0qM{63k%vCh#E>SwejrmHAT_eJxP1K*jXr1z%P506co--& z`dJGRmgFaFx_Vz|ruXJ9RAm;_%K?DL1ad;xxh=qI_#;_?dCo*AZoaiJ&dpiscj_sq zcS6A(jV2!#Qk(lwY5vOrC~gFzVOh2{7|IL;tR!6kioh-fQ^}_z1vR@?8|}tM5p`(U zn2%Wl>!q^xQMSX$mTzUdwj$8Zdfi5}OcUKu0&zEuwI9Sh6xI?Z+7^w@MWfA$aS79c zFMgKht--pTSjV(rj>Np_OeX<5q%-GW=pY7jTCNkY&q9Zk$8g}zO9()}RzTi4Ls1t= zr49P<@qOc{;ZU}mr|#FNpB+%6#|EJ7*Q?3DzbW$LD4*8_ z_w4~#vkb9@&3tKMkLameU)G5V$1^@O9TAwvGceQ?nkz0AJXZWlX|sW}l0lchhRg~0 zu23YJaVjR{*Kd;(fe3|<3Y_tp(#d}2Z?tG#na*(_>x|*hJ*DS%;~OQHr!Vf6okyd# zV*G=*R8%pZQKnPx7xG=O-=r*&|L|33h^H9z zDPHm^?5<5Gp7hiftndsEWuqID^AF#en4PGQ_U zr0R`$D5=7pb|dX1>v1F8TAZvq$?h1zx+6aAEF*5M5#O99=HY&|Q7PyKchgz>{;B=p zQ_y=wduev*+b#URy1)DA#`?WdiTd8^ln0;)l?6*uWYINPWD9oljX&l8`H$q+FN@#b zY_UIdhQqE)3s`pVFR<+N&#<2 zBo(Zo;GYrqo#|oI{~pUC6#0R`MXN{8)sgt7I8&HFU2Wy)B&q|JlYNI{l4!};vhMDI z{QZ>dEJU$#G=WAPDHNmj2>HHkWXY3pz1CJ(hnS2X_k&HE=5I`Q74K*?S3sD{%8crU zWLYxFBRTxmczFA0|DiT57#SPi^6}h&xpB^1QG_20&%~}gfA-wr_hNOzVDaY8m0s62 zZ*zMCf0$4lm{dL_fAGbJFXlX`xH?E3HS~Yhw6D>-&sc6+YJQ-+$ng(YJs3NG_NMN= z!?E+{>V(`?=Xc!sKjMyy0w53WxfIova`z(c9%byK5!(`bkqus43IsyncRH;Z=<-BR z$7d+Hd{AOCtZoVe3Ky8STP`$(>q&u6~?Orw6y&>;>s` NUQ@1YBbvUU{sbS{Knnl> literal 0 HcmV?d00001 diff --git a/tools/scripts/content/_shaders/dxil/sample.vert.dxil b/tools/scripts/content/_shaders/dxil/sample.vert.dxil new file mode 100644 index 0000000000000000000000000000000000000000..fdabb150dc7d441e281506f448f4a779bb5a950f GIT binary patch literal 3780 zcmeHJe^3+I9e>F#y9;cV1)@ZLcpK1+2=xpP2~GM-gL<`lhY13^qJdhzFQ$}p%%@y4@^ZLiw9{&)|Gr=9-O{?WP4 z^gDU)`+eV^yYIbxzN=lM*8KI`4?xtSs$JUa5&hDk;{zf9Kpz7D33&z_xo|k(n1G`L z8XKXZ3y%EEY@UKTKV|1HNlJzb6z|v1nKBYndbAWF2T1v=-(6i)v8|{&TML%MSUuE< z;qb?1LD^5(ln~-qK%O@xqjboQxZl2V@fywYxD%kWe0x82w(SAf$&w1_%DS2?S5AS;Su!FEwn2RZ$G0N!tq%>V(N{@Y_T{3$RxT zibPrrgGJt+^7pg+mBPxA008tbLp2Q6uF1|t1yF7;)T=e_VL1)JR;UZE(~TUn(vjgl=5Qm$}hxul#X({T*UP^w3> z7}ws|KAn(fcHXl*+>OU)5_xa~&>2NJN6>bWDsj8SI)OxtE9GrScmo8sgKX%B&LzB7 zujXRM?xTav;sr}sX`w_(9Id)xd>;M{yYJUw*K=}zTyeKu zR_M&zoqAh_lVYZ!%@L;f(4$aC*&MFc`nf@|>YnC9Sm7QZMb8v2t#I47>Fp`S_8r9- zlqIKhOsS9A31<+plP4>h$x4nabus0Bq1rE$>q+F`BObltR;40$>d9?BVvHrLUU=#m znBj%z7&JAL(5G~SfqAAfOlmZTUtWFyY#9OU%ezDGV7Zrhl15~r8#=MdDiY`_OhwOtc%$~ zx!&g9LPrI5z%$zpc_fzW$`pt9?V-0m{(2cbt3Tk<;x;0)KY+v+JI53XVw2(*iA5SV zm$ent^0Fwad5~lAfD7G$y~Yw5V{PPg(*w_Urk@Y&HI-yhMRJE(ZjuOR%tnYG9OWkT z9+mc*O?8K-eaS-mafz__$h^cW^}pSJ>)@(G(d%dYB=+1GjdKr_01P#`y}er zk~LJ~jg&GUb@eX0OWVG?!*=*^t3yHI$pUvIP%K}@5=9o@fgW2Og(Z!AmL&6mt|RX}XJ>8&eXoNQV$vvVnK?xDWLZ_vo8?4j-~CO$tnQjWzI zR2a$%i;F4~uMdrlk0~gRI`&F^*`EG&cfO2>no-}~b>T#+~#l<^@CCYT8wGoS5?8J0&6 z%42#BGdJ=dE&SZF(5Ff7!ZJR$WLU9<0~69JJy}ysrWV^P;B2xRU3R0MteQhsJqv(o zx0~$mQucD0y`s^+qtTrBWP*7z!u-k2Jm#?iZ%g!OOZ33xJYzq-h@TJt6g{#TiD@odgbIUBUZuMD~%X>7rou+wQp}HcQ%?c zMol4Qs*s01W`ehvy`ndURH#s|AqEKuyURIC~;$Ht-xfGXDiOtc9`v zKK?gy^d-W;&l$V|L3o45G^-CcAE#h{*q~7-(gH0Jl~5l``Y_|Kz%E>FU>rV{Sm*uc4A^x6DXlPnmQ`r>8Ep(b?a|}c?i{+eT zgIcK|#~=khNfNWT@Lg0K5ZJyC4ee5Pzb ziL3bn6W}O9CrkGH&Z)rN#kH(cLH9~FZB483e7Ux^@SHpy;~R@)4t*aGsaU!>xqbR? zB9~F7Yq(stOlFO`I&A#LcIFIz$*8fKdlEGUJdU7XQE*X6H4GQ4fm1>C6!&sN$Sw8b zPiFJPT;^y8R?vK(56a-s!iN^1t~SK+$i_cwgjJg#m@I%MF3QH!MmS&*l8CpMH24v& zbDH;PrioX{q|ilIXPQQ=3vSB7D9Hv uW`1IN&D_G+zBg-OwCa1a3PsnxW`5$PGwCpZ_kj4iG`3FHj=`^BME?NNWSW!! literal 0 HcmV?d00001 diff --git a/tools/scripts/content/_shaders/dxil/test.vert.dxil b/tools/scripts/content/_shaders/dxil/test.vert.dxil new file mode 100644 index 0000000000000000000000000000000000000000..a29b0fe9191aca62d43e89d0f1c9ba7a4024cda1 GIT binary patch literal 3800 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 literal 0 HcmV?d00001 diff --git a/tools/scripts/content/_shaders/msl/lit_mesh.frag.msl b/tools/scripts/content/_shaders/msl/lit_mesh.frag.msl new file mode 100644 index 0000000..3f1796e --- /dev/null +++ b/tools/scripts/content/_shaders/msl/lit_mesh.frag.msl @@ -0,0 +1,22 @@ +#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 Texture [[texture(0)]], sampler Sampler [[sampler(0)]]) +{ + main0_out out = {}; + out.out_var_SV_Target0 = Texture.sample(Sampler, in.in_var_TEXCOORD0); + return out; +} + diff --git a/tools/scripts/content/_shaders/msl/meshes.vert.msl b/tools/scripts/content/_shaders/msl/meshes.vert.msl new file mode 100644 index 0000000..88a175b --- /dev/null +++ b/tools/scripts/content/_shaders/msl/meshes.vert.msl @@ -0,0 +1,41 @@ +#include +#include + +using namespace metal; + +struct Scene +{ + float4x4 Model; +}; + +struct type_StructuredBuffer_Scene +{ + Scene _m0[1]; +}; + +struct type_Uniforms +{ + float4x4 ViewProjection; + float time; +}; + +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]], 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 = in.in_var_TEXCOORD3; + out.gl_Position = Uniforms.ViewProjection * (scene._m0[gl_InstanceIndex].Model * float4(in.in_var_TEXCOORD0, 1.0)); + return out; +} + diff --git a/tools/scripts/content/_shaders/msl/sample.frag.msl b/tools/scripts/content/_shaders/msl/sample.frag.msl new file mode 100644 index 0000000..e9e2dad --- /dev/null +++ b/tools/scripts/content/_shaders/msl/sample.frag.msl @@ -0,0 +1,22 @@ +#include +#include + +using namespace metal; + +struct main0_out +{ + float4 out_var_SV_Target0 [[color(0)]]; +}; + +struct main0_in +{ + float4 in_var_TEXCOORD0 [[user(locn0)]]; +}; + +fragment main0_out main0(main0_in in [[stage_in]]) +{ + main0_out out = {}; + out.out_var_SV_Target0 = in.in_var_TEXCOORD0; + return out; +} + diff --git a/tools/scripts/content/_shaders/msl/sample.vert.msl b/tools/scripts/content/_shaders/msl/sample.vert.msl new file mode 100644 index 0000000..15b45b2 --- /dev/null +++ b/tools/scripts/content/_shaders/msl/sample.vert.msl @@ -0,0 +1,66 @@ +#include +#include + +using namespace metal; + +struct Scene +{ + float3 color; +}; + +struct type_StructuredBuffer_Scene +{ + Scene _m0[1]; +}; + +constant float2 _31 = {}; +constant float4 _32 = {}; + +struct main0_out +{ + float4 out_var_TEXCOORD0 [[user(locn0)]]; + float4 gl_Position [[position]]; +}; + +vertex main0_out main0(const device type_StructuredBuffer_Scene& test [[buffer(0)]], uint gl_VertexIndex [[vertex_id]]) +{ + main0_out out = {}; + float4 _71; + float2 _72; + if (gl_VertexIndex == 0u) + { + _71 = float4(test._m0[0u].color, 1.0); + _72 = float2(-1.0); + } + else + { + float4 _69; + float2 _70; + if (gl_VertexIndex == 1u) + { + _69 = float4(test._m0[1u].color, 1.0); + _70 = float2(1.0, -1.0); + } + else + { + bool _57 = gl_VertexIndex == 2u; + float4 _66; + if (_57) + { + _66 = float4(test._m0[2u].color, 1.0); + } + else + { + _66 = _32; + } + _69 = _66; + _70 = select(_31, float2(0.0, 1.0), bool2(_57)); + } + _71 = _69; + _72 = _70; + } + out.out_var_TEXCOORD0 = _71; + out.gl_Position = float4(_72, 0.0, 1.0); + return out; +} + diff --git a/tools/scripts/content/_shaders/msl/test.vert.msl b/tools/scripts/content/_shaders/msl/test.vert.msl new file mode 100644 index 0000000..564cda3 --- /dev/null +++ b/tools/scripts/content/_shaders/msl/test.vert.msl @@ -0,0 +1,66 @@ +#include +#include + +using namespace metal; + +struct Scene +{ + float4 color; +}; + +struct type_StructuredBuffer_Scene +{ + Scene _m0[1]; +}; + +constant float2 _30 = {}; +constant float4 _31 = {}; + +struct main0_out +{ + float4 out_var_TEXCOORD0 [[user(locn0)]]; + float4 gl_Position [[position]]; +}; + +vertex main0_out main0(const device type_StructuredBuffer_Scene& test [[buffer(0)]], uint gl_VertexIndex [[vertex_id]]) +{ + main0_out out = {}; + float4 _58; + float2 _59; + if (gl_VertexIndex == 0u) + { + _58 = test._m0[0u].color; + _59 = float2(-1.0); + } + else + { + float4 _56; + float2 _57; + if (gl_VertexIndex == 1u) + { + _56 = test._m0[1u].color; + _57 = float2(1.0, -1.0); + } + else + { + bool _48 = gl_VertexIndex == 2u; + float4 _53; + if (_48) + { + _53 = test._m0[2u].color; + } + else + { + _53 = _31; + } + _56 = _53; + _57 = select(_30, float2(0.0, 1.0), bool2(_48)); + } + _58 = _56; + _59 = _57; + } + out.out_var_TEXCOORD0 = _58; + out.gl_Position = float4(_59, 0.0, 1.0); + return out; +} + diff --git a/tools/scripts/content/_shaders/spv/lit_mesh.frag.spv b/tools/scripts/content/_shaders/spv/lit_mesh.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..33a8e9529f279f607f4631e5aaf8641de53a9c82 GIT binary patch literal 756 zcmYk2%}c{T5XINTG=BEOYU>9`TkkSVn~m?Cg~qHIW9sHmU!rBaqT@RZ+c2S7SLHlQ(m8~uMA6ijz6R;!n?Q9UGB7oF zC;wj9=;Ad>XUWux3)Dpu+pm0?S*NQBJKaYzTfEs!(CL^tDq4XY@J#2?XOczn!{lx_ ze7ZkhX+yWm`!aXrX#5f<+0^D@@vH95oDE&7`28>UC@mhR3{`-6V->UeK#2|>+*cA{ zcCPZ^lJ98Rrf^Srq!a%X%zn%(15EU!*jgQ(_E;+Z75(j^5AF)@s4|N=@Vlzap$}hI zg~t=Vp~~Cnw{@$j+E=Hg%K1cR{uBCZec6Mz5@7s!8v(`-Z#==}d^|37lbLV?9zRm= xsoqG-j%_9P!FcW~@dNY510{ZAb=j+Y;GgS@ z;P<;Tw;A-p$+_Qm_A{5%YrU4)jG4_@tY6Ne)k>!BG1hrIe|8@oCu2ZOf=482NSYqk z{ryPBhRvFiTmIv#ix2W_GRP;HJ9#}B4qX->4BXhsC$e+$DG)gt9*eTw^u&FU#%EUg z)JK4uz8jzSaGVU&Y;-DnQ`L$t%|0dW`+k;wc7r@g)h&6kF-x9|oRpY`U68J%5YzH= zCFA(paTb4kcl2g&@59^2g@4P>`;YBOu(5-5lK&S-|I`h8+ZJYL)b2~b><-KUv)i^u z1!m7+GTiH9(FXYQ!x)SPvnQKErE--WVB-DGaTSdO-AGG?QGzS9}k5tHUCS zHp>xIs>yqMK2mYJKknlD`Sd{bxb%N#4c4B%jD)bfIqrh=w}9-?>ArBr6|F?Cec}Vy z?4KF#u(=FBU`K_je#(qIx+$MW(nDs{%J?$k*6=j@e7_=96YegO|x B72yB? literal 0 HcmV?d00001 diff --git a/tools/scripts/content/_shaders/spv/sample.vert.spv b/tools/scripts/content/_shaders/spv/sample.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..8e1453ee4a2459f9368105a056a570033ddb7d41 GIT binary patch literal 1848 zcmZ9MX-`v85QYzwsRqOY7^emTzUYj;!bCZIxL2I|f~c)a_Hc=xJr2(>>K(0XAl)IpmzI+e8yQR-XtbJN*5dR*yG45%CuGCLK#+WB!dXe>soPEfi zi0MZbGtRsNaPzkITgvt$HUtv;x`6B+)GNdc!mS~u?yl_9dChqSZcgt|`&qd8#e0c7 z2OkDG4_EF38-nZW9h=)8rqQkCU5lw(OWAtrk=y*Cx8ArurEE_ZGyhUnzk(dQ7)Ew? zl6{ZB?Zf<&OlNP_@!0DxETixle4X_Yr0+L;jk}y<-uX{zUx9o6;IC~Ax(b;`d4b8C z_ZsAkz9nPj)^G=Y587W+!<~-j80-L>$T52jzZ*Gbe;Z_X_f^Pv{k8iBe$$J6+LOJ- zEH{yz&o}5SezzWH(RLfU0~x0rv)o0FS&S{tat~d5^mrdx%oErovRHAJ2RT-pWeUuA z{k6v|_GwS{7PCA=b{4-4XL$toIE%JvNX$6pnB_5Y%wlYDmKk*I(f2H}m?y9~WU=Bb z^EpWC3=$o$nS6wxdJ(#arV2x+Zcf_LCzz6FMIbl??m+Q^TT)A6qSVw=6YqQ-eF>k+I3y;1 z-|1PVaVM*5{{OYt*)5l5kEC=cr8Jz@`1RCMsfd(w-|R>_`p9#UlivP*yW8ApwGZ0lE9o%xeJ^2GbDvOZb>4QmXlocQ zW$h1{@hYBtonF@bxYupIdcON~YwP8+g*;cuXO7u6=yks1$PGl_IrTmIVom2>-oguyftG?XhGv>=zfe%VaL9Vy9fO`m6K>WjOn{8=kDLXlFnkgGjT?#Jcn)&Igi#J zBX$98?-W`rYnKabzpXKSv9-n54{Y(n@4snl%K2V=C)#3OMB?ssYSZCJbT3mPX8ay;aib&4(*ZC+&ppVr#i2o^b;+Y%#4t|fod4%n^^1F%|9O5h^b;O*Q t=3X$n|Fg%4c~8Vvu#Nflwu}3(Vq0r2{;#X--ghszw(s7$KXfi3e*xuCT%`a2 literal 0 HcmV?d00001