From 3c1ae7d1b601b9be8f5026771b6f8bf4eb874291 Mon Sep 17 00:00:00 2001 From: peterino2 Date: Mon, 1 Sep 2025 09:05:05 -0700 Subject: [PATCH] working on text renderer now --- engine/core/src/configVars.zig | 1 + engine/rend/src/sgpu/renderer.zig | 2 +- engine/ui/shaders/text.frag.hlsl | 20 +- engine/ui/shaders/text.frag.json | 14 +- engine/ui/shaders/text.vert.hlsl | 24 +- engine/ui/shaders/text.vert.json | 16 +- engine/ui/shaders/text_shared.hlsli | 24 +- engine/ui/src/sgpu/papyrusSgpu.zig | 42 +- engine/ui/src/sgpu/textRenderer.zig | 47 + extras/bsp/src/maploader.zig | 5 - extras/gameExtras/src/fpsCharacter.zig | 0 projects/build.zig | 11 + projects/content/_shaders/dxil/text.frag.dxil | Bin 5952 -> 5940 bytes projects/content/_shaders/dxil/text.vert.dxil | Bin 5004 -> 4868 bytes projects/content/_shaders/msl/text.frag.msl | 67 +- projects/content/_shaders/msl/text.vert.msl | 16 +- projects/content/_shaders/spv/text.frag.spv | Bin 4432 -> 4620 bytes projects/content/_shaders/spv/text.vert.spv | Bin 2080 -> 1964 bytes projects/content/bsp/autosave/testmap.4.map | 1200 +++++++++++++++++ projects/content/toolboxEngine.ini | 4 + projects/sampleGame/externGame/externGame.zig | 2 - projects/tools/toolbox.zig | 174 +++ 22 files changed, 1581 insertions(+), 88 deletions(-) create mode 100644 engine/ui/src/sgpu/textRenderer.zig create mode 100644 extras/gameExtras/src/fpsCharacter.zig create mode 100644 projects/content/bsp/autosave/testmap.4.map create mode 100644 projects/content/toolboxEngine.ini create mode 100644 projects/tools/toolbox.zig diff --git a/engine/core/src/configVars.zig b/engine/core/src/configVars.zig index b33e7e6..f982870 100644 --- a/engine/core/src/configVars.zig +++ b/engine/core/src/configVars.zig @@ -319,6 +319,7 @@ pub const Parser = struct { pub fn setupConfigs(configFilePath: []const u8) !void { _ = try core.createObject(ConfigRegistry, .{}); + core.engine_log("loading configs {s}", .{configFilePath}); try getConfigRegistry().loadConfigFile(configFilePath); } diff --git a/engine/rend/src/sgpu/renderer.zig b/engine/rend/src/sgpu/renderer.zig index 8b8c20d..665d5f2 100644 --- a/engine/rend/src/sgpu/renderer.zig +++ b/engine/rend/src/sgpu/renderer.zig @@ -400,7 +400,7 @@ pub const Renderer = struct { } } - fn addAttribute(list: *std.ArrayList(gpu.GPUVertexAttribute), offset: *u32, size: u32, format: gpu.GPUVertexElementFormat) !void { + pub fn addAttribute(list: *std.ArrayList(gpu.GPUVertexAttribute), offset: *u32, size: u32, format: gpu.GPUVertexElementFormat) !void { try list.append(.{ .location = @intCast(list.items.len), .offset = offset.*, .format = format, .buffer_slot = 0 }); offset.* = offset.* + size; } diff --git a/engine/ui/shaders/text.frag.hlsl b/engine/ui/shaders/text.frag.hlsl index 1c89153..cde3981 100644 --- a/engine/ui/shaders/text.frag.hlsl +++ b/engine/ui/shaders/text.frag.hlsl @@ -5,8 +5,10 @@ Texture2D Texture0 : register(t0, space2); SamplerState Sampler0 : register(s0, space2); +StructuredBuffer fontBuffer: register(t1, space2); + float4 main( - float4 Color : TEXCOORD0, + uint Color : TEXCOORD0, float2 UV : TEXCOORD1, float2 pixelPosition: TEXCOORD2, uint Instance: TEXCOORD3 @@ -26,11 +28,16 @@ float4 main( discard; } + float4 textColor = float4( + getRedFromUint(Color), + getGreenFromUint(Color), + getBlueFromUint(Color), + getAlphaFromUint(Color)); + if(isSdf == 1) { float dist = tex.r; float width = fwidth(dist); - float4 textColor = clamp(Color, 0.0, 1.0); float outerEdge = 1.0f - (120.0f / 255.0f); float alpha = contour(dist, outerEdge, width); @@ -49,16 +56,17 @@ float4 main( // so 1 + 0.5*4 = 3 is the divisor alpha = (alpha + 0.5 * asum) / 3.0; - textColor = float4(Color.xyz, alpha);//textColor.* alpha); + textColor = float4(textColor.xyz, alpha);//textColor.* alpha); textColor.xyz = pow(textColor.xyz, 2.2); // gamma correction // Premultiplied alpha output. o = textColor; } - else { + else + { float alpha = 1.0; - float gray = dot(Color.xyz, float3(0.2126, 0.7152, 0.0722)); - o = float4(Color.xyz , pow(tex.x / gray, 1/(2.2)) );//textColor.* alpha); + float gray = dot(textColor.xyz, float3(0.2126, 0.7152, 0.0722)); + o = float4(textColor.xyz , pow(tex.x / gray, 1/(2.2)) );//textColor.* alpha); //outFragColor = vec4(1.0, 0.0, 0.0, 1.0); } diff --git a/engine/ui/shaders/text.frag.json b/engine/ui/shaders/text.frag.json index 221c949..0a9bb68 100644 --- a/engine/ui/shaders/text.frag.json +++ b/engine/ui/shaders/text.frag.json @@ -6,7 +6,7 @@ } ], "types" : { - "_9" : { + "_13" : { "name" : "FontInfo", "members" : [ { @@ -36,12 +36,12 @@ } ] }, - "_8" : { + "_12" : { "name" : "type.StructuredBuffer.FontInfo", "members" : [ { "name" : "_m0", - "type" : "_9", + "type" : "_13", "array" : [ 0 ], @@ -56,7 +56,7 @@ }, "inputs" : [ { - "type" : "vec4", + "type" : "uint", "name" : "in.var.TEXCOORD0", "location" : 0 }, @@ -101,12 +101,12 @@ ], "ssbos" : [ { - "type" : "_8", + "type" : "_12", "name" : "fontBuffer", "readonly" : true, "block_size" : 0, - "set" : 0, - "binding" : 0 + "set" : 2, + "binding" : 1 } ] } \ No newline at end of file diff --git a/engine/ui/shaders/text.vert.hlsl b/engine/ui/shaders/text.vert.hlsl index 2455f28..58c6a66 100644 --- a/engine/ui/shaders/text.vert.hlsl +++ b/engine/ui/shaders/text.vert.hlsl @@ -1,9 +1,16 @@ #include "text_shared.hlsli" +StructuredBuffer fontBuffer: register(t0, space0); + +cbuffer Uniforms : register(b0, space1) +{ + float2 Extents; +}; + struct VSOut { - float4 Color : TEXCOORD0; + uint Color : TEXCOORD0; float2 UV : TEXCOORD1; float2 pixelPosition: TEXCOORD2; uint Instance: TEXCOORD3; @@ -13,13 +20,9 @@ struct VSOut struct Input { - float3 Position : TEXCOORD0; - float3 Normal : TEXCOORD1; - float4 Color : TEXCOORD2; - float2 UV : TEXCOORD3; - uint Bones : TEXCOORD4; - uint weights : TEXCOORD5; - + float2 Position : TEXCOORD0; + float2 UV : TEXCOORD1; + uint Color: TEXCOORD2; uint Instance : SV_InstanceID; }; @@ -28,11 +31,10 @@ VSOut main(Input v) FontInfo s = fontBuffer[v.Instance]; VSOut o; - float2 t = v.Position.xy + s.position; + float2 t = v.Position + s.position; o.pixelPosition = t; - //gl_Position = vec4(( (v.Position.xy + pos) / PushConstants.extent) * 2 + vec2(-1.0f, -1.0f), v.Position.z, 1.0); - o.Position = float4((t / Extents) * 2 + float2(-1.0f, -1.0f), v.Position.z, 1.0); + o.Position = float4((t / Extents) * 2 + float2(-1.0f, -1.0f), 0.0, 1.0); o.UV = v.UV; o.Color = v.Color; diff --git a/engine/ui/shaders/text.vert.json b/engine/ui/shaders/text.vert.json index 64e5405..eabf67b 100644 --- a/engine/ui/shaders/text.vert.json +++ b/engine/ui/shaders/text.vert.json @@ -66,24 +66,24 @@ }, "inputs" : [ { - "type" : "vec3", + "type" : "vec2", "name" : "in.var.TEXCOORD0", "location" : 0 }, { - "type" : "vec4", - "name" : "in.var.TEXCOORD2", - "location" : 2 + "type" : "vec2", + "name" : "in.var.TEXCOORD1", + "location" : 1 }, { - "type" : "vec2", - "name" : "in.var.TEXCOORD3", - "location" : 3 + "type" : "uint", + "name" : "in.var.TEXCOORD2", + "location" : 2 } ], "outputs" : [ { - "type" : "vec4", + "type" : "uint", "name" : "out.var.TEXCOORD0", "location" : 0 }, diff --git a/engine/ui/shaders/text_shared.hlsli b/engine/ui/shaders/text_shared.hlsli index e7f37c5..554e7a5 100644 --- a/engine/ui/shaders/text_shared.hlsli +++ b/engine/ui/shaders/text_shared.hlsli @@ -6,9 +6,23 @@ struct FontInfo { float2 pad2; // 8 bytes }; -StructuredBuffer fontBuffer: register(t0, space0); - -cbuffer Uniforms : register(b0, space1) +float getRedFromUint(uint color) { - float2 Extents; -}; + return float(color & 0xFF) / 255.0; +} + +float getGreenFromUint(uint color) +{ + return float((color >> 8) & 0xFF) / 255.0; +} + +float getBlueFromUint(uint color) +{ + return float((color >> 16) & 0xFF) / 255.0; +} + +float getAlphaFromUint(uint color) +{ + return float((color >> 24) & 0xFF) / 255.0; +} + diff --git a/engine/ui/src/sgpu/papyrusSgpu.zig b/engine/ui/src/sgpu/papyrusSgpu.zig index aed7ff3..06b7aec 100644 --- a/engine/ui/src/sgpu/papyrusSgpu.zig +++ b/engine/ui/src/sgpu/papyrusSgpu.zig @@ -18,7 +18,7 @@ drawList: papyrus.DrawList, first: bool = true, rectPipeline: *gpu.GPUGraphicsPipeline = undefined, -// textPipeline: *gpu.GPUGraphicsPipeline = undefined, +textPipeline: *gpu.GPUGraphicsPipeline = undefined, tempDrawCommand: std.ArrayListUnmanaged(DrawCommand) = .{}, @@ -123,8 +123,15 @@ pub fn create(allocator: std.mem.Allocator) !*@This() { pub fn setup(self: *@This()) !void { core.graphics_log("imgui startup", .{}); + try rend.registerRendererObject(@This(), self); + + const ctx = rend.context(); + try self.createRectPipeline(); + try self.createTextPipeline(); + + self.screenBuffers = ScreenBuffers.init(ctx.device); } pub fn destroy(self: *@This()) void { @@ -136,7 +143,32 @@ pub fn destroy(self: *@This()) void { self.allocator.destroy(self); } -pub fn createTextPipeline() !void {} +pub fn createTextPipeline(self: *@This()) !void { + const ctx = rend.context(); + const vertex = try ctx.loadShader("text.vert", text_vert.LoadArgs); + const fragment = try ctx.loadShader("text.frag", text_frag.LoadArgs); + + core.graphics_log("text shaders created", .{}); + + var pci = std.mem.zeroes(gpu.GPUGraphicsPipelineCreateInfo); + pci.vertex_shader = vertex; + pci.fragment_shader = fragment; + + var attributes = try textRenderer.addVertexAttributes(&pci); + defer attributes.deinit(); + + pci.target_info.num_color_targets = 1; + + pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{ + .{ + .format = ctx.swapchainTargetFormat, + .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), + }, + }; + + pci.rasterizer_state.fill_mode = .fillmodeFill; + self.textPipeline = ctx.device.createGPUGraphicsPipeline(&pci); +} pub fn createRectPipeline(self: *@This()) !void { const ctx = rend.context(); @@ -171,8 +203,6 @@ pub fn createRectPipeline(self: *@This()) !void { pci.rasterizer_state.fill_mode = .fillmodeFill; self.rectPipeline = ctx.device.createGPUGraphicsPipeline(&pci); - - self.screenBuffers = ScreenBuffers.init(ctx.device); } pub fn postRender(p: *anyopaque, cmd: *gpu.GPUCommandBuffer) void { @@ -307,5 +337,9 @@ pub fn drawToTarget(self: *@This(), cmd: *gpu.GPUCommandBuffer, ctx: *papyrus.Co self.tempDrawCommand.clearRetainingCapacity(); } +pub const textRenderer = @import("textRenderer.zig"); + pub const rect_frag = @import("rect.frag"); pub const rect_vert = @import("rect.vert"); +pub const text_frag = @import("text.frag"); +pub const text_vert = @import("text.vert"); diff --git a/engine/ui/src/sgpu/textRenderer.zig b/engine/ui/src/sgpu/textRenderer.zig new file mode 100644 index 0000000..bd91f58 --- /dev/null +++ b/engine/ui/src/sgpu/textRenderer.zig @@ -0,0 +1,47 @@ +// reusing the exact same setup that i used to have in neonwood. +// + +const vec2 = text_frag.vec2; +const u8vec4 = text_frag.u8vec4; + +const TextMeshVertex = extern struct { + position: vec2, + uv: vec2, + Color: u8vec4, +}; + +pub fn addVertexAttributes(pci: *gpu.GPUGraphicsPipelineCreateInfo) !std.ArrayList(gpu.GPUVertexAttribute) { + const ctx = rend.context(); + + var list = std.ArrayList(gpu.GPUVertexAttribute).init(ctx.allocator); + + var offset: u32 = 0; + { + const Renderer = rend.renderer.Renderer; + try Renderer.addAttribute(&list, &offset, @sizeOf(f32) * 2, .vertexelementformatFloat2); + try Renderer.addAttribute(&list, &offset, @sizeOf(f32) * 2, .vertexelementformatFloat2); + try Renderer.addAttribute(&list, &offset, @sizeOf(u32), .vertexelementformatUint); + } + + pci.vertex_input_state = .{ + .num_vertex_buffers = 1, + .vertex_buffer_descriptions = &[_]gpu.GPUVertexBufferDescription{ + .{ .slot = 0, .pitch = @sizeOf(TextMeshVertex), .input_rate = .vertexinputrateVertex, .instance_step_rate = 0 }, + }, + .num_vertex_attributes = @intCast(list.items.len), + .vertex_attributes = @ptrCast(list.items.ptr), + }; + + return list; +} + +const TextBuffer = struct { + pub fn create() @This() {} +}; + +pub const text_frag = @import("text.frag"); +pub const text_vert = @import("text.vert"); +pub const rend = @import("rend"); +pub const std = @import("std"); +const sdl = @import("sdl3"); +const gpu = sdl.gpu; diff --git a/extras/bsp/src/maploader.zig b/extras/bsp/src/maploader.zig index a6685c5..1abea16 100644 --- a/extras/bsp/src/maploader.zig +++ b/extras/bsp/src/maploader.zig @@ -141,11 +141,6 @@ pub const TBMap = struct { physics.context().system.update(0.001, .{}) catch {}; - // for (self.shapes.items) |*shapeName| { - // //_ = shapeName; - // physics.removeShape(shapeName); - // } - self.shapes.deinit(self.allocator); self.root.destroy(); diff --git a/extras/gameExtras/src/fpsCharacter.zig b/extras/gameExtras/src/fpsCharacter.zig new file mode 100644 index 0000000..e69de29 diff --git a/projects/build.zig b/projects/build.zig index 4122633..2295047 100644 --- a/projects/build.zig +++ b/projects/build.zig @@ -46,5 +46,16 @@ pub fn build(b: *std.Build) void { newProjectMaker.setModuleEnabled("sys", true); _ = newProjectMaker.compileInstall(); + const toolbox = blbuild.program(.{ + .name = "toolbox", + .desc = "graphical toolbox for random stuff", + .root_source_file = b.path("tools/toolbox.zig"), + }); + + toolbox.setModuleEnabled("imgui", true); + toolbox.setModuleEnabled("audio", false); + toolbox.setModuleEnabled("sys", true); + _ = toolbox.compileInstall(); + blbuild.addDependencyInstalls(b, .ReleaseFast); //.ReleaseFast); } diff --git a/projects/content/_shaders/dxil/text.frag.dxil b/projects/content/_shaders/dxil/text.frag.dxil index a6e91a84b2596eac313bd72c3f0ae849909e02d3..8cc0ab4ecd61346e46c1deb5b73b5e000e25cb21 100644 GIT binary patch delta 3257 zcmdT_i&qm@8o!ealS!CB0tmx<0vLlJodEK%mNP>lr3e))T57eMhiJ7xQPia?r+E@% zMH>vZ_^1Z7lnUEM!LHbLHz9~fsm0b>wCF*kG`04WcKe{M$K4yjp1NoE57>LoH*>$o z{oU{W=KJorQo2*Jm1Vh#vu|#Cd+!+jNW-F2VY`+GS`Yw0dKdsa_+AX95Q-N{0(4Yx z05A&xa5QG8&G!ZR26BG_=T<0OpAnAxW)7!uTVCU6p&tV+>2^61Y-f-_gkvv8viK12 zULay`M7E+V1hWe`Nor8?04xHOA|Gtvtiad3fy1Xy?vE!**-{ZSsGtFb(8{vM3VrY* zs87QK19pZh(@o+o)gF-8PZL~uv7B4npd~R4b&Pb;L?1gC#TH{K zReR5d(|7pW@$-M;Z_cA@u)m%k3A556rt@0iKQra|C_YE4LySR+4l%7D}v$S zQe&FQaB-onfiHcuA5}yYs89#_k|VjGl^8r4GMM3L@)H=W%Sl9L*ef$~643&G^I$kw zv>xEmOIhoe2tW}aSPzi^c!31quzfDJKxZj8(sZQRFhYq?ztcVZ-r))|z}!rk4P>!= zd(F|{<7sJ0_Jb600ae##B$!Xqo?(#-Z6R{vO3Q1vY~5T=2b+Lb} zevaKBE~q@IRzrl%9pQAlFm8Ca+oHeXq%{s~?G#o)`;3)NNtQ|YLAcdT+SsUOw@QbZ z!yRrcPB;nzCiLf1p_8K|@uQkuFaDcy!VWZHgsv zAMUQ&)4%%am9WV0-96p9uD7$#@OxF_mL$(_n(hAa@wrc0e*WSo>1X||DKNCk^aIZ! z6138SW5ohfBK3w|@TOjH90)o@E7aPq=V~5{PpUb3FbG{SFtz&j;Kby|*GJn>WpL`^ zuy^T#ou~k+t z)(6RU#>s5Cj&7#?5aOu8^us4Y%(XFq5dlXvHru?F4>WHxMSO^`Lt`IvQswM7D}JFQ4`!ST6XH0Ki$7pcHI zg{U9+3`K*D;FF7rT40PPD``YTS7N{I)z5k>b8`72glM(Y2*df^sq`XTv2x5Eh1-OmgxpzNn=bx16fhl z=lEw%25yoNR+=;k(ePvLh;GE5*zwSDx~D7k44>0jB*H6=bYUbax0!_g-(lr|r3a_-th%x$=t{^Ma?O<{szYJWrlzJD?Mv5<{S zBNmdcZi*C_GljwiFf7jlMk?Rv#$6zdy#pVQZ{2IwVcOe_cw5Tlh?^Bt1!{5Gr z=0z<^;YO%9FK_%SRGc4O_#!jUru+K!hjm&sYx|L&%)F`os@pSh6gdR*0Pz?f7*&pM z3_oEn=y}6dmZPW0XX~79Hpa`QYixkRu~o6vO)*}>tX7}c%tqffL>+R^1XFF**b6RR zjUJo9(jVePc-hz?Hll${0Ju?y7zG=qcrO<7HqtYA`SaTm*&Q~za~2__!-+Y7;Lk3I z5D2rOT6!ZA&QY=gnK?I7c9f44ZJH1s@(WYL~XwN6Q%?LQMf-KRNuB>U0T6$+~Rhd1LbYdpSF2LR&}mottK?FNtf*q+Ia(W%^X4oO2b z$lPLMjK)W2^6-)xhu1+VplZnYA z0wA@npk0mlgqwrq%vRq1B?X5R*-Zx0!CiExZ&@e0s6mSA{WghW{Ri|g=pK`=pDjQ` zPn+r*VvW-y^uRd|3q3r@vFg;>rRZH+Q|+sYSDt=PITqND>ZZcwwLW4VOWCN28NVSM z)5mz#3oegKz4!9=!n^_Rhwz#2emtcr&dJ11Xl3HQa~3uy6#qVahS#Krw#60ioF)7R z%{|IxJHM#eh zIb~UecA+0IXOX$xEktQl@p#1Ga-Y`j)7ILk!I?WlcB&+-(;ab?ow*_m%OkhCBRVA! To(J3x$pdb6D8lhwSpfVSuCr9i delta 3297 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 diff --git a/projects/content/_shaders/dxil/text.vert.dxil b/projects/content/_shaders/dxil/text.vert.dxil index baacf9b72446ab7c7cad034a1b61189b2e2472f8..091037a4498fa40d52bad8a903706c3902524813 100644 GIT binary patch delta 1866 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 diff --git a/projects/content/_shaders/msl/text.frag.msl b/projects/content/_shaders/msl/text.frag.msl index 2aec7dc..6bae432 100644 --- a/projects/content/_shaders/msl/text.frag.msl +++ b/projects/content/_shaders/msl/text.frag.msl @@ -18,6 +18,8 @@ struct type_StructuredBuffer_FontInfo FontInfo _m0[1]; }; +constant float _60 = {}; + struct main0_out { float4 out_var_SV_Target0 [[color(0)]]; @@ -25,76 +27,79 @@ struct main0_out struct main0_in { - float4 in_var_TEXCOORD0 [[user(locn0)]]; + uint in_var_TEXCOORD0 [[user(locn0)]]; float2 in_var_TEXCOORD1 [[user(locn1)]]; float2 in_var_TEXCOORD2 [[user(locn2)]]; uint in_var_TEXCOORD3 [[user(locn3)]]; }; -fragment main0_out main0(main0_in in [[stage_in]], const device type_StructuredBuffer_FontInfo& fontBuffer [[buffer(4294967295)]], texture2d Texture0 [[texture(0)]], sampler Sampler0 [[sampler(0)]]) +fragment main0_out main0(main0_in in [[stage_in]], const device type_StructuredBuffer_FontInfo& fontBuffer [[buffer(0)]], texture2d Texture0 [[texture(0)]], sampler Sampler0 [[sampler(0)]]) { main0_out out = {}; - float4 _64 = Texture0.sample(Sampler0, in.in_var_TEXCOORD1); - bool _99; + float4 _68 = Texture0.sample(Sampler0, in.in_var_TEXCOORD1); + bool _103; do { - bool _81; + bool _85; if (in.in_var_TEXCOORD2.x >= fontBuffer._m0[in.in_var_TEXCOORD3].position.x) { - _81 = in.in_var_TEXCOORD2.x <= (fontBuffer._m0[in.in_var_TEXCOORD3].position.x + fontBuffer._m0[in.in_var_TEXCOORD3].size); + _85 = in.in_var_TEXCOORD2.x <= (fontBuffer._m0[in.in_var_TEXCOORD3].position.x + fontBuffer._m0[in.in_var_TEXCOORD3].size); } else { - _81 = false; + _85 = false; } - bool _88; - if (_81) + bool _92; + if (_85) { - _88 = in.in_var_TEXCOORD2.y >= fontBuffer._m0[in.in_var_TEXCOORD3].position.y; + _92 = in.in_var_TEXCOORD2.y >= fontBuffer._m0[in.in_var_TEXCOORD3].position.y; } else { - _88 = false; + _92 = false; } - bool _96; - if (_88) + bool _100; + if (_92) { - _96 = in.in_var_TEXCOORD2.y <= (fontBuffer._m0[in.in_var_TEXCOORD3].position.y + fontBuffer._m0[in.in_var_TEXCOORD3].size); + _100 = in.in_var_TEXCOORD2.y <= (fontBuffer._m0[in.in_var_TEXCOORD3].position.y + fontBuffer._m0[in.in_var_TEXCOORD3].size); } else { - _96 = false; + _100 = false; } - if (_96) + if (_100) { - _99 = true; + _103 = true; break; } - _99 = false; + _103 = false; break; } while(false); - if (!_99) + if (!_103) { discard_fragment(); } - float4 _170; + float _109 = float(in.in_var_TEXCOORD0 & 255u) * 0.0039215688593685626983642578125; + float _113 = float((in.in_var_TEXCOORD0 >> 8u) & 255u) * 0.0039215688593685626983642578125; + float _117 = float((in.in_var_TEXCOORD0 >> 16u) & 255u) * 0.0039215688593685626983642578125; + float4 _180; if (fontBuffer._m0[in.in_var_TEXCOORD3].isSdf == 1u) { - float _107 = _64.x; - float _108 = fwidth(_107); - float _109 = 0.529411792755126953125 - _108; - float _110 = 0.529411792755126953125 + _108; - float2 _116 = (dfdx(in.in_var_TEXCOORD1) + dfdy(in.in_var_TEXCOORD1)) * 0.3540000021457672119140625; - float4 _123 = float4(in.in_var_TEXCOORD1 - _116, in.in_var_TEXCOORD1 + _116); - float4 _157 = float4(in.in_var_TEXCOORD0.xyz, (fast::clamp(smoothstep(_109, _110, _107), 0.0, 1.0) + (0.5 * (((fast::clamp(smoothstep(_109, _110, Texture0.sample(Sampler0, _123.xy).x), 0.0, 1.0) + fast::clamp(smoothstep(_109, _110, Texture0.sample(Sampler0, _123.zw).x), 0.0, 1.0)) + fast::clamp(smoothstep(_109, _110, Texture0.sample(Sampler0, _123.xw).x), 0.0, 1.0)) + fast::clamp(smoothstep(_109, _110, Texture0.sample(Sampler0, _123.zy).x), 0.0, 1.0)))) * 0.3333333432674407958984375); - float3 _159 = powr(_157.xyz, float3(2.2000000476837158203125)); - _170 = float4(_159.x, _159.y, _159.z, _157.w); + float _123 = _68.x; + float _124 = fwidth(_123); + float _125 = 0.529411792755126953125 - _124; + float _126 = 0.529411792755126953125 + _124; + float2 _132 = (dfdx(in.in_var_TEXCOORD1) + dfdy(in.in_var_TEXCOORD1)) * 0.3540000021457672119140625; + float4 _139 = float4(in.in_var_TEXCOORD1 - _132, in.in_var_TEXCOORD1 + _132); + float4 _170 = float4(_109, _113, _117, (fast::clamp(smoothstep(_125, _126, _123), 0.0, 1.0) + (0.5 * (((fast::clamp(smoothstep(_125, _126, Texture0.sample(Sampler0, _139.xy).x), 0.0, 1.0) + fast::clamp(smoothstep(_125, _126, Texture0.sample(Sampler0, _139.zw).x), 0.0, 1.0)) + fast::clamp(smoothstep(_125, _126, Texture0.sample(Sampler0, _139.xw).x), 0.0, 1.0)) + fast::clamp(smoothstep(_125, _126, Texture0.sample(Sampler0, _139.zy).x), 0.0, 1.0)))) * 0.3333333432674407958984375); + float3 _172 = powr(_170.xyz, float3(2.2000000476837158203125)); + _180 = float4(_172.x, _172.y, _172.z, _170.w); } else { - _170 = float4(in.in_var_TEXCOORD0.xyz, powr(_64.x / dot(in.in_var_TEXCOORD0.xyz, float3(0.2125999927520751953125, 0.715200006961822509765625, 0.072200000286102294921875)), 0.4545454680919647216796875)); + _180 = float4(_109, _113, _117, powr(_68.x / dot(float4(_109, _113, _117, _60).xyz, float3(0.2125999927520751953125, 0.715200006961822509765625, 0.072200000286102294921875)), 0.4545454680919647216796875)); } - out.out_var_SV_Target0 = _170; + out.out_var_SV_Target0 = _180; return out; } diff --git a/projects/content/_shaders/msl/text.vert.msl b/projects/content/_shaders/msl/text.vert.msl index 090e1cc..2021ed7 100644 --- a/projects/content/_shaders/msl/text.vert.msl +++ b/projects/content/_shaders/msl/text.vert.msl @@ -25,7 +25,7 @@ struct type_Uniforms struct main0_out { - float4 out_var_TEXCOORD0 [[user(locn0)]]; + uint out_var_TEXCOORD0 [[user(locn0)]]; float2 out_var_TEXCOORD1 [[user(locn1)]]; float2 out_var_TEXCOORD2 [[user(locn2)]]; uint out_var_TEXCOORD3 [[user(locn3)]]; @@ -34,20 +34,20 @@ struct main0_out struct main0_in { - float3 in_var_TEXCOORD0 [[attribute(0)]]; - float4 in_var_TEXCOORD2 [[attribute(2)]]; - float2 in_var_TEXCOORD3 [[attribute(3)]]; + float2 in_var_TEXCOORD0 [[attribute(0)]]; + float2 in_var_TEXCOORD1 [[attribute(1)]]; + uint in_var_TEXCOORD2 [[attribute(2)]]; }; vertex main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], const device type_StructuredBuffer_FontInfo& fontBuffer [[buffer(1)]], uint gl_InstanceIndex [[instance_id]]) { main0_out out = {}; - float2 _51 = in.in_var_TEXCOORD0.xy + fontBuffer._m0[gl_InstanceIndex].position; + float2 _46 = in.in_var_TEXCOORD0 + fontBuffer._m0[gl_InstanceIndex].position; out.out_var_TEXCOORD0 = in.in_var_TEXCOORD2; - out.out_var_TEXCOORD1 = in.in_var_TEXCOORD3; - out.out_var_TEXCOORD2 = _51; + out.out_var_TEXCOORD1 = in.in_var_TEXCOORD1; + out.out_var_TEXCOORD2 = _46; out.out_var_TEXCOORD3 = gl_InstanceIndex; - out.gl_Position = float4(((_51 / Uniforms.Extents) * 2.0) + float2(-1.0), in.in_var_TEXCOORD0.z, 1.0); + out.gl_Position = float4(((_46 / Uniforms.Extents) * 2.0) + float2(-1.0), 0.0, 1.0); return out; } diff --git a/projects/content/_shaders/spv/text.frag.spv b/projects/content/_shaders/spv/text.frag.spv index ecf737d7bdf8c1eeabeedd01649b717d68e0da42..15ad3b5ad74bb7775471db384a099f36aa2710f8 100644 GIT binary patch literal 4620 zcmZXWS9eua6opT^LPQY(0g0hXGl~^K5`vL{q7f1iY#2>~QBzEA6tM*>_5vz)>=^9j z#o_S57hiOUKfrhYfWtoY`_4Tp90T5eM>jwG@8~S?&iffM|?_WmE)rp*AaA3H%&^wTx ztD2qU?bdMbE@hHg`C9&njS~aXi!++Oh`_!QGf3eeJop&-YQb;#!-?F`aB7hATMJIza>wL2 z&n$NwP@^%=Sr1(2dWSiV_2dM1Jia~ExAs(GlbP#*nwDn%vDl9Ar(mlueD^lr^;4Pa zfy21|G+=xhyG&=U2gbD3u;;;=rtoLr-`VteWB4=i8RPL;INyC+yJkA;Pr$Z@+Lv)^ z{n@~rK-4MT^XPb;6UjOJ>9+BG>hZTtKYKhr2Y>&MdsjzY@6|Q+z*y9^ucv(RQ{!=T zWIpy1)Hp8yi!*y6w)ytrB=C36Uxe+wM|?51cNq1TU^`~;YMJMG%Ygllq3@_?kEKO3 z&7Db>@0$FwjMuk!C#Q39|k9T$Hq=i;Bm@7R9Co!g&Z@m4dhW}W?L1Zvl}A5B2*5nqF?R(<=~ z4D5}*-^5yAZ?>?PJwFeaBYznyy`vT&Z*502r}a+G2lml-Vh!+ph<(>#8#mYcY6baR z*O;s3^;z6p?{Wjk=laf=Ykw}t;=gd}3$Y!4VB7DF!2UQla~}J85%BI}KWki^@tcU~ zw*fUczJi<2d~c{+B&gATlDf;IQe`pufx9v7*lWT=Nx*w zu+{4s%vXzgyO|y8HKzy2saM;2epCALd0#&2@4#LNT;o3G9;BxCcs(%ge!a{N_mjT? z$XQ?ePi{h6?i)Jf@A*dHZ~7!K$U48zn}GcN=xkoA?wi{*z)&gJ-QS7cpx9&(_J~PmeKsE4N^>2&sop0MN=GgB8 zY~M`bi2e4l+V|>1V9s0+J^l#01vvI(c^_lTo3B>aegdqgR^#(P^x#wMd=JdcYgDU$ a|2)@cz_a-#yH5R$oT`S|*kA0j0{jDOM}sl| literal 4432 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 0) { + ig.setNextWindowPos(.{ .x = 20, .y = 20 }, .{}, .{}); + + if (ig.begin("tasks", null, .{ + .always_auto_resize = true, + .no_title_bar = true, + .no_move = true, + .no_resize = true, + .no_collapse = true, + })) {} + + ig.end(); + } + + // Initialize docking layout on first run + if (!self.dockingInitialized) { + // Get the main viewport dockspace ID (created by dockSpaceOverViewport) + const main_dockspace_id = ig.getID_Str("##DockSpaceViewport_11111111"); + + // Dock our toolbox window to the center of the main dockspace + ig.dockBuilderDockWindow("Toolbox Window", main_dockspace_id); + + ig.dockBuilderFinish(main_dockspace_id); + self.dockingInitialized = true; + } + + // Create a docked window + if (ig.begin("Toolbox Window", null, .{})) { + ig.textf("This is a docked toolbox window", .{}); + + if (ig.button("Recompile Shaders", .{})) { + start_RecompileShaders() catch {}; + } + + ig.separator(); + ig.textf("Additional toolbox content can go here", .{}); + + if (self.activeCommand != null or self.commandQueue.count() > 0) { + ig.textf("outstanding tasks: {d}", .{self.commandQueue.count() + 1}); + + if (self.activeCommand) |cmd| { + ig.textf("current command: ", .{}); + + for (cmd.args) |arg| { + ig.textf("{s}", .{arg}); + ig.sameLine(0, 4); + } + } + } + } + ig.end(); +} + +fn start_RecompileShaders() !void {} + +fn tickTasks(self: *@This()) !void { + if (self.activeCommand == null) { + if (self.commandQueue.popFromLocked()) |task| { + switch (task) { + .subprocess => |t| { + self.activeCommand = t; + // core.engine_log("starting task {any}", .{t.args}); + try t.run(); + }, + .func => |f| { + f(self); + }, + } + } + } + + if (self.activeCommand) |active| { + if (active.checkComplete()) { + active.destroy(); + core.engine_logs("task complete"); + self.activeCommand = null; + } + } +} + +fn loadFileAllocFromCwd(allocator: std.mem.Allocator, dir: std.fs.Dir, path: []const u8) ![]u8 { + var file = try dir.openFile(path, .{}); + defer file.close(); + const filesize = (try file.stat()).size + 1; // add null byte + const buffer: []u8 = try allocator.alloc(u8, filesize); + errdefer allocator.free(buffer); + try file.reader().readNoEof(buffer[0 .. buffer.len - 1]); + buffer[buffer.len - 1] = 0; + return buffer; +} + +fn displayInstructions(self: *@This()) void { + self.showInstructions = true; +} + +pub fn deinit(self: *@This()) void { + self.allocator.destroy(self); +} + +fn copyRecursiveDir( + allocator: std.mem.Allocator, + src_dir: *std.fs.Dir, + dest_dir: *std.fs.Dir, +) !void { + var walker = try src_dir.walk(allocator); + defer walker.deinit(); + + while (try walker.next()) |entry| { + switch (entry.kind) { + .file => { + try entry.dir.copyFile(entry.basename, dest_dir.*, entry.path, .{}); + }, + .directory => { + try dest_dir.makeDir(entry.path); + }, + else => {}, + } + } +} + +pub fn main() anyerror!void { + var spec = try api.getSpec("New Project Dialogue"); + try spec.put("useGPA", .{ .boolean = false }); + try spec.put("configName", .{ .string = "toolbox" }); + _ = api.startEngine(&NeonObjectTable, &spec); +} + +const builtin = @import("builtin"); +const std = @import("std"); +const api = @import("backlog"); +const imgui = api.imgui; +const ig = api.imgui.api; +const core = api.core; +const sys = api.sys;