Skip to content

Instantly share code, notes, and snippets.

@deakcor
Created August 13, 2025 09:00
Show Gist options
  • Select an option

  • Save deakcor/9643a2d6355b1ba1d617522e5eb98ab2 to your computer and use it in GitHub Desktop.

Select an option

Save deakcor/9643a2d6355b1ba1d617522e5eb98ab2 to your computer and use it in GitHub Desktop.
Donut arc shape 2D for Godot
#Donut arc shape 2D.
#License: CC0
#https://creativecommons.org/publicdomain/zero/1.0/
@tool
extends ConvexPolygonShape2D
class_name DonutArcShape2D
@export var inner_radius: float : set = set_inner_radius
@export var outer_radius: float : set = set_outer_radius
@export var start_angle_degree: float : set = set_start_angle_degree
@export var end_angle_degree: float : set = set_end_angle_degree
@export var point_count: int : set = set_point_count
func set_inner_radius(value: float) -> void:
if inner_radius != value:
inner_radius = value
_rebuild()
func set_outer_radius(value: float) -> void:
if outer_radius != value:
outer_radius = value
_rebuild()
func set_start_angle_degree(value: float) -> void:
if start_angle_degree != value:
start_angle_degree = value
_rebuild()
func set_end_angle_degree(value: float) -> void:
if end_angle_degree != value:
end_angle_degree = value
_rebuild()
func set_point_count(value: int) -> void:
if point_count != value:
point_count = value
_rebuild()
func _rebuild():
points = create_circle_arc_band(Vector2.ZERO, inner_radius, outer_radius, deg_to_rad(start_angle_degree), deg_to_rad(end_angle_degree), point_count)
emit_changed()
func create_circle_arc_band(center: Vector2, inner_radius: float, outer_radius: float, start_angle: float, end_angle: float, point_count: int) -> Array:
var points: Array = []
points.resize((point_count + 1) * 2) # Outer arc + inner arc
var delta_angle = end_angle - start_angle
# Outer arc points
for i in range(point_count + 1):
var theta = (float(i) / float(point_count)) * delta_angle + start_angle
points[i] = center + Vector2(cos(theta), sin(theta)) * outer_radius
# Inner arc points (reverse direction to close shape properly)
for i in range(point_count + 1):
var theta = (float(point_count - i) / float(point_count)) * delta_angle + start_angle
points[point_count + 1 + i] = center + Vector2(cos(theta), sin(theta)) * inner_radius
return points
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment