Created
September 18, 2023 19:21
-
-
Save cmargroff/5657101aa5641fb62636801d441e2cce to your computer and use it in GitHub Desktop.
Polygon node for Godot Visual Shader
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@tool | |
class_name VisualShaderNodePolygon | |
extends VisualShaderNodeCustom | |
func _get_name(): | |
return "Polygon" | |
func _get_category(): | |
return "" | |
func _get_description(): | |
return "Draws a polygon" | |
func _get_return_icon_type(): | |
return PORT_TYPE_SCALAR | |
func _get_input_port_count(): | |
return 4 | |
func _get_input_port_name(port): | |
if (port == 0): return "UV" | |
if (port == 1): return "Sides" | |
if (port == 2): return "Width" | |
return "Height" | |
func _get_input_port_type(port): | |
if (port == 0): return PORT_TYPE_VECTOR_2D | |
return PORT_TYPE_SCALAR | |
func _get_output_port_count(): | |
return 1 | |
func _get_output_port_name(port): | |
return "Out" | |
func _get_output_port_type(port): | |
return PORT_TYPE_SCALAR | |
func _get_global_code(mode): | |
return "const float pi = 3.14159265359;" | |
func _get_code(input_vars, output_vars, | |
mode, type): | |
var UV = input_vars[0] | |
var Sides = input_vars[1] | |
var Width = input_vars[2] | |
var Height = input_vars[3] | |
var Out = output_vars[0] | |
return "float aw = %s * cos(pi / %s);\n" % [Width, Sides] \ | |
+ "float ah = %s * cos(pi / %s);\n" % [Height, Sides] \ | |
+ "vec2 uv = (%s * 2.0 - 1.0) / vec2(aw, ah);\n" % UV \ | |
+ "uv.y *= -1.0;\n" \ | |
+ "float coord = atan(uv.x, uv.y);\n" \ | |
+ "float r = 2.0 * pi / %s;\n" % Sides \ | |
+ "float d = cos(floor(0.5 + coord / r) * r - coord) * length(uv);\n" \ | |
+ Out + " = clamp((1.0 - d) / fwidth(d), 0.0, 1.0);" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment