Skip to content

Instantly share code, notes, and snippets.

@cmargroff
Created September 18, 2023 19:21
Show Gist options
  • Save cmargroff/5657101aa5641fb62636801d441e2cce to your computer and use it in GitHub Desktop.
Save cmargroff/5657101aa5641fb62636801d441e2cce to your computer and use it in GitHub Desktop.
Polygon node for Godot Visual Shader
@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