diff --git a/Assets/raw/1.PNG b/Assets/raw/1.PNG new file mode 100644 index 00000000..86ce5f25 Binary files /dev/null and b/Assets/raw/1.PNG differ diff --git a/Assets/raw/2.PNG b/Assets/raw/2.PNG new file mode 100644 index 00000000..f34020e6 Binary files /dev/null and b/Assets/raw/2.PNG differ diff --git a/Assets/raw/3.PNG b/Assets/raw/3.PNG new file mode 100644 index 00000000..e99b60c3 Binary files /dev/null and b/Assets/raw/3.PNG differ diff --git a/Assets/raw/4.PNG b/Assets/raw/4.PNG new file mode 100644 index 00000000..45a19ed5 Binary files /dev/null and b/Assets/raw/4.PNG differ diff --git a/Assets/raw/6.PNG b/Assets/raw/6.PNG new file mode 100644 index 00000000..cb134fa4 Binary files /dev/null and b/Assets/raw/6.PNG differ diff --git a/Assets/raw/7.PNG b/Assets/raw/7.PNG new file mode 100644 index 00000000..edfe4bbe Binary files /dev/null and b/Assets/raw/7.PNG differ diff --git a/Bundled/brush_bake.jpg b/Bundled/brush_bake.jpg deleted file mode 100644 index aed8eba4..00000000 Binary files a/Bundled/brush_bake.jpg and /dev/null differ diff --git a/Bundled/brush_bake.png b/Bundled/brush_bake.png new file mode 100644 index 00000000..9e46f6da Binary files /dev/null and b/Bundled/brush_bake.png differ diff --git a/Bundled/brush_colorid.jpg b/Bundled/brush_colorid.jpg deleted file mode 100644 index c8842251..00000000 Binary files a/Bundled/brush_colorid.jpg and /dev/null differ diff --git a/Bundled/brush_colorid.png b/Bundled/brush_colorid.png new file mode 100644 index 00000000..08f4ea05 Binary files /dev/null and b/Bundled/brush_colorid.png differ diff --git a/Bundled/brush_draw.jpg b/Bundled/brush_draw.jpg deleted file mode 100644 index b89ffce3..00000000 Binary files a/Bundled/brush_draw.jpg and /dev/null differ diff --git a/Bundled/brush_draw.png b/Bundled/brush_draw.png new file mode 100644 index 00000000..d4d86294 Binary files /dev/null and b/Bundled/brush_draw.png differ diff --git a/Bundled/brush_erase.jpg b/Bundled/brush_erase.jpg deleted file mode 100644 index f56870e7..00000000 Binary files a/Bundled/brush_erase.jpg and /dev/null differ diff --git a/Bundled/brush_erase.png b/Bundled/brush_erase.png new file mode 100644 index 00000000..1a25ff15 Binary files /dev/null and b/Bundled/brush_erase.png differ diff --git a/Bundled/brush_fill.jpg b/Bundled/brush_fill.jpg deleted file mode 100644 index 02fc1690..00000000 Binary files a/Bundled/brush_fill.jpg and /dev/null differ diff --git a/Bundled/brush_fill.png b/Bundled/brush_fill.png new file mode 100644 index 00000000..131ef05d Binary files /dev/null and b/Bundled/brush_fill.png differ diff --git a/Bundled/brush_pick.jpg b/Bundled/brush_pick.jpg deleted file mode 100644 index 3fac8012..00000000 Binary files a/Bundled/brush_pick.jpg and /dev/null differ diff --git a/Bundled/license.md b/Bundled/license.md new file mode 100644 index 00000000..4b308e96 --- /dev/null +++ b/Bundled/license.md @@ -0,0 +1,7 @@ +# The zlib/libpng License + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +This notice may not be removed or altered from any source distribution. diff --git a/Bundled/readme.txt b/Bundled/readme.txt new file mode 100644 index 00000000..258a39fb --- /dev/null +++ b/Bundled/readme.txt @@ -0,0 +1,3 @@ +ArmorPaint - 3D PBR Texture Painting +http://armorpaint.org/manual/ +https://github.com/armory3d/armorpaint diff --git a/Sources/arm/UINodes.hx b/Sources/arm/UINodes.hx index 7bf4adc4..77ba63f7 100644 --- a/Sources/arm/UINodes.hx +++ b/Sources/arm/UINodes.hx @@ -66,17 +66,17 @@ class UINodes extends iron.Trait { } public function updateCanvasMap() { - if (UITrait.inst.selected != null) { + if (UITrait.inst.selectedMaterial != null) { if (canvasMap == null) canvasMap = new Map(); - var c = canvasMap.get(UITrait.inst.selected); + var c = canvasMap.get(UITrait.inst.selectedMaterial); if (c == null) { c = haxe.Json.parse(canvasBlob); - canvasMap.set(UITrait.inst.selected, c); + canvasMap.set(UITrait.inst.selectedMaterial, c); canvas = c; } else canvas = c; - if (!isBrush) nodes = UITrait.inst.selected.nodes; + if (!isBrush) nodes = UITrait.inst.selectedMaterial.nodes; } } @@ -328,8 +328,7 @@ class UINodes extends iron.Trait { vert.write('ndc.xyz = ndc.xyz / ndc.w;'); vert.write('sp.xyz = ndc.xyz * 0.5 + 0.5;'); vert.write('sp.y = 1.0 - sp.y;'); - vert.write('sp.z -= 0.0001;'); // Bias - vert.write('sp.z -= paintDepthBias;'); // paintVisible + vert.write('sp.z -= paintDepthBias;'); // small bias or !paintVisible vert.add_out('vec3 mposition'); if (UITrait.inst.brushPaint == 0 && con_paint.is_elem('tex')) { @@ -388,7 +387,7 @@ class UINodes extends iron.Trait { frag.add_uniform('float brushOpacity', '_brushOpacity'); frag.add_uniform('float brushStrength', '_brushStrength'); - if (UITrait.inst.brushType == 0) { // Draw + if (UITrait.inst.brushType == 0 || UITrait.inst.brushType == 1) { // Draw / Erase frag.write('if (sp.z > texture(paintdb, vec2(sp.x, 1.0 - bsp.y)).r) { discard; return; }'); frag.write('vec2 binp = inp.xy * 2.0 - 1.0;'); diff --git a/Sources/arm/UITrait.hx b/Sources/arm/UITrait.hx index 172bba63..5894ac55 100644 --- a/Sources/arm/UITrait.hx +++ b/Sources/arm/UITrait.hx @@ -31,6 +31,9 @@ class BrushSlot { class LayerSlot { public function new() {} + public function unload() { + + } } @:access(zui.Zui) @@ -44,6 +47,7 @@ class UITrait extends iron.Trait { public static var inst:UITrait; public static var defaultWindowW = 280; + public static var penPressure = true; public static var drawWorld = true; public static var worldColor = 0xffffffff; @@ -104,7 +108,10 @@ class UITrait extends iron.Trait { public function paintDirty():Bool { // Paint bounds if (paintVec.x > 1) return false; - // if (UINodes.inst.show && paintVec.y > UINodes.inst.wy) return false; + + if (brushType == 4) { + colorIdPicked = true; + } // Prevent painting the same spot - save perf & reduce projection paint jittering caused by _sub offset var down = iron.system.Input.getMouse().down() || iron.system.Input.getPen().down(); @@ -145,7 +152,7 @@ class UITrait extends iron.Trait { if (link == '_brushRadius') { var r = (brushRadius * brushNodesRadius) / 15.0; var p = iron.system.Input.getPen().pressure; - if (p != 0.0) r *= p; + if (p != 0.0 && penPressure) r *= p; return r; } else if (link == '_brushOpacity') { @@ -156,12 +163,10 @@ class UITrait extends iron.Trait { } else if (link == '_brushStrength') { var f = brushStrength * brushNodesStrength; - // var p = iron.system.Input.getPen().pressure; - // if (p != 0.0) f *= p; return f * f * 100; } else if (link == '_paintDepthBias') { - return paintVisible ? 0.0 : 1.0; + return paintVisible ? 0.0001 : 1.0; } return null; @@ -172,7 +177,7 @@ class UITrait extends iron.Trait { function linkVec2(link:String):iron.math.Vec4 { if (link == '_sub') { - var seps = brushBias * 0.0001; + var seps = brushBias * 0.0004; sub = (sub + 1) % 9; if (sub == 0) vec2.set(0.0 + seps, 0.0, 0.0); else if (sub == 1) vec2.set(0.0 - seps, 0.0, 0.0); @@ -214,7 +219,7 @@ class UITrait extends iron.Trait { function linkTex(link:String):kha.Image { if (link == "_texcolorid") { - if (UITrait.inst.assets.length == 0) return null; + if (UITrait.inst.assets.length == 0) return bundled.get("mat_empty.jpg"); else return UITrait.inst.getImage(UITrait.inst.assets[colorIdHandle.position]); } return null; @@ -228,7 +233,7 @@ class UITrait extends iron.Trait { haxeTrace = haxe.Log.trace; haxe.Log.trace = consoleTrace; - windowW = Std.int(windowW * armory.data.Config.raw.window_scale); + windowW = Std.int(defaultWindowW * armory.data.Config.raw.window_scale); iron.object.Uniforms.externalFloatLinks = [linkFloat]; iron.object.Uniforms.externalVec2Links = [linkVec2]; @@ -237,7 +242,7 @@ class UITrait extends iron.Trait { var scale = armory.data.Config.raw.window_scale; ui = new Zui( { theme: arm.App.theme, font: arm.App.font, scaleFactor: scale, color_wheel: arm.App.color_wheel } ); - loadBundled(['cursor.png', 'mat.jpg', 'mat_empty.jpg', 'brush_draw.jpg', 'brush_erase.jpg', 'brush_fill.jpg', 'brush_bake.jpg', 'brush_colorid.jpg', 'cay_thumb.jpg'], done); + loadBundled(['cursor.png', 'mat.jpg', 'mat_empty.jpg', 'brush_draw.png', 'brush_erase.png', 'brush_fill.png', 'brush_bake.png', 'brush_colorid.png', 'cay_thumb.jpg'], done); } var haxeTrace:Dynamic->haxe.PosInfos->Void; @@ -329,7 +334,7 @@ class UITrait extends iron.Trait { }); } - public static var pickColorId = false; + // public static var pickColorId = false; function update() { isScrolling = ui.isScrolling; @@ -342,20 +347,20 @@ class UITrait extends iron.Trait { UINodes.inst.show = !UINodes.inst.show; arm.App.resize(); } - else if (kb.started("1")) shift ? selectBrush(0) : selectMaterial(0); - else if (kb.started("2")) shift ? selectBrush(1) : selectMaterial(1); - else if (kb.started("3")) shift ? selectBrush(2) : selectMaterial(2); - else if (kb.started("4")) shift ? selectBrush(3) : selectMaterial(3); - else if (kb.started("5")) shift ? selectBrush(4) : selectMaterial(4); + else if (kb.started("1")) shift ? setBrushType(0) : selectMaterial(0); + else if (kb.started("2")) shift ? setBrushType(1) : selectMaterial(1); + else if (kb.started("3")) shift ? setBrushType(2) : selectMaterial(2); + else if (kb.started("4")) shift ? setBrushType(3) : selectMaterial(3); + else if (kb.started("5")) shift ? setBrushType(4) : selectMaterial(4); - pickColorId = kb.down("alt"); + // pickColorId = kb.down("alt"); for (p in Plugin.plugins) if (p.update != null) p.update(); } function selectMaterial(i:Int) { if (materials.length <= i) return; - selected = materials[i]; + selectedMaterial = materials[i]; UINodes.inst.updateCanvasMap(); UINodes.inst.parsePaintMaterial(); hwnd.redraws = 2; @@ -399,7 +404,7 @@ class UITrait extends iron.Trait { g.end(); texpaint.g4.begin(); - texpaint.g4.clear(kha.Color.fromFloats(0.2, 0.2, 0.2, 0.0)); // Base + texpaint.g4.clear(kha.Color.fromFloats(0.3, 0.3, 0.3, 0.0)); // Base texpaint.g4.end(); texpaint_nor.g4.begin(); @@ -407,7 +412,7 @@ class UITrait extends iron.Trait { texpaint_nor.g4.end(); texpaint_pack.g4.begin(); - texpaint_pack.g4.clear(kha.Color.fromFloats(1.0, 1.0, 0.0, 0.0)); // Occ, rough, met + texpaint_pack.g4.clear(kha.Color.fromFloats(1.0, 0.3, 0.0, 0.0)); // Occ, rough, met texpaint_pack.g4.end(); g.begin(); @@ -498,6 +503,13 @@ class UITrait extends iron.Trait { arm.App.resize(); } + function setBrushType(i:Int) { + brushType = i; + UINodes.inst.parsePaintMaterial(); + UINodes.inst.parseMeshMaterial(); + hwnd.redraws = 2; + } + var outputType = 0; var isBase = true; var isOpac = true; @@ -507,10 +519,10 @@ class UITrait extends iron.Trait { var isNor = true; var hwnd = Id.handle(); var materials:Array = null; - public var selected:MaterialSlot; + public var selectedMaterial:MaterialSlot; var brushes:Array = null; public var selectedBrush:BrushSlot; - var layers:Array = null; + public var layers:Array = null; public var selectedLayer:LayerSlot; var selectTime = 0.0; function renderUI(g:kha.graphics2.Graphics) { @@ -519,7 +531,7 @@ class UITrait extends iron.Trait { if (materials == null) { materials = []; materials.push(new MaterialSlot()); - selected = materials[0]; + selectedMaterial = materials[0]; } if (brushes == null) { @@ -571,84 +583,90 @@ class UITrait extends iron.Trait { ui.text(message); } - if (ui.panel(Id.handle({selected: true}), "Brush")) { + ui._y += 6; - var img1 = bundled.get("brush_draw.jpg"); - var img2 = bundled.get("brush_erase.jpg"); - var img3 = bundled.get("brush_fill.jpg"); - var img4 = bundled.get("brush_bake.jpg"); - var img5 = bundled.get("brush_colorid.jpg"); - ui.row([1/5,1/5,1/5,1/5,1/5]); - if (brushType == 0) { ui.g.color = 0xff205d9c; ui.g.fillRect(ui._x + 1, ui._y - 2, img1.width + 3, img1.height + 3); ui.g.color = 0xffffffff; } - if (ui.image(img1) == State.Started) { brushType = 0; UINodes.inst.parsePaintMaterial(); UINodes.inst.parseMeshMaterial(); } - if (brushType == 1) { ui.g.color = 0xff205d9c; ui.g.fillRect(ui._x + 1, ui._y - 2, img1.width + 3, img1.height + 3); ui.g.color = 0xffffffff; } - if (ui.image(img2) == State.Started) { brushType = 1; UINodes.inst.parsePaintMaterial(); UINodes.inst.parseMeshMaterial(); } - if (brushType == 2) { ui.g.color = 0xff205d9c; ui.g.fillRect(ui._x + 1, ui._y - 2, img1.width + 3, img1.height + 3); ui.g.color = 0xffffffff; } - if (ui.image(img3) == State.Started) { brushType = 2; UINodes.inst.parsePaintMaterial(); UINodes.inst.parseMeshMaterial(); } - if (brushType == 3) { ui.g.color = 0xff205d9c; ui.g.fillRect(ui._x + 1, ui._y - 2, img1.width + 3, img1.height + 3); ui.g.color = 0xffffffff; } - if (ui.image(img4) == State.Started) { brushType = 3; UINodes.inst.parsePaintMaterial(); UINodes.inst.parseMeshMaterial(); } - if (brushType == 4) { ui.g.color = 0xff205d9c; ui.g.fillRect(ui._x + 1, ui._y - 2, img1.width + 3, img1.height + 3); ui.g.color = 0xffffffff; } - if (ui.image(img5) == State.Started) { colorIdPicked = true; brushType = 4; UINodes.inst.parsePaintMaterial(); UINodes.inst.parseMeshMaterial(); } + var img1 = bundled.get("brush_draw.png"); + var img2 = bundled.get("brush_erase.png"); + var img3 = bundled.get("brush_fill.png"); + var img4 = bundled.get("brush_bake.png"); + var img5 = bundled.get("brush_colorid.png"); + ui.row([1/5,1/5,1/5,1/5,1/5]); + var tool = ""; + if (brushType == 0) { tool = "Draw"; ui.fill(1, -2, img1.width + 3, img1.height + 3, 0xff205d9c); } + if (ui.image(img1) == State.Started) setBrushType(0); + if (brushType == 1) { tool = "Erase"; ui.fill(1, -2, img1.width + 3, img1.height + 3, 0xff205d9c); } + if (ui.image(img2) == State.Started) setBrushType(1); + if (brushType == 2) { tool = "Fill"; ui.fill(1, -2, img1.width + 3, img1.height + 3, 0xff205d9c); } + if (ui.image(img3) == State.Started) setBrushType(2); + if (brushType == 3) { tool = "Bake"; ui.fill(1, -2, img1.width + 3, img1.height + 3, 0xff205d9c); } + if (ui.image(img4) == State.Started) setBrushType(3); + if (brushType == 4) { tool = "Color ID"; ui.fill(1, -2, img1.width + 3, img1.height + 3, 0xff205d9c); } + if (ui.image(img5) == State.Started) setBrushType(4); - // UINodes.inst.updateCanvasBrushMap(); - // UINodes.inst.parseBrush(); + ui._y += 6; - // ui.row([1/2,1/2]); - // if (ui.button("New")) { - // brushes.push(new BrushSlot()); - // } - - - ui.row([1/2, 1/2]); - // var typeHandle = Id.handle(); - // brushType = ui.combo(typeHandle, ["Draw", "Fill", "Bake AO", "Pick Color ID"], "Type"); - // if (typeHandle.changed) { - // UINodes.inst.parsePaintMaterial(); - // UINodes.inst.parseMeshMaterial(); // Pickcolorid - // if (brushType == 3) colorIdPicked = true; - // } - - ui.combo(Id.handle(), ["Add"], "Blending"); - if (ui.button("Nodes")) showBrushNodes(); - ui.row([1/2, 1/2]); - var paintHandle = Id.handle(); - brushPaint = ui.combo(paintHandle, ["UV", "Project"], "Paint"); - if (paintHandle.changed) { - UINodes.inst.parsePaintMaterial(); + if (ui.panel(Id.handle({selected: true}), tool)) { + // Color ID + if (brushType == 4) { + // Picked color + ui.row([1/2, 1/2]); + ui.text("Picked Color"); + if (ui.button("Clear")) colorIdPicked = false; + if (colorIdPicked) { + ui.image(iron.RenderPath.active.renderTargets.get("texpaint_colorid0").image, 0xffffffff, 64); + } + // Set color map + ui.text("Color ID Map"); + var cid = ui.combo(colorIdHandle, App.getEnumTexts(), "Color ID"); + if (UITrait.inst.assets.length > 0) ui.image(UITrait.inst.getImage(UITrait.inst.assets[cid])); } - brushBias = ui.slider(Id.handle({value: brushBias}), "Bias", 0.0, 4.0, true); - ui.row([1/2, 1/2]); - brushRadius = ui.slider(Id.handle({value: brushRadius}), "Radius", 0.0, 2.0, true); - brushOpacity = ui.slider(Id.handle({value: brushOpacity}), "Opacity", 0.0, 1.0, true); - ui.row([1/2, 1/2]); - brushScale = ui.slider(Id.handle({value: brushScale}), "UV Scale", 0.0, 2.0, true); - brushStrength = ui.slider(Id.handle({value: brushStrength}), "Strength", 0.0, 1.0, true); - - ui.row([1/3,1/3,1/3]); - - var baseHandle = Id.handle({selected: paintBase}); - paintBase = ui.check(baseHandle, "Base Color"); - if (baseHandle.changed) { - UINodes.inst.updateCanvasMap(); - UINodes.inst.parsePaintMaterial(); + else if (brushType == 3) { // Bake AO + ui.radio(Id.handle(), 0, "Ambient Occlusion"); } + else { + ui.row([1/2, 1/2]); + ui.combo(Id.handle(), ["Add"], "Blending"); + if (ui.button("Nodes")) showBrushNodes(); + ui.row([1/2, 1/2]); + var paintHandle = Id.handle(); + brushPaint = ui.combo(paintHandle, ["UV", "Project"], "Paint"); + if (paintHandle.changed) { + UINodes.inst.parsePaintMaterial(); + } + brushBias = ui.slider(Id.handle({value: brushBias}), "Bias", 0.0, 1.0, true); + ui.row([1/2, 1/2]); + brushRadius = ui.slider(Id.handle({value: brushRadius}), "Radius", 0.0, 2.0, true); + brushOpacity = ui.slider(Id.handle({value: brushOpacity}), "Opacity", 0.0, 1.0, true); + ui.row([1/2, 1/2]); + brushScale = ui.slider(Id.handle({value: brushScale}), "UV Scale", 0.0, 2.0, true); + brushStrength = ui.slider(Id.handle({value: brushStrength}), "Strength", 0.0, 1.0, true); - var norHandle = Id.handle({selected: paintNor}); - paintNor = ui.check(norHandle, "Normal Map"); - if (norHandle.changed) { - UINodes.inst.updateCanvasMap(); - UINodes.inst.parsePaintMaterial(); + ui.row([1/3,1/3,1/3]); + + var baseHandle = Id.handle({selected: paintBase}); + paintBase = ui.check(baseHandle, "Base Color"); + if (baseHandle.changed) { + UINodes.inst.updateCanvasMap(); + UINodes.inst.parsePaintMaterial(); + } + + var norHandle = Id.handle({selected: paintNor}); + paintNor = ui.check(norHandle, "Normal Map"); + if (norHandle.changed) { + UINodes.inst.updateCanvasMap(); + UINodes.inst.parsePaintMaterial(); + } + + var roughHandle = Id.handle({selected: paintRough}); + // TODO: Use glColorMaski() to disable specific channel + paintRough = ui.check(roughHandle, "ORM"); + if (roughHandle.changed) { + UINodes.inst.updateCanvasMap(); + UINodes.inst.parsePaintMaterial(); + } + + paintVisible = ui.check(Id.handle({selected: paintVisible}), "Visible Only"); } - - var roughHandle = Id.handle({selected: paintRough}); - // TODO: Use glColorMaski() to disable specific channel - paintRough = ui.check(roughHandle, "ORM"); - if (roughHandle.changed) { - UINodes.inst.updateCanvasMap(); - UINodes.inst.parsePaintMaterial(); - } - - paintVisible = ui.check(Id.handle({selected: paintVisible}), "Visible Only"); } if (ui.panel(Id.handle({selected: true}), "Material")) { @@ -660,15 +678,13 @@ class UITrait extends iron.Trait { var im = img; if (materials.length <= i) im = img2; - if (im == img && selected == materials[i]) { - ui.g.color = 0xff205d9c; - ui.g.fillRect(ui._x + 1, ui._y - 2, im.width + 3, im.height + 3); - ui.g.color = 0xffffffff; + if (im == img && selectedMaterial == materials[i]) { + ui.fill(1, -2, im.width + 3, im.height + 3, 0xff205d9c); } if (ui.image(im) == State.Started && im == img) { - if (selected != materials[i]) { - selected = materials[i]; + if (selectedMaterial != materials[i]) { + selectedMaterial = materials[i]; UINodes.inst.updateCanvasMap(); UINodes.inst.parsePaintMaterial(); } @@ -681,7 +697,8 @@ class UITrait extends iron.Trait { ui.row([1/2,1/2]); if (ui.button("New")) { - materials.push(new MaterialSlot()); + selectedMaterial = new MaterialSlot(); + materials.push(selectedMaterial); } if (ui.button("Nodes")) { showMaterialNodes(); @@ -692,9 +709,7 @@ class UITrait extends iron.Trait { function drawList(h:zui.Zui.Handle, l:LayerSlot, i:Int) { if (selectedLayer == l) { - ui.g.color = 0xff205d9c; - ui.g.fillRect(0, ui._y, ui._windowW, ui.t.ELEMENT_H); - ui.g.color = 0xffffffff; + ui.fill(0, 0, ui._windowW, ui.t.ELEMENT_H, 0xff205d9c); } ui.text("Layer " + (i + 1)); if (ui.isReleased) { @@ -707,9 +722,19 @@ class UITrait extends iron.Trait { drawList(Id.handle(), l, j); } - ui.row([1/2, 1/2]); + ui.row([1/3, 1/3, 1/3]); if (ui.button("New")) { - if (layers.length < 3) layers.push(new LayerSlot()); + if (layers.length < 2) { + selectedLayer = new LayerSlot(); + layers.push(selectedLayer); + } + } + if (ui.button("Delete")) { + if (layers.length > 1) { + selectedLayer.unload(); + layers.remove(selectedLayer); + selectedLayer = layers[0]; + } } if (ui.button("Merge")) { } @@ -755,14 +780,6 @@ class UITrait extends iron.Trait { } } - if (ui.panel(Id.handle({selected: false}), "Color ID")) { - // Picked color - ui.image(iron.RenderPath.active.renderTargets.get("texpaint_colorid0").image, 0xffffffff, 64); - // Set color map - var cid = ui.combo(colorIdHandle, App.getEnumTexts(), "Color ID"); - if (UITrait.inst.assets.length > 0) ui.image(UITrait.inst.getImage(UITrait.inst.assets[cid])); - } - // Draw plugins for (p in Plugin.plugins) if (p.drawUI != null) p.drawUI(ui); } @@ -942,11 +959,13 @@ class UITrait extends iron.Trait { if (ui.tab(htab, "Preferences")) { var hscale = Id.handle({value: armory.data.Config.raw.window_scale}); ui.slider(hscale, "UI Scale", 0.5, 4.0, true); - if (ui.changed) { + if (ui.changed && !iron.system.Input.getMouse().down()) { armory.data.Config.raw.window_scale = hscale.value; ui.setScale(hscale.value); + windowW = Std.int(defaultWindowW * armory.data.Config.raw.window_scale); + arm.App.resize(); } - ui.check(Id.handle({selected: true}), "Pen Pressure"); + penPressure = ui.check(Id.handle({selected: penPressure}), "Pen Pressure"); drawWorld = ui.check(Id.handle({selected: drawWorld}), "Envmap"); if (ui.changed) { dirty = true; @@ -955,6 +974,7 @@ class UITrait extends iron.Trait { var hwheel = Id.handle(); worldColor = Ext.colorWheel(ui, hwheel); } + armory.data.Config.raw.window_vsync = ui.check(Id.handle({selected: armory.data.Config.raw.window_vsync}), "VSync"); if (ui.button("Save")) { #if kha_krom Krom.fileSaveBytes("config.arm", haxe.io.Bytes.ofString(haxe.Json.stringify(armory.data.Config.raw)).getData()); diff --git a/armorpaint.blend b/armorpaint.blend index e08b9c2f..b16e9ef6 100644 Binary files a/armorpaint.blend and b/armorpaint.blend differ