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. + +![Donut Example](screenshots/donut_example.png) + +![Donut Rectangle](screenshots/donut_rectangle_example.png) + +## 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. +![Tree Example](screenshots/tree_example.png) + +## 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"