diff --git a/Sources/arm/Importer.hx b/Sources/arm/Importer.hx index f76ff390..2dcbed9e 100644 --- a/Sources/arm/Importer.hx +++ b/Sources/arm/Importer.hx @@ -132,7 +132,6 @@ class Importer { if (valid) importTexture(f); } // Create material - UITrait.inst.autoFillHandle.selected = false; UITrait.inst.selectedMaterial = new MaterialSlot(); UITrait.inst.materials.push(UITrait.inst.selectedMaterial); UINodes.inst.updateCanvasMap(); @@ -696,7 +695,6 @@ class Importer { if (handle != "mesh_SphereSphere" && handle != "mesh_PlanePlane") { iron.data.Data.deleteMesh(handle); } - UITrait.inst.autoFillHandle.selected = false; while (UITrait.inst.layers.length > 1) { var l = UITrait.inst.layers.pop(); l.unload(); } UITrait.inst.setLayer(UITrait.inst.layers[0]); diff --git a/Sources/arm/LayerSlot.hx b/Sources/arm/LayerSlot.hx index 8daac988..51628b3b 100644 --- a/Sources/arm/LayerSlot.hx +++ b/Sources/arm/LayerSlot.hx @@ -17,9 +17,10 @@ class LayerSlot { public var texpaint_preview:kha.Image; // Layer preview - public var texpaint_mask:kha.Image = null; + public var texpaint_mask:kha.Image = null; // Texture mask public var texpaint_mask_preview:kha.Image; - public var maskOpacity = 1.0; + public var maskOpacity = 1.0; // Opacity mask + public var material_mask:MaterialSlot = null; // Fill layer // For undo layer public var targetLayer:LayerSlot = null; @@ -206,4 +207,30 @@ class LayerSlot { deleteMask(); } + + public function duplicate() { + var layers = UITrait.inst.layers; + var i = 0; + while (i++ < layers.length) if (layers[i] == this) break; + i++; + + var l = new LayerSlot(); + layers.insert(i, l); + + if (Layers.pipe == null) Layers.makePipe(); + l.texpaint.g2.begin(false); + l.texpaint.g2.pipeline = Layers.pipeCopy; + l.texpaint.g2.drawImage(texpaint, 0, 0); + l.texpaint.g2.end(); + l.texpaint_nor.g2.begin(false); + l.texpaint_nor.g2.pipeline = Layers.pipeCopy; + l.texpaint_nor.g2.drawImage(texpaint_nor, 0, 0); + l.texpaint_nor.g2.end(); + l.texpaint_pack.g2.begin(false); + l.texpaint_pack.g2.pipeline = Layers.pipeCopy; + l.texpaint_pack.g2.drawImage(texpaint_pack, 0, 0); + l.texpaint_pack.g2.end(); + + return l; + } } diff --git a/Sources/arm/Layers.hx b/Sources/arm/Layers.hx index 47e97f15..447362bd 100644 --- a/Sources/arm/Layers.hx +++ b/Sources/arm/Layers.hx @@ -3,6 +3,7 @@ package arm; import kha.graphics4.TextureFormat; import kha.graphics4.DepthStencilFormat; import iron.RenderPath; +import arm.ui.UITrait; import arm.ui.*; class Layers { @@ -264,4 +265,55 @@ class Layers { UITrait.inst.setLayer(l0); UITrait.inst.layerPreviewDirty = true; } + + public static function isFillMaterial():Bool { + var m = UITrait.inst.selectedMaterial; + for (l in UITrait.inst.layers) if (l.material_mask == m) return true; + return false; + } + + public static function updateFillLayers(fills = 1) { + var m = UITrait.inst.selectedMaterial; + var layers = UITrait.inst.layers; + var selectedLayer = UITrait.inst.selectedLayer; + var isMask = UITrait.inst.selectedLayerIsMask; + var selectedTool = UITrait.inst.selectedTool; + var current:kha.graphics4.Graphics2 = null; + + var first = true; + for (l in layers) { + if (l.material_mask == m) { + if (first) { + current = @:privateAccess kha.graphics4.Graphics2.current; + if (current != null) current.end(); + UITrait.inst.pdirty = fills; + UITrait.inst.selectedLayerIsMask = false; + UITrait.inst.selectedTool = ToolFill; + } + + UITrait.inst.selectedLayer = l; + UITrait.inst.setObjectMask(); + + if (first) { + first = false; + UINodes.inst.parsePaintMaterial(); + } + + for (i in 0...fills) { + arm.renderpath.RenderPathDeferred.commandsPaint(); + } + } + } + + if (!first) { + UITrait.inst.pdirty = 0; + UITrait.inst.ddirty = 2; + UITrait.inst.rdirty = 2; + if (current != null) current.begin(false); + UITrait.inst.selectedLayer = selectedLayer; + UITrait.inst.selectedLayerIsMask = isMask; + UITrait.inst.setObjectMask(); + UITrait.inst.selectedTool = selectedTool; + } + } } diff --git a/Sources/arm/MaterialSlot.hx b/Sources/arm/MaterialSlot.hx index 804bb0ca..f18da2ad 100644 --- a/Sources/arm/MaterialSlot.hx +++ b/Sources/arm/MaterialSlot.hx @@ -2,7 +2,8 @@ package arm; class MaterialSlot { public var nodes = new zui.Nodes(); - public var image:kha.Image = null; + public var image:kha.Image = null; // 200 + public var imageIcon:kha.Image = null; // 50 public var data:iron.data.MaterialData; static var counter = 0; @@ -20,7 +21,12 @@ class MaterialSlot { public function new(m:iron.data.MaterialData = null) { id = ++counter; - image = kha.Image.createRenderTarget(arm.util.RenderUtil.matPreviewSize, arm.util.RenderUtil.matPreviewSize); + + var w = arm.util.RenderUtil.matPreviewSize; + var wIcon = Std.int(w / 4); + image = kha.Image.createRenderTarget(w, w); + imageIcon = kha.Image.createRenderTarget(wIcon, wIcon); + data = m; } } diff --git a/Sources/arm/Project.hx b/Sources/arm/Project.hx index eb30328c..7945642e 100644 --- a/Sources/arm/Project.hx +++ b/Sources/arm/Project.hx @@ -161,7 +161,6 @@ class Project { var current = @:privateAccess kha.graphics4.Graphics2.current; if (current != null) current.end(); - UITrait.inst.autoFillHandle.selected = false; UITrait.inst.pickerMaskHandle.position = 0; UITrait.inst.paintObject.setData(md); UITrait.inst.paintObject.transform.scale.set(1, 1, 1); diff --git a/Sources/arm/renderpath/RenderPathDeferred.hx b/Sources/arm/renderpath/RenderPathDeferred.hx index 494a0b72..14477b2f 100644 --- a/Sources/arm/renderpath/RenderPathDeferred.hx +++ b/Sources/arm/renderpath/RenderPathDeferred.hx @@ -84,6 +84,14 @@ class RenderPathDeferred { t.format = 'RGBA32'; path.createRenderTarget(t); } + { + var t = new RenderTargetRaw(); + t.name = "texpreview_icon"; + t.width = 1; + t.height = 1; + t.format = 'RGBA32'; + path.createRenderTarget(t); + } { path.createDepthBuffer("mmain", "DEPTH24"); @@ -170,13 +178,6 @@ class RenderPathDeferred { if (kha.System.windowWidth() == 0 || kha.System.windowHeight() == 0) return; - // Only enable vxao in scene mode - // var restoreGI = false; - // if (armory.data.Config.raw.rp_gi && UITrait.inst.worktab.position == 0) { // paint - // armory.data.Config.raw.rp_gi = false; - // restoreGI = true; - // } - var ssaa4 = armory.data.Config.raw.rp_supersample == 4 ? true : false; if (!UITrait.inst.dirty()) { @@ -268,135 +269,7 @@ class RenderPathDeferred { path.drawMeshes("depth"); } - if (UITrait.inst.paintDirty()) { - if (UITrait.inst.selectedTool == ToolParticle) { - path.setTarget("texparticle"); - path.clearTarget(0x00000000); - path.bindTarget("_paintdb", "paintdb"); - - var mo:iron.object.MeshObject = cast iron.Scene.active.getChild(".ParticleEmitter"); - mo.visible = true; - mo.render(path.currentG, "mesh", @:privateAccess path.bindParams); - mo.visible = false; - - mo = cast iron.Scene.active.getChild(".Particle"); - mo.visible = true; - mo.render(path.currentG, "mesh", @:privateAccess path.bindParams); - mo.visible = false; - @:privateAccess path.end(path.currentG); - } - - if (UITrait.inst.selectedTool == ToolColorId) { - path.setTarget("texpaint_colorid"); - path.clearTarget(0xff000000); - path.bindTarget("gbuffer2", "gbuffer2"); - path.drawMeshes("paint"); - UITrait.inst.headerHandle.redraws = 2; - } - else if (UITrait.inst.selectedTool == ToolPicker) { - path.setTarget("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker"]); - path.clearTarget(0xff000000); - path.bindTarget("gbuffer2", "gbuffer2"); - tid = UITrait.inst.layers[0].id; - path.bindTarget("texpaint" + tid, "texpaint"); - path.bindTarget("texpaint_nor" + tid, "texpaint_nor"); - path.bindTarget("texpaint_pack" + tid, "texpaint_pack"); - path.drawMeshes("paint"); - UITrait.inst.headerHandle.redraws = 2; - - var texpaint_picker = path.renderTargets.get("texpaint_picker").image; - var texpaint_nor_picker = path.renderTargets.get("texpaint_nor_picker").image; - var texpaint_pack_picker = path.renderTargets.get("texpaint_pack_picker").image; - var a = texpaint_picker.getPixels(); - var b = texpaint_nor_picker.getPixels(); - var c = texpaint_pack_picker.getPixels(); - // Picked surface values - UITrait.inst.baseRPicked = a.get(0) / 255; - UITrait.inst.baseGPicked = a.get(1) / 255; - UITrait.inst.baseBPicked = a.get(2) / 255; - UITrait.inst.normalRPicked = b.get(0) / 255; - UITrait.inst.normalGPicked = b.get(1) / 255; - UITrait.inst.normalBPicked = b.get(2) / 255; - UITrait.inst.occlusionPicked = c.get(0) / 255; - UITrait.inst.roughnessPicked = c.get(1) / 255; - UITrait.inst.metallicPicked = c.get(2) / 255; - // Pick material - if (UITrait.inst.pickerSelectMaterial) { - var matid = b.get(3); - for (m in UITrait.inst.materials) { - if (m.id == matid) { - UITrait.inst.setMaterial(m); - UITrait.inst.materialIdPicked = matid; - break; - } - } - } - } - else { - if (UITrait.inst.selectedTool == ToolBake) { - if (initVoxels) { - initVoxels = false; - // Init voxel texture - var rp_gi = UITrait.inst.C.rp_gi; - UITrait.inst.C.rp_gi = true; - #if rp_voxelao - Inc.initGI(); - #end - UITrait.inst.C.rp_gi = rp_gi; - } - path.clearImage("voxels", 0x00000000); - path.setTarget(""); - path.setViewport(256, 256); - path.bindTarget("voxels", "voxels"); - path.drawMeshes("voxel"); - path.generateMipmaps("voxels"); - } - - // - #if (!kha_opengl) - path.setDepthFrom("bufa", "texpaint" + tid); // Unbind depth so we can read it - path.setDepthFrom("texpaint" + tid, "texpaint_nor" + tid); - path.depthToRenderTarget.set("paintdb", path.renderTargets.get("bufa")); - #end - // - - var blendA = "texpaint_blend0"; - var blendB = "texpaint_blend1"; - path.setTarget(blendB); - path.bindTarget(blendA, "tex"); - path.drawShader("shader_datas/copy_pass/copy_pass"); - var isMask = UITrait.inst.selectedLayerIsMask; - var texpaint = isMask ? "texpaint_mask" + tid : "texpaint" + tid; - path.setTarget(texpaint, ["texpaint_nor" + tid, "texpaint_pack" + tid, blendA]); - path.bindTarget("_paintdb", "paintdb"); - path.bindTarget(blendB, "paintmask"); - if (UITrait.inst.selectedTool == ToolBake) { - path.bindTarget("voxels", "voxels"); - } - if (UITrait.inst.colorIdPicked) { - path.bindTarget("texpaint_colorid", "texpaint_colorid"); - } - - // Read texcoords from gbuffer - var readTC = (UITrait.inst.selectedTool == ToolFill && UITrait.inst.fillTypeHandle.position == 1) || // Face fill - UITrait.inst.selectedTool == ToolClone || - UITrait.inst.selectedTool == ToolBlur; - if (readTC) { - path.bindTarget("gbuffer2", "gbuffer2"); - } - - path.drawMeshes("paint"); - - // - #if (!kha_opengl) - path.setDepthFrom("texpaint" + tid, "bufa"); // Re-bind depth - path.setDepthFrom("bufa", "texpaint_nor" + tid); - var tid0 = UITrait.inst.layers[0].id; - path.depthToRenderTarget.set("paintdb", path.renderTargets.get("texpaint" + tid0)); - #end - // - } - } + commandsPaint(); // if (UITrait.inst.brushBlendDirty) { @@ -814,8 +687,143 @@ class RenderPathDeferred { UITrait.inst.ddirty--; UITrait.inst.pdirty--; UITrait.inst.rdirty--; + } - // if (restoreGI) armory.data.Config.raw.rp_gi = true; + @:access(iron.RenderPath) + public static function commandsPaint() { + + if (UITrait.inst.paintDirty()) { + + var tid = UITrait.inst.selectedLayer.id; + + if (UITrait.inst.selectedTool == ToolParticle) { + path.setTarget("texparticle"); + path.clearTarget(0x00000000); + path.bindTarget("_paintdb", "paintdb"); + + var mo:iron.object.MeshObject = cast iron.Scene.active.getChild(".ParticleEmitter"); + mo.visible = true; + mo.render(path.currentG, "mesh", @:privateAccess path.bindParams); + mo.visible = false; + + mo = cast iron.Scene.active.getChild(".Particle"); + mo.visible = true; + mo.render(path.currentG, "mesh", @:privateAccess path.bindParams); + mo.visible = false; + @:privateAccess path.end(path.currentG); + } + + if (UITrait.inst.selectedTool == ToolColorId) { + path.setTarget("texpaint_colorid"); + path.clearTarget(0xff000000); + path.bindTarget("gbuffer2", "gbuffer2"); + path.drawMeshes("paint"); + UITrait.inst.headerHandle.redraws = 2; + } + else if (UITrait.inst.selectedTool == ToolPicker) { + path.setTarget("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker"]); + path.clearTarget(0xff000000); + path.bindTarget("gbuffer2", "gbuffer2"); + tid = UITrait.inst.layers[0].id; + path.bindTarget("texpaint" + tid, "texpaint"); + path.bindTarget("texpaint_nor" + tid, "texpaint_nor"); + path.bindTarget("texpaint_pack" + tid, "texpaint_pack"); + path.drawMeshes("paint"); + UITrait.inst.headerHandle.redraws = 2; + + var texpaint_picker = path.renderTargets.get("texpaint_picker").image; + var texpaint_nor_picker = path.renderTargets.get("texpaint_nor_picker").image; + var texpaint_pack_picker = path.renderTargets.get("texpaint_pack_picker").image; + var a = texpaint_picker.getPixels(); + var b = texpaint_nor_picker.getPixels(); + var c = texpaint_pack_picker.getPixels(); + // Picked surface values + UITrait.inst.baseRPicked = a.get(0) / 255; + UITrait.inst.baseGPicked = a.get(1) / 255; + UITrait.inst.baseBPicked = a.get(2) / 255; + UITrait.inst.normalRPicked = b.get(0) / 255; + UITrait.inst.normalGPicked = b.get(1) / 255; + UITrait.inst.normalBPicked = b.get(2) / 255; + UITrait.inst.occlusionPicked = c.get(0) / 255; + UITrait.inst.roughnessPicked = c.get(1) / 255; + UITrait.inst.metallicPicked = c.get(2) / 255; + // Pick material + if (UITrait.inst.pickerSelectMaterial) { + var matid = b.get(3); + for (m in UITrait.inst.materials) { + if (m.id == matid) { + UITrait.inst.setMaterial(m); + UITrait.inst.materialIdPicked = matid; + break; + } + } + } + } + else { + if (UITrait.inst.selectedTool == ToolBake) { + if (initVoxels) { + initVoxels = false; + // Init voxel texture + var rp_gi = UITrait.inst.C.rp_gi; + UITrait.inst.C.rp_gi = true; + #if rp_voxelao + Inc.initGI(); + #end + UITrait.inst.C.rp_gi = rp_gi; + } + path.clearImage("voxels", 0x00000000); + path.setTarget(""); + path.setViewport(256, 256); + path.bindTarget("voxels", "voxels"); + path.drawMeshes("voxel"); + path.generateMipmaps("voxels"); + } + + // + #if (!kha_opengl) + path.setDepthFrom("bufa", "texpaint" + tid); // Unbind depth so we can read it + path.setDepthFrom("texpaint" + tid, "texpaint_nor" + tid); + path.depthToRenderTarget.set("paintdb", path.renderTargets.get("bufa")); + #end + // + + var blendA = "texpaint_blend0"; + var blendB = "texpaint_blend1"; + path.setTarget(blendB); + path.bindTarget(blendA, "tex"); + path.drawShader("shader_datas/copy_pass/copy_pass"); + var isMask = UITrait.inst.selectedLayerIsMask; + var texpaint = isMask ? "texpaint_mask" + tid : "texpaint" + tid; + path.setTarget(texpaint, ["texpaint_nor" + tid, "texpaint_pack" + tid, blendA]); + path.bindTarget("_paintdb", "paintdb"); + path.bindTarget(blendB, "paintmask"); + if (UITrait.inst.selectedTool == ToolBake) { + path.bindTarget("voxels", "voxels"); + } + if (UITrait.inst.colorIdPicked) { + path.bindTarget("texpaint_colorid", "texpaint_colorid"); + } + + // Read texcoords from gbuffer + var readTC = (UITrait.inst.selectedTool == ToolFill && UITrait.inst.fillTypeHandle.position == 1) || // Face fill + UITrait.inst.selectedTool == ToolClone || + UITrait.inst.selectedTool == ToolBlur; + if (readTC) { + path.bindTarget("gbuffer2", "gbuffer2"); + } + + path.drawMeshes("paint"); + + // + #if (!kha_opengl) + path.setDepthFrom("texpaint" + tid, "bufa"); // Re-bind depth + path.setDepthFrom("bufa", "texpaint_nor" + tid); + var tid0 = UITrait.inst.layers[0].id; + path.depthToRenderTarget.set("paintdb", path.renderTargets.get("texpaint" + tid0)); + #end + // + } + } } #end diff --git a/Sources/arm/renderpath/RenderPathPreview.hx b/Sources/arm/renderpath/RenderPathPreview.hx index 017593b1..a364ff72 100644 --- a/Sources/arm/renderpath/RenderPathPreview.hx +++ b/Sources/arm/renderpath/RenderPathPreview.hx @@ -50,12 +50,13 @@ class RenderPathPreview { path.drawSkydome("shader_datas/world_pass/world_pass"); var framebuffer = "texpreview"; - var selectedMat = UITrait.inst.worktab.position == 1 ? UITrait.inst.selectedMaterial2 : UITrait.inst.selectedMaterial; - iron.RenderPath.active.renderTargets.get("texpreview").image = selectedMat.image; + iron.RenderPath.active.renderTargets.get("texpreview_icon").image = selectedMat.imageIcon; + + // path.setTarget("mbuf"); + path.setTarget(framebuffer); // - path.setTarget("mbuf"); path.bindTarget("mtex", "tex"); #if rp_compositordepth { @@ -64,30 +65,34 @@ class RenderPathPreview { #end path.drawShader("shader_datas/compositor_pass/compositor_pass"); - #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA")) - { - path.setTarget("mbufa"); - path.clearTarget(0x00000000); - path.bindTarget("mbuf", "colorTex"); - path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect"); + path.setTarget("texpreview_icon"); + path.bindTarget("texpreview", "tex"); + path.drawShader("shader_datas/supersample_resolve/supersample_resolve"); - path.setTarget("mbufb"); - path.clearTarget(0x00000000); - path.bindTarget("mbufa", "edgesTex"); - path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight"); + // #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA")) + // { + // path.setTarget("mbufa"); + // path.clearTarget(0x00000000); + // path.bindTarget("mbuf", "colorTex"); + // path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect"); - path.setTarget(framebuffer); + // path.setTarget("mbufb"); + // path.clearTarget(0x00000000); + // path.bindTarget("mbufa", "edgesTex"); + // path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight"); - path.bindTarget("mbuf", "colorTex"); - path.bindTarget("mbufb", "blendTex"); - #if (rp_antialiasing == "TAA") - { - path.bindTarget("mgbuffer2", "sveloc"); - } - #end - path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend"); - } - #end + // path.setTarget(framebuffer); + + // path.bindTarget("mbuf", "colorTex"); + // path.bindTarget("mbufb", "blendTex"); + // #if (rp_antialiasing == "TAA") + // { + // path.bindTarget("mgbuffer2", "sveloc"); + // } + // #end + // path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend"); + // } + // #end } @:access(iron.RenderPath) @@ -132,14 +137,15 @@ class RenderPathPreview { path.setDepthFrom("tex", "gbuffer0"); // Re-bind depth #end - path.setTarget("tex"); // Re-binds depth - path.drawSkydome("shader_datas/world_pass/world_pass"); + // path.setTarget("tex"); // Re-binds depth + // path.drawSkydome("shader_datas/world_pass/world_pass"); var framebuffer = "texpreview"; - iron.RenderPath.active.renderTargets.get("texpreview").image = UITrait.inst.decalImage; - path.setTarget("buf"); + // path.setTarget("buf"); + path.setTarget(framebuffer); // + path.bindTarget("tex", "tex"); #if rp_compositordepth { @@ -148,29 +154,29 @@ class RenderPathPreview { #end path.drawShader("shader_datas/compositor_pass/compositor_pass"); - #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA")) - { - path.setTarget("bufa"); - path.clearTarget(0x00000000); - path.bindTarget("buf", "colorTex"); - path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect"); + // #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA")) + // { + // path.setTarget("bufa"); + // path.clearTarget(0x00000000); + // path.bindTarget("buf", "colorTex"); + // path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect"); - path.setTarget("bufb"); - path.clearTarget(0x00000000); - path.bindTarget("bufa", "edgesTex"); - path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight"); + // path.setTarget("bufb"); + // path.clearTarget(0x00000000); + // path.bindTarget("bufa", "edgesTex"); + // path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight"); - path.setTarget(framebuffer); + // path.setTarget(framebuffer); - path.bindTarget("buf", "colorTex"); - path.bindTarget("bufb", "blendTex"); - #if (rp_antialiasing == "TAA") - { - path.bindTarget("gbuffer2", "sveloc"); - } - #end - path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend"); - } - #end + // path.bindTarget("buf", "colorTex"); + // path.bindTarget("bufb", "blendTex"); + // #if (rp_antialiasing == "TAA") + // { + // path.bindTarget("gbuffer2", "sveloc"); + // } + // #end + // path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend"); + // } + // #end } } \ No newline at end of file diff --git a/Sources/arm/ui/UINodes.hx b/Sources/arm/ui/UINodes.hx index 1e2dd4eb..24c27669 100644 --- a/Sources/arm/ui/UINodes.hx +++ b/Sources/arm/ui/UINodes.hx @@ -196,17 +196,18 @@ class UINodes extends iron.Trait { if ((mreleased && mchanged) || changed) { mchanged = changed = false; if (canvasType == 0) { + if (Layers.isFillMaterial()) { + Layers.updateFillLayers(1); // TODO: jitter + UITrait.inst.hwnd.redraws = 2; + } parsePaintMaterial(); RenderUtil.makeMaterialPreview(); UITrait.inst.hwnd1.redraws = 2; var decal = UITrait.inst.selectedTool == ToolDecal || UITrait.inst.selectedTool == ToolText; if (decal) RenderUtil.makeDecalPreview(); - if (UITrait.inst.autoFillHandle.selected) { - UITrait.inst.layerPreviewDirty = true; - } } } - else if (ui.changed && (mstartedlast || mouse.moved) && UITrait.inst.instantMat) { + else if (ui.changed && (mstartedlast || mouse.moved)) { recompileMat = true; // Instant preview } mstartedlast = mouse.started(); @@ -273,13 +274,13 @@ class UINodes extends iron.Trait { function render2D(g:kha.graphics2.Graphics) { if (recompileMat) { recompileMat = false; - if (UITrait.inst.autoFillHandle.selected) { - parsePaintMaterial(); + if (Layers.isFillMaterial()) { + Layers.updateFillLayers(); } else { RenderUtil.makeMaterialPreview(); - UITrait.inst.hwnd1.redraws = 2; } + UITrait.inst.hwnd1.redraws = 2; } if (!show) return; @@ -547,21 +548,6 @@ class UINodes extends iron.Trait { m.shader.raw.contexts.push(sc.raw); m.shader.contexts.push(sc); - - // var matcon:TMaterialContext = { name: "shadowmap", bind_textures: [] }; - // var smcon = MaterialBuilder.make_depth(sd, matcon, true); - // var smcdata = smcon.data; - // // from_source is synchronous.. - // var smsc = new ShaderContext(smcdata, function(sc:ShaderContext){}); - // for (c in m.shader.contexts) if (c.raw.name == 'shadowmap') { m.shader.contexts.remove(c); break; } - // m.shader.contexts.push(smsc); - // for (i in 0...m.contexts.length) { - // if (m.contexts[i].raw.name == "shadowmap") { - // m.contexts[i] = new MaterialContext(matcon, function(self:MaterialContext) {}); - // break; - // } - // } - // }); } @@ -651,26 +637,6 @@ class UINodes extends iron.Trait { new MaterialContext(dmatcon, function(self:MaterialContext) { m.contexts.push(self); }); - - // var smcon = MaterialBuilder.make_depth(_sd, _matcon, true); - // var smcdata = smcon.data; - // from_source is synchronous.. - // var smsc = new ShaderContext(smcdata, function(sc:ShaderContext){}); - // for (c in m.shader.contexts) if (c.raw.name == 'shadowmap') { m.shader.contexts.remove(c); break; } - // m.shader.contexts.push(smsc); - // var smmatcon:TMaterialContext = { - // name: "shadowmap" - // } - // m.raw.contexts.push(smmatcon); - // for (c in m.contexts) if (c.raw.name == 'shadowmap') { m.contexts.remove(c); break; } - // new MaterialContext(smmatcon, function(self:MaterialContext) { - // m.contexts.push(self); - // }); - - if ((UITrait.inst.selectedTool == ToolFill || UITrait.inst.selectedTool == ToolBake) && UITrait.inst.autoFillHandle.selected) { - UITrait.inst.pdirty = 8; - UITrait.inst.ddirty = 8; - } // }); } diff --git a/Sources/arm/ui/UITrait.hx b/Sources/arm/ui/UITrait.hx index 47996fe2..707ecfb8 100644 --- a/Sources/arm/ui/UITrait.hx +++ b/Sources/arm/ui/UITrait.hx @@ -124,7 +124,6 @@ class UITrait extends iron.Trait { public var decalImage:kha.Image = null; public var decalPreview = false; public var viewportMode = 0; - public var instantMat = true; var hscaleWasChanged = false; public var textToolImage:kha.Image = null; @@ -186,7 +185,6 @@ class UITrait extends iron.Trait { public var mirrorX = false; public var showGrid = false; public var showCompass = true; - public var autoFillHandle = new Zui.Handle({selected: false}); public var fillTypeHandle = new Zui.Handle(); public var resHandle = new Zui.Handle({position: 1}); // 2048 public var mergedObject:MeshObject = null; // For object mask @@ -211,7 +209,6 @@ class UITrait extends iron.Trait { var brushCanLock = false; var brushCanUnlock = false; public var cameraType = 0; - // public var originalShadowBias = 0.0; public var camHandle = new Zui.Handle({position: 0}); public var fovHandle:Zui.Handle = null; public var undoHandle:Zui.Handle = null; @@ -624,7 +621,6 @@ class UITrait extends iron.Trait { public function setMaterial(m:MaterialSlot) { selectedMaterial = m; - autoFillHandle.selected = false; // Auto-disable UINodes.inst.updateCanvasMap(); UINodes.inst.parsePaintMaterial(); hwnd1.redraws = 2; @@ -662,7 +658,6 @@ class UITrait extends iron.Trait { public function setLayer(l:LayerSlot, isMask = false) { selectedLayer = l; selectedLayerIsMask = isMask; - autoFillHandle.selected = false; // Auto-disable headerHandle.redraws = 2; var current = @:privateAccess kha.graphics4.Graphics2.current; @@ -1077,7 +1072,6 @@ class UITrait extends iron.Trait { function selectTool(i:Int) { selectedTool = i; - autoFillHandle.selected = false; // Auto-disable UINodes.inst.parsePaintMaterial(); UINodes.inst.parseMeshMaterial(); headerHandle.redraws = 2; @@ -1124,7 +1118,6 @@ class UITrait extends iron.Trait { } public function selectPaintObject(o:iron.object.MeshObject) { - autoFillHandle.selected = false; // Auto-disable headerHandle.redraws = 2; for (p in paintObjects) p.skip_context = "paint"; paintObject = o; @@ -1377,12 +1370,6 @@ class UITrait extends iron.Trait { var h = Id.handle({value: bakeOffset}); bakeOffset = ui.slider(h, "Offset", 0.0, 2.0, true); if (h.changed) UINodes.inst.parsePaintMaterial(); - ui.check(autoFillHandle, "Auto-Fill"); - if (autoFillHandle.changed) { - UINodes.inst.updateCanvasMap(); - UINodes.inst.parsePaintMaterial(); - pushUndo = true; - } } else { if (selectedTool != ToolFill) { @@ -1402,14 +1389,10 @@ class UITrait extends iron.Trait { RenderUtil.makeDecalPreview(); ui.g.begin(false); } - if (autoFillHandle.selected) { - UINodes.inst.parsePaintMaterial(); - } } var brushRotHandle = Id.handle({value: brushRot}); brushRot = ui.slider(brushRotHandle, "UV Rotate", 0.0, 360.0, true, 1); - // if (brushRotHandle.changed && autoFillHandle.selected) UINodes.inst.parsePaintMaterial(); if (brushRotHandle.changed) UINodes.inst.parsePaintMaterial(); } @@ -1445,12 +1428,6 @@ class UITrait extends iron.Trait { UINodes.inst.parsePaintMaterial(); UINodes.inst.parseMeshMaterial(); } - ui.check(autoFillHandle, "Auto-Fill"); - if (autoFillHandle.changed) { - UINodes.inst.updateCanvasMap(); - UINodes.inst.parsePaintMaterial(); - pushUndo = true; - } } else { paintVisible = ui.check(Id.handle({selected: paintVisible}), "Visible Only"); @@ -1718,7 +1695,7 @@ class UITrait extends iron.Trait { // @:privateAccess ui.endElement(); // continue; // } - // var img = materials2[i].image; + // var img = materials2[i].imageIcon; // if (selectedMaterial2 == materials2[i]) { // // ui.fill(1, -2, img.width + 3, img.height + 3, ui.t.HIGHLIGHT_COL); // TODO @@ -1860,8 +1837,10 @@ class UITrait extends iron.Trait { var contextMenu = false; ui._y += 3; - var state = ui.image(l.texpaint_preview); + // var state = ui.image(l.texpaint_preview); + var state = ui.image(l.material_mask == null ? l.texpaint_preview : l.material_mask.imageIcon); ui._y -= 3; + if (ui.isHovered) { ui.tooltipImage(l.texpaint_preview); } @@ -1876,6 +1855,21 @@ class UITrait extends iron.Trait { selectTime = iron.system.Time.time(); } + // if (l.material_mask != null) { + // var img = l.material_mask.imageIcon; + // var w = img.width / 2; + // var x = ui._x - w * 1.13; + // var y = ui._y + w * 0.63; + // ui.g.color = 0xff000000; + // ui.g.fillRect(x, y, w, w); + // ui.g.color = 0xffffffff; + // #if kha_direct3d11 + // ui.g.drawScaledImage(img, x, y, w, w); + // #else + // ui.g.drawScaledImage(img, x, y + w, w, -w); + // #end + // } + if (l.texpaint_mask != null) { ui._y += 3; var state = ui.image(l.texpaint_mask_preview); @@ -1922,13 +1916,13 @@ class UITrait extends iron.Trait { ui.text(l.name, Right); } else { - ui.fill(0, 0, ui._w, ui.t.ELEMENT_H * 16, ui.t.SEPARATOR_COL); + ui.fill(0, 0, ui._w, ui.t.ELEMENT_H * 17, ui.t.SEPARATOR_COL); ui.text(l.name, Right); - if (ui.button("Delete", Left) && l != layers[0]) { + if (ui.button("Delete", Left)) { selectedLayer = l; Layers.deleteSelectedLayer(); } - if (ui.button("Move Up", Left) && l != layers[0]) { + if (ui.button("Move Up", Left)) { if (i < layers.length - 1) { setLayer(l); var t = layers[i + 1]; @@ -1937,7 +1931,7 @@ class UITrait extends iron.Trait { hwnd.redraws = 2; } } - if (ui.button("Move Down", Left) && l != layers[0]) { + if (ui.button("Move Down", Left)) { if (i > 1) { setLayer(l); var t = layers[i - 1]; @@ -1946,24 +1940,48 @@ class UITrait extends iron.Trait { hwnd.redraws = 2; } } - if (ui.button("Merge Down", Left) && l != layers[0]) { + if (ui.button("Merge Down", Left)) { setLayer(l); iron.App.notifyOnRender(Layers.mergeSelectedLayer); } - if (ui.button("Duplicate", Left) && l != layers[0]) { + if (ui.button("Duplicate", Left)) { setLayer(l); - + l = l.duplicate(); + setLayer(l); + layerPreviewDirty = true; } - if (ui.button("Black Mask", Left) && l != layers[0]) { + if (ui.button("Black Mask", Left)) { l.createMask(0x00000000); setLayer(l, true); layerPreviewDirty = true; } - if (ui.button("White Mask", Left) && l != layers[0]) { + if (ui.button("White Mask", Left)) { l.createMask(0xffffffff); setLayer(l, true); layerPreviewDirty = true; } + + if (l.material_mask == null && ui.button("To Fill Layer", Left)) { + setLayer(l); + l.material_mask = UITrait.inst.selectedMaterial; + function makeFill(g:kha.graphics4.Graphics) { + g.end(); + Layers.updateFillLayers(8); + UINodes.inst.parsePaintMaterial(); + UITrait.inst.layerPreviewDirty = true; + hwnd.redraws = 2; + g.begin(); + iron.App.removeRender(makeFill); + } + iron.App.notifyOnRender(makeFill); + } + if (l.material_mask != null && ui.button("To Paint Layer", Left)) { + setLayer(l); + l.material_mask = null; + UINodes.inst.parsePaintMaterial(); + UITrait.inst.layerPreviewDirty = true; + hwnd.redraws = 2; + } } var baseHandle = Id.handle().nest(l.id, {selected: l.paintBase}); @@ -2109,6 +2127,9 @@ class UITrait extends iron.Trait { statusHandle.redraws = 2; workspaceHandle.redraws = 2; menuHandle.redraws = 2; + hwnd.redraws = 2; + hwnd1.redraws = 2; + hwnd2.redraws = 2; }); } } @@ -2127,9 +2148,7 @@ class UITrait extends iron.Trait { ui.g.begin(false); armory.data.Config.save(); } - // ui.row([1/2, 1/2]); penPressure = ui.check(Id.handle({selected: penPressure}), "Pen Pressure"); - // instantMat = ui.check(Id.handle({selected: instantMat}), "Material Preview"); } #if arm_debug @@ -2190,7 +2209,6 @@ class UITrait extends iron.Trait { ui.row([1/4,1/4]); if (ui.button("New")) { ui.g.end(); - autoFillHandle.selected = false; // Auto-disable headerHandle.redraws = 2; selectedMaterial = new MaterialSlot(); materials.push(selectedMaterial); @@ -2222,7 +2240,8 @@ class UITrait extends iron.Trait { @:privateAccess ui.endElement(); continue; } - var img = materials[i].image; + var img = materials[i].imageIcon; + var imgFull = materials[i].image; if (selectedMaterial == materials[i]) { // ui.fill(1, -2, img.width + 3, img.height + 3, ui.t.HIGHLIGHT_COL); // TODO @@ -2242,14 +2261,15 @@ class UITrait extends iron.Trait { } if (ui.isHovered && ui.inputReleasedR) { App.showContextMenu(function(ui:Zui) { + var m = materials[i]; ui.fill(0, 0, ui._w, ui.t.ELEMENT_H * 10, ui.t.SEPARATOR_COL); ui.text(UINodes.inst.canvasMap.get(materials[i]).name, Right); + if (ui.button("Delete", Left) && materials.length > 1) { materials.splice(i, 1); hwnd1.redraws = 2; } - var m = materials[i]; var baseHandle = Id.handle().nest(m.id, {selected: m.paintBase}); m.paintBase = ui.check(baseHandle, "Base Color"); if (baseHandle.changed) { @@ -2300,7 +2320,7 @@ class UITrait extends iron.Trait { } }); } - if (ui.isHovered) ui.tooltipImage(img); + if (ui.isHovered) ui.tooltipImage(imgFull); } ui._y += 6; @@ -2664,7 +2684,7 @@ class UITrait extends iron.Trait { g.begin(false); } - function setObjectMask() { + public function setObjectMask() { var ar = ["None"]; for (p in paintObjects) ar.push(p.name); diff --git a/Sources/arm/util/RenderUtil.hx b/Sources/arm/util/RenderUtil.hx index 2631a3a0..47800c88 100644 --- a/Sources/arm/util/RenderUtil.hx +++ b/Sources/arm/util/RenderUtil.hx @@ -6,9 +6,83 @@ import arm.ui.*; class RenderUtil { - public static inline var matPreviewSize = 100; // 200 + public static inline var matPreviewSize = 200; public static inline var decalPreviewSize = 512; + public static function makeMaterialPreview() { + UITrait.inst.materialPreview = true; + + var painto = UITrait.inst.paintObject; + var visibles:Array = []; + for (p in UITrait.inst.paintObjects) { + visibles.push(p.visible); + p.visible = false; + } + + var sphere:MeshObject = cast iron.Scene.active.getChild(".Sphere"); + sphere.visible = true; + UITrait.inst.paintObject = sphere; + + // + sphere.materials[0] = UITrait.inst.worktab.position == 1 ? UITrait.inst.selectedMaterial2.data : UITrait.inst.materials[0].data; + var gizmo_vis = UITrait.inst.gizmo.visible; + // var grid_vis = UITrait.inst.grid.visible; + UITrait.inst.gizmo.visible = false; + // UITrait.inst.grid.visible = false; + // + + UITrait.inst.savedCamera.setFrom(iron.Scene.active.camera.transform.local); + var m = new Mat4(0.9146286343879498, -0.0032648027153306235, 0.404281837254303, 0.4659988049397712, 0.404295023959927, 0.007367569133732468, -0.9145989516155143, -1.0687517188018691, 0.000007410128652369705, 0.9999675337275382, 0.008058532943908717, 0.015935682577325486, 0, 0, 0, 1); + iron.Scene.active.camera.transform.setMatrix(m); + var savedFov = iron.Scene.active.camera.data.raw.fov; + iron.Scene.active.camera.data.raw.fov = 0.92; + UITrait.inst.updateCameraType(0); + var light = iron.Scene.active.lights[0]; + var savedLight = light.data.raw.strength; + light.data.raw.strength = 1500; + var probe = iron.Scene.active.world.probe; + var savedProbe = probe.raw.strength; + probe.raw.strength = 4; + iron.Scene.active.world.envmap = UITrait.inst.previewEnvmap; + // No jitter + // @:privateAccess iron.Scene.active.camera.frame = 0; + // No resize + @:privateAccess iron.RenderPath.active.lastW = matPreviewSize; + @:privateAccess iron.RenderPath.active.lastH = matPreviewSize; + iron.Scene.active.camera.buildProjection(); + iron.Scene.active.camera.buildMatrix(); + + UINodes.inst.parseMeshPreviewMaterial(); + iron.RenderPath.active.commands = arm.renderpath.RenderPathPreview.commandsPreview; + iron.RenderPath.active.renderFrame(iron.RenderPath.active.frameG); + iron.RenderPath.active.commands = arm.renderpath.RenderPathDeferred.commands; + + UITrait.inst.materialPreview = false; + @:privateAccess iron.RenderPath.active.lastW = iron.App.w(); + @:privateAccess iron.RenderPath.active.lastH = iron.App.h(); + + // Restore + sphere.visible = false; + for (i in 0...UITrait.inst.paintObjects.length) { + UITrait.inst.paintObjects[i].visible = visibles[i]; + } + UITrait.inst.paintObject = painto; + + UITrait.inst.gizmo.visible = gizmo_vis; + // UITrait.inst.grid.visible = grid_vis; + + iron.Scene.active.camera.transform.setMatrix(UITrait.inst.savedCamera); + UITrait.inst.updateCameraType(UITrait.inst.cameraType); + iron.Scene.active.camera.data.raw.fov = savedFov; + iron.Scene.active.camera.buildProjection(); + iron.Scene.active.camera.buildMatrix(); + light.data.raw.strength = savedLight; + probe.raw.strength = savedProbe; + iron.Scene.active.world.envmap = UITrait.inst.showEnvmap ? UITrait.inst.savedEnvmap : UITrait.inst.emptyEnvmap; + UINodes.inst.parseMeshMaterial(); + UITrait.inst.ddirty = 0; + } + public static function makeDecalPreview() { if (UITrait.inst.decalImage == null) { UITrait.inst.decalImage = kha.Image.createRenderTarget(arm.util.RenderUtil.decalPreviewSize, arm.util.RenderUtil.decalPreviewSize); @@ -70,87 +144,12 @@ class RenderUtil { iron.Scene.active.camera.buildMatrix(); var light = iron.Scene.active.lights[0]; light.visible = true; - // light.data.raw.cast_shadow = true; iron.Scene.active.world.envmap = UITrait.inst.showEnvmap ? UITrait.inst.savedEnvmap : UITrait.inst.emptyEnvmap; UINodes.inst.parseMeshMaterial(); UITrait.inst.ddirty = 0; } - public static function makeMaterialPreview() { - UITrait.inst.materialPreview = true; - - var painto = UITrait.inst.paintObject; - var visibles:Array = []; - for (p in UITrait.inst.paintObjects) { - visibles.push(p.visible); - p.visible = false; - } - - var sphere:MeshObject = cast iron.Scene.active.getChild(".Sphere"); - sphere.visible = true; - UITrait.inst.paintObject = sphere; - - // - sphere.materials[0] = UITrait.inst.worktab.position == 1 ? UITrait.inst.selectedMaterial2.data : UITrait.inst.materials[0].data; - var gizmo_vis = UITrait.inst.gizmo.visible; - // var grid_vis = UITrait.inst.grid.visible; - UITrait.inst.gizmo.visible = false; - // UITrait.inst.grid.visible = false; - // - - UITrait.inst.savedCamera.setFrom(iron.Scene.active.camera.transform.local); - var m = new Mat4(0.9146286343879498, -0.0032648027153306235, 0.404281837254303, 0.4659988049397712, 0.404295023959927, 0.007367569133732468, -0.9145989516155143, -1.0687517188018691, 0.000007410128652369705, 0.9999675337275382, 0.008058532943908717, 0.015935682577325486, 0, 0, 0, 1); - iron.Scene.active.camera.transform.setMatrix(m); - var savedFov = iron.Scene.active.camera.data.raw.fov; - iron.Scene.active.camera.data.raw.fov = 0.92; - UITrait.inst.updateCameraType(0); - var light = iron.Scene.active.lights[0]; - var savedLight = light.data.raw.strength; - light.data.raw.strength = 1000; - var probe = iron.Scene.active.world.probe; - var savedProbe = probe.raw.strength; - probe.raw.strength = 2; - iron.Scene.active.world.envmap = UITrait.inst.previewEnvmap; - // No jitter - // @:privateAccess iron.Scene.active.camera.frame = 0; - // No resize - @:privateAccess iron.RenderPath.active.lastW = matPreviewSize; - @:privateAccess iron.RenderPath.active.lastH = matPreviewSize; - iron.Scene.active.camera.buildProjection(); - iron.Scene.active.camera.buildMatrix(); - - UINodes.inst.parseMeshPreviewMaterial(); - iron.RenderPath.active.commands = arm.renderpath.RenderPathPreview.commandsPreview; - iron.RenderPath.active.renderFrame(iron.RenderPath.active.frameG); - iron.RenderPath.active.commands = arm.renderpath.RenderPathDeferred.commands; - - UITrait.inst.materialPreview = false; - @:privateAccess iron.RenderPath.active.lastW = iron.App.w(); - @:privateAccess iron.RenderPath.active.lastH = iron.App.h(); - - // Restore - sphere.visible = false; - for (i in 0...UITrait.inst.paintObjects.length) { - UITrait.inst.paintObjects[i].visible = visibles[i]; - } - UITrait.inst.paintObject = painto; - - UITrait.inst.gizmo.visible = gizmo_vis; - // UITrait.inst.grid.visible = grid_vis; - - iron.Scene.active.camera.transform.setMatrix(UITrait.inst.savedCamera); - UITrait.inst.updateCameraType(UITrait.inst.cameraType); - iron.Scene.active.camera.data.raw.fov = savedFov; - iron.Scene.active.camera.buildProjection(); - iron.Scene.active.camera.buildMatrix(); - light.data.raw.strength = savedLight; - probe.raw.strength = savedProbe; - iron.Scene.active.world.envmap = UITrait.inst.showEnvmap ? UITrait.inst.savedEnvmap : UITrait.inst.emptyEnvmap; - UINodes.inst.parseMeshMaterial(); - UITrait.inst.ddirty = 0; - } - public static function makeTextPreview() { var text = UITrait.inst.textToolText; var font = UITrait.inst.getTextToolFont(); diff --git a/Sources/arm/util/ViewportUtil.hx b/Sources/arm/util/ViewportUtil.hx index 8c446eae..3a8fe778 100644 --- a/Sources/arm/util/ViewportUtil.hx +++ b/Sources/arm/util/ViewportUtil.hx @@ -29,9 +29,6 @@ class ViewportUtil { if (UITrait.inst.fovHandle != null) UITrait.inst.fovHandle.value = 0.92; UITrait.inst.camHandle.position = 0; cam.data.raw.ortho = null; - // if (UITrait.inst.originalShadowBias > 0) { - // iron.Scene.active.lights[0].data.raw.shadows_bias = UITrait.inst.originalShadowBias; - // } cam.buildProjection(); UITrait.inst.selectedObject.transform.reset(); UITrait.inst.ddirty = 2;