diff --git a/addons/material_maker/nodes/shard_fbm.mmg b/addons/material_maker/nodes/shard_fbm.mmg new file mode 100644 index 000000000..925ce540a --- /dev/null +++ b/addons/material_maker/nodes/shard_fbm.mmg @@ -0,0 +1,190 @@ +{ + "name": "shard_fbm", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "folds": 0, + "iter": 4, + "off": 0, + "per": 0.5, + "sharp": 0.7, + "sx": 7, + "sy": 7 + }, + "seed_int": 0, + "shader_model": { + "code": "", + "global": [ + "// Adapted from https://www.shadertoy.com/view/dlKyWw by @ENDESGA", + "", + "vec3 hash(vec3 p)", + "{", + "\tp = vec3(dot(p, vec3(127.1, 311.7, 74.7)), dot(p, vec3(269.5,183.3,246.1)), dot(p, vec3(113.5, 271.9, 124.6)));", + "\tp = fract(sin(p) * 43758.5453123);", + "\treturn p;", + "}", + "", + "float shard_noise(vec3 p, vec3 size, float sharpness, float seed) {", + "\tvec3 ip = floor(p);", + "\tvec3 fp = fract(p);", + "", + "\tfloat v = 0.0, t = 0.0;", + "\t", + "\tfor (int z = -1; z <= 1; z++) {", + "\t\tfor (int y = -2; y <= 2; y++) {", + "\t\t\tfor (int x = -2; x <= 2; x++) {", + "\t\t\t", + "\t\t\t\tvec3 o = vec3(float(x), float(y), float(z));", + "\t\t\t\tvec3 io = mod(ip + o, size);", + "\t\t\t\tvec3 h = hash(io + seed);", + "\t\t\t\tvec3 r = fp - (o + h);", + "", + "\t\t\t\tfloat w = exp2(-6.283185*dot(r, r));", + "\t\t\t\t// tanh deconstruction and optimization by @Xor", + "\t\t\t\tfloat s = sharpness * dot(r, hash(io + vec3(11, 31, 47)) - 0.5);", + "\t\t\t\tv += w * s*inversesqrt(1.0+s*s);", + "\t\t\t\tt += w;", + "\t\t\t}", + "\t\t}", + "\t}", + "\treturn ((v / t) * 0.5) + 0.5;", + "}", + "", + "float fbm_shard(vec3 coord, vec3 size, int folds, int octaves, float persistence, float sharpness, float seed) {", + "\tfloat normalize_factor = 0.0;", + "\tfloat value = 0.0;", + "\tfloat scale = 1.0;", + "\tfor (int i = 0; i < octaves; i++) {", + "\t\tfloat noise = shard_noise(coord*size, size, sharpness, seed);", + "\t\tfor (int f = 0; f < folds; ++f) {", + "\t\t\tnoise = abs(2.0*noise-1.0);", + "\t\t}", + "\t\tvalue += noise * scale;", + "\t\tnormalize_factor += scale;", + "\t\tsize *= 2.0;", + "\t\tscale *= persistence;", + "\t}", + "\treturn value / normalize_factor;", + "}" + ], + "inputs": [ + { + "default": "$sharp", + "label": "1:", + "longdesc": "Map that affects the sharpness parameter", + "name": "sharp_in", + "shortdesc": "Sharpness Map", + "type": "f" + }, + { + "default": "$off", + "label": "7:", + "longdesc": "An optional input to drive the offset", + "name": "offset_in", + "shortdesc": "Offset Input", + "type": "f" + } + ], + "instance": "", + "longdesc": "Generates noise made of several octaves of shard noise", + "name": "Shard FBM Noise", + "outputs": [ + { + "f": "fbm_shard(vec3($uv,$offset_in($uv)),vec3($sx,$sy,1.0),int($folds),int($iter),$per,pow(2,$sharp_in($uv)*$sharp*8.0),$seed)", + "longdesc": "Greyscale image of the generated noise", + "shortdesc": "Output", + "type": "f" + } + ], + "parameters": [ + { + "control": "None", + "default": 0.7, + "label": "Sharpness", + "longdesc": "Sharpness of the noise", + "max": 1, + "min": 0, + "name": "sharp", + "shortdesc": "Sharpness", + "step": 0.01, + "type": "float" + }, + { + "control": "None", + "default": 7, + "label": "Scale X", + "longdesc": "Scale of the first octave along the X axis", + "max": 32, + "min": 1, + "name": "sx", + "shortdesc": "Scale.x", + "step": 1, + "type": "float" + }, + { + "control": "None", + "default": 7, + "label": "Scale Y", + "longdesc": "Scale of the first octave along the Y axis", + "max": 32, + "min": 1, + "name": "sy", + "shortdesc": "Scale.y", + "step": 1, + "type": "float" + }, + { + "control": "None", + "default": 0, + "label": "Folds", + "longdesc": "Number of times the noise is folded", + "max": 5, + "min": 0, + "name": "folds", + "shortdesc": "Folds", + "step": 1, + "type": "float" + }, + { + "control": "None", + "default": 4, + "label": "Iterations", + "longdesc": "Number of noise octaves", + "max": 8, + "min": 1, + "name": "iter", + "shortdesc": "Octaves", + "step": 1, + "type": "float" + }, + { + "control": "None", + "default": 0.5, + "label": "Persistence", + "longdesc": "Persistence between two consecutive octaves", + "max": 1, + "min": 0, + "name": "per", + "shortdesc": "Persistence", + "step": 0.01, + "type": "float" + }, + { + "control": "None", + "default": 0, + "label": "Offset", + "longdesc": "Offsets the points of the noise, can be used to animate the noise with \"$time\"", + "max": 1, + "min": 0, + "name": "off", + "shortdesc": "Offset", + "step": 0.01, + "type": "float" + } + ], + "shortdesc": "Fractional Brownian Motion Noise" + }, + "type": "shader" +} \ No newline at end of file diff --git a/material_maker/doc/images/node_noise_shard_fbm.png b/material_maker/doc/images/node_noise_shard_fbm.png new file mode 100644 index 000000000..fd9048037 Binary files /dev/null and b/material_maker/doc/images/node_noise_shard_fbm.png differ diff --git a/material_maker/doc/images/node_noise_shard_fbm_sample.png b/material_maker/doc/images/node_noise_shard_fbm_sample.png new file mode 100644 index 000000000..43e5441c8 Binary files /dev/null and b/material_maker/doc/images/node_noise_shard_fbm_sample.png differ diff --git a/material_maker/doc/node_noise_shard_fbm.rst b/material_maker/doc/node_noise_shard_fbm.rst new file mode 100644 index 000000000..a451d0a95 --- /dev/null +++ b/material_maker/doc/node_noise_shard_fbm.rst @@ -0,0 +1,37 @@ +Shard FBM Noise node +~~~~~~~~~~~~~~~~~~~~ + +The **Shard FBM Noise** node outputs a fractional Brownian motion texture. +FBM is obtained by repeating a noise pattern with smaller and smaller details. + +.. image:: images/node_noise_shard_fbm.png + :align: center + +Inputs +++++++ + +The **Shard FBM Noise** node accepts two inputs, the **Offset Input** to optionally +drive the **Offset** value with an input and a **Sharpness Map** which affects the sharpness parameter. + +Outputs ++++++++ + +The **Shard FBM Noise** node provides a greyscale noise texture. + +Parameters +++++++++++ + +The Shard FBM Noise node accepts the following parameters: + +* *Sharpness* of the noise +* *X* and *Y* scale of the first octave noise +* Number of *Folds* (offsetting the noise negatively and taking the absolute value) +* Number of *Iterations* +* *Persistance*, i.e. the strength of each subsequent iteration +* *Offset* of the points, can be used to animate the noise + +Example images +++++++++++++++ + +.. image:: images/node_noise_shard_fbm_sample.png + :align: center diff --git a/material_maker/doc/nodes_noise.rst b/material_maker/doc/nodes_noise.rst index 96d671fb0..e2d8ab549 100644 --- a/material_maker/doc/nodes_noise.rst +++ b/material_maker/doc/nodes_noise.rst @@ -14,6 +14,7 @@ made from random patterns. node_noise_voronoi node_noise_voronoi_triangle node_noise_fbm + node_noise_shard_fbm node_noise_anisotropic node_noise_wavelet node_noise_crystal diff --git a/material_maker/library/base.json b/material_maker/library/base.json index 0f8bd039a..eabe435b2 100644 --- a/material_maker/library/base.json +++ b/material_maker/library/base.json @@ -7275,6 +7275,23 @@ "tree_item": "Miscellaneous/Mesh Map", "type": "meshmap" }, + { + "icon_data":"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", + "name": "shard_fbm", + "parameters": { + "folds": 0, + "iter": 4, + "off": 0, + "per": 0.5, + "sharp": 0.7, + "sx": 7, + "sy": 7 + }, + "seed": 0, + "seed_locked": false, + "tree_item": "Noise/Shard FBM", + "type": "shard_fbm" + }, { "icon_data": "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", "name": "classic_kuwahara",