From 033af3b8756645b07cb55c1153f7bbe9e8de17cf Mon Sep 17 00:00:00 2001 From: DevFika <29062641+DevFika@users.noreply.github.com> Date: Wed, 22 Oct 2025 00:17:51 +0200 Subject: [PATCH] Add dilate node with filtering option --- addons/material_maker/nodes/dilate2.mmg | 603 ++++++++++++++++++ .../doc/images/node_filter_dilate.png | Bin 9758 -> 9964 bytes material_maker/doc/node_filter_dilate.rst | 1 + material_maker/library/base.json | 2 +- 4 files changed, 605 insertions(+), 1 deletion(-) create mode 100644 addons/material_maker/nodes/dilate2.mmg diff --git a/addons/material_maker/nodes/dilate2.mmg b/addons/material_maker/nodes/dilate2.mmg new file mode 100644 index 000000000..e6a932f2b --- /dev/null +++ b/addons/material_maker/nodes/dilate2.mmg @@ -0,0 +1,603 @@ +{ + "connections": [ + { + "from": "gen_inputs", + "from_port": 1, + "to": "default_color", + "to_port": 0 + }, + { + "from": "dilate_pass_4", + "from_port": 0, + "to": "dilate_pass_3", + "to_port": 0 + }, + { + "from": "dilate_pass_1", + "from_port": 0, + "to": "buffer_3", + "to_port": 0 + }, + { + "from": "buffer_3", + "from_port": 0, + "to": "dilate_pass_4", + "to_port": 0 + }, + { + "from": "dilate_pass_3", + "from_port": 0, + "to": "buffer_2", + "to_port": 0 + }, + { + "from": "buffer_2", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 + }, + { + "from": "default_color", + "from_port": 0, + "to": "buffer_4", + "to_port": 0 + }, + { + "from": "buffer_4", + "from_port": 0, + "to": "dilate_pass_3", + "to_port": 1 + }, + { + "from": "gen_inputs", + "from_port": 0, + "to": "buffer_5", + "to_port": 0 + }, + { + "from": "buffer_5", + "from_port": 0, + "to": "dilate_pass_1", + "to_port": 0 + } + ], + "label": "Dilate", + "longdesc": "Dilates the white areas of a mask, using the colors of an optional input", + "name": "dilate2", + "node_position": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "name": "gen_parameters", + "node_position": { + "x": 486.103820800781, + "y": -848.979248046875 + }, + "parameters": { + "param0": 11.0, + "param1": 0.1, + "param2": 0.0, + "param3": 0.0, + "param4": true, + "param5": true + }, + "seed": 1419.0, + "type": "remote", + "widgets": [ + { + "label": "", + "linked_widgets": [ + { + "node": "dilate_pass_1", + "widget": "s" + }, + { + "node": "dilate_pass_4", + "widget": "s" + }, + { + "node": "buffer_3", + "widget": "size" + }, + { + "node": "buffer_2", + "widget": "size" + }, + { + "node": "buffer_4", + "widget": "size" + }, + { + "node": "buffer_5", + "widget": "size" + } + ], + "longdesc": "The resolution of the input images", + "name": "param0", + "shortdesc": "Size", + "type": "linked_control" + }, + { + "label": "", + "linked_widgets": [ + { + "node": "dilate_pass_1", + "widget": "d" + }, + { + "node": "dilate_pass_4", + "widget": "d" + } + ], + "longdesc": "The length of the dilate effect", + "name": "param1", + "shortdesc": "Length", + "type": "linked_control" + }, + { + "label": "", + "linked_widgets": [ + { + "node": "dilate_pass_3", + "widget": "amount" + } + ], + "longdesc": "0 to generate a gradient to black while dilating, 1 to fill with input color", + "name": "param2", + "shortdesc": "Fill", + "type": "linked_control" + }, + { + "label": "", + "linked_widgets": [ + { + "node": "dilate_pass_4", + "widget": "distance" + } + ], + "name": "param3", + "shortdesc": "Distance function", + "type": "linked_control" + }, + { + "label": "Tile", + "linked_widgets": [ + { + "node": "dilate_pass_1", + "widget": "tile" + }, + { + "node": "dilate_pass_4", + "widget": "tile" + } + ], + "name": "param4", + "type": "linked_control" + }, + { + "label": "Filter", + "linked_widgets": [ + { + "node": "buffer_5", + "widget": "filter" + }, + { + "node": "buffer_2", + "widget": "filter" + }, + { + "node": "buffer_4", + "widget": "filter" + } + ], + "longdesc": "the filter property, uses bilinear filtering if set", + "name": "param5", + "shortdesc": "Filter", + "type": "linked_control" + } + ] + }, + { + "name": "gen_inputs", + "node_position": { + "x": -124.306457519531, + "y": -462.481384277344 + }, + "parameters": { + + }, + "ports": [ + { + "group_size": 0.0, + "longdesc": "The input mask whose white areas will be dilated", + "name": "mask", + "shortdesc": "Mask", + "type": "f" + }, + { + "group_size": 0.0, + "longdesc": "The optional source for colors", + "name": "source", + "shortdesc": "Source", + "type": "rgb" + } + ], + "seed": 317.0, + "type": "ios" + }, + { + "name": "gen_outputs", + "node_position": { + "x": 1126.21105957031, + "y": -488.481384277344 + }, + "parameters": { + + }, + "ports": [ + { + "group_size": 0.0, + "longdesc": "Shows the dilated image", + "name": "out", + "shortdesc": "Output", + "type": "rgb" + } + ], + "seed": -14401.0, + "seed_locked": true, + "type": "ios" + }, + { + "name": "dilate_pass_1", + "node_position": { + "x": 507.326843261719, + "y": -562.240783691406 + }, + "parameters": { + "d": 0.1, + "s": 11.0, + "tile": true + }, + "seed": 71939.0, + "seed_locked": true, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "function": true, + "label": "", + "name": "in", + "type": "f" + } + ], + "instance": [ + "vec3 $(name)_distance_h(vec2 uv, bool tile) {", + "\tvec2 e = vec2(1.0/$s, 0.0);", + "\tint steps = int($s*$d);", + "\tfloat rv = 0.0;", + "\tvec2 source_uv;", + "\tfor (int i = 0; i < steps; ++i) {", + "\t\tsource_uv = uv+float(i)*e;", + "\t\tif ((tile || (source_uv.x >= 0.0 && source_uv.x <= 1.0)) && $in(source_uv) > 0.5) {", + "\t\t\trv = 1.0-float(i)*e.x/$d;", + "\t\t\tbreak;", + "\t\t}", + "\t\tsource_uv = uv-float(i)*e;", + "\t\tif ((tile || (source_uv.x >= 0.0 && source_uv.x <= 1.0)) && $in(source_uv) > 0.5) {", + "\t\t\trv = 1.0-float(i)*e.x/$d;", + "\t\t\tbreak;", + "\t\t}", + "\t}", + "\treturn vec3(rv, source_uv);", + "}", + "" + ], + "name": "Dilate pass 1", + "outputs": [ + { + "rgb": "vec3($(name)_distance_h($uv, $tile).xy, 0.0)", + "type": "rgb" + } + ], + "parameters": [ + { + "default": 9.0, + "first": 6.0, + "label": "", + "last": 12.0, + "name": "s", + "type": "size" + }, + { + "control": "None", + "default": 0.5, + "label": "", + "max": 1.0, + "min": 0.0, + "name": "d", + "step": 0.01, + "type": "float" + }, + { + "default": true, + "label": "Tile", + "name": "tile", + "type": "boolean" + } + ] + }, + "type": "shader" + }, + { + "name": "dilate_pass_4", + "node_position": { + "x": 558.310546875, + "y": -294.577270507812 + }, + "parameters": { + "d": 0.1, + "distance": 0.0, + "s": 11.0, + "tile": true + }, + "seed": 50297.0, + "shader_model": { + "code": "", + "global": [ + "float dilate_distance_euclidian(float x, float y, float d) {", + "\treturn 1.0-sqrt((1.0-x)*(1.0-x)+y*y/d/d);", + "}", + "", + "float dilate_distance_manhattan(float x, float y, float d) {", + "\treturn 1.0-(abs(1.0-x)+abs(y)/d);", + "}", + "", + "float dilate_distance_chebyshev(float x, float y, float d) {", + "\treturn 1.0-max(abs(1.0-x), abs(y)/d);", + "}", + "", + "" + ], + "inputs": [ + { + "default": "vec3(0.0)", + "function": true, + "label": "", + "name": "in", + "type": "rgba" + } + ], + "instance": [ + "vec3 $(name)_distance_v(vec2 uv, bool tile) {", + "\tvec2 e = vec2(0.0, 1.0/$s);", + "\tint steps = int($s*$d);", + "\tvec3 p = vec3($in(uv).xy, uv.y);", + "\tvec2 source_uv;", + "\tfor (int i = 0; i < steps; ++i) {", + "\t\tvec2 dx = float(i)*e;", + "\t\tsource_uv = uv+dx;", + "\t\tif (tile || (source_uv.y >= 0.0 && source_uv.y < 1.0)) {", + "\t\t\tvec3 p2 = vec3($in(source_uv).xy, source_uv.y);", + "\t\t\tif (p2.x > p.x) {", + "\t\t\t\tp2.x = dilate_distance_$distance(p2.x, dx.y, $d);", + "\t\t\t\tp = mix(p, p2, step(p.x, p2.x));", + "\t\t\t}", + "\t\t}", + "\t\tsource_uv = uv-dx;", + "\t\tif (tile || (source_uv.y >= 0.0 && source_uv.y < 1.0)) {", + "\t\t\tvec3 p2 = vec3($in(source_uv).xy, source_uv.y);", + "\t\t\tif (p2.x > p.x) {", + "\t\t\t\tp2.x = dilate_distance_$distance(p2.x, dx.y, $d);", + "\t\t\t\tp = mix(p, p2, step(p.x, p2.x));", + "\t\t\t}", + "\t\t}", + "\t}", + "\treturn p;", + "}", + "" + ], + "name": "Dilate pass 2", + "outputs": [ + { + "rgb": "$(name)_distance_v($uv, $tile)", + "type": "rgb" + } + ], + "parameters": [ + { + "default": 9.0, + "first": 6.0, + "label": "", + "last": 12.0, + "name": "s", + "type": "size" + }, + { + "control": "None", + "default": 0.5, + "label": "", + "max": 1.0, + "min": 0.0, + "name": "d", + "step": 0.01, + "type": "float" + }, + { + "default": 2.0, + "label": "", + "name": "distance", + "type": "enum", + "values": [ + { + "name": "Euclidian", + "value": "euclidian" + }, + { + "name": "Manhattan", + "value": "manhattan" + }, + { + "name": "Chebyshev", + "value": "chebyshev" + } + ] + }, + { + "default": true, + "label": "Tile", + "name": "tile", + "type": "boolean" + } + ] + }, + "type": "shader" + }, + { + "name": "default_color", + "node_position": { + "x": 284.131286621094, + "y": -66.0206604003906 + }, + "parameters": { + "default": { + "a": 1.0, + "b": 1.0, + "g": 1.0, + "r": 1.0, + "type": "Color" + } + }, + "seed": 939.0, + "type": "default_color" + }, + { + "name": "dilate_pass_3", + "node_position": { + "x": 759.301208496094, + "y": -172.368988037109 + }, + "parameters": { + "amount": 0.0 + }, + "seed": 50311.0, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "vec3(0.0)", + "label": "", + "name": "distance", + "type": "rgb" + }, + { + "default": "vec3(1.0)", + "label": "", + "name": "source", + "type": "rgb" + } + ], + "instance": "", + "name": "Dilate pass 3", + "outputs": [ + { + "rgb": "$source($distance($uv).yz)*mix($distance($uv).x, 1.0, $amount)", + "type": "rgb" + } + ], + "parameters": [ + { + "control": "None", + "default": 0.0, + "label": "", + "max": 1.0, + "min": 0.0, + "name": "amount", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "buffer_3", + "node_position": { + "x": 544.77001953125, + "y": -431.83056640625 + }, + "parameters": { + "f32": true, + "filter": false, + "mipmap": false, + "size": 11.0 + }, + "seed_int": 0, + "type": "buffer", + "version": 2 + }, + { + "name": "buffer_2", + "node_position": { + "x": 930.4814453125, + "y": -357.159149169922 + }, + "parameters": { + "f32": false, + "filter": true, + "mipmap": false, + "size": 11.0 + }, + "seed_int": 0, + "type": "buffer", + "version": 2 + }, + { + "name": "buffer_4", + "node_position": { + "x": 507.171508789062, + "y": -41.1798095703125 + }, + "parameters": { + "f32": false, + "filter": true, + "mipmap": false, + "size": 11.0 + }, + "seed_int": 0, + "type": "buffer", + "version": 2 + }, + { + "name": "buffer_5", + "node_position": { + "x": 264.530487060547, + "y": -543.795166015625 + }, + "parameters": { + "f32": false, + "filter": true, + "mipmap": false, + "size": 11.0 + }, + "seed_int": 0, + "type": "buffer", + "version": 2 + } + ], + "parameters": { + "param0": 11.0, + "param1": 0.1, + "param2": 0.0, + "param3": 0.0, + "param4": true, + "param5": true + }, + "seed_int": 0, + "shortdesc": "Dilate", + "type": "graph" +} \ No newline at end of file diff --git a/material_maker/doc/images/node_filter_dilate.png b/material_maker/doc/images/node_filter_dilate.png index 8364c1e097c93d4a31814ba06da651d9bdc6beb4..0bdde5fd4afd0ae8c477a4c3090b6b6a4c3d3e9f 100644 GIT binary patch literal 9964 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 diff --git a/material_maker/doc/node_filter_dilate.rst b/material_maker/doc/node_filter_dilate.rst index 693403615..23b3d5820 100644 --- a/material_maker/doc/node_filter_dilate.rst +++ b/material_maker/doc/node_filter_dilate.rst @@ -35,6 +35,7 @@ The **Dilate** node accepts the following parameters: the source (or the white color). Values in between mix both methods * the *distance* function used for the Dilate operation (Euclidian, Manhattan or Chebyshev) * a *tile* option to create a tileable result +* the *filter* property; if set, filtering will be applied Example images ++++++++++++++ diff --git a/material_maker/library/base.json b/material_maker/library/base.json index 27b9872bf..69b914fad 100644 --- a/material_maker/library/base.json +++ b/material_maker/library/base.json @@ -2946,7 +2946,7 @@ "param2": 0.0 }, "tree_item": "Filter/Dilate", - "type": "dilate" + "type": "dilate2" }, { "display_name": "Bevel",