From 273d07ae8501542fcaa19fd61610a6f9f76a8e4b Mon Sep 17 00:00:00 2001 From: Digvijaysinh Gohil Date: Sun, 10 Dec 2023 17:46:18 +0530 Subject: [PATCH] SwirlUV node added --- addons/ShaderLib/UV/SwirlUV.gd | 75 +++++++++++++++++++++++++ addons/ShaderLib/UV/SwirlUV.gdshaderinc | 8 +++ 2 files changed, 83 insertions(+) create mode 100644 addons/ShaderLib/UV/SwirlUV.gd create mode 100644 addons/ShaderLib/UV/SwirlUV.gdshaderinc diff --git a/addons/ShaderLib/UV/SwirlUV.gd b/addons/ShaderLib/UV/SwirlUV.gd new file mode 100644 index 0000000..11b170e --- /dev/null +++ b/addons/ShaderLib/UV/SwirlUV.gd @@ -0,0 +1,75 @@ +@tool +class_name VisualShaderNodeUVSwirl extends VisualShaderNodeCustom + +func _init() -> void: + _set_input_port_default_value(1, Vector2(0.5, 0.5)) + _set_input_port_default_value(2, 10.0) + _set_input_port_default_value(3, Vector2(0.0, 0.0)) + + output_port_for_preview = 0 + +func _get_name() -> String: + return "Swirl" + +func _get_category() -> String: + return "UV" + +func _get_description() -> String: + return "Applies a swirl warping effect similar to a black hole to the value of input UV." + +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 "strength" + 3: + return "offset" + return "" + +func _get_input_port_type(port: int) -> VisualShaderNode.PortType: + match port: + 0, 1, 3: + return PORT_TYPE_VECTOR_2D + 2: + return PORT_TYPE_SCALAR + 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("SwirlUV.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 + + match mode: + 0, 1: + uv = "UV" + _: + uv = "vec2(0.0)" + + if input_vars[0]: + uv = input_vars[0] + + var center: String = input_vars[1] + var strength: String = input_vars[2] + var offset: String = input_vars[3] + + return output_vars[0] + " = swirl_uv(%s, %s, %s, %s);" % [uv, center, strength, offset] diff --git a/addons/ShaderLib/UV/SwirlUV.gdshaderinc b/addons/ShaderLib/UV/SwirlUV.gdshaderinc new file mode 100644 index 0000000..e277554 --- /dev/null +++ b/addons/ShaderLib/UV/SwirlUV.gdshaderinc @@ -0,0 +1,8 @@ +vec2 swirl_uv(vec2 uv, vec2 center, float strength, vec2 offset){ + vec2 _delta = uv - center; + float _inverse_length = 1.0 - length(_delta); + float _angle = strength * _inverse_length; + float _x = cos(_angle) * _delta.x - sin(_angle) * _delta.y; + float _y = sin(_angle) * _delta.x + cos(_angle) * _delta.y; + return vec2(_x + center.x + offset.x, _y + center.y + offset.y); +} \ No newline at end of file