diff --git a/Sources/arm/nodes/MaterialBuilder.hx b/Sources/arm/nodes/MaterialBuilder.hx index 1fffb3d0..701b50b1 100644 --- a/Sources/arm/nodes/MaterialBuilder.hx +++ b/Sources/arm/nodes/MaterialBuilder.hx @@ -324,6 +324,10 @@ class MaterialBuilder { frag.write_attrib('uvsp.x *= aspectRatio;'); frag.write_attrib('uvsp *= 0.21 / (brushRadius * 0.9);'); + + frag.add_uniform('float brushScaleX', '_brushScaleX'); + frag.write_attrib('uvsp.x *= brushScaleX;'); + frag.write_attrib('uvsp += vec2(0.5, 0.5);'); frag.write_attrib('if (uvsp.x < 0.01 || uvsp.y < 0.01 || uvsp.x > 0.99 || uvsp.y > 0.99) discard;'); diff --git a/Sources/arm/render/Uniforms.hx b/Sources/arm/render/Uniforms.hx index 931bd99e..8087189c 100644 --- a/Sources/arm/render/Uniforms.hx +++ b/Sources/arm/render/Uniforms.hx @@ -35,6 +35,9 @@ class Uniforms { else val *= 900 / App.h(); // Projection ratio return val; } + else if (link == '_brushScaleX') { + return 1 / UITrait.inst.brushScaleX; + } else if (link == '_brushOpacity') { var val = UITrait.inst.brushOpacity * UITrait.inst.brushNodesOpacity; var pen = Input.getPen(); diff --git a/Sources/arm/ui/UITrait.hx b/Sources/arm/ui/UITrait.hx index 24e21de8..ef9f10b4 100644 --- a/Sources/arm/ui/UITrait.hx +++ b/Sources/arm/ui/UITrait.hx @@ -171,6 +171,8 @@ class UITrait { public var brushRadius = 0.5; public var brushRadiusHandle = new Handle({value: 0.5}); + public var brushScaleX = 1.0; + public var brushScaleXHandle = new Handle({value: 1.0}); public var brushBlending = 0; public var brushOpacity = 1.0; public var brushOpacityHandle = new Handle({value: 1.0}); @@ -806,12 +808,15 @@ class UITrait { if (!brush3d || in2dView || decal) { if (decal) { - psize = Std.int(256 * (brushRadius * brushNodesRadius)); + var psizex = Std.int(256 * (brushRadius * brushNodesRadius * brushScaleX)); + var psizey = Std.int(256 * (brushRadius * brushNodesRadius)); + g.color = kha.Color.fromFloats(1, 1, 1, brushOpacity); #if (kha_direct3d11 || kha_direct3d12) - g.drawScaledImage(decalImage, mx - psize / 2, my - psize / 2, psize, psize); + g.drawScaledImage(decalImage, mx - psizex / 2, my - psizey / 2, psizex, psizey); #else - g.drawScaledImage(decalImage, mx - psize / 2, my - psize / 2 + psize, psize, -psize); + g.drawScaledImage(decalImage, mx - psizex / 2, my - psizey / 2 + psizey, psizex, -psizey); #end + g.color = 0xffffffff; } else if (Context.tool == ToolBrush || Context.tool == ToolEraser || @@ -1029,6 +1034,10 @@ class UITrait { brushRadius = ui.slider(brushRadiusHandle, "Radius", 0.01, 2.0, true); } + if (Context.tool == ToolDecal) { + brushScaleX = ui.slider(brushScaleXHandle, "Scale X", 0.01, 2.0, true); + } + if (Context.tool == ToolBrush || Context.tool == ToolFill || Context.tool == ToolDecal ||