diff --git a/addons/ShaderLib/Maths/Scalar/SmoothMax.gd b/addons/ShaderLib/Maths/Scalar/SmoothMax.gd new file mode 100644 index 0000000..11da039 --- /dev/null +++ b/addons/ShaderLib/Maths/Scalar/SmoothMax.gd @@ -0,0 +1,56 @@ +@tool +class_name VisualShaderNodeScalarSmoothMax extends VisualShaderNodeCustom + +func _get_name() -> String: + return "SmoothMax" + +func _get_category() -> String: + return "Maths/Scalar" + +func _get_description() -> String: + return "Returns the maximum value between A and B, but smooths out the intersections of A and B based on T." + +func _get_return_icon_type() -> PortType: + return PORT_TYPE_SCALAR + +func _get_input_port_count() -> int: + return 3 + +func _get_input_port_name(port: int) -> String: + match port: + 0: + return "a" + 1: + return "b" + _: + return "t" + +func _get_input_port_type(port: int) -> PortType: + return PORT_TYPE_SCALAR + +func _get_input_port_default_value(port: int) -> Variant: + match port: + 2: + return 0.5 + _: + return 0.0 + +func _get_output_port_count() -> int: + return 1 + +func _get_output_port_name(port: int) -> String: + return "op" + +func _get_output_port_type(port: int) -> PortType: + return PORT_TYPE_SCALAR + +func _get_global_code(mode: Shader.Mode) -> String: + var code: String = preload("SmoothMax.gdshaderinc").code + return code + +func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shader.Mode, type: VisualShader.Type) -> String: + var a: String = input_vars[0] + var b: String = input_vars[1] + var t: String = input_vars[2] + + return output_vars[0] + " = smoothmax(%s, %s, %s);" % [a, b, t] diff --git a/addons/ShaderLib/Maths/Scalar/SmoothMax.gdshaderinc b/addons/ShaderLib/Maths/Scalar/SmoothMax.gdshaderinc new file mode 100644 index 0000000..0c1dcf0 --- /dev/null +++ b/addons/ShaderLib/Maths/Scalar/SmoothMax.gdshaderinc @@ -0,0 +1,4 @@ +float smoothmax(float a, float b, float t) { + float h = clamp(.5 + .5 * (b - a) / -t, 0, 1); + return mix(b, a, h) + t * h * (1. - h); +} \ No newline at end of file diff --git a/addons/ShaderLib/Maths/Scalar/SmoothMin.gd b/addons/ShaderLib/Maths/Scalar/SmoothMin.gd new file mode 100644 index 0000000..19b0d17 --- /dev/null +++ b/addons/ShaderLib/Maths/Scalar/SmoothMin.gd @@ -0,0 +1,56 @@ +@tool +class_name VisualShaderNodeScalarSmoothMin extends VisualShaderNodeCustom + +func _get_name() -> String: + return "SmoothMin" + +func _get_category() -> String: + return "Maths/Scalar" + +func _get_description() -> String: + return "Returns the minimum value between A and B, but smooths out the intersections of A and B based on T." + +func _get_return_icon_type() -> PortType: + return PORT_TYPE_SCALAR + +func _get_input_port_count() -> int: + return 3 + +func _get_input_port_name(port: int) -> String: + match port: + 0: + return "a" + 1: + return "b" + _: + return "t" + +func _get_input_port_type(port: int) -> PortType: + return PORT_TYPE_SCALAR + +func _get_input_port_default_value(port: int) -> Variant: + match port: + 2: + return 0.5 + _: + return 0.0 + +func _get_output_port_count() -> int: + return 1 + +func _get_output_port_name(port: int) -> String: + return "op" + +func _get_output_port_type(port: int) -> PortType: + return PORT_TYPE_SCALAR + +func _get_global_code(mode: Shader.Mode) -> String: + var code: String = preload("SmoothMin.gdshaderinc").code + return code + +func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shader.Mode, type: VisualShader.Type) -> String: + var a: String = input_vars[0] + var b: String = input_vars[1] + var t: String = input_vars[2] + + return output_vars[0] + " = smoothmin(%s, %s, %s);" % [a, b, t] diff --git a/addons/ShaderLib/Maths/Scalar/SmoothMin.gdshaderinc b/addons/ShaderLib/Maths/Scalar/SmoothMin.gdshaderinc new file mode 100644 index 0000000..e9c7621 --- /dev/null +++ b/addons/ShaderLib/Maths/Scalar/SmoothMin.gdshaderinc @@ -0,0 +1,4 @@ +float smoothmin(float a, float b, float t) { + float h = clamp(.5 + .5 * (b - a) / t, 0, 1); + return mix(b, a, h) - t * h * (1. - h); +} \ No newline at end of file diff --git a/addons/ShaderLib/Maths/Vector/Project.gd b/addons/ShaderLib/Maths/Vector/Project.gd index 6333216..27c0c7a 100644 --- a/addons/ShaderLib/Maths/Vector/Project.gd +++ b/addons/ShaderLib/Maths/Vector/Project.gd @@ -62,6 +62,10 @@ func _get_property_name(index: int) -> String: func _get_property_options(index: int) -> PackedStringArray: return ["Vector2", "Vector3"] +func _get_global_code(mode: Shader.Mode) -> String: + var code: String = preload("Project.gdshaderinc").code + return code + func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shader.Mode, type: VisualShader.Type) -> String: var vector_a: String = input_vars[0] var vector_b: String = input_vars[1] @@ -69,6 +73,6 @@ func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shad match vector_index: 0: - return output_vars[0] + " = vec2(%s.xy) * (dot(%s.xy, %s.xy) / dot(%s.xy, %s.xy));" % [vector_b, vector_a, vector_b, vector_b, vector_b] + return output_vars[0] + " = project_2d(%s, %s);" % [vector_a, vector_b] _: - return output_vars[0] + " = %s * (dot(%s, %s) / dot(%s, %s));" % [vector_b, vector_a, vector_b, vector_b, vector_b] + return output_vars[0] + " = project_3d(%s, %s);" % [vector_a, vector_b] diff --git a/addons/ShaderLib/Maths/Vector/Project.gdshaderinc b/addons/ShaderLib/Maths/Vector/Project.gdshaderinc new file mode 100644 index 0000000..b3b27ae --- /dev/null +++ b/addons/ShaderLib/Maths/Vector/Project.gdshaderinc @@ -0,0 +1,7 @@ +vec2 project_2d(vec2 a, vec2 b) { + return b * (dot(a, b) / dot(b, b)); +} + +vec3 project_3d(vec3 a, vec3 b) { + return b * (dot(a, b) / dot(b, b)); +} \ No newline at end of file diff --git a/addons/ShaderLib/Maths/Vector/ProjectOnPlane.gd b/addons/ShaderLib/Maths/Vector/ProjectOnPlane.gd index 4abdfa0..fb60ab0 100644 --- a/addons/ShaderLib/Maths/Vector/ProjectOnPlane.gd +++ b/addons/ShaderLib/Maths/Vector/ProjectOnPlane.gd @@ -11,12 +11,7 @@ func _get_description() -> String: return "Projects a vector onto a plane defined by a normal orthogonal to the plane." func _get_return_icon_type() -> PortType: - var vector_index: int = get_option_index(0) - match vector_index: - 0: - return PORT_TYPE_VECTOR_2D - _: - return PORT_TYPE_VECTOR_3D + return PORT_TYPE_VECTOR_3D func _get_input_port_count() -> int: return 2 @@ -29,12 +24,7 @@ func _get_input_port_name(port: int) -> String: return "plane normal" func _get_input_port_type(port: int) -> PortType: - var vector_index: int = get_option_index(0) - match vector_index: - 0: - return PORT_TYPE_VECTOR_2D - _: - return PORT_TYPE_VECTOR_3D + return PORT_TYPE_VECTOR_3D func _get_output_port_count() -> int: return 1 @@ -43,31 +33,13 @@ func _get_output_port_name(port: int) -> String: return "vector" func _get_output_port_type(port: int) -> PortType: - var vector_index: int = get_option_index(0) - match vector_index: - 0: - return PORT_TYPE_VECTOR_2D - _: - return PORT_TYPE_VECTOR_3D + return PORT_TYPE_VECTOR_3D -func _get_property_count() -> int: - return 1 - -func _get_property_default_index(index: int) -> int: - return 0 - -func _get_property_name(index: int) -> String: - return "" - -func _get_property_options(index: int) -> PackedStringArray: - return ["Vector2", "Vector3"] +func _get_global_code(mode: Shader.Mode) -> String: + var code: String = preload("ProjectOnPlane.gdshaderinc").code + return code func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shader.Mode, type: VisualShader.Type) -> String: var vector_a: String = input_vars[0] var plane_normal: String = input_vars[1] - var vector_index: int = get_option_index(0) - match vector_index: - 0: - return output_vars[0] + " = %s.xy - (%s.xy * (dot(%s.xy, %s.xy) / dot(%s.xy, %s.xy)));" % [vector_a, plane_normal, vector_a, plane_normal, plane_normal, plane_normal] - _: - return output_vars[0] + " = %s - (%s * (dot(%s, %s) / dot(%s, %s)));" % [vector_a, plane_normal, vector_a, plane_normal, plane_normal, plane_normal] + return output_vars[0] + " = project_on_plane(%s, %s);" % [vector_a, plane_normal] diff --git a/addons/ShaderLib/Maths/Vector/ProjectOnPlane.gdshaderinc b/addons/ShaderLib/Maths/Vector/ProjectOnPlane.gdshaderinc new file mode 100644 index 0000000..ba49e1c --- /dev/null +++ b/addons/ShaderLib/Maths/Vector/ProjectOnPlane.gdshaderinc @@ -0,0 +1,3 @@ +vec3 project_on_plane(vec3 vector, vec3 plane_normal) { + return vector - (plane_normal * (dot(vector, plane_normal) / dot(plane_normal, plane_normal))); +} \ No newline at end of file diff --git a/addons/ShaderLib/Maths/Wave/SawtoothWave.gd b/addons/ShaderLib/Maths/Wave/SawtoothWave.gd index 2b82b9f..f487fb4 100644 --- a/addons/ShaderLib/Maths/Wave/SawtoothWave.gd +++ b/addons/ShaderLib/Maths/Wave/SawtoothWave.gd @@ -70,6 +70,10 @@ func _get_property_name(index: int) -> String: func _get_property_options(index: int) -> PackedStringArray: return ["Vector1", "Vector2", "Vector3", "Vector4"] +func _get_global_code(mode: Shader.Mode) -> String: + var code: String = preload("SawtoothWave.gdshaderinc").code + return code + func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shader.Mode, type: VisualShader.Type) -> String: var input: String var vector_index: int = get_option_index(0) @@ -86,4 +90,12 @@ func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shad if input_vars[0]: input = input_vars[0] - return output_vars[0] + " = 2.0 * (%s - floor(0.5 + %s));" % [input, input] + match vector_index: + 0: + return output_vars[0] + " = sawtooth_wave(vec4(%s)).x;" % [input] + 1: + return output_vars[0] + " = sawtooth_wave(vec4(%s, 0.0, 0.0)).xy;" % [input] + 2: + return output_vars[0] + " = sawtooth_wave(vec4(%s, 0.0)).xyz;" % [input] + _: + return output_vars[0] + " = sawtooth_wave(%s);" % [input] diff --git a/addons/ShaderLib/Maths/Wave/SawtoothWave.gdshaderinc b/addons/ShaderLib/Maths/Wave/SawtoothWave.gdshaderinc new file mode 100644 index 0000000..f27a23f --- /dev/null +++ b/addons/ShaderLib/Maths/Wave/SawtoothWave.gdshaderinc @@ -0,0 +1,3 @@ +vec4 sawtooth_wave(vec4 input) { + return 2. * (input - floor(.5 + input)); +} \ No newline at end of file diff --git a/addons/ShaderLib/Maths/Wave/SquareWave.gd b/addons/ShaderLib/Maths/Wave/SquareWave.gd index 3d6e2f4..24c3628 100644 --- a/addons/ShaderLib/Maths/Wave/SquareWave.gd +++ b/addons/ShaderLib/Maths/Wave/SquareWave.gd @@ -71,6 +71,10 @@ func _get_property_name(index: int) -> String: func _get_property_options(index: int) -> PackedStringArray: return ["Vector1", "Vector2", "Vector3", "Vector4"] +func _get_global_code(mode: Shader.Mode) -> String: + var code: String = preload("SquareWave.gdshaderinc").code + return code + func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shader.Mode, type: VisualShader.Type) -> String: var input: String var vector_index: int = get_option_index(0) @@ -87,4 +91,12 @@ func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shad if input_vars[0]: input = input_vars[0] - return output_vars[0] + " = 1.0 - 2.0 * round(fract(%s));" % [input] + match vector_index: + 0: + return output_vars[0] + " = square_wave(vec4(%s)).x;" % [input] + 1: + return output_vars[0] + " = square_wave(vec4(%s, 0.0, 0.0)).xy;" % [input] + 2: + return output_vars[0] + " = square_wave(vec4(%s, 0.0)).xyz;" % [input] + _: + return output_vars[0] + " = square_wave(%s);" % [input] diff --git a/addons/ShaderLib/Maths/Wave/SquareWave.gdshaderinc b/addons/ShaderLib/Maths/Wave/SquareWave.gdshaderinc new file mode 100644 index 0000000..dc376d0 --- /dev/null +++ b/addons/ShaderLib/Maths/Wave/SquareWave.gdshaderinc @@ -0,0 +1,3 @@ +vec4 square_wave(vec4 input) { + return 1. - 2. * round(fract(input)); +} \ No newline at end of file diff --git a/addons/ShaderLib/Maths/Wave/TriangleWave.gd b/addons/ShaderLib/Maths/Wave/TriangleWave.gd index 07d3d3e..b5d4328 100644 --- a/addons/ShaderLib/Maths/Wave/TriangleWave.gd +++ b/addons/ShaderLib/Maths/Wave/TriangleWave.gd @@ -69,6 +69,10 @@ func _get_property_name(index: int) -> String: func _get_property_options(index: int) -> PackedStringArray: return ["Vector1", "Vector2", "Vector3", "Vector4"] +func _get_global_code(mode: Shader.Mode) -> String: + var code: String = preload("TriangleWave.gdshaderinc").code + return code + func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shader.Mode, type: VisualShader.Type) -> String: var input: String var vector_index: int = get_option_index(0) @@ -85,4 +89,12 @@ func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shad if input_vars[0]: input = input_vars[0] - return output_vars[0] + " = 2.0 * abs(2.0 * (%s - floor(0.5 + %s))) - 1.0;" % [input, input] + match vector_index: + 0: + return output_vars[0] + " = triangle_wave(vec4(%s)).x;" % [input] + 1: + return output_vars[0] + " = triangle_wave(vec4(%s, 0.0, 0.0)).xy;" % [input] + 2: + return output_vars[0] + " = triangle_wave(vec4(%s, 0.0)).xyz;" % [input] + _: + return output_vars[0] + " = triangle_wave(%s);" % [input] diff --git a/addons/ShaderLib/Maths/Wave/TriangleWave.gdshaderinc b/addons/ShaderLib/Maths/Wave/TriangleWave.gdshaderinc new file mode 100644 index 0000000..2642c07 --- /dev/null +++ b/addons/ShaderLib/Maths/Wave/TriangleWave.gdshaderinc @@ -0,0 +1,3 @@ +vec4 triangle_wave(vec4 input) { + return 2. * abs(2. * (input - floor(.5 + input))) - 1.; +} \ No newline at end of file diff --git a/documentation/Documentation.md b/documentation/Documentation.md index fd387e7..b55c4c3 100644 --- a/documentation/Documentation.md +++ b/documentation/Documentation.md @@ -1,5 +1,5 @@ # Installation -Copy the contents of **_addons/ShaderLib_** into the same folder in your project. No activation needed. Custom visual shader nodes work the same way as standard visual shader nodes. +Hit download as zip button in the git repo. Copy the contents of **_addons/ShaderLib_** into the same folder in your project. No activation needed. Custom visual shader nodes work the same way as standard visual shader nodes. If you don't immediatly see new nodes under **_Addons_** category, simply reload your project. # Uninstallation @@ -30,6 +30,11 @@ For example if you want to rotate UV in your **_.gdshader_** file, you can use `