{ "name": "circle_splatter", "node_position": { "x": 0, "y": 0 }, "parameters": { "count": 20, "i_rotate": 0, "i_scale": 0, "radius": 0.4, "rings": 2, "rotate": 0, "scale": 0, "scale_x": 1, "scale_y": 1, "select_inputs": 0, "spiral": 0, "value": 0 }, "shader_model": { "code": "vec4 $(name_uv)_rch = splatter_$(name)($uv, int($count), int($rings), vec2(float($seed)));", "longdesc": "A node that spreads several occurences of an input image in a circle or spiral pattern.", "global": "", "inputs": [ { "default": "0.0", "function": true, "label": "", "longdesc": "The input image or atlas of 4 or 16 input images", "name": "in", "shortdesc": "Input", "type": "f" }, { "default": "1.0", "function": true, "label": "", "longdesc": "The mask applied to the pattern", "name": "mask", "shortdesc": "Mask", "type": "f" } ], "instance": "vec4 splatter_$(name)(vec2 uv, int count, int rings, vec2 seed) {\n\tfloat c = 0.0;\n\tvec3 rc = vec3(0.0);\n\tvec3 rc1;\n\tseed = rand2(seed);\n\tfor (int i = 0; i < count; ++i) {\n\t\tfloat a = -1.57079632679+6.28318530718*float(i)*$rings/float(count);\n\t\tfloat rings_distance = ceil(float(i+1)*float(rings)/float(count))/float(rings);\n\t\tfloat spiral_distance = float(i+1)/float(count);\n\t\tvec2 pos = $radius*mix(rings_distance, spiral_distance, $spiral)*vec2(cos(a), sin(a));\n\t\tfloat mask = $mask(fract(pos-vec2(0.5)));\n\t\tif (mask > 0.01) {\n\t\t\tvec2 pv = uv-0.5-pos;\n\t\t\trc1 = rand3(seed);\n\t\t\tseed = rand2(seed);\n\t\t\tfloat angle = (seed.x * 2.0 - 1.0) * $rotate * 0.01745329251 + (a+1.57079632679) * $i_rotate;\n\t\t\tfloat ca = cos(angle);\n\t\t\tfloat sa = sin(angle);\n\t\t\tpv = vec2(ca*pv.x+sa*pv.y, -sa*pv.x+ca*pv.y);\n\t\t\tpv /= mix(1.0, float(i+1)/float(count+1), $i_scale);\n\t\t\tpv /= vec2($scale_x, $scale_y);\n\t\t\tpv *= (seed.y-0.5)*2.0*$scale+1.0;\n\t\t\tpv += vec2(0.5);\n\t\t\tpv = clamp(pv, vec2(0.0), vec2(1.0));\n\t\t\t$select_inputs\n\t\t\tseed = rand2(seed);\n\t\t\tfloat c1 = $in(pv)*mask*(1.0-$value*seed.x);\n\t\t\tc = max(c, c1);\n\t\t\trc = mix(rc, rc1, step(c, c1));\n\t\t}\n\t}\n\treturn vec4(rc, c);\n}\n", "name": "Circle Splatter", "outputs": [ { "f": "$(name_uv)_rch.a", "longdesc": "Shows the generated pattern", "shortdesc": "Output", "type": "f" }, { "longdesc": "Shows a random color for each instance of the input image", "rgb": "$(name_uv)_rch.rgb", "shortdesc": "Instance map", "type": "rgb" } ], "parameters": [ { "control": "None", "default": 10, "label": "Count", "longdesc": "The number of occurences of the input image", "max": 256, "min": 1, "name": "count", "shortdesc": "Count", "step": 1, "type": "float" }, { "control": "None", "default": 1, "label": "Rings", "longdesc": "The number of rings of the circle pattern", "max": 16, "min": 1, "name": "rings", "shortdesc": "Rings", "step": 1, "type": "float" }, { "default": 0, "label": "Inputs", "longdesc": "The input type of the node:\n- 1: single image\n- 4: atlas of 4 images\n- 16: atlas of 16 images\nAtlases can be created using the Tile2x2 node.", "name": "select_inputs", "shortdesc": "Input", "type": "enum", "values": [ { "name": "1", "value": " " }, { "name": "4", "value": "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));" }, { "name": "16", "value": "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));" } ] }, { "control": "None", "default": 1, "label": "Scale X", "longdesc": "The scale of input images on the X axis", "max": 2, "min": 0, "name": "scale_x", "shortdesc": "Scale.x", "step": 0.01, "type": "float" }, { "control": "None", "default": 1, "label": "Scale Y", "longdesc": "The scale of input images on the Y axis", "max": 2, "min": 0, "name": "scale_y", "shortdesc": "Scale.y", "step": 0.01, "type": "float" }, { "control": "None", "default": 0.25, "label": "Radius", "longdesc": "The radius of the outer circle pattern", "max": 0.5, "min": 0, "name": "radius", "shortdesc": "Radius", "step": 0.01, "type": "float" }, { "control": "None", "default": 0, "label": "Spiral", "longdesc": "The type of pattern:\n- 0: circles\n- 1: spiral", "max": 1, "min": 0, "name": "spiral", "shortdesc": "Spiral", "step": 0.01, "type": "float" }, { "control": "None", "default": 0, "label": "Inc Rotate", "longdesc": "The rotate increment along the pattern", "max": 1, "min": 0, "name": "i_rotate", "shortdesc": "IncRotate", "step": 0.01, "type": "float" }, { "control": "None", "default": 0, "label": "Inc Scale", "longdesc": "The scale increment of the pattern", "max": 1, "min": 0, "name": "i_scale", "shortdesc": "IncScale", "step": 0.01, "type": "float" }, { "control": "None", "default": 0, "label": "Rnd Rotate", "longdesc": "The random rotation applied to each image instance", "max": 180, "min": 0, "name": "rotate", "shortdesc": "RndRotate", "step": 0.1, "type": "float" }, { "control": "None", "default": 0, "label": "Rnd Scale", "longdesc": "The random scale applied to each image instance", "max": 1, "min": 0, "name": "scale", "shortdesc": "RndScale", "step": 0.01, "type": "float" }, { "control": "None", "default": 0.5, "label": "Rnd Value", "longdesc": "The random greyscale value applied to each image instance", "max": 1, "min": 0, "name": "value", "shortdesc": "RndValue", "step": 0.01, "type": "float" } ] }, "type": "shader" }