diff --git a/Sources/arm/App.hx b/Sources/arm/App.hx index a8637e53..96b30871 100644 --- a/Sources/arm/App.hx +++ b/Sources/arm/App.hx @@ -22,6 +22,7 @@ import arm.sys.Path; import arm.util.RenderUtil; import arm.util.ViewportUtil; import arm.data.MaterialSlot; +import arm.data.LayerSlot; import arm.data.ConstData; import arm.plugin.Camera; import arm.Config; @@ -40,6 +41,7 @@ class App { public static var isDragging = false; public static var isResizing = false; public static var dragMaterial:MaterialSlot = null; + public static var dragLayer:LayerSlot = null; public static var dragAsset:TAsset = null; public static var dragOffX = 0.0; public static var dragOffY = 0.0; @@ -306,11 +308,11 @@ class App { var mouse = Input.getMouse(); var kb = Input.getKeyboard(); - if ((dragAsset != null || dragMaterial != null) && + if ((dragAsset != null || dragMaterial != null || dragLayer != null) && (mouse.movementX != 0 || mouse.movementY != 0)) { isDragging = true; } - if (mouse.released() && (dragAsset != null || dragMaterial != null)) { + if (mouse.released() && (dragAsset != null || dragMaterial != null || dragLayer != null)) { var mx = mouse.x; var my = mouse.y; var inViewport = UITrait.inst.paintVec.x < 1 && UITrait.inst.paintVec.x > 0 && @@ -333,7 +335,7 @@ class App { break; } } - UINodes.inst.acceptDrag(index); + UINodes.inst.acceptAssetDrag(index); } // Create mask else if (inViewport || inLayers || in2dView) { @@ -341,13 +343,26 @@ class App { } dragAsset = null; } - if (dragMaterial != null) { + else if (dragMaterial != null) { // Material dragged onto viewport or layers tab if (inViewport || inLayers || in2dView) { Layers.createFillLayer(); } dragMaterial = null; } + else if (dragLayer != null) { + if (inNodes) { + var index = 0; + for (i in 0...Project.layers.length) { + if (Project.layers[i] == dragLayer) { + index = i; + break; + } + } + UINodes.inst.acceptLayerDrag(index); + } + dragLayer = null; + } isDragging = false; } @@ -390,12 +405,12 @@ class App { var mouse = Input.getMouse(); if (isDragging) { Krom.setMouseCursor(1); // Hand - var img = dragAsset != null ? UITrait.inst.getImage(dragAsset) : dragMaterial.imageIcon; + var img = dragAsset != null ? UITrait.inst.getImage(dragAsset) : dragMaterial != null ? dragMaterial.imageIcon : dragLayer.texpaint_preview; @:privateAccess var size = 50 * UITrait.inst.ui.SCALE(); var ratio = size / img.width; var h = img.height * ratio; #if (kha_opengl || kha_webgl) - var inv = dragMaterial != null ? h : 0; + var inv = (dragMaterial != null || dragLayer != null) ? h : 0; #else var inv = 0; #end diff --git a/Sources/arm/io/ImportAsset.hx b/Sources/arm/io/ImportAsset.hx index 4d220e30..375638b5 100644 --- a/Sources/arm/io/ImportAsset.hx +++ b/Sources/arm/io/ImportAsset.hx @@ -34,7 +34,7 @@ class ImportAsset { var x0 = UINodes.inst.wx; var x1 = UINodes.inst.wx + UINodes.inst.ww; if (UINodes.inst.show && dropX > x0 && dropX < x1) { - UINodes.inst.acceptDrag(Project.assets.length - 1); + UINodes.inst.acceptAssetDrag(Project.assets.length - 1); UINodes.inst.nodes.nodesDrag = false; UINodes.inst.hwnd.redraws = 2; } diff --git a/Sources/arm/io/ImportFolder.hx b/Sources/arm/io/ImportFolder.hx index 1370194d..6b301250 100644 --- a/Sources/arm/io/ImportFolder.hx +++ b/Sources/arm/io/ImportFolder.hx @@ -128,7 +128,7 @@ class ImportFolder { } static function placeImageNode(asset:String, ny:Int, to_id:Int, to_socket:Int) { - var n = NodesMaterial.createImageTexture(); + var n = NodesMaterial.createNode("TEX_IMAGE"); n.buttons[0].default_value = App.getAssetIndex(asset); n.x = 72; n.y = ny; diff --git a/Sources/arm/node/NodesBrush.hx b/Sources/arm/node/NodesBrush.hx index 24ba261f..c6cf38fa 100644 --- a/Sources/arm/node/NodesBrush.hx +++ b/Sources/arm/node/NodesBrush.hx @@ -395,14 +395,16 @@ class NodesBrush { ] ]; - public static function createImageTexture():TNode { - for (n in list[categories.indexOf("Nodes")]) { - if (n.type == "TEX_IMAGE") { - var canvas = arm.ui.UINodes.inst.canvasBrush; - var nodes = arm.ui.UINodes.inst.nodes; - var node = arm.ui.UINodes.makeNode(n, nodes, canvas); - canvas.nodes.push(node); - return node; + public static function createNode(nodeType:String):TNode { + for (c in list) { + for (n in c) { + if (n.type == nodeType) { + var canvas = arm.ui.UINodes.inst.canvasBrush; + var nodes = arm.ui.UINodes.inst.nodes; + var node = arm.ui.UINodes.makeNode(n, nodes, canvas); + canvas.nodes.push(node); + return node; + } } } return null; diff --git a/Sources/arm/node/NodesMaterial.hx b/Sources/arm/node/NodesMaterial.hx index 138a79ea..f2a926e0 100644 --- a/Sources/arm/node/NodesMaterial.hx +++ b/Sources/arm/node/NodesMaterial.hx @@ -2035,14 +2035,16 @@ class NodesMaterial { ] ]; - public static function createImageTexture():TNode { - for (n in list[categories.indexOf("Texture")]) { - if (n.type == "TEX_IMAGE") { - var canvas = arm.ui.UINodes.inst.canvas; - var nodes = arm.ui.UINodes.inst.nodes; - var node = arm.ui.UINodes.makeNode(n, nodes, canvas); - canvas.nodes.push(node); - return node; + public static function createNode(nodeType:String):TNode { + for (c in list) { + for (n in c) { + if (n.type == nodeType) { + var canvas = arm.ui.UINodes.inst.canvas; + var nodes = arm.ui.UINodes.inst.nodes; + var node = arm.ui.UINodes.makeNode(n, nodes, canvas); + canvas.nodes.push(node); + return node; + } } } return null; diff --git a/Sources/arm/ui/TabLayers.hx b/Sources/arm/ui/TabLayers.hx index c0362d41..b7f1c48d 100644 --- a/Sources/arm/ui/TabLayers.hx +++ b/Sources/arm/ui/TabLayers.hx @@ -3,6 +3,7 @@ package arm.ui; import zui.Zui; import zui.Id; import iron.system.Time; +import iron.system.Input; import arm.data.LayerSlot; import arm.node.MaterialParser; import arm.util.UVUtil; @@ -97,6 +98,8 @@ class TabLayers { ui.imageInvertY = l.material_mask != null; #end + var uix = ui._x; + var uiy = ui._y; ui._x += 2; ui._y += 3; var state = ui.image(l.material_mask == null ? l.texpaint_preview : l.material_mask.imageIcon, 0xffffffff, (ui.ELEMENT_H() - 3) * 2); @@ -119,6 +122,10 @@ class TabLayers { if (state == State.Started) { if (Time.time() - UITrait.inst.selectTime < 0.25) UITrait.inst.show2DView(); UITrait.inst.selectTime = Time.time(); + var mouse = Input.getMouse(); + App.dragOffX = -(mouse.x - uix - ui._windowX - 3); + App.dragOffY = -(mouse.y - uiy - ui._windowY + 1); + App.dragLayer = Context.layer; } if (l.texpaint_mask != null) { diff --git a/Sources/arm/ui/UINodes.hx b/Sources/arm/ui/UINodes.hx index 9dd0f646..a2b876b1 100644 --- a/Sources/arm/ui/UINodes.hx +++ b/Sources/arm/ui/UINodes.hx @@ -475,12 +475,18 @@ class UINodes { } } - public function acceptDrag(assetIndex:Int) { - var n = canvasType == 0 ? NodesMaterial.createImageTexture() : NodesBrush.createImageTexture(); + public function acceptAssetDrag(assetIndex:Int) { + var n = canvasType == 0 ? NodesMaterial.createNode("TEX_IMAGE") : NodesBrush.createNode("TEX_IMAGE"); n.buttons[0].default_value = assetIndex; nodes.nodesSelected = [n]; } + public function acceptLayerDrag(layerIndex:Int) { + var n = NodesMaterial.createNode("LAYER"); + n.buttons[0].default_value = layerIndex; + nodes.nodesSelected = [n]; + } + public static function makeNode(n:TNode, nodes:Nodes, canvas:TNodeCanvas):TNode { var node:TNode = Json.parse(Json.stringify(n)); node.id = nodes.getNodeId(canvas.nodes);