From 69c260b1e8c4ca21457817c8a56ccf8b9a00e99e Mon Sep 17 00:00:00 2001
From: Tabby <41929769+tabby-cat-nya@users.noreply.github.com>
Date: Thu, 7 Aug 2025 11:34:04 +1000
Subject: [PATCH] added donut colisions
---
.editorconfig | 4 ++
.gitattributes | 4 +-
.gitignore | 3 ++
.../addons/donut_collision_polygon2D/LICENSE | 21 ++++++++
.../donut_collision_polygon2D/README.md | 26 ++++++++++
.../donut_collision_polygon2D.gd | 48 ++++++++++++++++++
.../donut_collision_polygon2D.gd.uid | 1 +
.../donut_collision_polygon2D.svg | 4 ++
.../donut_collision_polygon2D.svg.import | 37 ++++++++++++++
.../donut_collision_rectangle2D.gd | 46 +++++++++++++++++
.../donut_collision_rectangle2D.gd.uid | 1 +
.../donut_collision_rectangle2D.svg | 4 ++
.../donut_collision_rectangle2D.svg.import | 37 ++++++++++++++
.../donut_collision_polygon2D/plugin.cfg | 7 +++
.../donut_collision_polygon2D/plugin.gd | 11 ++++
.../donut_collision_polygon2D/plugin.gd.uid | 1 +
.../default_env.tres | 7 +++
.../example/example.tscn | 26 ++++++++++
.../example/example_area.gd | 16 ++++++
.../example/example_area.gd.uid | 1 +
.../example/example_square.tscn | 26 ++++++++++
.../example/icon.png | Bin 0 -> 3305 bytes
.../example/icon.png.import | 34 +++++++++++++
.../icon.png.import | 34 +++++++++++++
.../screenshots/.gdignore | 0
.../screenshots/donut_example.png | Bin 0 -> 17647 bytes
.../screenshots/donut_example.png.import | 34 +++++++++++++
.../screenshots/donut_rectangle.png | Bin 0 -> 1807 bytes
.../screenshots/tree_example.png | Bin 0 -> 4997 bytes
.../screenshots/tree_example.png.import | 34 +++++++++++++
icon.svg | 1 +
icon.svg.import | 37 ++++++++++++++
project.godot | 24 +++++++++
33 files changed, 527 insertions(+), 2 deletions(-)
create mode 100644 .editorconfig
create mode 100644 .gitignore
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/LICENSE
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/README.md
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.gd
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.gd.uid
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.svg
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.svg.import
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.gd
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.gd.uid
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.svg
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.svg.import
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.cfg
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.gd
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.gd.uid
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/default_env.tres
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example.tscn
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_area.gd
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_area.gd.uid
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_square.tscn
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/icon.png
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/icon.png.import
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/icon.png.import
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/.gdignore
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/donut_example.png
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/donut_example.png.import
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/donut_rectangle.png
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/tree_example.png
create mode 100644 addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/tree_example.png.import
create mode 100644 icon.svg
create mode 100644 icon.svg.import
create mode 100644 project.godot
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..f28239b
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,4 @@
+root = true
+
+[*]
+charset = utf-8
diff --git a/.gitattributes b/.gitattributes
index dfe0770..8ad74f7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,2 +1,2 @@
-# Auto detect text files and perform LF normalization
-* text=auto
+# Normalize EOL for all files that Git considers text files.
+* text=auto eol=lf
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0af181c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+# Godot 4+ specific ignores
+.godot/
+/android/
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/LICENSE b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/LICENSE
new file mode 100644
index 0000000..e7dab16
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 angrykoala
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/README.md b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/README.md
new file mode 100644
index 0000000..0a6b4ae
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/README.md
@@ -0,0 +1,26 @@
+# Donut Collision Polygon 2D for Godot
+_by @angrykoala_
+A donut-shaped collision shape for Godot.
+
+This plugin creates a new Node type for a donut collision shape for 2D collisions.
+
+
+
+
+
+## Instructions
+
+1. Add the folder `donut_collision_polygon2D` to `addons/`.
+2. Activate the plugin in [Godot](https://docs.godotengine.org/en/stable/tutorials/plugins/editor/installing_plugins.html).
+3. Create any collision or physics 2D node (e.g. `Area2D` or `RigidBody2D`).
+4. Add a `DonutCollisionPolygon2D` or `DonutCollisionRectangle2D` as child.
+
+
+## Properties
+
+* **radius**: Defines the radius of the donut. This will be the circumference at the **center** of the donut.
+* **width**: The width of the donut.
+* **quality**: The number of points to use **per circumference**. The total points count will be `quality*2+1`.
+
+## License
+Made by [@angrykoala](https://github.com/angrykoala). [MIT License](LICENSE)
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.gd b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.gd
new file mode 100644
index 0000000..b974b45
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.gd
@@ -0,0 +1,48 @@
+@tool
+class_name DonutCollisionPolygon2D
+extends CollisionPolygon2D
+## A Collider in the shape of a Donut
+
+@export var radius: float = 10.0:
+ set(rad):
+ radius = rad
+ update_polygons()
+@export var width: float = 2.0:
+ set(w):
+ width = w
+ update_polygons()
+@export_range(5, 256) var quality: int = 32:
+ set(q):
+ quality = q
+ update_polygons()
+
+
+func _ready() -> void:
+ build_mode = CollisionPolygon2D.BUILD_SOLIDS
+ update_polygons()
+
+
+func update_polygons() -> void:
+ var points := get_polygon_points(Vector2(0,0), radius)
+ polygon = points
+
+
+func get_polygon_points(center: Vector2, radius: float) -> PackedVector2Array:
+ var half_width := width / 2
+ var inner_circle := get_circle_points(center, radius - half_width)
+ var outer_circle := get_circle_points(center, radius + half_width)
+ inner_circle.reverse()
+ var points := PackedVector2Array()
+ points.append_array(outer_circle)
+ points.append_array(inner_circle)
+ points.append(outer_circle[0] + Vector2(0.0001, 0.0001))
+ return points
+
+
+func get_circle_points(center: Vector2, radius: float, angle_from: float = 0, angle_to: float = 360) -> PackedVector2Array:
+ var nb_points := 16
+ var points_arc := PackedVector2Array()
+ for i in range(quality + 1):
+ var angle_point := deg_to_rad(angle_from + i * (angle_to - angle_from) / quality - 90)
+ points_arc.push_back(center + Vector2(cos(angle_point), sin(angle_point)) * radius)
+ return points_arc
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.gd.uid b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.gd.uid
new file mode 100644
index 0000000..ac83647
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.gd.uid
@@ -0,0 +1 @@
+uid://deq18nev0kwbg
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.svg b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.svg
new file mode 100644
index 0000000..f9a8ea0
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.svg
@@ -0,0 +1,4 @@
+
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.svg.import b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.svg.import
new file mode 100644
index 0000000..9ef15e4
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bcwggi4xo00lm"
+path="res://.godot/imported/donut_collision_polygon2D.svg-84f3efc5ce2b2fce93bc5753624e2eb6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_polygon2D.svg"
+dest_files=["res://.godot/imported/donut_collision_polygon2D.svg-84f3efc5ce2b2fce93bc5753624e2eb6.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.gd b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.gd
new file mode 100644
index 0000000..d8d0d94
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.gd
@@ -0,0 +1,46 @@
+@tool
+class_name DonutCollisionRectangle
+extends CollisionPolygon2D
+## A Collider in the shape of a Rectangle with a hole in the middle
+
+@export var size := Vector2(10.0, 20.0):
+ set(new_size):
+ size = new_size
+ update_polygons()
+@export var width: float = 2.0:
+ set(new_width):
+ width = new_width
+ update_polygons()
+
+
+func _ready() -> void:
+ build_mode = CollisionPolygon2D.BUILD_SOLIDS
+ update_polygons()
+
+
+func update_polygons() -> void:
+ var points := get_rectangle_points(size)
+ polygon = points
+
+
+func get_rectangle_points(size: Vector2) -> PackedVector2Array:
+ var half_width := width / 2
+ var inner_rectangle := get_rectangle_corners(size - Vector2(half_width, half_width))
+ var outer_rectangle := get_rectangle_corners(size + Vector2(half_width, half_width))
+ inner_rectangle.reverse()
+ var points := PackedVector2Array()
+ points.append_array(outer_rectangle)
+ points.append(outer_rectangle[0]) # Connect the last point of the outer rectangle to the first point
+ points.append_array(inner_rectangle)
+ points.append(inner_rectangle[0]) # Connect the last point of the inner rectangle to the first point
+ return points
+
+
+func get_rectangle_corners(size: Vector2) -> PackedVector2Array:
+ var half_size := size / 2
+ var points := PackedVector2Array()
+ points.push_back(Vector2(-half_size.x, -half_size.y))
+ points.push_back(Vector2(half_size.x, -half_size.y))
+ points.push_back(Vector2(half_size.x, half_size.y))
+ points.push_back(Vector2(-half_size.x, half_size.y))
+ return points
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.gd.uid b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.gd.uid
new file mode 100644
index 0000000..e339419
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.gd.uid
@@ -0,0 +1 @@
+uid://dtfe5w8mxp05m
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.svg b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.svg
new file mode 100644
index 0000000..41bd76c
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.svg.import b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.svg.import
new file mode 100644
index 0000000..ab95bec
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dn8hljsdwd42q"
+path="res://.godot/imported/donut_collision_rectangle2D.svg-1850bd2eee6a5b0e414b6b5601b42d81.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/donut_collision_rectangle2D.svg"
+dest_files=["res://.godot/imported/donut_collision_rectangle2D.svg-1850bd2eee6a5b0e414b6b5601b42d81.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.cfg b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.cfg
new file mode 100644
index 0000000..6dac55d
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="DonutCollisionPolygon2D"
+description="A donut-shaped collision polygon"
+author="angrykoala"
+version="1.2"
+script="plugin.gd"
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.gd b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.gd
new file mode 100644
index 0000000..9f23fc6
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.gd
@@ -0,0 +1,11 @@
+@tool
+extends EditorPlugin
+
+func _enter_tree():
+ add_custom_type("DonutCollisionPolygon2D", "CollisionPolygon2D", preload("donut_collision_polygon2D.gd"), preload("donut_collision_polygon2D.svg"))
+ add_custom_type("DonutCollisionRectangle2D", "CollisionPolygon2D", preload("donut_collision_rectangle2D.gd"),preload("donut_collision_rectangle2D.svg"))
+
+
+func _exit_tree():
+ remove_custom_type("DonutCollisionPolygon2D")
+ remove_custom_type("DonutCollisionRectangle2D")
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.gd.uid b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.gd.uid
new file mode 100644
index 0000000..89fd2e8
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.gd.uid
@@ -0,0 +1 @@
+uid://be3xoruguvh4v
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/default_env.tres b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/default_env.tres
new file mode 100644
index 0000000..20207a4
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/default_env.tres
@@ -0,0 +1,7 @@
+[gd_resource type="Environment" load_steps=2 format=2]
+
+[sub_resource type="ProceduralSky" id=1]
+
+[resource]
+background_mode = 2
+background_sky = SubResource( 1 )
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example.tscn b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example.tscn
new file mode 100644
index 0000000..7540c60
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example.tscn
@@ -0,0 +1,26 @@
+[gd_scene load_steps=4 format=3 uid="uid://drd1j4dv673ld"]
+
+[ext_resource type="Script" path="res://example/example_area.gd" id="1"]
+[ext_resource type="Script" path="res://addons/donut_collision_polygon2D/donut_collision_polygon2D.gd" id="2"]
+[ext_resource type="Texture2D" uid="uid://xfkvttl8cxns" path="res://addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/icon.png" id="3"]
+
+[node name="Example" type="Node2D"]
+
+[node name="Area2D" type="Area2D" parent="."]
+script = ExtResource("1")
+
+[node name="DonutCollisionPolygon2D" type="CollisionPolygon2D" parent="Area2D"]
+polygon = PackedVector2Array(1.01033e-14, -165, 32.1899, -161.83, 63.1428, -152.44, 91.6691, -137.192, 116.673, -116.673, 137.192, -91.6691, 152.44, -63.1428, 161.83, -32.1899, 165, 0, 161.83, 32.1899, 152.44, 63.1428, 137.192, 91.6691, 116.673, 116.673, 91.6691, 137.192, 63.1428, 152.44, 32.1899, 161.83, 1.01033e-14, 165, -32.1899, 161.83, -63.1428, 152.44, -91.6691, 137.192, -116.673, 116.673, -137.192, 91.6691, -152.44, 63.1428, -161.83, 32.1899, -165, 2.02067e-14, -161.83, -32.1899, -152.44, -63.1428, -137.192, -91.6691, -116.673, -116.673, -91.6691, -137.192, -63.1428, -152.44, -32.1899, -161.83, -3.031e-14, -165, -2.47991e-14, -135, -26.3372, -132.406, -51.6623, -124.724, -75.002, -112.248, -95.4594, -95.4594, -112.248, -75.002, -124.724, -51.6623, -132.406, -26.3372, -135, 1.65327e-14, -132.406, 26.3372, -124.724, 51.6623, -112.248, 75.002, -95.4594, 95.4594, -75.002, 112.248, -51.6623, 124.724, -26.3372, 132.406, 8.26637e-15, 135, 26.3372, 132.406, 51.6623, 124.724, 75.002, 112.248, 95.4594, 95.4594, 112.248, 75.002, 124.724, 51.6623, 132.406, 26.3372, 135, 0, 132.406, -26.3372, 124.724, -51.6623, 112.248, -75.002, 95.4594, -95.4594, 75.002, -112.248, 51.6623, -124.724, 26.3372, -132.406, 8.26637e-15, -135, 0.0001, -165)
+script = ExtResource("2")
+radius = 150.0
+width = 30.0
+
+[node name="Camera2D" type="Camera2D" parent="."]
+
+[node name="icon" type="Sprite2D" parent="."]
+scale = Vector2(3, 3)
+texture = ExtResource("3")
+
+[connection signal="input_event" from="Area2D" to="Area2D" method="_on_input_event"]
+[connection signal="mouse_entered" from="Area2D" to="Area2D" method="_on_mouse_enter"]
+[connection signal="mouse_exited" from="Area2D" to="Area2D" method="_on_mouse_exit"]
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_area.gd b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_area.gd
new file mode 100644
index 0000000..4215bbc
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_area.gd
@@ -0,0 +1,16 @@
+extends Area2D
+
+
+func _on_mouse_enter() -> void:
+ print("Mouse Enter")
+
+
+func _on_mouse_exit() -> void:
+ print("Mouse Exit")
+
+
+func _on_input_event(_viewport: Node, event: InputEvent, _shape_idx: int) -> void:
+ if event is InputEventMouseButton \
+ and event.button_index == MOUSE_BUTTON_LEFT \
+ and event.is_pressed():
+ print("On Mouse Click")
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_area.gd.uid b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_area.gd.uid
new file mode 100644
index 0000000..380653d
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_area.gd.uid
@@ -0,0 +1 @@
+uid://duxotjfepjkfh
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_square.tscn b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_square.tscn
new file mode 100644
index 0000000..8d45193
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/example_square.tscn
@@ -0,0 +1,26 @@
+[gd_scene load_steps=4 format=3 uid="uid://vogtjcpnjohc"]
+
+[ext_resource type="Script" path="res://example/example_area.gd" id="1_fnxl8"]
+[ext_resource type="Script" path="res://addons/donut_collision_polygon2D/donut_collision_rectangle2D.gd" id="2_xud1h"]
+[ext_resource type="Texture2D" uid="uid://xfkvttl8cxns" path="res://addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/icon.png" id="3_qnowy"]
+
+[node name="ExampleSquare" type="Node2D"]
+
+[node name="Area2D" type="Area2D" parent="."]
+script = ExtResource("1_fnxl8")
+
+[node name="DonutCollisionRectangle2D" type="CollisionPolygon2D" parent="Area2D"]
+polygon = PackedVector2Array(-160, -160, 160, -160, 160, 160, -160, 160, -160, -160, -140, 140, 140, 140, 140, -140, -140, -140, -140, 140)
+script = ExtResource("2_xud1h")
+size = Vector2(300, 300)
+width = 40.0
+
+[node name="Camera2D" type="Camera2D" parent="."]
+
+[node name="icon" type="Sprite2D" parent="."]
+scale = Vector2(3, 3)
+texture = ExtResource("3_qnowy")
+
+[connection signal="input_event" from="Area2D" to="Area2D" method="_on_input_event"]
+[connection signal="mouse_entered" from="Area2D" to="Area2D" method="_on_mouse_enter"]
+[connection signal="mouse_exited" from="Area2D" to="Area2D" method="_on_mouse_exit"]
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/icon.png b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c98fbb601c83c81ec8c22b1dba7d1d57c62b323c
GIT binary patch
literal 3305
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
literal 0
HcmV?d00001
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/icon.png.import b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/icon.png.import
new file mode 100644
index 0000000..8240509
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/icon.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://xfkvttl8cxns"
+path="res://.godot/imported/icon.png-7eea17e57ed3675faa8b72817d0880ed.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/example/icon.png"
+dest_files=["res://.godot/imported/icon.png-7eea17e57ed3675faa8b72817d0880ed.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/icon.png.import b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/icon.png.import
new file mode 100644
index 0000000..8696800
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/icon.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://byywtrj3eq3wm"
+path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/.gdignore b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/.gdignore
new file mode 100644
index 0000000..e69de29
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/donut_example.png b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/donut_example.png
new file mode 100644
index 0000000000000000000000000000000000000000..60217b0d514a1308b87f4828d544f267ca81d537
GIT binary patch
literal 17647
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
literal 0
HcmV?d00001
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/donut_example.png.import b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/donut_example.png.import
new file mode 100644
index 0000000..0a48c9b
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/donut_example.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/donut_example.png-e10c5658522da25266912e65fd566f17.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/donut_example.png"
+dest_files=[ "res://.import/donut_example.png-e10c5658522da25266912e65fd566f17.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/donut_rectangle.png b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/donut_rectangle.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b25e75afcd059552b905a2561a1630398fb6a3c
GIT binary patch
literal 1807
zcmchYeM}Q~7{?DikwXw{!%K!tvbAN3Kt~5;F(^2(6c81GK?Ap<_F$AZDFGR8+VB!}
z>KsBTFS5mCD6@2f9mDkoIi@4d0~d6yEuhETaE2D^kd{msJE=>434boxA9ug|eeyiN
z=lgx`x!kD(2|`!r*PI~;auvnwNrWH=9rHZuw1&C6oc?A%vpC2Tg}b5d(aleo4V)FV
zFA9RbKEGixa~-os3S-jb5ah{yc{zv@ITi-8ilbAD4;5g=rI|%iNLVD5=F77SiqT{z
zCdIK%v?nU*IBLE}p7oWw*B*2)zwhpNSg_sCDJu%Hp5{{}fBLNtk({Y4v=<1BDx
z1s^gt0wfjn@fI;Lgj>JE!sLM!avrJAue_u>J2`H9DxTk)S2w!$9?$#?HZGbg51GbZV6&NP{64ppTn%hj{l3K1euYrDp
zjQsb=+*TS-0;qC?O?Y1Y3jX0JE1l!*^oc!I8Nnj@s(~=O9@9k{ZwG6blr$azf)&M5
zJQ$$4n`nF=NI7hxFJqOq8ipPOsIo$#@4K?f
z*d_$kmVseg8IT76yHl4~i_sMc46$4q
zM1>b5evyhZ@LC5}`ZVvjxy3n-AI~H0d6(IQ^;ZzET;P~O)g>BNCZ{SgLy({q@NT3+
zkAjV}XAj4`9C=_aHuFf?ovu|ac$0hF{KTV4(j5Ov$3~{Z{wY9#6^*x_u?Xu$Pz^K1
zMlY~{eLk-sXgRUU+{QK<7j6U9>>y=spbdMKDaNw_tdhmp=mh1hjAhZMum%Uim~YKE
zygIB4)?|QH+X6`$_{Qw5@@JfYjVT(1HB05T`Fgi?(--I>BfPwHH+*KpNbWSJzl~20
zPPQ5{b;j_ctVI)E8rpkA9nIf?RE-(gEe1rFjN{FQnY6gy
zbPe>f9v!04IdMRE3vAQ2swxT3k@4AiUVnyxGCjjTdT>+|M4G?Ausa#I{|GG)MDo4f
z5ooK_ox%5Su_tDwSl>-?YR7<_Nf@SbJMf{ZW1X>u+FDgwP9W}Pc0uy1^Rcij_4T~<
z3575A3wm$Ko~eC}P$Jux
literal 0
HcmV?d00001
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/tree_example.png b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/tree_example.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f125aa91a425edefece7f0929eb0504e7f8b37a
GIT binary patch
literal 4997
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
literal 0
HcmV?d00001
diff --git a/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/tree_example.png.import b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/tree_example.png.import
new file mode 100644
index 0000000..6a1a279
--- /dev/null
+++ b/addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/screenshots/tree_example.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/tree_example.png-30e5634b0df2b8ed1a0c3af2929c3498.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/tree_example.png"
+dest_files=[ "res://.import/tree_example.png-30e5634b0df2b8ed1a0c3af2929c3498.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/icon.svg b/icon.svg
new file mode 100644
index 0000000..9d8b7fa
--- /dev/null
+++ b/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icon.svg.import b/icon.svg.import
new file mode 100644
index 0000000..1a55945
--- /dev/null
+++ b/icon.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dyxnlko6tpmui"
+path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.svg"
+dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/project.godot b/project.godot
new file mode 100644
index 0000000..089154d
--- /dev/null
+++ b/project.godot
@@ -0,0 +1,24 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+; [section] ; section goes between []
+; param=value ; assign values to parameters
+
+config_version=5
+
+[application]
+
+config/name="Snake"
+config/features=PackedStringArray("4.4", "GL Compatibility")
+config/icon="res://icon.svg"
+
+[editor_plugins]
+
+enabled=PackedStringArray("res://addons/godot-donut-collision-polygon-2d-7780d026ae3d4a37fe68f43cc1f97ba664dd775d/addons/donut_collision_polygon2D/plugin.cfg")
+
+[rendering]
+
+renderer/rendering_method="gl_compatibility"
+renderer/rendering_method.mobile="gl_compatibility"