Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 187 additions & 0 deletions addons/material_maker/nodes/custom_uv2.mmg
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
{
"generic_size": 1,
"name": "custom_uv2",
"node_position": {
"x": 0,
"y": 0
},
"parameters": {
"inputs": 0.0,
"mode": 0.0,
"rotate": 0.0,
"scale": 0.0,
"sx": 1.0,
"sy": 1.0,
"variations": false
},
"seed_int": 0,
"shader_model": {
"code": [
"vec3 $(name_uv)_map = $map($uv);",
"float $(name_uv)_rnd = float($seed)+$(name_uv)_map.z;",
""
],
"global": [
"vec2 get_from_tileset_extend(float count, float seed, vec2 uv) {",
"\treturn (uv+floor(rand2(vec2(seed))*count))/count;",
"}",
"",
"vec2 get_from_tileset_clamp(float count, float seed, vec2 uv) {",
"\treturn clamp((uv+floor(rand2(vec2(seed))*count))/count, vec2(0.0), vec2(1.0));",
"}",
"",
"vec2 get_from_tileset_repeat(float count, float seed, vec2 uv) {",
"\treturn fract(uv+floor(rand2(vec2(seed))*count))/count;",
"}",
"",
"",
"vec2 custom_uv_transform(vec2 uv, vec2 cst_scale, float rnd_rotate, float rnd_scale, vec2 seed) {",
"\tseed = rand2(seed);",
"\tuv -= vec2(0.5);",
"\tfloat angle = (seed.x * 2.0 - 1.0) * rnd_rotate;",
"\tfloat ca = cos(angle);",
"\tfloat sa = sin(angle);",
"\tuv = vec2(ca*uv.x+sa*uv.y, -sa*uv.x+ca*uv.y);",
"\tuv *= (seed.y-0.5)*2.0*rnd_scale+1.0;",
"\tuv /= cst_scale;",
"\tuv += vec2(0.5);",
"\treturn uv;",
"}",
""
],
"inputs": [
{
"default": "vec4(1.0)",
"function": true,
"label": "Input#",
"longdesc": "The image or atlas of images to be remapped.",
"name": "in#",
"shortdesc": "Input#",
"type": "rgba"
},
{
"default": "vec3(1.0)",
"label": "UV",
"longdesc": "The custom UV map to be used for remapping.",
"name": "map",
"shortdesc": "Map",
"type": "rgb"
}
],
"instance": "",
"longdesc": "Remaps an Input image using a custom UV map.",
"name": "Custom UV",
"outputs": [
{
"longdesc": "Shows the remapped image",
"rgba": "$in#.variation(get_from_tileset_$(mode)($inputs, $(name_uv)_rnd, custom_uv_transform($(name_uv)_map.xy, vec2($sx, $sy), $rotate*0.01745329251, $scale, vec2($(name_uv)_map.z, float($seed)))), $variations ? $(name_uv)_rnd : 0.0)",
"shortdesc": "Output#",
"type": "rgba"
}
],
"parameters": [
{
"default": 0.0,
"label": "2: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": "inputs",
"shortdesc": "Inputs",
"type": "enum",
"values": [
{
"name": "1",
"value": "1.0"
},
{
"name": "4",
"value": "2.0"
},
{
"name": "16",
"value": "4.0"
}
]
},
{
"control": "None",
"default": 1.0,
"label": "Scale X",
"longdesc": "The scale of the input image along the X axis.",
"max": 5.0,
"min": 0.0,
"name": "sx",
"shortdesc": "Scale.x",
"step": 0.01,
"type": "float"
},
{
"control": "None",
"default": 1.0,
"label": "Scale Y",
"longdesc": "The scale of the input image along the Y axis.",
"max": 5.0,
"min": 0.0,
"name": "sy",
"shortdesc": "Scale.y",
"step": 0.01,
"type": "float"
},
{
"control": "None",
"default": 0.0,
"label": "Rnd Rotate",
"longdesc": "The random rotation applied to each remapped instance.",
"max": 180.0,
"min": 0.0,
"name": "rotate",
"shortdesc": "RndRotate",
"step": 0.1,
"type": "float"
},
{
"control": "None",
"default": 0.5,
"label": "Rnd Scale",
"longdesc": "The random scale applied to each remapped instance.",
"max": 1.0,
"min": 0.0,
"name": "scale",
"shortdesc": "RndScale",
"step": 0.01,
"type": "float"
},
{
"default": 2.0,
"label": "UV Mode",
"longdesc": "Clamp: Stretches the edges\nRepeat: Tiles the input UV\nExtend: Shows parts of the UV beyond the edges",
"name": "mode",
"shortdesc": "UV Mode",
"type": "enum",
"values": [
{
"name": "Clamp",
"value": "clamp"
},
{
"name": "Repeat",
"value": "repeat"
},
{
"name": "Extend",
"value": "extend"
}
]
},
{
"default": false,
"label": "Variations",
"longdesc": "Check to use variations of the input image",
"name": "variations",
"shortdesc": "Variations",
"type": "boolean"
}
],
"shortdesc": "Custom UV remapper"
},
"type": "shader"
}
Binary file modified material_maker/doc/images/node_transform_custom_uv.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 12 additions & 1 deletion material_maker/doc/node_transform_custom_uv.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
Custom UV node
~~~~~~~~~~~~~~

The **Custom UV** node deforms an input image according to a custom UV map given as input.
The **Custom UV** node is variadic and deforms one or more input images
according to a custom UV map given as input.

.. image:: images/node_transform_custom_uv.png
:align: center
Expand Down Expand Up @@ -29,8 +30,18 @@ The **Custom UV** node accepts the following parameters:

* *Inputs* is the number of alternate shapes in the input (1, 4 or 16). Images containing several
shapes can easily be created using the **Tile2x2** node.

* *Scale X and Scale Y* are the scale along X and Y axes applied to each instance.

* *Rnd Rotate* is the maximum angle of the random rotation applied to each instance.

* *Rnd Scale* is the amount of random scaling applied to each instance.

* *UV Mode* defines the behavior beyond the limits for the input UV:

* **Clamp** stretches the edges
* **Repeat** tiles the input UV
* **Extend** shows parts of the input UV that are beyond the edges

* *Variations*: if checked, the node will deform different variations of its input
(i.e. roll a different seed for each instance)
6 changes: 3 additions & 3 deletions material_maker/library/base.json
Original file line number Diff line number Diff line change
Expand Up @@ -3265,12 +3265,12 @@
"display_name": "Custom UV",
"icon": "transform_customuv",
"icon_data": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAACZtJREFUeJztW01P20wXPbHjxI4dxwmJSSBRlAQpUiugSEhItCyQWHTRFVL/T39RV91UqtRF1aqsUGHRgvgo5Ts1SQgx/srHu+CdESmZEPM+eiM99EqRMJk59/p4PHPnzE0AQBf3WC6XgyzL8DwPu7u79zUfysbGxpBMJgEAhmHg4uLiH8EtlUoQBAGmaeLw8PDe9gEMICCXy6FQKEBVVQiCgE6nA9M0cX5+js3NzQcHubCwgEQigXA4DABwHAfVahVra2sPxpyensb4+DhkWQbHcfA8D41GA/v7+wOJCLK+0HUd5XIZyWQSkUgEwWAQnU4H0WgUoigCwINIWFxcRCaTgaIoCIVCAADXdRGJRMDzPL58+eIbc3p6Gvl8HpqmQRRFcByHVqtFfTiOg0ql0rcvk4BisYhEIgFVVSFJEnieR6fToUHbtu2bAEKoqqpQFAWCIAAAPM+jT61cLmNra8sX7vj4ODRNg6qqCIVC4DgO7XabPrRiseifAEVRIIoiwuEwQqEQBQMAURQhyzJKpZKvOUHTNEiSBFEUEQqFKAGBQACiKEKSJGia5ufeUSqVIMsyxQyHw3QEdDodiKIIRVGY/ZkE8DwPjuPoJxAI9FxzHEdvYFj7E5PjOADoueZ53hemIAh3MP+MdRAmkwDXddFqtdBqtdButwEAnU4H7XYbrVYLnufBNE1fwTqO04NJCCCYrVYLjuP4wjRNE57nUcxWq0VfAYLpui6zP5OAer0OTdPoO09eAcdxcH19jUajMdQyc9vOzs6g63rPRAXczAHX19doNps4OzvzhXl4eIhCoQBFUWiMBNuyLJimiXq9zuzPJGB9fR2RSATAzWgg4LZto1qtYn9/31egAHB8fIxkMkkDvL0KNBoNnJyc4Pj42Dfu/v4+QqEQfecJvmmaqFQqWF9fZ/YdmAcAwNzcHB0J7XYbzWYTe3t7zFl1GCuXy9B1HZIkAQAsy0KlUvE9+982XddRLBahKAp4nofruqjX6wNvHhiCgH+7caMOYNT2lwBZlodqmMlkhgYdtq0syxi1/+Dr169xdHSEDx8+MBuurq4iHo/T9HdjY6Nvu5mZGUxPT0MURdRqNbx9+5aJubKygmw2CwAj9c/puo5sNst8EktLS0in00ilUtB1HVNTU0zQqakp6LqOVCqFdDqNpaWlvu1kWUY2m4Wu6xi1/0c/BwQrlQqOjo6Yae2nT5+QSqXgOA5s28bOzg4TbGdnh252arUaPn361LedaZo4Ojqi1yP1L8tyFze5wMBPJpMZqp2ftrIsd0ft/28iNOoARm2PngDmbpDYv30zNJCA58+fQ9f1m4zp1nZYURRsbW351gMAYHZ2Ftlslup3wM12WFVViKKIb9+++cbM5XIol8tIJBI922FN0xCJRPD582dmXyYBc3Nz0HUd8XgckiRRAogD13V9EzA5OYmJiQkkEok7oijBNwzDtyZQKBSo2HpbEyQEz83NMUcCkwBN0yDLMiRJ6lGFCbiqqsjlcr5ISKfTUBQFkUgEkiRRAsjNK4qCdDrti4BcLgdVVSnmbVUYuBldg4RWJgFECQ4Gg+B5ngqaRG4WBGHojQyxcDh8BxO40RrJ/8lhybAmyzIEQaCYwWAQgUDg5ub+i0lGQj9jrgLtdhudTod+ut1uz3Wn04Hneb6C/ROz34c8uWHN87w7GH/GOgiTOQKazSZs26bvPAnedV3Ytg3TNH2fE9brdViWBdu2EQwG0e126U3Ytg3LsgYKmP1sd3cXhUIB0WiUPmkSL0mfm80msz+TgL29PSiKQt/526tAvV7H+fm5r0ABYGtrC2NjY/Sc8fYq0Gw2YRjGg5bC8/Nzelx3exW4vr5GtVrF3t4esy8P4E2/L4jeHgwG0Wq16FOv1Wo4Pj5+8OHo4eEhVFW9I7Gfn5/j69evD8KsVCp07vA8D5Zl4erqCoZhYGdnB6enp8y+Q+0FHu3x+GOwR78XePQEBFdXV7Gzs8MUGgFgeXkZyWQSlmXh3bt3AwFfvXoFSZJgGAY+fvzIbDczM0P1vVH651++fPlGURTmrD4/P4+nT59C13Woqgpd17G9vc10XigUkEgkaKnKyclJ37YrKyuYnJyEpmkYpX8uHA5DFEWmlk5KYkihBNnC9jOSixPMaDTat10mk6GYo/YfbDQaqNVqzLXy4OAAuVwOwE1ZjGEYzAAMw6B1OpeXlzg4OOjb7vT0FLVaja7do/TPi6L45v3790zQWq2Gq6sruK6Lg4ODgUVMP3/+BMdxuLy8xObm5sAM7Pv37xBFEZVKBaP0/zcPGHUAo7ZHT8C9oujk5CTS6TTC4TDa7Tbq9fr/JF4Sm5mZoYKKaZoD84BhrVwuQ9M08DwPx3FwdnZ2r7o0cA6YnZ3FxMRETwGSZVkwDONBFZ0AkM/nUSqVoGlaT6lsvV7H7u4uc+a+zxYXF5FMJiFJEt0ON5tNnJycDBRamSOgXC4jm80ikUj0lMratg1BELCwsPCg2t5SqYTx8fE7oigh4yEELCwsIJPJUGWZEED+tm2bOWqZesCTJ0+QSqWo4Ej0PJ7nqeRUq9VgWdbQgc7MzGBiYoLK1aIoQhAE8DyPQCCAbrcLQRB8iS1jY2OYmppCPB6nSRPRMzmOQ7fbRbvdxq9fv/r2Z44AklUJgkCDJHobybaSyaSvfbwsywiHwxTzdqWpIAgIh8O+hdZkMkmzRIJJKkSJND4oe/y7CrC+sCwLruv2HFoQJdh1XTiOMzAt7WemacJxHHie16Mok2vHcXyX3xqGAcdxaKykTrjdbtNYB72mTAIqlQpUVaU3f3sSbDabqFarvmWsjY0NOmQB9EyCzWYT9Xrd93J4cXGBarWKSCQCjuPuiKKNRmPgOSaTgK2tLYiiSE9s/lwGH/rrDqIpOo7Tdxl8iK2trYHneXie13cZHJS33LsXeNSJ0GOwR78KPHoC+KWlpTesLIlYsVjEs2fPkEwmmRobsfn5eZTLZXAch1qtNrDt0tIS8vk8M0v7f/gPTk9PI5VKMctKi8UiXrx4gVgsBtu2EY1GmWrr8vIypqamIIoilbFYqszq6irS6TQAjNQ/p6oq4vE4U5TM5/OIxWKIRqNQVZUeZ/UzUqURjUYRi8WQz+f7tstkMojH41BVFaP2HyRHyCxR8urqCrZtIxQK3ZtVkewRuBEwr66u+rY7PT2Fbdv0B1Kj9M9PTEy8+fHjB3MHdnJyglgsBs/z8Pv374EHE9vb29B1HdfX1zg6OhqoGQQCAfA8j8vLS4zS/988YNQBjNoePQH/AbN2W+gmuQ/vAAAAAElFTkSuQmCC",
"name": "custom_uv",
"name": "custom_uv2",
"parameters": {

},
"tree_item": "Transform/Custom UV",
"type": "custom_uv"
"type": "custom_uv2"
},
{
"display_name": "Tile 2x2",
Expand Down Expand Up @@ -7854,4 +7854,4 @@
}
],
"name": "Base library"
}
}
Loading