From a9b0bfa3f90e5299ca6987c21da945c4dd05b24e Mon Sep 17 00:00:00 2001 From: luboslenco Date: Tue, 13 Oct 2020 11:41:00 +0200 Subject: [PATCH] Pass mask to texture synthesis --- Assets/plugins/texsynth.js | 45 ++++++++++++++++++++++++----------- Sources/arm/App.hx | 1 + Sources/arm/History.hx | 26 ++++++++++++++++++++ Sources/arm/Plugin.hx | 1 + Sources/arm/data/LayerSlot.hx | 3 +++ 5 files changed, 62 insertions(+), 14 deletions(-) diff --git a/Assets/plugins/texsynth.js b/Assets/plugins/texsynth.js index 661eced2..81e9477a 100644 --- a/Assets/plugins/texsynth.js +++ b/Assets/plugins/texsynth.js @@ -22,22 +22,39 @@ function texsynthInpaint(tiling) { let w = arm.Config.getTextureResX(); let h = arm.Config.getTextureResY(); let l = arm.Context.layer; - if (l.texpaint_mask == null) return; - let bytes_img = l.texpaint.getPixels().b.bufferValue; - let bytes_mask = l.texpaint_mask.getPixels().b.bufferValue; - let view_img = new Uint8Array(bytes_img); - let view_mask = new Uint8Array(bytes_mask); - for (let i = 0; i < view_img.length / 4; ++i) { - view_img[i * 4 + 3] = view_mask[i]; + if (l.texpaint_mask == null) { + return; } + let bytes_img = l.texpaint.getPixels().b.bufferValue; + let bytes_mask = l.texpaint_mask.getPixels().b.bufferValue; let bytes_out = new arm.Bytes(new ArrayBuffer(w * h * 4)); - Krom.texsynthInpaint(w, h, bytes_out.b.bufferValue, bytes_img, tiling); - + Krom.texsynthInpaint(w, h, bytes_out.b.bufferValue, bytes_img, bytes_mask, tiling); let image = arm.Image.fromBytes(bytes_out, w, h); - var asset = {name: "tex_synth.png", file: "/tex_synth.png", id: arm.Project.assetId++}; - iron.Data.cachedImages.h[asset.file] = image; - arm.Project.assets.push(asset); - arm.Project.assetNames.push(asset.name); - arm.Project.assetMap.h[asset.id] = image; + + function apply(g) { + g.end(); + + arm.Context.layerIsMask = false; + arm.History.applyFilter(); + + l.deleteMask(); + l.texpaint.unload(); + + l.texpaint = arm.Image.createRenderTarget(w, h); + let g2 = l.texpaint.get_g2(); + g2.begin(false); + g2.drawImage(image, 0, 0); + g2.end(); + + let rts = iron.RenderPath.active.renderTargets; + rts.h["texpaint" + l.ext].image = l.texpaint; + arm.MakeMaterial.parseMeshMaterial(); + arm.App.redrawUI(); + arm.Context.layerPreviewDirty = true; + + g.begin(); + iron.App.removeRender(apply); + } + iron.App.notifyOnRender(apply); } diff --git a/Sources/arm/App.hx b/Sources/arm/App.hx index 5e6ee704..8e35c9cd 100644 --- a/Sources/arm/App.hx +++ b/Sources/arm/App.hx @@ -322,6 +322,7 @@ class App { UIMenubar.inst.menuHandle.redraws = 2; UIMenubar.inst.workspaceHandle.redraws = 2; UINodes.inst.hwnd.redraws = 2; + UIView2D.inst.hwnd.redraws = 2; if (Context.ddirty < 0) Context.ddirty = 0; // Redraw viewport } diff --git a/Sources/arm/History.hx b/Sources/arm/History.hx index 786ec0aa..50f84f07 100644 --- a/Sources/arm/History.hx +++ b/Sources/arm/History.hx @@ -115,6 +115,16 @@ class History { Context.layersPreviewDirty = true; Context.setLayer(Context.layer, true); } + else if (step.name == "Apply Filter") { + undoI = undoI - 1 < 0 ? Config.raw.undo_steps - 1 : undoI - 1; + var lay = undoLayers[undoI]; + Context.setLayer(Project.layers[step.layer], step.is_mask); + Context.layer.swap(lay); + Context.layer.createMask(0, false); + Context.layer.swapMask(lay); + lay.deleteMask(); + Context.layerPreviewDirty = true; + } else if (step.name == tr("To Fill Layer")) { Context.layer.toPaintLayer(); undoI = undoI - 1 < 0 ? Config.raw.undo_steps - 1 : undoI - 1; @@ -233,6 +243,16 @@ class History { } iron.App.notifyOnRender(makeApply); } + else if (step.name == tr("Apply Filter")) { + var lay = undoLayers[undoI]; + Context.setLayer(Project.layers[step.layer], false); + Context.layer.swap(lay); + lay.createMask(0, false); + Context.layer.swapMask(lay); + Context.layer.deleteMask(); + Context.layerPreviewDirty = true; + undoI = (undoI + 1) % Config.raw.undo_steps; + } else if (step.name == tr("To Fill Layer")) { var lay = undoLayers[undoI]; Context.layer.swap(lay); @@ -353,6 +373,12 @@ class History { push(tr("Apply Mask")); } + @:keep + public static function applyFilter() { + copyToUndoWithMask(); + push(tr("Apply Filter")); + } + public static function toFillLayer() { copyToUndo(Context.layer.id, undoI, false); push(tr("To Fill Layer")); diff --git a/Sources/arm/Plugin.hx b/Sources/arm/Plugin.hx index d22e8863..9f245c48 100644 --- a/Sources/arm/Plugin.hx +++ b/Sources/arm/Plugin.hx @@ -80,6 +80,7 @@ class ArmBridge { public static var NodesMaterial = arm.shader.NodesMaterial; public static var NodesBrush = arm.node.NodesBrush; public static var MaterialParser = arm.shader.MaterialParser; + public static var MakeMaterial = arm.node.MakeMaterial; public static var Brush = arm.node.Brush; public static var UISidebar = arm.ui.UISidebar; public static var UINodes = arm.ui.UINodes; diff --git a/Sources/arm/data/LayerSlot.hx b/Sources/arm/data/LayerSlot.hx index b8ef5b78..5ab64922 100644 --- a/Sources/arm/data/LayerSlot.hx +++ b/Sources/arm/data/LayerSlot.hx @@ -169,6 +169,9 @@ class LayerSlot { var _texpaint_mask = texpaint_mask; texpaint_mask = other.texpaint_mask; other.texpaint_mask = _texpaint_mask; + var _texpaint_mask_preview = texpaint_mask_preview; + texpaint_mask_preview = other.texpaint_mask_preview; + other.texpaint_mask_preview = _texpaint_mask_preview; } public function createMask(color: Int, clear = true, image: Image = null) {