{ "name": "voronoi", "node_position": { "x": 0, "y": 0 }, "parameters": { "intensity": 1, "randomness": 0.66, "scale_x": 4, "scale_y": 4, "stretch_x": 1, "stretch_y": 1 }, "shader_model": { "code": "vec4 $(name_uv)_xyzw = voronoi($uv, vec2($scale_x, $scale_y), vec2($stretch_y, $stretch_x), $intensity, $randomness, $seed);", "global": "vec4 voronoi(vec2 uv, vec2 size, vec2 stretch, float intensity, float randomness, int seed) {\n\tvec2 seed2 = rand2(vec2(float(seed), 1.0-float(seed)));\n uv *= size;\n float best_distance0 = 1.0;\n float best_distance1 = 1.0;\n vec2 point0;\n vec2 point1;\n vec2 p0 = floor(uv);\n for (int dx = -1; dx < 2; ++dx) {\n \tfor (int dy = -1; dy < 2; ++dy) {\n vec2 d = vec2(float(dx), float(dy));\n vec2 p = p0+d;\n p += randomness*rand2(seed2+mod(p, size));\n float distance = length(stretch*(uv - p) / size);\n if (best_distance0 > distance) {\n \tbest_distance1 = best_distance0;\n \tbest_distance0 = distance;\n point1 = point0;\n point0 = p;\n } else if (best_distance1 > distance) {\n \tbest_distance1 = distance;\n point1 = p;\n }\n }\n }\n float edge_distance = dot(uv - 0.5*(point0+point1), normalize(point0-point1));\n \n return vec4(point0, best_distance0*length(size)*intensity, edge_distance);\n}\n", "inputs": [ ], "instance": "", "longdesc": "A node that generates several images from a tileable voronoi noise", "name": "Voronoi", "outputs": [ { "f": "$(name_uv)_xyzw.z", "longdesc": "A greyscale pattern based on the distance to cell centers", "shortdesc": "Nodes", "type": "f" }, { "f": "$(name_uv)_xyzw.w", "longdesc": "A greyscale pattern based on the distance to borders", "shortdesc": "Borders", "type": "f" }, { "longdesc": "A color pattern that assigns a random color to each cell", "rgb": "rand3(fract($(name_uv)_xyzw.xy))", "shortdesc": "Random color", "type": "rgb" }, { "longdesc": "An output that should be plugged into a Fill companion node", "rgba": "vec4(fract(($(name_uv)_xyzw.xy-0.5)/vec2($scale_x, $scale_y)), vec2(1.0)/vec2($scale_x, $scale_y))", "shortdesc": "Fill", "type": "rgba" } ], "parameters": [ { "control": "None", "default": 4, "label": "Scale X", "longdesc": "The scale along the X axis", "max": 32, "min": 1, "name": "scale_x", "shortdesc": "Scale.x", "step": 1, "type": "float" }, { "control": "None", "default": 4, "label": "Scale Y", "longdesc": "The scale along the Y axis", "max": 32, "min": 1, "name": "scale_y", "shortdesc": "Scale.y", "step": 1, "type": "float" }, { "control": "None", "default": 1, "label": "Stretch X", "longdesc": "The stretch factor along the X axis", "max": 1, "min": 0.01, "name": "stretch_x", "shortdesc": "Stretch.x", "step": 0.01, "type": "float" }, { "control": "None", "default": 1, "label": "Stretch Y", "longdesc": "The stretch factor along the Y axis", "max": 1, "min": 0.01, "name": "stretch_y", "shortdesc": "Stretch.y", "step": 0.01, "type": "float" }, { "control": "None", "default": 0.75, "label": "Intensity", "longdesc": "A value factor for greyscale outputs", "max": 1, "min": 0, "name": "intensity", "shortdesc": "Intensity", "step": 0.01, "type": "float" }, { "control": "None", "default": 1, "label": "Randomness", "longdesc": "The randomness of cell centers positions", "max": 1, "min": 0, "name": "randomness", "shortdesc": "Randomness", "step": 0.01, "type": "float" } ], "shortdesc": "Voronoi Noise" }, "type": "shader" }