1
0
mirror of https://github.com/DigvijaysinhGohil/Godot-Shader-Lib.git synced 2025-01-05 00:53:36 +08:00

Merge branch 'godot-4.2'

This commit is contained in:
Digvijaysinh Gohil 2024-07-03 00:29:20 +05:30
commit 506c677307
22 changed files with 321 additions and 48 deletions

View File

@ -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]

View File

@ -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);
}

View File

@ -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]

View File

@ -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);
}

View File

@ -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]

View File

@ -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));
}

View File

@ -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]

View File

@ -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)));
}

View File

@ -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]

View File

@ -0,0 +1,3 @@
vec4 sawtooth_wave(vec4 input) {
return 2. * (input - floor(.5 + input));
}

View File

@ -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]

View File

@ -0,0 +1,3 @@
vec4 square_wave(vec4 input) {
return 1. - 2. * round(fract(input));
}

View File

@ -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]

View File

@ -0,0 +1,3 @@
vec4 triangle_wave(vec4 input) {
return 2. * abs(2. * (input - floor(.5 + input))) - 1.;
}

View File

@ -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 `
<h2>Maths nodes</h2>
<h3>&emsp;Scalar</h3>
<h4><a href="/documentation/Nodes/Maths/Scalar/SmoothMax.md">&emsp;&emsp;SmoothMax node</a></h4>
<h4><a href="/documentation/Nodes/Maths/Scalar/SmoothMin.md">&emsp;&emsp;SmoothMin node</a></h4>
<h3>&emsp;Vector</h3>
<h3>&emsp;&emsp;Distance</h3>

View File

@ -0,0 +1,29 @@
# SmoothMax node
Returns the maximum value between A and B, but smooths out the intersections of A and B based on T. T is the smoothing value. If 0 is passed at T, function will act as a standard max(), if negative value is passed it will act as <b><i>[SmoothMin node](/documentation/Nodes/Maths/Scalar/SmoothMin.md)</b></i>.
<hr>
**Inputs**
|Name|Type|Binding|Description|
|---|---|---|---|
|a|float|none|Input A|
|b|float|none|Input B|
|t|float|none|Smoothing input|
**Outputs**
|Name|Type|Binding|Description|
|---|---|---|---|
|op|float|None|Smooth maximum between A and B|
**ShaderInc location**
<br>`res://addons/ShaderLib/Maths/Scalar/SmoothMax.gdshaderinc`
**Method signature**
<br>`float smoothmax(float a, float b, float t)`
**Parameters**
|Name|Type|Description|
|---|---|---|
|a|float|Input A|
|b|float|Input B|
|t|float|Smoothing input|
___

View File

@ -0,0 +1,29 @@
# SmoothMin node
Returns the minimum value between A and B, but smooths out the intersections of A and B based on T. T is the smoothing value. If 0 is passed at T, function will act as a standard min(), if negative value is passed it will act as <b><i>[SmoothMax node](/documentation/Nodes/Maths/Scalar/SmoothMax.md)</b></i>.
<hr>
**Inputs**
|Name|Type|Binding|Description|
|---|---|---|---|
|a|float|none|Input A|
|b|float|none|Input B|
|t|float|none|Smoothing input|
**Outputs**
|Name|Type|Binding|Description|
|---|---|---|---|
|op|float|None|Smooth minimum between A and B|
**ShaderInc location**
<br>`res://addons/ShaderLib/Maths/Scalar/SmoothMin.gdshaderinc`
**Method signature**
<br>`float smoothmin(float a, float b, float t)`
**Parameters**
|Name|Type|Description|
|---|---|---|
|a|float|Input A|
|b|float|Input B|
|t|float|Smoothing input|
___

View File

@ -17,4 +17,23 @@ Projects <i><b>vector A</b></i> onto <i><b>vector B</b></i>.
|Name|Type|Binding|Description|
|---|---|---|---|
|vector|vector3|None|Output vector|
**ShaderInc location**
<br>`res://addons/ShaderLib/Maths/Vector/Project.gdshaderinc`
**Method signature**
<br>`vec2 project_2d(vec2 a, vec2 b)`
<br>`vec3 project_3d(vec3 a, vec3 b)`
**Parameters for 2D**
|Name|Type|Description|
|---|---|---|
|a|vec2|Vector A|
|b|vec2|Vector B|
**Parameters for 3D**
|Name|Type|Description|
|---|---|---|
|a|vec3|Vector A|
|b|vec3|Vector B|
___

View File

@ -2,19 +2,26 @@
Projects a vector onto a plane defined by a normal orthogonal to the plane.
<hr>
**Controls**
|Options|Description|
|---|---|
|Vector2, Vector3|Vector type to use for calculation|
**Inputs**
|Name|Type|Binding|Description|
|---|---|---|---|
|vector|Dynamic vector|none|Vector to project|
|plane normal|Dynamic vector|none|Normal orthogonal of the plane|
|vector|vector3|none|Vector to project|
|plane normal|vector3|none|Normal orthogonal of the plane|
**Outputs**
|Name|Type|Binding|Description|
|---|---|---|---|
|vector|vector3|None|Output vector|
**ShaderInc location**
<br>`res://addons/ShaderLib/Maths/Vector/ProjectOnPlane.gdshaderinc`
**Method signature**
<br>`vec3 project_on_plane(vec3 vector, vec3 plane_normal)`
**Parameters**
|Name|Type|Description|
|---|---|---|
|vector|vec3|Input vector|
|plane_normal|vec3|Normal vector to the plane|
___

View File

@ -16,4 +16,15 @@ Returns a sawtooth wave from the value of input <b><i>in</i></b>. Resulting outp
|Name|Type|Binding|Description|
|---|---|---|---|
|out|Dynamic vector|None|Output value|
**ShaderInc location**
<br>`res://addons/ShaderLib/Maths/Wave/SawtoothWave.gdshaderinc`
**Method signature**
<br>`vec4 sawtooth_wave(vec4 input)`
**Parameters**
|Name|Type|Description|
|---|---|---|
|input|vec4|Input vector|
___

View File

@ -16,4 +16,15 @@ Returns a square wave from the value of input <b><i>in</i></b>. Resulting output
|Name|Type|Binding|Description|
|---|---|---|---|
|out|Dynamic vector|None|Output value|
**ShaderInc location**
<br>`res://addons/ShaderLib/Maths/Wave/SquareWave.gdshaderinc`
**Method signature**
<br>`vec4 square _wave(vec4 input)`
**Parameters**
|Name|Type|Description|
|---|---|---|
|input|vec4|Input vector|
___

View File

@ -16,4 +16,15 @@ Returns a triangle wave from the value of input <b><i>in</i></b>. Resulting outp
|Name|Type|Binding|Description|
|---|---|---|---|
|out|Dynamic vector|None|Output value|
**ShaderInc location**
<br>`res://addons/ShaderLib/Maths/Wave/TriangleWave.gdshaderinc`
**Method signature**
<br>`vec4 triangle_wave(vec4 input)`
**Parameters**
|Name|Type|Description|
|---|---|---|
|input|vec4|Input vector|
___