From e4782abf9b8c4bc0370264bbcfc2c2069a43f637 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Fri, 6 Jul 2018 15:57:03 +0200 Subject: [PATCH] Begin undo --- Libraries/paint/blender.py | 1 + Sources/arm/CamBall.hx | 2 +- Sources/arm/UITrait.hx | 133 ++++++++++++++----- Sources/arm/renderpath/RenderPathDeferred.hx | 12 ++ 4 files changed, 112 insertions(+), 36 deletions(-) diff --git a/Libraries/paint/blender.py b/Libraries/paint/blender.py index 3092cf27..c0150d1c 100644 --- a/Libraries/paint/blender.py +++ b/Libraries/paint/blender.py @@ -5,6 +5,7 @@ import arm.make_renderpath def on_make_renderpath(): arm.assets.add_shader_pass('max_luminance_pass') + arm.assets.add_shader_pass('copy_mrt_pass') def register(): diff --git a/Sources/arm/CamBall.hx b/Sources/arm/CamBall.hx index 03c107ab..909069f6 100644 --- a/Sources/arm/CamBall.hx +++ b/Sources/arm/CamBall.hx @@ -31,7 +31,7 @@ class CamBall extends Trait { // Paint bounds if (mouse.x > iron.App.w()) return; - if (mouse.down("right") || (mouse.down("left") && kb.down("ctrl"))) { + if (mouse.down("right") || (mouse.down("left") && kb.down("control"))) { UITrait.inst.dirty = true; // Rotate object.transform.rotate(new Vec4(0, 0, 1), mouse.movementX / 100); diff --git a/Sources/arm/UITrait.hx b/Sources/arm/UITrait.hx index d1c21a01..51cf8a0e 100644 --- a/Sources/arm/UITrait.hx +++ b/Sources/arm/UITrait.hx @@ -44,24 +44,49 @@ class LayerSlot { public var texpaint:kha.Image; public var texpaint_nor:kha.Image; public var texpaint_pack:kha.Image; - public var texpaint_opt:kha.Image; + public var rt:iron.RenderPath.RenderTarget; - public function new() { + var ext:String; + + public function set_texpaint(img:kha.Image) { + RenderPath.active.renderTargets.get("texpaint" + ext).image = img; + texpaint = img; + } + + public function set_texpaint_nor(img:kha.Image) { + RenderPath.active.renderTargets.get("texpaint_nor" + ext).image = img; + texpaint_nor = img; + } + + public function set_texpaint_pack(img:kha.Image) { + RenderPath.active.renderTargets.get("texpaint_pack" + ext).image = img; + texpaint_pack = img; + } + + public function set_texpaint_opt(img:kha.Image) { + RenderPath.active.renderTargets.get("texpaint_opt" + ext).image = img; + texpaint_opt = img; + } + + public function new(ext = "") { id = counter++; + if (ext == "") ext = id + ""; + this.ext = ext; { var t = new RenderTargetRaw(); - t.name = "texpaint" + id; + t.name = "texpaint" + ext; t.width = 4096; t.height = 4096; t.format = 'RGBA32'; t.depth_buffer = "paintdb"; - texpaint = RenderPath.active.createRenderTarget(t).image; + rt = RenderPath.active.createRenderTarget(t); + texpaint = rt.image; } { var t = new RenderTargetRaw(); - t.name = "texpaint_nor" + id; + t.name = "texpaint_nor" + ext; t.width = 4096; t.height = 4096; t.format = 'RGBA32'; @@ -69,16 +94,15 @@ class LayerSlot { } { var t = new RenderTargetRaw(); - t.name = "texpaint_pack" + id; + t.name = "texpaint_pack" + ext; t.width = 4096; t.height = 4096; t.format = 'RGBA32'; texpaint_pack = RenderPath.active.createRenderTarget(t).image; } - { var t = new RenderTargetRaw(); - t.name = "texpaint_opt" + id; + t.name = "texpaint_opt" + ext; t.width = 4096; t.height = 4096; t.format = 'RGBA32'; @@ -130,6 +154,36 @@ class UITrait extends iron.Trait { var colorIdHandle = Id.handle(); + var outputType = 0; + var isBase = true; + var isOpac = true; + var isOcc = true; + var isRough = true; + var isMet = true; + var isNor = true; + var hwnd = Id.handle(); + var materials:Array = null; + public var selectedMaterial:MaterialSlot; + var brushes:Array = null; + public var selectedBrush:BrushSlot; + public var layers:Array = null; + public var undoLayers:Array = null; + public var selectedLayer:LayerSlot; + var selectTime = 0.0; + public var displaceStrength = 1.0; + + var first = 0; + + var _onBrush:ArrayVoid> = []; + + public var paint = false; + public var paintVec = new iron.math.Vec4(); + public var lastPaintX = 0.0; + public var lastPaintY = 0.0; + var painted = 0; + public var brushTime = 0.0; + public var pushUndo = false; + function loadBundled(names:Array, done:Void->Void) { var loaded = 0; for (s in names) { @@ -145,7 +199,6 @@ class UITrait extends iron.Trait { return dirty || first < 10; } - var first = 0; public function redraw():Bool { if (first < 10) { first++; @@ -155,18 +208,10 @@ class UITrait extends iron.Trait { return m.down() || m.down("right") || m.released() || m.released("right") || depthDirty(); } - var _onBrush:ArrayVoid> = []; - public function notifyOnBrush(f:Void->Void) { _onBrush.push(f); } - public var paint = false; - public var paintVec = new iron.math.Vec4(); - public var lastPaintX = 0.0; - public var lastPaintY = 0.0; - var painted = 0; - public var brushTime = 0.0; public function paintDirty():Bool { // Paint bounds if (paintVec.x > 1) return false; @@ -320,6 +365,10 @@ class UITrait extends iron.Trait { layers.push(new LayerSlot()); selectedLayer = layers[0]; } + if (undoLayers == null) { + undoLayers = []; + undoLayers.push(new LayerSlot("_undo")); + } 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 } ); @@ -408,7 +457,9 @@ class UITrait extends iron.Trait { if (apconfig.plugins != null) { for (plugin in apconfig.plugins) { iron.data.Data.getBlob(plugin, function(blob:kha.Blob) { + #if js untyped __js__("(1, eval)({0})", blob.toString()); + #end }); } } @@ -496,6 +547,7 @@ class UITrait extends iron.Trait { hwnd.redraws = 2; } + var isUndo = false; function updateUI() { messageTimer -= iron.system.Time.delta; @@ -508,11 +560,38 @@ class UITrait extends iron.Trait { if (!arm.App.uienabled) return; var down = iron.system.Input.getMouse().down() || iron.system.Input.getPen().down(); - if (down && !kb.down("ctrl")) { + if (down && !kb.down("control")) { + if (brushTime == 0) pushUndo = true; brushTime += iron.system.Time.delta; for (f in _onBrush) f(); } - else brushTime = 0; + else if (brushTime > 0) { + brushTime = 0; + } + + if (kb.down("control") && kb.started("z")) { + // TODO: swap layers instead of images + var tp = selectedLayer.texpaint; + var tp_nor = selectedLayer.texpaint_nor; + var tp_pack = selectedLayer.texpaint_pack; + var tp_opt = selectedLayer.texpaint_opt; + + selectedLayer.set_texpaint(undoLayers[0].texpaint); + selectedLayer.set_texpaint_nor(undoLayers[0].texpaint_nor); + selectedLayer.set_texpaint_pack(undoLayers[0].texpaint_pack); + selectedLayer.set_texpaint_opt(undoLayers[0].texpaint_opt); + + undoLayers[0].set_texpaint(tp); + undoLayers[0].set_texpaint_nor(tp_nor); + undoLayers[0].set_texpaint_pack(tp_pack); + undoLayers[0].set_texpaint_opt(tp_opt); + + // Only main layer contains the depth + iron.RenderPath.active.depthToRenderTarget.set("paintdb", isUndo ? selectedLayer.rt : undoLayers[0].rt); + isUndo = !isUndo; + + dirty = true; + } } function initLayers(g:kha.graphics4.Graphics) { @@ -723,22 +802,6 @@ class UITrait extends iron.Trait { hwnd.redraws = 2; } - var outputType = 0; - var isBase = true; - var isOpac = true; - var isOcc = true; - var isRough = true; - var isMet = true; - var isNor = true; - var hwnd = Id.handle(); - var materials:Array = null; - public var selectedMaterial:MaterialSlot; - var brushes:Array = null; - public var selectedBrush:BrushSlot; - public var layers:Array = null; - public var selectedLayer:LayerSlot; - var selectTime = 0.0; - public var displaceStrength = 1.0; function renderUI(g:kha.graphics2.Graphics) { if (!show) return; diff --git a/Sources/arm/renderpath/RenderPathDeferred.hx b/Sources/arm/renderpath/RenderPathDeferred.hx index 80cf7616..74e95447 100644 --- a/Sources/arm/renderpath/RenderPathDeferred.hx +++ b/Sources/arm/renderpath/RenderPathDeferred.hx @@ -396,6 +396,7 @@ class RenderPathDeferred { } path.loadShader("shader_datas/max_luminance_pass/max_luminance_pass"); + path.loadShader("shader_datas/copy_mrt_pass/copy_mrt_pass"); { // Material preview @@ -476,6 +477,17 @@ class RenderPathDeferred { // Paint var tid = arm.UITrait.inst.selectedLayer.id; + + if (arm.UITrait.inst.pushUndo) { + path.setTarget("texpaint_undo", ["texpaint_nor_undo", "texpaint_pack_undo", "texpaint_opt_undo"]); + path.bindTarget("texpaint" + tid, "tex0"); + path.bindTarget("texpaint_nor" + tid, "tex1"); + path.bindTarget("texpaint_pack" + tid, "tex2"); + path.bindTarget("texpaint_opt" + tid, "tex3"); + path.drawShader("shader_datas/copy_mrt_pass/copy_mrt_pass"); + arm.UITrait.inst.pushUndo = false; + } + if (arm.UITrait.inst.depthDirty()) { path.setTarget("texpaint" + tid); path.clearTarget(null, 1.0);