diff --git a/Assets/creator/Scene.arm b/Assets/creator/Scene.arm index d95e1f4c..ae9ee60e 100644 Binary files a/Assets/creator/Scene.arm and b/Assets/creator/Scene.arm differ diff --git a/Assets/painter/Scene.arm b/Assets/painter/Scene.arm index 57254853..31cad56c 100644 Binary files a/Assets/painter/Scene.arm and b/Assets/painter/Scene.arm differ diff --git a/Shaders/painter/cursor.vert.glsl b/Shaders/painter/cursor.vert.glsl index 8600a98b..32a4c949 100644 --- a/Shaders/painter/cursor.vert.glsl +++ b/Shaders/painter/cursor.vert.glsl @@ -23,9 +23,9 @@ out vec2 texCoord; vec3 getPos(vec2 uv) { #ifdef HLSL float keep = textureLod(texa, vec2(0.0, 0.0), 0.0).r; // direct3d12 unit align + float keep2 = pos.x + nor.x; #endif #if defined(HLSL) || defined(METAL) - float keep2 = pos.x + nor.x; float depth = textureLod(gbufferD, vec2(uv.x, 1.0 - uv.y), 0.0).r; #else float depth = textureLod(gbufferD, uv, 0.0).r; diff --git a/Sources/arm/Layers.hx b/Sources/arm/Layers.hx index a8f45e1c..d973d4d6 100644 --- a/Sources/arm/Layers.hx +++ b/Sources/arm/Layers.hx @@ -27,6 +27,7 @@ class Layers { public static var pipeMergeB: PipelineState = null; public static var pipeMergeA: PipelineState = null; public static var pipeCopy: PipelineState; + public static var pipeCopy8: PipelineState; public static var pipeMask: PipelineState; public static var tex0: TextureUnit; public static var tex1: TextureUnit; @@ -159,6 +160,22 @@ class Layers { pipeCopy.inputLayout = [vs]; pipeCopy.compile(); + #if kha_metal + pipeCopy8 = new PipelineState(); + pipeCopy8.vertexShader = Reflect.field(kha.Shaders, "layer_view_vert"); + pipeCopy8.fragmentShader = Reflect.field(kha.Shaders, "layer_copy_frag"); + var vs = new VertexStructure(); + vs.add("pos", VertexData.Float3); + vs.add("tex", VertexData.Float2); + vs.add("col", VertexData.Float4); + pipeCopy8.inputLayout = [vs]; + pipeCopy8.colorAttachmentCount = 1; + pipeCopy8.colorAttachments[0] = TextureFormat.L8; + pipeCopy8.compile(); + #else + pipeCopy8 = pipeCopy; + #end + pipeMask = new PipelineState(); pipeMask.vertexShader = Reflect.field(kha.Shaders, "layer_merge_vert"); pipeMask.fragmentShader = Reflect.field(kha.Shaders, "mask_merge_frag"); @@ -175,9 +192,13 @@ class Layers { pipeCursor.vertexShader = Reflect.field(kha.Shaders, "cursor_vert"); pipeCursor.fragmentShader = Reflect.field(kha.Shaders, "cursor_frag"); var vs = new VertexStructure(); + #if kha_metal + vs.add("tex", VertexData.Short2Norm); + #else vs.add("pos", VertexData.Short4Norm); vs.add("nor", VertexData.Short2Norm); vs.add("tex", VertexData.Short2Norm); + #end pipeCursor.inputLayout = [vs]; pipeCursor.blendSource = BlendingFactor.SourceAlpha; pipeCursor.blendDestination = BlendingFactor.InverseSourceAlpha; diff --git a/Sources/arm/data/LayerSlot.hx b/Sources/arm/data/LayerSlot.hx index 0a81b67b..cf48d1fe 100644 --- a/Sources/arm/data/LayerSlot.hx +++ b/Sources/arm/data/LayerSlot.hx @@ -261,13 +261,13 @@ class LayerSlot { if (texpaint_mask != null) { l.createMask(0, false); l.texpaint_mask.g2.begin(false); - l.texpaint_mask.g2.pipeline = Layers.pipeCopy; + l.texpaint_mask.g2.pipeline = Layers.pipeCopy8; l.texpaint_mask.g2.drawImage(texpaint_mask, 0, 0); l.texpaint_mask.g2.pipeline = null; l.texpaint_mask.g2.end(); l.texpaint_mask_preview.g2.begin(true, 0x00000000); - l.texpaint_mask_preview.g2.pipeline = Layers.pipeCopy; + l.texpaint_mask_preview.g2.pipeline = Layers.pipeCopy8; l.texpaint_mask_preview.g2.drawScaledImage(texpaint_mask_preview, 0, 0, texpaint_mask_preview.width, texpaint_mask_preview.height); l.texpaint_mask_preview.g2.pipeline = null; l.texpaint_mask_preview.g2.end(); @@ -342,7 +342,7 @@ class LayerSlot { this.texpaint_mask = Image.createRenderTarget(res, res, TextureFormat.L8); this.texpaint_mask.g2.begin(false); - this.texpaint_mask.g2.pipeline = Layers.pipeCopy; + this.texpaint_mask.g2.pipeline = Layers.pipeCopy8; this.texpaint_mask.g2.drawScaledImage(texpaint_mask, 0, 0, res, res); this.texpaint_mask.g2.pipeline = null; this.texpaint_mask.g2.end(); diff --git a/Sources/arm/io/ImportArm.hx b/Sources/arm/io/ImportArm.hx index 4dc8651b..e6649a94 100644 --- a/Sources/arm/io/ImportArm.hx +++ b/Sources/arm/io/ImportArm.hx @@ -253,7 +253,7 @@ class ImportArm { l.createMask(0, false); texpaint_mask = Image.fromBytes(Lz4.decode(ld.texpaint_mask, ld.res * ld.res), ld.res, ld.res, TextureFormat.L8); l.texpaint_mask.g2.begin(false); - l.texpaint_mask.g2.pipeline = Layers.pipeCopy; + l.texpaint_mask.g2.pipeline = Layers.pipeCopy8; l.texpaint_mask.g2.drawImage(texpaint_mask, 0, 0); l.texpaint_mask.g2.pipeline = null; l.texpaint_mask.g2.end(); diff --git a/Sources/arm/node/MakePaint.hx b/Sources/arm/node/MakePaint.hx index a6aa7333..29bd4bac 100644 --- a/Sources/arm/node/MakePaint.hx +++ b/Sources/arm/node/MakePaint.hx @@ -19,7 +19,7 @@ class MakePaint { // cull_mode: "counter_clockwise", cull_mode: "none", vertex_elements: [{name: "pos", data: "short4norm"}, {name: "nor", data: "short2norm"}, {name: "tex", data: "short2norm"}], - color_attachments: ["RGBA32", "RGBA32", "RGBA32", "R8"] + color_attachments: [Context.layerIsMask ? "R8" : "RGBA32", "RGBA32", "RGBA32", "R8"] }); con_paint.data.color_writes_red = [true, true, true, true]; diff --git a/Sources/arm/render/RenderPathDeferred.hx b/Sources/arm/render/RenderPathDeferred.hx index 6cc1c2b6..d408928c 100644 --- a/Sources/arm/render/RenderPathDeferred.hx +++ b/Sources/arm/render/RenderPathDeferred.hx @@ -458,11 +458,19 @@ class RenderPathDeferred { if (Config.raw.rp_ssr != false) { if (@:privateAccess path.cachedShaderContexts.get("shader_datas/ssr_pass/ssr_pass") == null) { + { + var t = new RenderTargetRaw(); + t.name = "bufb"; + t.width = 0; + t.height = 0; + t.format = "RGBA64"; + path.createRenderTarget(t); + } path.loadShader("shader_datas/ssr_pass/ssr_pass"); path.loadShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x"); path.loadShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend"); } - var targeta = "buf"; + var targeta = "bufb"; var targetb = "gbuffer1"; path.setTarget(targeta); @@ -596,7 +604,11 @@ class RenderPathDeferred { public static function drawGbuffer() { path.setTarget("gbuffer0"); // Only clear gbuffer0 + #if kha_metal + path.clearTarget(0x00000000, 1.0); + #else path.clearTarget(null, 1.0); + #end path.setTarget("gbuffer2"); path.clearTarget(0xff000000); path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]); diff --git a/Sources/arm/render/RenderPathForward.hx b/Sources/arm/render/RenderPathForward.hx index e4ee51ce..1cb04b03 100644 --- a/Sources/arm/render/RenderPathForward.hx +++ b/Sources/arm/render/RenderPathForward.hx @@ -61,7 +61,11 @@ class RenderPathForward { static function drawGbuffer() { path.setTarget("gbuffer0"); + #if kha_metal + path.clearTarget(0x00000000, 1.0); + #else path.clearTarget(null, 1.0); + #end path.setTarget("gbuffer2"); path.clearTarget(0xff000000); path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]); diff --git a/Sources/arm/render/RenderPathPaint.hx b/Sources/arm/render/RenderPathPaint.hx index 12776c93..0373ea15 100644 --- a/Sources/arm/render/RenderPathPaint.hx +++ b/Sources/arm/render/RenderPathPaint.hx @@ -127,8 +127,18 @@ class RenderPathPaint { UIHeader.inst.headerHandle.redraws = 2; } else if (Context.tool == ToolPicker) { + #if kha_metal + path.setTarget("texpaint_picker"); + path.clearTarget(0xff000000); + path.setTarget("texpaint_nor_picker"); + path.clearTarget(0xff000000); + path.setTarget("texpaint_pack_picker"); + path.clearTarget(0xff000000); + path.setTarget("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker"]); + #else path.setTarget("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker"]); path.clearTarget(0xff000000); + #end path.bindTarget("gbuffer2", "gbuffer2"); tid = Context.layer.id; path.bindTarget("texpaint" + tid, "texpaint"); @@ -409,7 +419,11 @@ class RenderPathPaint { var helpMat = iron.math.Mat4.identity(); helpMat.getInverse(Scene.active.camera.VP); g.setMatrix(Layers.cursorInvVP, helpMat.self); + #if kha_metal + g.setVertexBuffer(geom.get([{name: "tex", data: "short2norm"}])); + #else g.setVertexBuffer(geom.vertexBuffer); + #end g.setIndexBuffer(geom.indexBuffers[0]); g.drawIndexedVertices(); diff --git a/Sources/arm/render/RenderPathPreview.hx b/Sources/arm/render/RenderPathPreview.hx index 48906eb6..777329c5 100644 --- a/Sources/arm/render/RenderPathPreview.hx +++ b/Sources/arm/render/RenderPathPreview.hx @@ -86,7 +86,7 @@ class RenderPathPreview { path.setTarget("mgbuffer2"); path.clearTarget(0xff000000); - #if arm_world + #if (arm_world || kha_metal) var clearColor = 0xffffffff; #else var clearColor: Null = null; @@ -144,8 +144,9 @@ class RenderPathPreview { public static function commandsDecal() { path.setTarget("gbuffer2"); path.clearTarget(0xff000000); - path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]); + path.setTarget("gbuffer0"); path.clearTarget(null, 1.0); + path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]); path.drawMeshes("mesh"); // --- diff --git a/Sources/arm/ui/UISidebar.hx b/Sources/arm/ui/UISidebar.hx index 1f20be38..db9ddd78 100644 --- a/Sources/arm/ui/UISidebar.hx +++ b/Sources/arm/ui/UISidebar.hx @@ -632,7 +632,7 @@ class UISidebar { var source = Context.layerIsMask ? l.texpaint_mask : l.texpaint; var g2 = target.g2; g2.begin(true, 0x00000000); - g2.pipeline = Layers.pipeCopy; + g2.pipeline = Context.layerIsMask ? Layers.pipeCopy8 : Layers.pipeCopy; g2.drawScaledImage(source, 0, 0, target.width, target.height); g2.pipeline = null; g2.end(); diff --git a/Sources/arm/util/RenderUtil.hx b/Sources/arm/util/RenderUtil.hx index 2b6dbbc5..368d9875 100644 --- a/Sources/arm/util/RenderUtil.hx +++ b/Sources/arm/util/RenderUtil.hx @@ -176,7 +176,11 @@ class RenderUtil { Context.textToolImage = null; } if (Context.textToolImage == null) { + #if kha_metal + Context.textToolImage = Image.createRenderTarget(texW, texW, TextureFormat.RGBA32); + #else Context.textToolImage = Image.createRenderTarget(texW, texW, TextureFormat.L8); + #end } var g2 = Context.textToolImage.g2; g2.begin(true, 0xff000000);