Created
August 13, 2025 09:00
-
-
Save deakcor/9643a2d6355b1ba1d617522e5eb98ab2 to your computer and use it in GitHub Desktop.
Donut arc shape 2D for Godot
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
| #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