material-maker/addons/procedural_material/nodes/transform.gd
Rodolphe Suescun 26720e74e9 Updated Transform, added Decompose and minor changes
Updated Transform so it accepts a greyscale input per parameter. For each pixel, the parameter is multiplied by 2*v-1 (v being the value of the input's pixel) which makes it possible to affect the strength of each transform using an input image. New effects such as whirl and color guided offsets are now possible.

Added Decompose node (does the opposite of combine).

Used another color for inputs/outputs that expect/generate a greyscale image.
2018-08-25 08:07:22 +02:00

47 lines
1.6 KiB
GDScript

tool
extends "res://addons/procedural_material/node_base.gd"
var translate_x = 0.0
var translate_y = 0.0
var rotate = 0.0
var scale_x = 1.0
var scale_y = 1.0
var repeat = true
func _ready():
set_slot(0, true, 0, Color(0.5, 0.5, 1), true, 0, Color(0.5, 0.5, 1))
initialize_properties([ $HBoxContainer1/translate_x, $HBoxContainer2/translate_y, $HBoxContainer3/rotate, $HBoxContainer4/scale_x, $HBoxContainer5/scale_y, $repeat ])
func _get_shader_code(uv):
var rv = { defs="", code="" }
var src = get_source()
if src == null:
return rv
var variant_index = generated_variants.find(uv)
if variant_index == -1:
variant_index = generated_variants.size()
generated_variants.append(uv)
var inputs = [ "", "", "", "", "" ]
for i in range(5):
var tsrc = get_source(i+1)
if tsrc != null:
var tsrc_code = tsrc.get_shader_code(uv)
if generated_variants.size() == 1:
rv.defs += tsrc_code.defs
rv.code += tsrc_code.code
inputs[i] = "*(2.0*(%s)-1.0)" % tsrc_code.f
rv.code += "vec2 %s_%d_uv = %s(%s, vec2(%.9f%s, %.9f%s), %.9f%s, vec2(%.9f%s, %.9f%s));\n" % [ name, variant_index, "transform_repeat" if repeat else "transform_norepeat", uv, translate_x, inputs[0], translate_y, inputs[1], PI*rotate/180.0, inputs[2], scale_x, inputs[3], scale_y, inputs[4] ]
var src_code = src.get_shader_code("%s_%d_uv" % [ name, variant_index ])
if rv.code != "":
if generated_variants.size() == 1:
rv.defs += src_code.defs
rv.code += src_code.code
rv.rgb = src_code.rgb
return rv
func deserialize(data):
if data.has("scale"):
scale_x = data.scale
scale_y = data.scale
.deserialize(data)