From aef7f401afd1276b5d4d1a8a50e0890836609fe2 Mon Sep 17 00:00:00 2001 From: Digvijaysinh Gohil Date: Thu, 12 Oct 2023 18:31:51 +0530 Subject: [PATCH] RotateUV node added ^ Code refactored for various nodes --- addons/ShaderLib/UV/FlipbookUV.gd | 2 + addons/ShaderLib/UV/RadialShearUV.gd | 4 +- addons/ShaderLib/UV/RotateUV.gd | 71 ++++++++++++++++++++++++ addons/ShaderLib/UV/RotateUV.gdshaderinc | 16 ++++++ 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 addons/ShaderLib/UV/RotateUV.gd create mode 100644 addons/ShaderLib/UV/RotateUV.gdshaderinc diff --git a/addons/ShaderLib/UV/FlipbookUV.gd b/addons/ShaderLib/UV/FlipbookUV.gd index 7e0ad9a..e3d3f63 100644 --- a/addons/ShaderLib/UV/FlipbookUV.gd +++ b/addons/ShaderLib/UV/FlipbookUV.gd @@ -8,6 +8,8 @@ func _init() -> void: set_input_port_default_value(4, 0) set_input_port_default_value(5, 0.1) + set_output_port_for_preview(0) + func _get_name() -> String: return "Flipbook" diff --git a/addons/ShaderLib/UV/RadialShearUV.gd b/addons/ShaderLib/UV/RadialShearUV.gd index b7bb966..66f690f 100644 --- a/addons/ShaderLib/UV/RadialShearUV.gd +++ b/addons/ShaderLib/UV/RadialShearUV.gd @@ -6,8 +6,10 @@ func _init() -> void: _set_input_port_default_value(2, 10.0) _set_input_port_default_value(3, Vector2(0.0, 0.0)) + set_output_port_for_preview(0) + func _get_name() -> String: - return "Radial Shear" + return "RadialShear" func _get_category() -> String: return "UV" diff --git a/addons/ShaderLib/UV/RotateUV.gd b/addons/ShaderLib/UV/RotateUV.gd new file mode 100644 index 0000000..50c71af --- /dev/null +++ b/addons/ShaderLib/UV/RotateUV.gd @@ -0,0 +1,71 @@ +@tool +class_name VisualShaderNodeUVRotate extends VisualShaderNodeCustom + +func _init() -> void: + _set_input_port_default_value(1, Vector2(0.5, 0.5)) + _set_input_port_default_value(2, 0.0) + _set_input_port_default_value(3, false) + + set_output_port_for_preview(0) + +func _get_name() -> String: + return "Rotate" + +func _get_category() -> String: + return "UV" + +func _get_description() -> String: + return "Rotates value of input UV around a reference point defined by input center by the amount of input rotation." + +func _get_return_icon_type() -> VisualShaderNode.PortType: + return PORT_TYPE_VECTOR_2D + +func _get_input_port_count() -> int: + return 4 + +func _get_input_port_name(port: int) -> String: + match port: + 0: + return "uv" + 1: + return "center" + 2: + return "rotation" + 3: + return "use degrees" + return "" + +func _get_input_port_type(port: int) -> VisualShaderNode.PortType: + match port: + 0, 1: + return PORT_TYPE_VECTOR_2D + 2: + return PORT_TYPE_SCALAR + 3: + return PORT_TYPE_BOOLEAN + return PORT_TYPE_SCALAR + +func _get_output_port_count() -> int: + return 1 + +func _get_output_port_name(port: int) -> String: + return "uv" + +func _get_output_port_type(port: int) -> VisualShaderNode.PortType: + return PORT_TYPE_VECTOR_2D + +func _get_global_code(mode: Shader.Mode) -> String: + var code: String = preload("RotateUV.gdshaderinc").code + return code + +func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shader.Mode, type: VisualShader.Type) -> String: + var uv: String = "UV" + + if input_vars[0]: + uv = input_vars[0] + + var center: String = input_vars[1] + var rotation: String = input_vars[2] + var use_degrees: String = input_vars[3] + + return output_vars[0] + " = rotate_uv(%s, %s, %s, %s);" % [uv, center, rotation, use_degrees] diff --git a/addons/ShaderLib/UV/RotateUV.gdshaderinc b/addons/ShaderLib/UV/RotateUV.gdshaderinc new file mode 100644 index 0000000..c198edd --- /dev/null +++ b/addons/ShaderLib/UV/RotateUV.gdshaderinc @@ -0,0 +1,16 @@ +vec2 rotate_uv(vec2 uv, vec2 center, float rotation, bool use_degrees){ + if(use_degrees){ + rotation = rotation * (3.1415926/180.0); + } + vec2 _uv = uv; + _uv -= center; + float _s = sin(rotation); + float _c = cos(rotation); + mat2 _rotation_matrix = mat2(vec2(_c, -_s), vec2(_s, _c)); + _rotation_matrix *= 0.5; + _rotation_matrix += 0.5; + _rotation_matrix = _rotation_matrix * 2.0 - 1.0; + _uv.xy = _uv.xy * _rotation_matrix; + _uv += center; + return _uv; +} \ No newline at end of file