diff --git a/Sources/arm/Layers.hx b/Sources/arm/Layers.hx index 172e7bfb..0d9f0235 100644 --- a/Sources/arm/Layers.hx +++ b/Sources/arm/Layers.hx @@ -317,7 +317,6 @@ class Layers { } public static function updateFillLayers(fills = 1) { - var m = Context.material; var layers = Project.layers; var selectedLayer = Context.layer; var isMask = Context.layerIsMask; @@ -326,7 +325,7 @@ class Layers { var first = true; for (l in layers) { - if (l.material_mask == m) { + if (l.material_mask != null) { if (first) { current = @:privateAccess kha.graphics4.Graphics2.current; if (current != null) current.end(); diff --git a/Sources/arm/Project.hx b/Sources/arm/Project.hx index ba25ede5..66590ed8 100644 --- a/Sources/arm/Project.hx +++ b/Sources/arm/Project.hx @@ -239,6 +239,7 @@ typedef TLayerData = { public var texpaint_nor:haxe.io.Bytes; public var texpaint_pack:haxe.io.Bytes; public var texpaint_mask:haxe.io.Bytes; + public var uv_scale:Float; public var opacity_mask:Float; public var material_mask:Int; public var object_mask:Int; diff --git a/Sources/arm/data/LayerSlot.hx b/Sources/arm/data/LayerSlot.hx index 27b435cd..2f13c185 100644 --- a/Sources/arm/data/LayerSlot.hx +++ b/Sources/arm/data/LayerSlot.hx @@ -28,6 +28,7 @@ class LayerSlot { public var blending = 0; public var objectMask = 0; + public var uvScale = 1.0; public var paintBase = true; public var paintOpac = true; public var paintOcc = true; diff --git a/Sources/arm/io/ExportArm.hx b/Sources/arm/io/ExportArm.hx index da257245..a63b32c5 100644 --- a/Sources/arm/io/ExportArm.hx +++ b/Sources/arm/io/ExportArm.hx @@ -77,6 +77,7 @@ class ExportArm { texpaint_nor: Lz4.encode(l.texpaint_nor.getPixels()), texpaint_pack: Lz4.encode(l.texpaint_pack.getPixels()), texpaint_mask: l.texpaint_mask != null ? Lz4.encode(l.texpaint_mask.getPixels()) : null, + uv_scale: l.uvScale, opacity_mask: l.maskOpacity, material_mask: l.material_mask != null ? Project.materials.indexOf(l.material_mask) : -1, object_mask: l.objectMask, diff --git a/Sources/arm/io/ImportArm.hx b/Sources/arm/io/ImportArm.hx index f6e71744..4750497c 100644 --- a/Sources/arm/io/ImportArm.hx +++ b/Sources/arm/io/ImportArm.hx @@ -217,6 +217,8 @@ class ImportArm { // texpaint_mask.unload(); } + l.uvScale = ld.uv_scale; + if (l.uvScale == null) l.uvScale = 1.0; // TODO: deprecated l.maskOpacity = ld.opacity_mask; l.material_mask = ld.material_mask > -1 ? Project.materials[ld.material_mask] : null; l.objectMask = ld.object_mask; diff --git a/Sources/arm/render/Uniforms.hx b/Sources/arm/render/Uniforms.hx index f9058e8d..931bd99e 100644 --- a/Sources/arm/render/Uniforms.hx +++ b/Sources/arm/render/Uniforms.hx @@ -49,7 +49,9 @@ class Uniforms { return val; } else if (link == '_brushScale') { - var val = UITrait.inst.brushScale * UITrait.inst.brushNodesScale; + var nodesScale = UITrait.inst.brushNodesScale; + var fill = Context.layer.material_mask != null; + var val = (fill ? Context.layer.uvScale : UITrait.inst.brushScale) * nodesScale; return val; } else if (link == '_texpaintSize') { diff --git a/Sources/arm/ui/TabLayers.hx b/Sources/arm/ui/TabLayers.hx index 940a1656..7d2def86 100644 --- a/Sources/arm/ui/TabLayers.hx +++ b/Sources/arm/ui/TabLayers.hx @@ -325,8 +325,18 @@ class TabLayers { ui._y -= ui.t.ELEMENT_OFFSET; if (showPanel) { - ui.row([8/100,92/100]); + l.material_mask != null ? + ui.row([8/100, 46/100, 46/100]) : + ui.row([8/100, 92/100]); @:privateAccess ui.endElement(); + + if (l.material_mask != null) { + var uvHandle = Id.handle().nest(l.id, {value: l.uvScale}); + l.uvScale = ui.slider(uvHandle, "UV Scale", 0.0, 5.0, true); + if (uvHandle.changed) { + Layers.updateFillLayers(); + } + } var opacHandle = Id.handle().nest(l.id, {value: l.maskOpacity}); l.maskOpacity = ui.slider(opacHandle, "Opacity", 0.0, 1.0, true); if (opacHandle.changed) { diff --git a/Sources/arm/ui/TabMaterials.hx b/Sources/arm/ui/TabMaterials.hx index 65704eba..90065f93 100644 --- a/Sources/arm/ui/TabMaterials.hx +++ b/Sources/arm/ui/TabMaterials.hx @@ -119,7 +119,7 @@ class TabMaterials { if (ui.isHovered && ui.inputReleasedR) { UIMenu.draw(function(ui:Zui) { var m = materials[i]; - ui.fill(0, 0, ui._w / ui.SCALE, ui.t.ELEMENT_H * 11, ui.t.SEPARATOR_COL); + ui.fill(0, 0, ui._w / ui.SCALE, ui.t.ELEMENT_H * 12, ui.t.SEPARATOR_COL); ui.text(UINodes.inst.canvasMap.get(materials[i]).name, Right); if (ui.button("To Fill Layer", Left)) { diff --git a/Sources/arm/ui/UITrait.hx b/Sources/arm/ui/UITrait.hx index 23e610ef..f6f43a51 100644 --- a/Sources/arm/ui/UITrait.hx +++ b/Sources/arm/ui/UITrait.hx @@ -1033,7 +1033,7 @@ class UITrait { Context.tool == ToolDecal || Context.tool == ToolText) { var brushScaleHandle = Id.handle({value: brushScale}); - brushScale = ui.slider(brushScaleHandle, "UV Scale", 0.01, 10.0, true); + brushScale = ui.slider(brushScaleHandle, "UV Scale", 0.01, 5.0, true); if (brushScaleHandle.changed) { if (Context.tool == ToolDecal || Context.tool == ToolText) { ui.g.end(); @@ -1041,9 +1041,6 @@ class UITrait { RenderUtil.makeDecalPreview(); ui.g.begin(false); } - if (Context.layer.material_mask != null) { - Layers.updateFillLayers(); - } } var brushRotHandle = Id.handle({value: brushRot});