From 47471a63acee7cc3d89c13847f1be2b0ab7328ec Mon Sep 17 00:00:00 2001 From: LMW Date: Sun, 5 Apr 2026 21:27:42 +0800 Subject: [PATCH] Normalized output for scratches node --- addons/material_maker/nodes/scratches.mmg | 10 +- addons/material_maker/nodes/scratches2.mmg | 139 +++++++++++++++++++++ material_maker/library/base.json | 6 +- 3 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 addons/material_maker/nodes/scratches2.mmg diff --git a/addons/material_maker/nodes/scratches.mmg b/addons/material_maker/nodes/scratches.mmg index 1c10cd5ca..f849051a3 100644 --- a/addons/material_maker/nodes/scratches.mmg +++ b/addons/material_maker/nodes/scratches.mmg @@ -16,7 +16,7 @@ "shader_model": { "code": "", "global": [ - "float scratch(vec2 uv, vec2 size, float waviness, float angle, float randomness, vec2 seed) {", + "float old_scratch(vec2 uv, vec2 size, float waviness, float angle, float randomness, vec2 seed) {", "\tfloat subdivide = floor(1.0/size.x);", "\tfloat cut = size.x*subdivide;", "\tuv *= subdivide;", @@ -36,11 +36,11 @@ "\treturn min(border.x, border.y)*(1.0-uv.x*uv.x)*max(0.0, 1.0-1000.0*uv.y*uv.y);", "}", "", - "float scratches(vec2 uv, int layers, vec2 size, float waviness, float angle, float randomness, vec2 seed) {", + "float old_scratches(vec2 uv, int layers, vec2 size, float waviness, float angle, float randomness, vec2 seed) {", "\tfloat v = 0.0;", "\tfor (int i = 0; i < layers; ++i) {", "\t\tseed = rand2(seed);", - "\t\tv = max(v, scratch(fract(uv+seed), size, waviness, angle/360.0, randomness, seed));", + "\t\tv = max(v, old_scratch(fract(uv+seed), size, waviness, angle/360.0, randomness, seed));", "\t}", "\treturn v;", "}", @@ -54,7 +54,7 @@ "name": "Scratches", "outputs": [ { - "f": "scratches($uv, int($layers), vec2($length, $width), $waviness, $angle, $randomness, vec2(float($seed), 0.0))", + "f": "old_scratches($uv, int($layers), vec2($length, $width), $waviness, $angle, $randomness, vec2(float($seed), 0.0))", "longdesc": "Shows white scratches on a black background", "shortdesc": "Output", "type": "f" @@ -136,4 +136,4 @@ ] }, "type": "shader" -} \ No newline at end of file +} diff --git a/addons/material_maker/nodes/scratches2.mmg b/addons/material_maker/nodes/scratches2.mmg new file mode 100644 index 000000000..7003515f0 --- /dev/null +++ b/addons/material_maker/nodes/scratches2.mmg @@ -0,0 +1,139 @@ +{ + "name": "scratches", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "angle": 0, + "layers": 5, + "length": 0.25, + "randomness": 0.3, + "waviness": 0.3, + "width": 0.4 + }, + "seed_int": 0, + "shader_model": { + "code": "", + "global": [ + "float scratch(vec2 uv, vec2 size, float waviness, float angle, float randomness, vec2 seed) {", + "\tfloat subdivide = floor(1.0/size.x);", + "\tfloat cut = size.x*subdivide;", + "\tuv *= subdivide;", + "\tvec2 r1 = rand2(floor(uv)+seed);", + "\tvec2 r2 = rand2(r1);", + "\tuv = fract(uv);", + "\tvec2 border = min(fract(uv), 1.0-fract(uv));", + "\tuv = 2.0*uv-vec2(1.0);", + "\tfloat a = 6.28318530718*(angle+(r1.x-0.5)*randomness);", + "\tfloat c = cos(a);", + "\tfloat s = sin(a);", + "\tuv = vec2(c*uv.x+s*uv.y, s*uv.x-c*uv.y);", + "\tuv.y += 2.0*r1.y-1.0;", + "\tuv.y += 0.5*waviness*cos(2.0*uv.x+6.28318530718*r2.y);", + "\tuv.x /= cut;", + "\tuv.y /= subdivide*size.y;", + "\treturn min(border.x, border.y)*(1.0-uv.x*uv.x)*max(0.0, 1.0-1000.0*uv.y*uv.y);", + "}", + "", + "float scratches(vec2 uv, int layers, vec2 size, float waviness, float angle, float randomness, vec2 seed) {", + "\tfloat v = 0.0;", + "\tfor (int i = 0; i < layers; ++i) {", + "\t\tseed = rand2(seed);", + "\t\tv = max(v, scratch(fract(uv+seed), size, waviness, angle/360.0, randomness, seed));", + "\t}", + "\treturn v * 2.0;", + "}", + "" + ], + "inputs": [ + + ], + "instance": "", + "longdesc": "Draws white scratches on a black background", + "name": "Scratches", + "outputs": [ + { + "f": "scratches($uv, int($layers), vec2($length, $width), $waviness, $angle, $randomness, vec2(float($seed), 0.0))", + "longdesc": "Shows white scratches on a black background", + "shortdesc": "Output", + "type": "f" + } + ], + "parameters": [ + { + "control": "None", + "default": 0.25, + "label": "Length", + "longdesc": "The length of scratches (the shorter the scratches,the more they will be)", + "max": 1, + "min": 0.1, + "name": "length", + "shortdesc": "Length", + "step": 0.01, + "type": "float" + }, + { + "control": "None", + "default": 0.5, + "label": "Width", + "longdesc": "The width of scratches", + "max": 1, + "min": 0.1, + "name": "width", + "shortdesc": "Width", + "step": 0.01, + "type": "float" + }, + { + "control": "None", + "default": 4, + "label": "Layers", + "longdesc": "The number of scratches layers", + "max": 10, + "min": 1, + "name": "layers", + "shortdesc": "Layers", + "step": 1, + "type": "float" + }, + { + "control": "None", + "default": 0.5, + "label": "Waviness", + "longdesc": "The waviness of scratches", + "max": 1, + "min": 0, + "name": "waviness", + "shortdesc": "Waviness", + "step": 0.01, + "type": "float" + }, + { + "control": "None", + "default": 0, + "label": "Angle", + "longdesc": "The average angle of the scratches (0 generates horizontal scratches)", + "max": 180, + "min": -180, + "name": "angle", + "shortdesc": "Angle", + "step": 1, + "type": "float" + }, + { + "control": "None", + "default": 0.5, + "label": "Randomness", + "longdesc": "The randomness of the scratches angles", + "max": 1, + "min": 0, + "name": "randomness", + "shortdesc": "Randomness", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} diff --git a/material_maker/library/base.json b/material_maker/library/base.json index ab9f0cd72..3cd5e930e 100644 --- a/material_maker/library/base.json +++ b/material_maker/library/base.json @@ -1983,7 +1983,7 @@ "display_name": "Scratches", "icon": "pattern_scratches", "icon_data": "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", - "name": "scratches", + "name": "scratches2", "parameters": { "Randomness": 0.5, "angle": -1.0, @@ -1994,7 +1994,7 @@ "width": 0.4 }, "tree_item": "Pattern/Scratches", - "type": "scratches" + "type": "scratches2" }, { "display_name": "Beehive", @@ -8093,4 +8093,4 @@ } ], "name": "Base library" -} \ No newline at end of file +}