This commit is contained in:
2026-05-17 11:28:40 +02:00
commit daa66d5b54
195 changed files with 9284 additions and 0 deletions

4
.editorconfig Normal file
View File

@@ -0,0 +1,4 @@
root = true
[*]
charset = utf-8

2
.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf

18
.gitignore vendored Normal file
View File

@@ -0,0 +1,18 @@
# Godot 4+ specific ignores
.godot/
/android/
.nomedia
# Godot-specific ignores
.import/
export.cfg
export_credentials.cfg
*.tmp
# Imported translations (automatically generated from CSV files)
*.translation
# Mono-specific ignores
.mono/
data_*/
mono_crash.*.json

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#e0e0e0" d="m8 1c-1.108 0-2 .892-2 2v2h-1v2h1v5a2 2 0 0 0 1 1.7285v1.2715h2v-1.2695a2 2 0 0 0 1-1.7305v-5h1v-2h-1v-2c0-1.108-.892-2-2-2zm-1 6h2v5a1 1 0 0 1 -1 1 1 1 0 0 1 -1-1z"/></svg>

After

Width:  |  Height:  |  Size: 260 B

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://caun3agmbmgps"
path="res://.godot/imported/ColorPick.svg-3d1404ee7ad6e6f63eea544098a69601.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ColorPick.svg"
dest_files=["res://.godot/imported/ColorPick.svg-3d1404ee7ad6e6f63eea544098a69601.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

1
addons/ez_tiles/Edit.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#e0e0e0" d="m7 1c-.554 0-1 .446-1 1v2h4v-2c0-.554-.446-1-1-1zm-1 4v7l2 3 2-3v-7zm1 1h1v5h-1z"/></svg>

After

Width:  |  Height:  |  Size: 176 B

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dwo07c1odx7ob"
path="res://.godot/imported/Edit.svg-82304c6fcb6a1b25af7fee4a258df268.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/Edit.svg"
dest_files=["res://.godot/imported/Edit.svg-82304c6fcb6a1b25af7fee4a258df268.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

21
addons/ez_tiles/LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 René and Chris van der Ark
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.

29
addons/ez_tiles/README.md Normal file
View File

@@ -0,0 +1,29 @@
# EZ Tiles plugin for Godot 4.3
This plugin attempts to make it easy to start drawing terrains with tilesheets via a basic Tileset importer and TileMapLayer nodes.
For a complete showcase, please take a look at these youtube explainers.
## Basic introduction to EZ Tiles
[![link to explainer](https://raw.githubusercontent.com/Teaching-myself-Godot/ez-tiles/refs/tags/1.0.3/yt-thumnail-2.jpg)](https://youtu.be/cvx-chwh1Ds)
## Top down RPG tiles with EZ Tiles
[![link to RPG tiles example](https://raw.githubusercontent.com/Teaching-myself-Godot/ez-tiles/refs/tags/1.0.3/yt-thumnail-1.jpg)](https://youtu.be/gBNtqvF5T_Y)
## Importer Features
- importing tilesheets in a preset format to automatically generate connected terrains (4 sides)
![example of template](https://raw.githubusercontent.com/Teaching-myself-Godot/ez-tiles/refs/tags/1.0.0/template_32x32.png)
- a couple of preset collision polygons to use with these templates
- generation of a navigation layer
## Drawing Features
- Square and circle brush
- Draggable area draw
- Stamps (fast copy/paste)
- Several modes of terrain-connecting

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#e0e0e0" d="m5 1v1h-4v2h14v-2h-4v-1zm-3 4v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-8zm1 2h2v6h-2zm4 0h2v6h-2zm4 0h2v6h-2z"/></svg>

After

Width:  |  Height:  |  Size: 197 B

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://smg4iofcineo"
path="res://.godot/imported/Remove.svg-a5d55465b9350d5f0321a6a209a66676.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/Remove.svg"
dest_files=["res://.godot/imported/Remove.svg-a5d55465b9350d5f0321a6a209a66676.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

1
addons/ez_tiles/Save.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#e0e0e0" d="M3 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V4l-3-3h-1v6H3zm1 0v5h3V1zm4 8a1 1 0 0 1 0 4 1 1 0 0 1 0-4z"/></svg>

After

Width:  |  Height:  |  Size: 207 B

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cxl4w251e8xgf"
path="res://.godot/imported/Save.svg-cccadde19daf996f4fd509bf2315f230.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/Save.svg"
dest_files=["res://.godot/imported/Save.svg-cccadde19daf996f4fd509bf2315f230.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><circle cx="8" cy="8" r="8" fill-opacity=".4"/><path fill="#e0e0e0" d="M8 1a7 7 0 0 0 0 14A7 7 0 0 0 8 1zM4 7h8v2H4z"/></svg>

After

Width:  |  Height:  |  Size: 188 B

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://njliaygubc5c"
path="res://.godot/imported/ZoomLess.svg-1ac10bf8c27b37875d4fb511a1a711f8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ZoomLess.svg"
dest_files=["res://.godot/imported/ZoomLess.svg-1ac10bf8c27b37875d4fb511a1a711f8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="8" cy="8" r="8" fill-opacity=".4"/><path fill="#e0e0e0" d="M8 1a7 7 0 0 0 0 14A7 7 0 0 0 8 1zM7 4h2v3h3v2H9v3H7V9H4V7h3z"/></g></svg>

After

Width:  |  Height:  |  Size: 275 B

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bvwx6xu0hp7mv"
path="res://.godot/imported/ZoomMore.svg-1d933b2c818365668806650c495f37a9.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ZoomMore.svg"
dest_files=["res://.godot/imported/ZoomMore.svg-1d933b2c818365668806650c495f37a9.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,100 @@
[gd_scene format=3 uid="uid://ywxhlehtt18d"]
[node name="Cactus" type="Node2D"]
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0]
[node name="MC" type="Polygon2D" parent="."]
polygon = PackedVector2Array(0, 1, 0, 0.210938, 0.09375, 0.0390625, 0.289063, 0, 0.71875, 0, 0.882813, 0.078125, 1, 0.289063, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VT" type="Polygon2D" parent="."]
position = Vector2(1, 0)
polygon = PackedVector2Array(0, 1, 0, 0.226563, 0.132813, 0.0703125, 0.359375, 0, 0.640625, 0, 0.820313, 0.0859375, 0.992188, 0.304688, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VM" type="Polygon2D" parent="."]
position = Vector2(1, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VB" type="Polygon2D" parent="."]
position = Vector2(1, 2)
polygon = PackedVector2Array(0, 0.25, 0, 0, 1, 0, 1, 0.242188)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HL" type="Polygon2D" parent="."]
position = Vector2(0, 3)
polygon = PackedVector2Array(0.53125, 0.460938, 0.476563, 0.171875, 0.625, 0, 0.765625, 0.0390625, 0.835938, 0.328125, 1, 0.414063, 1, 0.734375, 0.703125, 0.625)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HM" type="Polygon2D" parent="."]
position = Vector2(1, 3)
polygon = PackedVector2Array(0, 0.71875, 0, 0.398438, 1, 0.390625, 1, 0.71875)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HR" type="Polygon2D" parent="."]
position = Vector2(2, 3)
polygon = PackedVector2Array(0, 0.703125, 0, 0.390625, 0.195313, 0.34375, 0.226563, 0.03125, 0.382813, 0.015625, 0.515625, 0.164063, 0.523438, 0.445313, 0.296875, 0.640625)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TR" type="Polygon2D" parent="."]
position = Vector2(5, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TM" type="Polygon2D" parent="."]
position = Vector2(4, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TL" type="Polygon2D" parent="."]
position = Vector2(3, 0)
polygon = PackedVector2Array(0, 1, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="LM" type="Polygon2D" parent="."]
position = Vector2(3, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="CM" type="Polygon2D" parent="."]
position = Vector2(4, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="RM" type="Polygon2D" parent="."]
position = Vector2(5, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BR" type="Polygon2D" parent="."]
position = Vector2(5, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BC" type="Polygon2D" parent="."]
position = Vector2(4, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BL" type="Polygon2D" parent="."]
position = Vector2(3, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]

View File

@@ -0,0 +1,100 @@
[gd_scene format=3 uid="uid://cxnhqxx237lix"]
[node name="Rounded Corners (Inverse)" type="Node2D"]
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0]
[node name="MC" type="Polygon2D" parent="."]
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VT" type="Polygon2D" parent="."]
position = Vector2(1, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VM" type="Polygon2D" parent="."]
position = Vector2(1, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VB" type="Polygon2D" parent="."]
position = Vector2(1, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HL" type="Polygon2D" parent="."]
position = Vector2(0, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HM" type="Polygon2D" parent="."]
position = Vector2(1, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HR" type="Polygon2D" parent="."]
position = Vector2(2, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BR" type="Polygon2D" parent="."]
position = Vector2(5, 2)
polygon = PackedVector2Array(0, 1, 0.03125, 0.734375, 0.15625, 0.476563, 0.3125, 0.273438, 0.515625, 0.125, 0.773438, 0.03125, 1, 0, 0, 0)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BL" type="Polygon2D" parent="."]
position = Vector2(3, 2)
polygon = PackedVector2Array(1, 0, 0, 0, 0.273438, 0.0390625, 0.5, 0.125, 0.71875, 0.289063, 0.859375, 0.484375, 0.953125, 0.695313, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TM" type="Polygon2D" parent="."]
position = Vector2(4, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="LM" type="Polygon2D" parent="."]
position = Vector2(3, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="CM" type="Polygon2D" parent="."]
position = Vector2(4, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="RM" type="Polygon2D" parent="."]
position = Vector2(5, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TL" type="Polygon2D" parent="."]
position = Vector2(3, 0)
polygon = PackedVector2Array(0, 1, 1, 1, 1, 0, 0.960938, 0.257813, 0.867188, 0.492188, 0.726563, 0.703125, 0.523438, 0.867188, 0.28125, 0.960938)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BC" type="Polygon2D" parent="."]
position = Vector2(4, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TR" type="Polygon2D" parent="."]
position = Vector2(5, 0)
polygon = PackedVector2Array(0.28125, 0.71875, 0.140625, 0.507813, 0.046875, 0.304688, 0, 0, 0, 1, 1, 1, 1, 1, 0.703125, 0.953125, 0.492188, 0.859375)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]

View File

@@ -0,0 +1,100 @@
[gd_scene format=3 uid="uid://bdtlwd7f6ojk0"]
[node name="Rectangles" type="Node2D"]
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0]
[node name="MC" type="Polygon2D" parent="."]
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VT" type="Polygon2D" parent="."]
position = Vector2(1, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VM" type="Polygon2D" parent="."]
position = Vector2(1, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VB" type="Polygon2D" parent="."]
position = Vector2(1, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HL" type="Polygon2D" parent="."]
position = Vector2(0, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HM" type="Polygon2D" parent="."]
position = Vector2(1, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HR" type="Polygon2D" parent="."]
position = Vector2(2, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TR" type="Polygon2D" parent="."]
position = Vector2(5, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TM" type="Polygon2D" parent="."]
position = Vector2(4, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TL" type="Polygon2D" parent="."]
position = Vector2(3, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="LM" type="Polygon2D" parent="."]
position = Vector2(3, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="CM" type="Polygon2D" parent="."]
position = Vector2(4, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="RM" type="Polygon2D" parent="."]
position = Vector2(5, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BR" type="Polygon2D" parent="."]
position = Vector2(5, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BC" type="Polygon2D" parent="."]
position = Vector2(4, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BL" type="Polygon2D" parent="."]
position = Vector2(3, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]

View File

@@ -0,0 +1,100 @@
[gd_scene format=3 uid="uid://cm4063l3dfehn"]
[node name="Rounded Corners" type="Node2D"]
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0]
[node name="MC" type="Polygon2D" parent="."]
polygon = PackedVector2Array(0.140209, 0.880727, 0.0546875, 0.75, 0, 0.515625, 0.0326076, 0.30961, 0.125, 0.15625, 0.3125, 0.03125, 0.5, 0, 0.671875, 0.03125, 0.835938, 0.125, 0.960938, 0.28125, 1, 0.507813, 0.945313, 0.710938, 0.84375, 0.859375, 0.695313, 0.96875, 0.507813, 1, 0.30575, 0.971775)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VB" type="Polygon2D" parent="."]
position = Vector2(1, 2)
polygon = PackedVector2Array(0.140209, 0.880727, 0.0546875, 0.75, 0, 0.515625, 0, 0, 1, 0, 1, 0.507813, 0.945313, 0.710938, 0.84375, 0.859375, 0.695313, 0.96875, 0.507813, 1, 0.30575, 0.971775)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VT" type="Polygon2D" parent="."]
position = Vector2(1, 0)
polygon = PackedVector2Array(0, 1, 0, 0.515625, 0.015625, 0.328125, 0.125, 0.15625, 0.3125, 0.03125, 0.5, 0, 0.671875, 0.03125, 0.835938, 0.125, 0.960938, 0.28125, 1, 0.507813, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VM" type="Polygon2D" parent="."]
position = Vector2(1, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HL" type="Polygon2D" parent="."]
position = Vector2(0, 3)
polygon = PackedVector2Array(0.117188, 0.8125, 0.0234375, 0.65625, 0, 0.492188, 0.0390625, 0.28125, 0.148438, 0.132813, 0.34375, 0.0234375, 0.515625, 0, 1, 0, 1, 1, 1, 1, 0.523438, 1, 0.304688, 0.953125)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HM" type="Polygon2D" parent="."]
position = Vector2(1, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HR" type="Polygon2D" parent="."]
position = Vector2(2, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 0.554688, 0, 0.820313, 0.09375, 0.960938, 0.296875, 1, 0.460938, 0.96875, 0.671875, 0.804688, 0.90625, 0.5625, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TL" type="Polygon2D" parent="."]
position = Vector2(3, 0)
polygon = PackedVector2Array(0, 1, 0.03125, 0.734375, 0.15625, 0.476563, 0.3125, 0.273438, 0.515625, 0.125, 0.773438, 0.03125, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TR" type="Polygon2D" parent="."]
position = Vector2(5, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 0.273438, 0.0390625, 0.5, 0.125, 0.71875, 0.289063, 0.859375, 0.484375, 0.953125, 0.695313, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TM" type="Polygon2D" parent="."]
position = Vector2(4, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="LM" type="Polygon2D" parent="."]
position = Vector2(3, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="CM" type="Polygon2D" parent="."]
position = Vector2(4, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="RM" type="Polygon2D" parent="."]
position = Vector2(5, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BR" type="Polygon2D" parent="."]
position = Vector2(5, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 0.960938, 0.257813, 0.867188, 0.492188, 0.726563, 0.703125, 0.523438, 0.867188, 0.28125, 0.960938)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BC" type="Polygon2D" parent="."]
position = Vector2(4, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BL" type="Polygon2D" parent="."]
position = Vector2(3, 2)
polygon = PackedVector2Array(0.28125, 0.71875, 0.140625, 0.507813, 0.046875, 0.304688, 0, 0, 1, 0, 1, 1, 1, 1, 0.703125, 0.953125, 0.492188, 0.859375)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]

View File

@@ -0,0 +1,100 @@
[gd_scene format=3 uid="uid://lfnyjmnayoqe"]
[node name="Sloped (All Corners)" type="Node2D"]
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0]
[node name="MC" type="Polygon2D" parent="."]
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VT" type="Polygon2D" parent="."]
position = Vector2(1, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VM" type="Polygon2D" parent="."]
position = Vector2(1, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VB" type="Polygon2D" parent="."]
position = Vector2(1, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HL" type="Polygon2D" parent="."]
position = Vector2(0, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HM" type="Polygon2D" parent="."]
position = Vector2(1, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HR" type="Polygon2D" parent="."]
position = Vector2(2, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TR" type="Polygon2D" parent="."]
position = Vector2(5, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TM" type="Polygon2D" parent="."]
position = Vector2(4, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TL" type="Polygon2D" parent="."]
position = Vector2(3, 0)
polygon = PackedVector2Array(0, 1, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="LM" type="Polygon2D" parent="."]
position = Vector2(3, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="CM" type="Polygon2D" parent="."]
position = Vector2(4, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="RM" type="Polygon2D" parent="."]
position = Vector2(5, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BR" type="Polygon2D" parent="."]
position = Vector2(5, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BC" type="Polygon2D" parent="."]
position = Vector2(4, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BL" type="Polygon2D" parent="."]
position = Vector2(3, 2)
polygon = PackedVector2Array(0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]

View File

@@ -0,0 +1,100 @@
[gd_scene format=3 uid="uid://ckfu3f4u350bg"]
[node name="Sloped (Bottom Corners)" type="Node2D"]
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0]
[node name="MC" type="Polygon2D" parent="."]
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VT" type="Polygon2D" parent="."]
position = Vector2(1, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VM" type="Polygon2D" parent="."]
position = Vector2(1, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VB" type="Polygon2D" parent="."]
position = Vector2(1, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HL" type="Polygon2D" parent="."]
position = Vector2(0, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HM" type="Polygon2D" parent="."]
position = Vector2(1, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HR" type="Polygon2D" parent="."]
position = Vector2(2, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TR" type="Polygon2D" parent="."]
position = Vector2(5, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TM" type="Polygon2D" parent="."]
position = Vector2(4, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TL" type="Polygon2D" parent="."]
position = Vector2(3, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="LM" type="Polygon2D" parent="."]
position = Vector2(3, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="CM" type="Polygon2D" parent="."]
position = Vector2(4, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="RM" type="Polygon2D" parent="."]
position = Vector2(5, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BR" type="Polygon2D" parent="."]
position = Vector2(5, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BC" type="Polygon2D" parent="."]
position = Vector2(4, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BL" type="Polygon2D" parent="."]
position = Vector2(3, 2)
polygon = PackedVector2Array(0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]

View File

@@ -0,0 +1,100 @@
[gd_scene format=3 uid="uid://3gmoem8hi2hi"]
[node name="Sloped (Top Corners)" type="Node2D"]
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0]
[node name="MC" type="Polygon2D" parent="."]
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VT" type="Polygon2D" parent="."]
position = Vector2(1, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VM" type="Polygon2D" parent="."]
position = Vector2(1, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VB" type="Polygon2D" parent="."]
position = Vector2(1, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HL" type="Polygon2D" parent="."]
position = Vector2(0, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HM" type="Polygon2D" parent="."]
position = Vector2(1, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HR" type="Polygon2D" parent="."]
position = Vector2(2, 3)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TR" type="Polygon2D" parent="."]
position = Vector2(5, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TM" type="Polygon2D" parent="."]
position = Vector2(4, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TL" type="Polygon2D" parent="."]
position = Vector2(3, 0)
polygon = PackedVector2Array(0, 1, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="LM" type="Polygon2D" parent="."]
position = Vector2(3, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="CM" type="Polygon2D" parent="."]
position = Vector2(4, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="RM" type="Polygon2D" parent="."]
position = Vector2(5, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BR" type="Polygon2D" parent="."]
position = Vector2(5, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BC" type="Polygon2D" parent="."]
position = Vector2(4, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BL" type="Polygon2D" parent="."]
position = Vector2(3, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]

View File

@@ -0,0 +1,101 @@
[gd_scene format=3 uid="uid://bp35luh5na8o7"]
[node name="Tree" type="Node2D"]
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 2.0, 3.0, 4.0]
[node name="MC" type="Polygon2D" parent="."]
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VT" type="Polygon2D" parent="."]
position = Vector2(1, 0)
polygon = PackedVector2Array(0, 1, 0.492188, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VM" type="Polygon2D" parent="."]
position = Vector2(1, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="VB" type="Polygon2D" parent="."]
position = Vector2(1, 2)
polygon = PackedVector2Array(0.1875, 0.820313, 0, 0, 1, 0, 0.8125, 0.570313)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HL" type="Polygon2D" parent="."]
position = Vector2(0, 3)
polygon = PackedVector2Array(0.478268, 0.299531, 0, 0, 1, 0, 1, 0, 0.992188, 0.398438)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HM" type="Polygon2D" parent="."]
position = Vector2(1, 3)
polygon = PackedVector2Array(0.0078125, 0.421875, 0, 0, 1, 0, 1, 0.421875)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="HR" type="Polygon2D" parent="."]
position = Vector2(2, 3)
scale = Vector2(1, 1.1)
polygon = PackedVector2Array(0, 0.411932, 0, 0, 1, 0, 0.78125, 0.191761)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BR" type="Polygon2D" parent="."]
position = Vector2(5, 2)
polygon = PackedVector2Array(0, 1, 1, 1, 1, 0, 0, 0)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BL" type="Polygon2D" parent="."]
position = Vector2(3, 2)
polygon = PackedVector2Array(1, 0, 0, 0, 0, 1, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TM" type="Polygon2D" parent="."]
position = Vector2(4, 0)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="LM" type="Polygon2D" parent="."]
position = Vector2(3, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="CM" type="Polygon2D" parent="."]
position = Vector2(4, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="RM" type="Polygon2D" parent="."]
position = Vector2(5, 1)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TL" type="Polygon2D" parent="."]
position = Vector2(3, 0)
polygon = PackedVector2Array(0, 1, 1, 1, 1, 0, 0.960938, 0.257813, 0.867188, 0.492188, 0.726563, 0.703125, 0.523438, 0.867188, 0.28125, 0.960938)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="BC" type="Polygon2D" parent="."]
position = Vector2(4, 2)
polygon = PackedVector2Array(0, 1, 0, 0, 1, 0, 1, 1, 1, 1)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]
[node name="TR" type="Polygon2D" parent="."]
position = Vector2(5, 0)
polygon = PackedVector2Array(0.28125, 0.71875, 0.140625, 0.507813, 0.046875, 0.304688, 0, 0, 0, 1, 1, 1, 1, 1, 0.703125, 0.953125, 0.492188, 0.859375)
metadata/_edit_vertical_guides_ = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
metadata/_edit_horizontal_guides_ = [1.0, 1.0, 2.0, 3.0, 4.0]

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dyf2x07bqc1kw"
path="res://.godot/imported/big_brick.png-7cbdd1461a54cb96eda7d75f06bf46e5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/15x15/big_brick.png"
dest_files=["res://.godot/imported/big_brick.png-7cbdd1461a54cb96eda7d75f06bf46e5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bm3oo83wmpa7t"
path="res://.godot/imported/brick_face.png-be3d3f48b608d1194504c80b008847cb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/15x15/brick_face.png"
dest_files=["res://.godot/imported/brick_face.png-be3d3f48b608d1194504c80b008847cb.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://qylofri7a3j"
path="res://.godot/imported/cactus.png-fb8308c83545f74973ca4d97df5fc871.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/15x15/cactus.png"
dest_files=["res://.godot/imported/cactus.png-fb8308c83545f74973ca4d97df5fc871.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://7ab600twsy17"
path="res://.godot/imported/gold_tiles.png-22f1bb38d765445d923d8f50d6c55c69.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/15x15/gold_tiles.png"
dest_files=["res://.godot/imported/gold_tiles.png-22f1bb38d765445d923d8f50d6c55c69.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://qkgb300aqju0"
path="res://.godot/imported/grass_and_dirt.png-eda66079d258f21e83b1bbc5af195e0a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/15x15/grass_and_dirt.png"
dest_files=["res://.godot/imported/grass_and_dirt.png-eda66079d258f21e83b1bbc5af195e0a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cx74c55pt4kvk"
path="res://.godot/imported/mossy_bricks.png-7a9818dfc7df3a554d452059d576c7f4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/15x15/mossy_bricks.png"
dest_files=["res://.godot/imported/mossy_bricks.png-7a9818dfc7df3a554d452059d576c7f4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dudbsnchdio2u"
path="res://.godot/imported/sand.png-25261f855efcdb39571b9c5a648b68d0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/15x15/sand.png"
dest_files=["res://.godot/imported/sand.png-25261f855efcdb39571b9c5a648b68d0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b66j5q5i4ltpn"
path="res://.godot/imported/spikes.png-a03d129e27aef364b1e1648c5710269d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/15x15/spikes.png"
dest_files=["res://.godot/imported/spikes.png-a03d129e27aef364b1e1648c5710269d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b4ibyc7vv0cqd"
path="res://.godot/imported/stonewall.png-165313e5941503a3dd613b03b79bddd7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/15x15/stonewall.png"
dest_files=["res://.godot/imported/stonewall.png-165313e5941503a3dd613b03b79bddd7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://f0usrkn63hv0"
path="res://.godot/imported/tree_trunk.png-9704d95a015e91b197256a3aedfee62d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/15x15/tree_trunk.png"
dest_files=["res://.godot/imported/tree_trunk.png-9704d95a015e91b197256a3aedfee62d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c0t85l7oiep61"
path="res://.godot/imported/tinyworlds-tileset-floating-dirt-isles.png-dd7c959e0deee039b2957f496e6c51b4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/16x16/tinyworlds-tileset-floating-dirt-isles.png"
dest_files=["res://.godot/imported/tinyworlds-tileset-floating-dirt-isles.png-dd7c959e0deee039b2957f496e6c51b4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://jhqreh71nv5o"
path="res://.godot/imported/zelda_like_dark_grass.png-e14eb21d78bf0a5e0209525e40e749cd.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/16x16/zelda_like_dark_grass.png"
dest_files=["res://.godot/imported/zelda_like_dark_grass.png-e14eb21d78bf0a5e0209525e40e749cd.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://csqilhkvhxmne"
path="res://.godot/imported/zelda_like_grass.png-b6f4304517edfc28d7e02e2179aabf56.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/16x16/zelda_like_grass.png"
dest_files=["res://.godot/imported/zelda_like_grass.png-b6f4304517edfc28d7e02e2179aabf56.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://h6xbr61ix6j7"
path="res://.godot/imported/zelda_like_grass_over_water.png-b6a3af1682cd313c336783e0d4d2199d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/16x16/zelda_like_grass_over_water.png"
dest_files=["res://.godot/imported/zelda_like_grass_over_water.png-b6a3af1682cd313c336783e0d4d2199d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://4aivnuxpkvr"
path="res://.godot/imported/zelda_like_hedge.png-d907887aa9483a2398bba354eaa4abcb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/16x16/zelda_like_hedge.png"
dest_files=["res://.godot/imported/zelda_like_hedge.png-d907887aa9483a2398bba354eaa4abcb.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://chx0bemo6hrf"
path="res://.godot/imported/zelda_like_water.png-3df6072f89452b6e6aa2ff950499ee5e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/16x16/zelda_like_water.png"
dest_files=["res://.godot/imported/zelda_like_water.png-3df6072f89452b6e6aa2ff950499ee5e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d152uhcg8kesn"
path="res://.godot/imported/plains_1.png-2fe6d3bbe2dc7c593788d82833fc8c5a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/16x16/plains_1.png"
dest_files=["res://.godot/imported/plains_1.png-2fe6d3bbe2dc7c593788d82833fc8c5a.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

View File

@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="384"
height="256"
viewBox="0 0 384 256"
id="svg19"
sodipodi:docname="plains_1.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs19" />
<sodipodi:namedview
id="namedview19"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
inkscape:zoom="1.2219078"
inkscape:cx="-4.9103541"
inkscape:cy="5.3195502"
inkscape:window-width="1920"
inkscape:window-height="1094"
inkscape:window-x="-11"
inkscape:window-y="-11"
inkscape:window-maximized="1"
inkscape:current-layer="svg19"
showgrid="true">
<inkscape:grid
id="grid1"
units="px"
originx="0"
originy="0"
spacingx="0.99999999"
spacingy="1"
empcolor="#e50000"
empopacity="0.48627451"
color="#0099e5"
opacity="0.14901961"
empspacing="64"
dotted="false"
gridanglex="30"
gridanglez="30"
visible="true" />
</sodipodi:namedview>
<rect
style="fill:#642700;fill-opacity:1;stroke-width:5.74983;stroke-linecap:square;stroke-miterlimit:80;stroke-dashoffset:127.298;paint-order:markers fill stroke"
id="rect1"
width="57.528324"
height="60.617859"
x="2.9739425"
y="3.4721446" />
<path
id="path1"
style="mix-blend-mode:normal;fill:#642700;fill-opacity:1;fill-rule:nonzero;stroke-width:4.00033;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"
d="m 256.18491,0 v 0.44534871 l -63.10279,63.73174829 0.0156,63.231703 63.08717,63.90755 h 63.90757 L 383.79295,127.61585 384,63.700495 h -0.4141 L 320.2995,0.41409617 V 0 Z"
sodipodi:nodetypes="cccccccccccc" />
<path
id="path2"
style="mix-blend-mode:normal;fill:#642700;fill-opacity:1;fill-rule:nonzero;stroke-width:4.00033;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"
d="M 95.859368,3.2971433 63.98163,64.043058 63.89944,128.3767 l 31.491127,57.4978 32.641253,-58.04037 0.0224,-63.75288 z"
sodipodi:nodetypes="ccccccc" />
<path
d="m 377.75018,127.14488 -58.84184,59.2659 H 256.74901 L 197.73262,126.96905 V 64.713421"
fill="none"
stroke="#006903"
stroke-width="10.6718"
stroke-linecap="round"
id="path13"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" />
<path
d="M 198.00517,63.997555 256.96069,5.3359353 h 62.27946 l 59.13049,58.8356977 v 61.620827"
data-paper-data="{&quot;index&quot;:null}"
fill="none"
stroke="#006903"
stroke-width="10.6718"
stroke-linecap="round"
id="path14"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" />
<path
id="path15"
style="mix-blend-mode:normal;fill:#642700;fill-opacity:1;fill-rule:nonzero;stroke-width:4.00033;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"
d="m 3.1174458,194.96117 v 60.84871 H 65.091236 v 0.30471 h 61.419064 0.92976 61.41125 v -60.8487 H 127.44006 126.5103 65.458454 v -0.30472 z" />
<path
d="M 5.3359128,197.50781 H 186.46472"
fill="none"
stroke="#006903"
stroke-width="10.6718"
stroke-linecap="round"
id="path18"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" />
<path
d="M 5.1299622,5.001772 H 58.931855"
fill="none"
stroke="#006903"
stroke-width="6.04268"
stroke-linecap="round"
id="path18-8"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-width:10.2029;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" />
<path
d="M 5.1299622,5.001772 H 58.931855"
fill="none"
stroke="#006903"
stroke-width="6.04268"
stroke-linecap="round"
id="path3"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-width:10.2029;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" />
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://82nd1ajjv633"
path="res://.godot/imported/plains_1.svg-5e57b110d812f8b73a3f571ca1f55b4c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/64x64/plains_1.svg"
dest_files=["res://.godot/imported/plains_1.svg-5e57b110d812f8b73a3f571ca1f55b4c.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,136 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="384.00049"
height="256"
viewBox="0 0 384.0005 255.99999"
id="svg21"
sodipodi:docname="plains_2.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs21" />
<sodipodi:namedview
id="namedview21"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
showgrid="true"
inkscape:zoom="1.7335071"
inkscape:cx="112.48873"
inkscape:cy="36.054079"
inkscape:window-width="1920"
inkscape:window-height="1094"
inkscape:window-x="-11"
inkscape:window-y="-11"
inkscape:window-maximized="1"
inkscape:current-layer="svg21">
<inkscape:grid
id="grid21"
units="px"
originx="-1.8224732e-06"
originy="0.036258534"
spacingx="1"
spacingy="0.99999997"
empcolor="#e50000"
empopacity="0.58039216"
color="#0099e5"
opacity="0.14901961"
empspacing="64"
dotted="false"
gridanglex="30"
gridanglez="30"
visible="true" />
</sodipodi:namedview>
<path
id="path1"
style="mix-blend-mode:normal;fill:#cc9978;fill-opacity:1;fill-rule:nonzero;stroke-width:3.87287;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"
d="m 198.12432,0.36362926 -0.0108,63.67645574 -0.59357,63.668645 58.29571,64.45222 63.7283,-0.28833 56.80278,-63.75001 0.16485,-64.082533 -0.0292,-63.67645574 h -59.90471 -58.32914 z"
sodipodi:nodetypes="ccccccccccc" />
<path
id="path2"
style="mix-blend-mode:normal;fill:#cc9978;fill-opacity:1;fill-rule:nonzero;stroke-width:3.99833;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"
d="m 68.460763,0.96043996 0.179605,64.08253604 0.179604,61.411784 v 59.97488 l 54.500788,-0.40774 -0.40773,-57.96652 0.22812,-66.090898 -0.17962,-61.41177662 z"
sodipodi:nodetypes="ccccccccc" />
<path
id="path2-4"
style="mix-blend-mode:normal;fill:#cc9978;fill-opacity:1;fill-rule:nonzero;stroke-width:2.16565;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"
d="m 4.2877142,7.6737973 0.179605,18.8001337 0.179604,18.016606 V 62.085588 L 59.147714,61.965971 58.739984,44.960116 58.968104,25.570782 58.788484,7.5541786 Z"
sodipodi:nodetypes="ccccccccc" />
<path
d="m 256.49689,5.0876426 h 62.24832"
data-paper-data="{&quot;index&quot;:null}"
fill="none"
stroke="#006903"
stroke-width="9.99581"
stroke-linecap="round"
id="path9"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" />
<path
id="path10"
style="mix-blend-mode:normal;fill:#cc9978;fill-opacity:1;fill-rule:nonzero;stroke-width:3.99833;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"
d="m 2.7800838,195.23514 v 60.81827 l 61.9506142,0.1523 61.845192,0.15229 h 61.853 v -60.8183 h -61.853 l -61.485967,-0.1523 z"
sodipodi:nodetypes="ccccccccc" />
<path
d="M 4.9979048,197.77503 H 186.03616"
fill="none"
stroke="#006903"
stroke-width="9.99581"
stroke-linecap="round"
id="path13"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" />
<path
d="m 319.86184,5.29151 h 59.26211"
data-paper-data="{&quot;index&quot;:null}"
fill="none"
stroke="#006903"
stroke-width="9.75311"
stroke-linecap="round"
id="path15"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" />
<path
d="m 196.69605,5.1897043 c 25.10338,0 41.83513,0 62.54051,0"
data-paper-data="{&quot;index&quot;:null}"
fill="none"
stroke="#006903"
stroke-width="10.0192"
stroke-linecap="round"
id="path17"
sodipodi:nodetypes="cc"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" />
<g
id="g19"
transform="matrix(3.9414296,0,0,3.9983253,-755.26761,-591.38618)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0">
<path
d="m 209.1463,149.32931 h 13.63105"
data-paper-data="{&quot;index&quot;:null}"
fill="none"
stroke="#006903"
stroke-width="2.5"
stroke-linecap="round"
id="path19"
sodipodi:nodetypes="cc" />
</g>
<g
id="g3"
transform="matrix(3.9983253,0,0,3.9983253,-831.03517,-591.28421)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0">
<path
d="M 209.11468,149.32931 H 222.4009"
data-paper-data="{&quot;index&quot;:null}"
fill="none"
stroke="#006903"
stroke-width="2.46818"
stroke-linecap="round"
id="path3"
sodipodi:nodetypes="cc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bbr3esj1mxpl0"
path="res://.godot/imported/plains_2.svg-b406f7a8bb22df8238488c2c4608aec9.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/64x64/plains_2.svg"
dest_files=["res://.godot/imported/plains_2.svg-b406f7a8bb22df8238488c2c4608aec9.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,523 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="384"
height="256"
viewBox="0 0 383.99999 256.00001"
id="svg456"
sodipodi:docname="spikes.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview458"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="true"
showguides="true"
inkscape:zoom="1.4142136"
inkscape:cx="149.90664"
inkscape:cy="118.44038"
inkscape:window-width="1920"
inkscape:window-height="1094"
inkscape:window-x="-11"
inkscape:window-y="-11"
inkscape:window-maximized="1"
inkscape:current-layer="svg456"><inkscape:grid
id="grid1"
units="px"
originx="0"
originy="0"
spacingx="0.99999997"
spacingy="1"
empcolor="#e50000"
empopacity="1"
color="#0099e5"
opacity="0.14901961"
empspacing="16"
dotted="false"
gridanglex="30"
gridanglez="30"
visible="true" /></sodipodi:namedview><defs
id="defs356"><linearGradient
id="linearGradient1"
inkscape:collect="always"><stop
style="stop-color:#a1a1a1;stop-opacity:1;"
offset="0"
id="stop1" /><stop
style="stop-color:#e9e9e9;stop-opacity:1;"
offset="1"
id="stop2" /></linearGradient><linearGradient
x1="232.53928"
y1="197.96335"
x2="232.53928"
y2="204.48351"
gradientUnits="userSpaceOnUse"
id="color-1"
gradientTransform="matrix(4.0931083,0,0,4.3257316,-791.29698,-647.99079)"><stop
offset="0"
stop-color="#a1a1a1"
id="stop231" /><stop
offset="1"
stop-color="#ffffff"
id="stop233" /></linearGradient><linearGradient
x1="217.53928"
y1="197.96335"
x2="217.53928"
y2="204.48351"
gradientUnits="userSpaceOnUse"
id="color-2"
gradientTransform="matrix(4.3257316,0,0,4.3257316,-843.64398,-647.99079)"><stop
offset="0"
stop-color="#a1a1a1"
id="stop236" /><stop
offset="1"
stop-color="#ffffff"
id="stop238" /></linearGradient><linearGradient
x1="202.53928"
y1="197.96335"
x2="202.53928"
y2="204.48351"
gradientUnits="userSpaceOnUse"
id="color-3"
gradientTransform="matrix(4.3257316,0,0,4.3257316,-843.64398,-647.99079)"><stop
offset="0"
stop-color="#a1a1a1"
id="stop241" /><stop
offset="1"
stop-color="#ffffff"
id="stop243" /></linearGradient><linearGradient
x1="225.15257"
y1="204.71323"
x2="232.61542"
y2="204.71323"
gradientUnits="userSpaceOnUse"
id="color-4"><stop
offset="0"
stop-color="#a1a1a1"
id="stop246" /><stop
offset="1"
stop-color="#ffffff"
id="stop248" /></linearGradient><linearGradient
x1="232.7382"
y1="204.71953"
x2="240.18665"
y2="204.71953"
gradientUnits="userSpaceOnUse"
id="color-5"><stop
offset="0"
stop-color="#a1a1a1"
id="stop251" /><stop
offset="1"
stop-color="#ffffff"
id="stop253" /></linearGradient><linearGradient
x1="225.15257"
y1="198.29657"
x2="232.61542"
y2="198.29657"
gradientUnits="userSpaceOnUse"
id="color-6"><stop
offset="0"
stop-color="#a1a1a1"
id="stop256" /><stop
offset="1"
stop-color="#ffffff"
id="stop258" /></linearGradient><linearGradient
x1="232.7382"
y1="198.29027"
x2="240.18665"
y2="198.29027"
gradientUnits="userSpaceOnUse"
id="color-7"><stop
offset="0"
stop-color="#a1a1a1"
id="stop261" /><stop
offset="1"
stop-color="#ffffff"
id="stop263" /></linearGradient><linearGradient
x1="210.15257"
y1="204.71323"
x2="217.61542"
y2="204.71323"
gradientUnits="userSpaceOnUse"
id="color-8"><stop
offset="0"
stop-color="#a1a1a1"
id="stop266" /><stop
offset="1"
stop-color="#ffffff"
id="stop268" /></linearGradient><linearGradient
x1="217.7382"
y1="204.71953"
x2="225.18665"
y2="204.71953"
gradientUnits="userSpaceOnUse"
id="color-9"><stop
offset="0"
stop-color="#a1a1a1"
id="stop271" /><stop
offset="1"
stop-color="#ffffff"
id="stop273" /></linearGradient><linearGradient
x1="210.15257"
y1="198.29657"
x2="217.61542"
y2="198.29657"
gradientUnits="userSpaceOnUse"
id="color-10"><stop
offset="0"
stop-color="#a1a1a1"
id="stop276" /><stop
offset="1"
stop-color="#ffffff"
id="stop278" /></linearGradient><linearGradient
x1="217.7382"
y1="198.29027"
x2="225.18665"
y2="198.29027"
gradientUnits="userSpaceOnUse"
id="color-11"><stop
offset="0"
stop-color="#a1a1a1"
id="stop281" /><stop
offset="1"
stop-color="#ffffff"
id="stop283" /></linearGradient><linearGradient
x1="195.15257"
y1="204.71323"
x2="202.61542"
y2="204.71323"
gradientUnits="userSpaceOnUse"
id="color-12"><stop
offset="0"
stop-color="#a1a1a1"
id="stop286" /><stop
offset="1"
stop-color="#ffffff"
id="stop288" /></linearGradient><linearGradient
x1="202.7382"
y1="204.71953"
x2="210.18665"
y2="204.71953"
gradientUnits="userSpaceOnUse"
id="color-13"><stop
offset="0"
stop-color="#a1a1a1"
id="stop291" /><stop
offset="1"
stop-color="#ffffff"
id="stop293" /></linearGradient><linearGradient
x1="195.15257"
y1="198.29657"
x2="202.61542"
y2="198.29657"
gradientUnits="userSpaceOnUse"
id="color-14"><stop
offset="0"
stop-color="#a1a1a1"
id="stop296" /><stop
offset="1"
stop-color="#ffffff"
id="stop298" /></linearGradient><linearGradient
x1="202.7382"
y1="198.29027"
x2="210.18665"
y2="198.29027"
gradientUnits="userSpaceOnUse"
id="color-15"><stop
offset="0"
stop-color="#a1a1a1"
id="stop301" /><stop
offset="1"
stop-color="#ffffff"
id="stop303" /></linearGradient><linearGradient
x1="217.64825"
y1="180.61667"
x2="218.05481"
y2="165.75507"
gradientUnits="userSpaceOnUse"
id="color-16"
gradientTransform="matrix(1.0007802,0,0,1.0009012,-195.20477,-150.74151)"><stop
offset="0"
stop-color="#a1a1a1"
id="stop306" /><stop
offset="1"
stop-color="#ffffff"
id="stop308"
style="stop-color:#d3d3d3;stop-opacity:1;" /></linearGradient><linearGradient
x1="254.37347"
y1="173.2084"
x2="240.2834"
y2="173.25858"
gradientUnits="userSpaceOnUse"
id="color-17"
gradientTransform="matrix(4.5324391,0,0,4.5324391,-896.30437,-688.33392)"><stop
offset="0"
stop-color="#a1a1a1"
id="stop311" /><stop
offset="1"
stop-color="#ffffff"
id="stop313"
style="stop-color:#e2e2e2;stop-opacity:1;" /></linearGradient><linearGradient
x1="269.44952"
y1="173.68042"
x2="282.18533"
y2="173.06766"
gradientUnits="userSpaceOnUse"
id="color-18"
gradientTransform="matrix(1.083279,0,0,1.083279,-209.73905,-162.7404)"><stop
offset="0"
stop-color="#a1a1a1"
id="stop316" /><stop
offset="1"
stop-color="#ffffff"
id="stop318"
style="stop-color:#d1d1d1;stop-opacity:1;" /></linearGradient><linearGradient
x1="261.31177"
y1="152.03796"
x2="261.31177"
y2="165.66718"
gradientUnits="userSpaceOnUse"
id="color-19"
gradientTransform="matrix(1.083279,0,0,1.083279,-209.93054,-163.02764)"><stop
offset="0"
stop-color="#ffffff"
id="stop321"
style="stop-color:#eaeaea;stop-opacity:1;" /><stop
offset="1"
stop-color="#a1a1a1"
id="stop323"
style="stop-color:#a1a1a1;stop-opacity:1;" /></linearGradient><linearGradient
x1="217.61385"
y1="166.09712"
x2="217.42195"
y2="154.62973"
gradientUnits="userSpaceOnUse"
id="color-20"
gradientTransform="matrix(1.0791616,0,0,1.206416,-210.19407,-184.18733)"><stop
offset="0"
stop-color="#a1a1a1"
id="stop326" /><stop
offset="1"
stop-color="#ffffff"
id="stop328"
style="stop-color:#e0e0e0;stop-opacity:1;" /></linearGradient><linearGradient
x1="218.68964"
y1="180.496"
x2="217.59315"
y2="191.96985"
gradientUnits="userSpaceOnUse"
id="color-21"
gradientTransform="matrix(1.0750154,0,0,1.1584143,-209.5846,-176.58093)"><stop
offset="0"
stop-color="#a1a1a1"
id="stop331" /><stop
offset="1"
stop-color="#ffffff"
id="stop333"
style="stop-color:#aeaeae;stop-opacity:1;" /></linearGradient><linearGradient
x1="195.15257"
y1="204.71323"
x2="202.61542"
y2="204.71323"
gradientUnits="userSpaceOnUse"
id="color-22"><stop
offset="0"
stop-color="#a1a1a1"
id="stop336" /><stop
offset="1"
stop-color="#ffffff"
id="stop338" /></linearGradient><linearGradient
x1="202.7382"
y1="204.71953"
x2="210.18665"
y2="204.71953"
gradientUnits="userSpaceOnUse"
id="color-23"><stop
offset="0"
stop-color="#a1a1a1"
id="stop341" /><stop
offset="1"
stop-color="#ffffff"
id="stop343" /></linearGradient><linearGradient
x1="210.15257"
y1="204.71323"
x2="217.61542"
y2="204.71323"
gradientUnits="userSpaceOnUse"
id="color-24"><stop
offset="0"
stop-color="#a1a1a1"
id="stop346" /><stop
offset="1"
stop-color="#ffffff"
id="stop348" /></linearGradient><linearGradient
x1="217.7382"
y1="204.71953"
x2="225.18665"
y2="204.71953"
gradientUnits="userSpaceOnUse"
id="color-25"><stop
offset="0"
stop-color="#a1a1a1"
id="stop351" /><stop
offset="1"
stop-color="#ffffff"
id="stop353" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1"
id="linearGradient2"
x1="24.303877"
y1="14.966226"
x2="28.175701"
y2="5.5409727"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.9931833,0,0,3.9931833,0,0.7144139)" /></defs><g
data-paper-data="{&quot;index&quot;:null}"
fill="#a1a1a1"
id="g362"
transform="matrix(4.3257314,0,0,4.3257314,-833.50542,-648.45952)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
id="path358"
d="m 266.53953,179.60442 -0.0497,14.57182 4.11496,-4.02994 9.46265,2.76533 -2.68006,-9.4102 3.92873,-3.84629 z"
style="stroke-width:0.488459" /></g><g
data-paper-data="{&quot;index&quot;:null}"
fill="#ffffff"
id="g368"
transform="matrix(4.2260352,0,0,4.2260352,-817.07064,-643.52778)"
style="mix-blend-mode:normal;fill:#c5c5c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
d="m 284.0652,167.45938 -15.10358,0.13582 0.13562,-15.20798 z"
id="path364"
style="fill:#c5c5c5;fill-opacity:1"
sodipodi:nodetypes="cccc" /><path
d="m 282.89083,153.78518 -3.90107,13.52862 -9.57058,-9.63717 z"
id="path366"
style="fill:#c5c5c5;fill-opacity:1" /></g><g
data-paper-data="{&quot;index&quot;:null}"
fill="#ffffff"
id="g374"
transform="matrix(4.3257314,0,0,4.3257314,-852.12939,-658.22366)"
style="mix-blend-mode:normal;fill:#c5c5c5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
d="m 256.09569,152.10953 -0.0215,14.99966 -15.05066,-0.0317 z"
id="path370"
style="fill:#c5c5c5;fill-opacity:1"
sodipodi:nodetypes="cccc" /><path
d="m 255.73707,157.39657 -9.63717,9.57057 -3.80718,-13.55535 z"
id="path372"
style="fill:#c5c5c5;fill-opacity:1" /></g><g
fill="#a1a1a1"
id="g380"
transform="matrix(4.3257314,0,0,4.3257314,-847.29369,-650.08167)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
id="path376"
d="m 240.22972,179.93224 3.88274,3.90922 -2.73381,9.47564 9.43683,-2.72497 4.12572,4.09276 -0.01,-14.70146 z"
style="stroke-width:0.489436"
sodipodi:nodetypes="ccccccc" /></g><path
d="m 129.77193,208.3455 h 61.47909 v 28.20442 h -61.47909 z"
fill="url(#color-1)"
id="path382"
style="mix-blend-mode:normal;fill:url(#color-1);fill-rule:nonzero;stroke:none;stroke-width:2.1039;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" /><path
d="m 64.885963,208.3455 h 64.973127 v 28.20442 H 64.885963 Z"
fill="url(#color-2)"
id="path384"
style="mix-blend-mode:normal;fill:url(#color-2);fill-rule:nonzero;stroke:none;stroke-width:2.16286;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" /><path
d="m 0,208.3455 h 64.97313 v 28.20442 H 0 Z"
fill="url(#color-3)"
id="path386"
style="mix-blend-mode:normal;fill:url(#color-3);fill-rule:nonzero;stroke:none;stroke-width:2.16286;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0" /><g
id="g392"
transform="matrix(4.2481451,0,0,4.3257314,-828.50268,-647.99069)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
d="m 228.91663,207.98032 -3.76405,-6.53417 h 7.46283 z"
fill="url(#color-4)"
id="path388"
style="fill:url(#color-4)" /><path
d="m 236.49499,207.98032 -3.75679,-6.52157 h 7.44845 z"
fill="url(#color-5)"
id="path390"
style="fill:url(#color-5)" /></g><g
data-paper-data="{&quot;index&quot;:null}"
id="g398"
transform="matrix(4.2481451,0,0,4.3257314,-828.50268,-647.99069)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
d="m 232.61541,201.56365 h -7.46283 l 3.76405,-6.53417 z"
fill="url(#color-6)"
id="path394"
style="fill:url(#color-6)" /><path
d="m 240.18664,201.55106 h -7.44845 l 3.75679,-6.52157 z"
fill="url(#color-7)"
id="path396"
style="fill:url(#color-7)" /></g><g
data-paper-data="{&quot;index&quot;:null}"
id="g410"
transform="matrix(4.2481451,0,0,4.3257314,-828.50268,-647.99069)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
d="m 217.61541,201.56365 h -7.46283 l 3.76405,-6.53417 z"
fill="url(#color-10)"
id="path406"
style="fill:url(#color-10)" /><path
d="m 225.18664,201.55106 h -7.44845 l 3.75679,-6.52157 z"
fill="url(#color-11)"
id="path408"
style="fill:url(#color-11)" /></g><g
id="g416"
transform="matrix(4.3257314,0,0,4.3257314,-843.64387,-647.99069)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
d="m 198.91663,207.98032 -3.76405,-6.53417 h 7.46283 z"
fill="url(#color-12)"
id="path412"
style="fill:url(#color-12)" /><path
d="m 206.49499,207.98032 -3.75679,-6.52157 h 7.44845 z"
fill="url(#color-13)"
id="path414"
style="fill:url(#color-13)" /></g><g
data-paper-data="{&quot;index&quot;:null}"
id="g422"
transform="matrix(4.2481451,0,0,4.3257314,-828.50268,-647.99069)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
d="m 202.61541,201.56365 h -7.46283 l 3.76405,-6.53417 z"
fill="url(#color-14)"
id="path418"
style="fill:url(#color-14)" /><path
d="m 210.18664,201.55106 h -7.44845 l 3.75679,-6.52157 z"
fill="url(#color-15)"
id="path420"
style="fill:url(#color-15)" /></g><path
id="path424"
style="mix-blend-mode:normal;fill:url(#linearGradient2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.1862;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"
d="M 96.904883,0.89379556 C 89.398014,24.462209 81.971293,49.021336 64.054715,64.457162 l -0.06241,65.754938 c 16.077873,17.11923 26.318826,38.25134 31.750482,62.68985 7.090223,-21.47815 13.011973,-43.1408 32.319823,-62.68985 L 127.59468,64.308974 C 110.06009,47.173271 101.99523,25.017076 96.904883,0.89379556 Z"
sodipodi:nodetypes="ccccccc" /><path
id="path426"
style="mix-blend-mode:normal;fill:url(#color-17);fill-rule:nonzero;stroke:none;stroke-width:2.26622;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"
d="M 289.23966,1.5475226 255.64319,64.58319 192.46831,96.529047 255.81786,128.43173 288.0874,192.11546 319.34547,128.62472 384.00071,97.060396 319.65028,64.752517 Z"
sodipodi:nodetypes="ccccccccc" /><g
id="g444"
transform="matrix(4.2481451,0,0,4.3257314,-828.50268,-647.99069)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
d="m 198.91663,207.98032 -3.76405,-6.53417 h 7.46283 z"
fill="url(#color-22)"
id="path440"
style="fill:url(#color-22)" /><path
d="m 206.49499,207.98032 -3.75679,-6.52157 h 7.44845 z"
fill="url(#color-23)"
id="path442"
style="fill:url(#color-23)" /></g><g
id="g450"
transform="matrix(4.2481451,0,0,4.3257314,-828.50268,-647.99069)"
style="mix-blend-mode:normal;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"><path
d="m 213.91663,207.98032 -3.76405,-6.53417 h 7.46283 z"
fill="url(#color-24)"
id="path446"
style="fill:url(#color-24)" /><path
d="m 221.49499,207.98032 -3.75679,-6.52157 h 7.44845 z"
fill="url(#color-25)"
id="path448"
style="fill:url(#color-25)" /></g></svg>

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dxc264vu06a4x"
path="res://.godot/imported/spikes.svg-b0aa9d0afa9f87737835a3d0db5b9908.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/examples/64x64/spikes.svg"
dest_files=["res://.godot/imported/spikes.svg-b0aa9d0afa9f87737835a3d0db5b9908.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
shape-rendering="geometricPrecision"
text-rendering="geometricPrecision"
image-rendering="optimizeQuality"
fill-rule="evenodd"
clip-rule="evenodd"
viewBox="0 0 16 16"
version="1.1"
id="svg1"
sodipodi:docname="exclamation-warning-triangle-icon.svg"
width="16"
height="16"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
inkscape:zoom="20.387171"
inkscape:cx="11.232554"
inkscape:cy="16.113074"
inkscape:window-width="1920"
inkscape:window-height="1094"
inkscape:window-x="-11"
inkscape:window-y="-11"
inkscape:window-maximized="1"
inkscape:current-layer="svg1"
showguides="false" />
<path
id="path2"
style="opacity:1;fill:#605b00;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-miterlimit:80;stroke-dashoffset:127.298;paint-order:markers fill stroke"
inkscape:transform-center-x="0.001516452"
inkscape:transform-center-y="-2.7319362"
d="m 15.377315,13.6115 c -2.287554,0.993096 -4.823787,0.867134 -7.2364566,1.29721 L 0.73272457,13.777923 C 0.52522035,10.993544 2.5093341,9.0614603 3.409006,6.7076493 4.9708537,4.6048819 6.6034079,1.4768751 8.0473064,1.084364 c 1.9652326,1.3678055 3.2790156,3.6662537 4.8299526,5.6259113 0.95991,2.2313765 2.204672,4.3073787 2.500056,6.9012247 z"
sodipodi:nodetypes="ccccccc" />
<path
d="M 9.1493665,0.60446211 C 9.537211,0.83102512 9.891962,1.1945571 10.181775,1.6954958 l 0.03031,0.056656 0.03494,0.060656 5.44295,9.4525202 c 1.053503,1.762723 -0.03759,3.555446 -2.067942,3.530414 v 0.0038 H 2.3945396 c -0.027969,0 -0.055625,-0.0012 -0.083032,-0.0035 -1.84700398,-0.02497 -2.69616204,-1.718597 -1.93466038,-3.339132 0.0263125,-0.05641 0.0567501,-0.108594 0.0880001,-0.162532 l 5.55460548,-9.6016767 -0.00165,-10e-4 C 6.3059229,1.1983384 6.6652049,0.83361882 7.0618934,0.60399336 7.7165199,0.22518001 8.4953649,0.22249251 9.1493665,0.60446211 Z M 8.0887704,10.919047 c 0.407501,0 0.7378766,0.330345 0.7378766,0.737877 0,0.407532 -0.3303756,0.737908 -0.7378766,0.737908 -0.407532,0 -0.737908,-0.330376 -0.737908,-0.737908 0,-0.407532 0.330376,-0.737877 0.737908,-0.737877 z m 0.55122,-1.1055966 c -0.02481,0.6220646 -1.078315,0.6228456 -1.10244,-1.87e-4 C 7.4309879,8.7473858 7.1585184,6.3275993 7.1671434,5.3260348 7.1760134,5.017472 7.4318004,4.834659 7.7589884,4.76494 7.8599574,4.7435 7.9708949,4.73294 8.0826454,4.733095 8.1949894,4.733345 8.3061769,4.74441 8.4072399,4.76594 8.745303,4.837909 9.0106475,5.0281905 9.0106475,5.3423788 l -0.00135,0.031405 z m -7.3669845,2.0624116 5.602137,-9.68374 c 0.679314,-1.1628465 1.757035,-1.19653408 2.4492551,0 l 5.509325,9.567708 c 0.536783,0.883908 0.313751,2.06988 -1.21169,2.046505 H 2.3945396 C 1.3627561,13.82996 0.74325477,13.003364 1.2730059,11.875862 Z"
id="path1"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.0312501" />
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cfrwoh80yb3se"
path="res://.godot/imported/exclamation-warning-triangle-icon.svg-5a6d8876361b1164bbf2243119cc81cb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/exclamation-warning-triangle-icon.svg"
dest_files=["res://.godot/imported/exclamation-warning-triangle-icon.svg-5a6d8876361b1164bbf2243119cc81cb.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

212
addons/ez_tiles/ez_tiles.gd Normal file
View File

@@ -0,0 +1,212 @@
@tool
extends EditorPlugin
class_name EZTiles
# importer
var dock : EZTilesDock
var alert_dialog : AcceptDialog
# draw
var selection : EditorSelection
var draw_dock : EZTilesDrawDock
var select_2D_viewport_button : Button
var select_mode_button : Button
var prev_tile_pos := Vector2i.ZERO
var lmb_is_down_outside_2d_viewport := false
var hint_polygon : Polygon2D
var prev_pos := Vector2i.ZERO
func _enter_tree() -> void:
# importer
dock = preload("res://addons/ez_tiles/ez_tiles_dock.tscn").instantiate()
add_control_to_bottom_panel(dock as Control, "EZ Tiles")
dock.request_tile_map_layer.connect(create_tile_map_layer_for_tile_set)
alert_dialog = AcceptDialog.new()
EditorInterface.get_base_control().add_child(alert_dialog)
# draw
draw_dock = preload("res://addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.tscn").instantiate()
selection = EditorInterface.get_selection()
selection.selection_changed.connect(handle_selected_node)
add_control_to_bottom_panel(draw_dock as Control, "EZ Tiles Draw")
handle_selected_node()
select_2D_viewport_button = EditorInterface.get_base_control().find_child("2D", true, false)
draw_dock.undo_redo = get_undo_redo()
# IMPORTER
func create_tile_map_layer_for_tile_set(tile_set : TileSet) -> void:
var root := EditorInterface.get_edited_scene_root()
if is_instance_valid(root) and root is Node2D:
var tile_map_layer := TileMapLayer.new()
tile_map_layer.tile_set = tile_set
tile_map_layer.name = "EZTilesTileMapLayer"
root.add_child(tile_map_layer, true)
tile_map_layer.set_owner(root)
tile_map_layer.set_meta("_is_ez_tiles_generated", true)
EditorInterface.edit_node(tile_map_layer)
else:
alert_dialog.title = "Warning!"
alert_dialog.dialog_text = """Cannot create TileMapLayer for this scene.
Please try again when editing a Node2D scene."""
alert_dialog.popup_centered()
# DRAW
func _handles(object: Object) -> bool:
return is_instance_valid(object) and object is TileMapLayer
func _dump_interface(n : Node, max_d : int = 2, d : int = 0) -> void:
if n.name.contains("Dialog") or n.name.contains("Popup"):
return
print(n.name.lpad(d + n.name.length(), "-") + " (%d)" % [n.get_child_count()])
for c in n.get_children():
if d < max_d:
_dump_interface(c, max_d, d + 1)
func _get_select_mode_button() -> Button:
if is_instance_valid(select_mode_button):
return select_mode_button
else:
select_mode_button = (
EditorInterface.get_editor_viewport_2d().find_parent("*CanvasItemEditor*")
.find_child("*Button*", true, false)
)
return select_mode_button
func _tile_pos_from_mouse_pos() -> Vector2i:
if not is_instance_valid(draw_dock.under_edit):
return Vector2i.ZERO
var mouse_pos := EditorInterface.get_editor_viewport_2d().get_mouse_position()
var cursor_pos_on_tilemaplayer := (mouse_pos - draw_dock.under_edit.global_position).rotated(-draw_dock.under_edit.global_rotation)
var tile_pos := Vector2i(cursor_pos_on_tilemaplayer / (Vector2(draw_dock.under_edit.tile_set.tile_size) * draw_dock.under_edit.global_scale))
if cursor_pos_on_tilemaplayer.x < 0:
tile_pos.x -= 1
if cursor_pos_on_tilemaplayer.y < 0:
tile_pos.y -= 1
return tile_pos
func _tile_pos_to_overlay_pos(tile_pos : Vector2i) -> Vector2:
if not(draw_dock.visible and is_instance_valid(draw_dock.under_edit) and _get_select_mode_button().button_pressed):
return Vector2i.ZERO
return (
(
(
(Vector2(tile_pos) * (Vector2(draw_dock.under_edit.tile_set.tile_size) * draw_dock.under_edit.global_scale)).rotated(draw_dock.under_edit.global_rotation) + draw_dock.under_edit.global_position
) * EditorInterface.get_editor_viewport_2d().get_final_transform().get_scale()
) + EditorInterface.get_editor_viewport_2d().get_final_transform().get_origin()
)
func _forward_canvas_draw_over_viewport(overlay):
if lmb_is_down_outside_2d_viewport:
return
var viewport_2d := EditorInterface.get_editor_viewport_2d()
var g_mouse_pos = (
EditorInterface.get_base_control().get_global_mouse_position()
- viewport_2d.get_parent().global_position
)
if not viewport_2d.get_visible_rect().has_point(g_mouse_pos):
return
var fill := Color(1.0, 0.0, 0.0, 0.2) if draw_dock.rmb_is_down or draw_dock.using_eraser else Color(Color.WHITE, 0.2)
var stroke := Color.RED if draw_dock.rmb_is_down or draw_dock.using_eraser else Color.WHITE
var draw_rect := draw_dock.get_draw_rect(_tile_pos_from_mouse_pos())
var tl_corner := _tile_pos_to_overlay_pos(draw_rect.position)
var tr_corner := _tile_pos_to_overlay_pos(draw_rect.position + draw_rect.size * Vector2i.RIGHT)
var br_corner := _tile_pos_to_overlay_pos(draw_rect.position + draw_rect.size)
var bl_corner := _tile_pos_to_overlay_pos(draw_rect.position + draw_rect.size * Vector2i.DOWN)
overlay.draw_polyline(PackedVector2Array([tl_corner, tr_corner, br_corner, bl_corner, tl_corner]), stroke, 0.5, true)
if draw_dock.rmb_is_down or draw_dock.using_eraser:
overlay.draw_polygon(PackedVector2Array([tl_corner, tr_corner, br_corner, bl_corner, tl_corner]), [fill])
if draw_dock.drag_mode == EZTilesDrawDock.DragMode.BRUSH:
var draw_area := draw_dock.get_draw_area(_tile_pos_from_mouse_pos())
for tile in draw_area:
var tl := _tile_pos_to_overlay_pos(tile)
var tr := _tile_pos_to_overlay_pos(tile + Vector2i.RIGHT)
var br := _tile_pos_to_overlay_pos(tile + Vector2i.ONE)
var bl := _tile_pos_to_overlay_pos(tile + Vector2i.DOWN)
overlay.draw_polygon(PackedVector2Array([tl, tr, br, bl]), [fill])
else:
var draw_area := draw_dock.get_draw_area(_tile_pos_from_mouse_pos())
for tile in draw_area:
var tl := _tile_pos_to_overlay_pos(tile)
var tr := _tile_pos_to_overlay_pos(tile + Vector2i.RIGHT)
var br := _tile_pos_to_overlay_pos(tile + Vector2i.ONE)
var bl := _tile_pos_to_overlay_pos(tile + Vector2i.DOWN)
overlay.draw_polygon(PackedVector2Array([tl, tr, br, bl]), [fill])
func _input(_event) -> void:
update_overlays()
if is_instance_valid(draw_dock.under_edit) and select_2D_viewport_button.button_pressed and _get_select_mode_button().button_pressed and draw_dock.visible:
var viewport_2d := EditorInterface.get_editor_viewport_2d()
var g_mouse_pos = (
EditorInterface.get_base_control().get_global_mouse_position()
- viewport_2d.get_parent().global_position
)
if ((viewport_2d.get_visible_rect().has_point(g_mouse_pos)
and not lmb_is_down_outside_2d_viewport
and not (g_mouse_pos.x <= 164 and g_mouse_pos.y <= 40))
or draw_dock.lmb_is_down or draw_dock.rmb_is_down):
var tile_pos := _tile_pos_from_mouse_pos()
if (Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT)
and not draw_dock.lmb_is_down
and not lmb_is_down_outside_2d_viewport):
draw_dock.handle_mouse_down(MOUSE_BUTTON_LEFT, tile_pos)
if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT) and not draw_dock.rmb_is_down:
draw_dock.handle_mouse_down(MOUSE_BUTTON_RIGHT, tile_pos)
if draw_dock.lmb_is_down and not Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT):
draw_dock.handle_mouse_up(MOUSE_BUTTON_LEFT, tile_pos)
if draw_dock.rmb_is_down and not Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
draw_dock.handle_mouse_up(MOUSE_BUTTON_RIGHT, tile_pos)
if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) and draw_dock.lmb_is_down:
viewport_2d.set_input_as_handled()
elif Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
viewport_2d.set_input_as_handled()
if Input.is_key_pressed(KEY_CTRL):
draw_dock._place_back_remembered_cells()
draw_dock.suppress_preview = true
else:
draw_dock.suppress_preview = false
if not draw_dock.viewport_has_mouse:
draw_dock.handle_mouse_entered()
if prev_pos != tile_pos:
draw_dock.handle_mouse_move(tile_pos)
prev_pos = tile_pos
else:
lmb_is_down_outside_2d_viewport = Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT)
if draw_dock.viewport_has_mouse:
draw_dock.handle_mouse_out()
func handle_selected_node():
var selected_node : Node = selection.get_selected_nodes().pop_back()
if is_instance_valid(selected_node) and selected_node is TileMapLayer and is_instance_valid(selected_node.tile_set):
draw_dock.activate(selected_node)
if selected_node.has_meta("_is_ez_tiles_generated"):
await get_tree().create_timer(0.5).timeout
make_bottom_panel_item_visible(draw_dock)
else:
draw_dock.deactivate()
func _exit_tree() -> void:
remove_control_from_bottom_panel(dock)
dock.free()
remove_control_from_bottom_panel(draw_dock)
draw_dock.free()

View File

@@ -0,0 +1 @@
uid://brinsj5s31qgh

View File

@@ -0,0 +1,408 @@
@tool
class_name EZTilesDock
extends HBoxContainer
signal request_tile_map_layer(tile_set : TileSet)
enum CollisionType {
RECT,
TOP_SLOPES,
NONE,
ALL_SLOPES,
BOTTOM_SLOPES,
ROUNDED,
INVERSE_ROUNDED,
TREE,
CACTUS,
NAVIGABLE
}
var collision_previews := {}
var num_regex := RegEx.new()
var images_container : ImagesContainer
var x_size_input : EditorSpinSlider
var y_size_input : EditorSpinSlider
var generate_template_button : Button
var generate_tileset_button : Button
var generate_tilemaplayer_button : Button
var overlay_texture_rect : TextureRect
var preview_texture_rect : TextureRect
var guide_texture_rect : TextureRect
var reset_zoom_button : Button
var resource_map : Dictionary = {}
var collision_type_map : Dictionary = {}
var zoom := 1.0
var save_template_file_dialog : EditorFileDialog
var save_tile_set_file_dialog : EditorFileDialog
var hint_color := Color(0, 0, 0, 0.702)
var collision_layer_color := Color(1.0, 0.0, 0.0, 0.4)
func _enter_tree() -> void:
num_regex.compile("^\\d+\\.?\\d*$")
images_container = find_child("ImagesContainer")
x_size_input = EditorSpinSlider.new()
y_size_input = EditorSpinSlider.new()
x_size_input.value = 16
y_size_input.value = 16
x_size_input.min_value = 2
x_size_input.max_value = 2048
y_size_input.min_value = 2
y_size_input.max_value = 2048
find_child("XSizeInputContainer").add_child(x_size_input)
find_child("YSizeInputContainer").add_child(y_size_input)
generate_template_button = find_child("GenerateTemplateButton")
generate_tileset_button = find_child("GenerateTileSetButton")
generate_tilemaplayer_button = find_child("GenerateTileMapLayerButton")
overlay_texture_rect = find_child("OverlayTextureRect")
preview_texture_rect = find_child("PreviewTextureRect")
guide_texture_rect = find_child("GuideTextureRect")
reset_zoom_button = find_child("ResetZoomButton")
preview_texture_rect.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
overlay_texture_rect.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
save_template_file_dialog = EditorFileDialog.new()
save_template_file_dialog.add_filter("*.png", "PNG image")
save_template_file_dialog.file_mode = EditorFileDialog.FILE_MODE_SAVE_FILE
save_template_file_dialog.file_selected.connect(_on_save_template_file_selected)
EditorInterface.get_base_control().add_child(save_template_file_dialog)
save_tile_set_file_dialog = EditorFileDialog.new()
save_tile_set_file_dialog.add_filter("*.tres,*.res", "Resource file")
save_tile_set_file_dialog.file_mode = EditorFileDialog.FILE_MODE_SAVE_FILE
save_tile_set_file_dialog.file_selected.connect(_on_save_tile_set_file_selected)
EditorInterface.get_base_control().add_child(save_tile_set_file_dialog)
collision_previews[CollisionType.RECT] = preview_texture_rect.find_child("Rectangles")
collision_previews[CollisionType.ALL_SLOPES] = preview_texture_rect.find_child("Sloped (All Corners)")
collision_previews[CollisionType.BOTTOM_SLOPES] = preview_texture_rect.find_child("Sloped (Bottom Corners)")
collision_previews[CollisionType.TOP_SLOPES] = preview_texture_rect.find_child("Sloped (Top Corners)")
collision_previews[CollisionType.ROUNDED] = preview_texture_rect.find_child("Rounded Corners")
collision_previews[CollisionType.INVERSE_ROUNDED] = preview_texture_rect.find_child("Rounded Corners (Inverse)")
collision_previews[CollisionType.TREE] = preview_texture_rect.find_child("Tree")
collision_previews[CollisionType.CACTUS] = preview_texture_rect.find_child("Cactus")
x_size_input.value_changed.connect(func(n): handle_tilesize_update())
y_size_input.value_changed.connect(func(n): handle_tilesize_update())
handle_tilesize_update()
func _on_file_menu_load_files(files : PackedStringArray) -> void:
load_files(files)
func _on_images_container_drop_files(files: PackedStringArray) -> void:
load_files(files)
func _on_preview_panel_container_drop_files(files: PackedStringArray) -> void:
load_files(files)
func validate_size(actual : Vector2) -> String:
var tile_size = Vector2i(
x_size_input.value,
y_size_input.value
)
if not tile_size:
return ""
var expected = Vector2i(
x_size_input.value * 6,
y_size_input.value * 4
)
if expected.x != actual.x or expected.y != actual.y:
return """
Invalid size detected for %dx%d tiles!
Expected size = %dx%d pixels
Actual size = %dx%d pixels
""" % [tile_size.x, tile_size.y, expected.x, expected.y, actual.x, actual.y]
return ""
func load_files(files : PackedStringArray):
for file in files:
var im := ResourceLoader.load(file, "Image")
if im is CompressedTexture2D and not resource_map.has(im.get_rid()):
var detected_size = im.get_size()
var validation := ""
if not resource_map.is_empty():
validation = validate_size(detected_size)
images_container.add_file(im, validation)
if resource_map.is_empty():
var tile_size := Vector2(float(detected_size.x) / 6.0, float(detected_size.y) / 4.0)
x_size_input.value = tile_size.x
y_size_input.value = tile_size.y
x_size_input.read_only = true
y_size_input.read_only = true
generate_tileset_button.disabled = false
generate_tilemaplayer_button.disabled = false
handle_tilesize_update()
resource_map[im.get_rid()] = im
collision_type_map[im.get_rid()] = CollisionType.NONE
preview_texture_rect.texture = im
_show_collision_preview(im.get_rid())
func _show_collision_preview(resource_id : RID) -> void:
for c : Node in collision_previews.values():
c.hide()
if collision_type_map.has(resource_id) and collision_previews.has(collision_type_map[resource_id]):
collision_previews[collision_type_map[resource_id]].show()
func _on_images_container_terrain_list_collision_type_selected(
resource_id: RID, type_id: EZTilesDock.CollisionType) -> void:
collision_type_map[resource_id] = type_id
_on_images_container_terrain_list_entry_selected(resource_id)
func _on_images_container_terrain_list_entry_removed(removed_resource_id : RID) -> void:
resource_map.erase(removed_resource_id)
collision_type_map.erase(removed_resource_id)
if preview_texture_rect.texture and preview_texture_rect.texture.get_rid() == removed_resource_id:
preview_texture_rect.texture = null
if resource_map.size() == 0:
x_size_input.value = 16
y_size_input.value = 16
x_size_input.read_only = false
y_size_input.read_only = false
generate_tileset_button.disabled = true
generate_tilemaplayer_button.disabled = true
handle_tilesize_update()
for c : Node2D in collision_previews.values():
c.hide()
func _redraw_overlay_texture() -> void:
var tile_size := Vector2i(x_size_input.value, y_size_input.value)
var new_template_overlay := Image.create_empty(tile_size.x * 6, tile_size.y * 4, false, Image.FORMAT_RGBA8)
for y in range(new_template_overlay.get_height()):
for x in range(new_template_overlay.get_width()):
if (
(x >= tile_size.x * 2 and y < tile_size.y * 3 and x < tile_size.x * 3) or
(x < tile_size.x and y >= tile_size.y and y < tile_size.y * 3) or
(x >= tile_size.x * 3 and y >= tile_size.y * 3)
):
new_template_overlay.set_pixel(x, y, hint_color)
overlay_texture_rect.texture = ImageTexture.create_from_image(new_template_overlay)
guide_texture_rect.modulate = hint_color
for c : Node2D in collision_previews.values():
c.modulate = collision_layer_color
func handle_tilesize_update() -> void:
generate_template_button.disabled = false
_redraw_overlay_texture()
resize_texture_rects(1)
func resize_texture_rects(new_zoom : float):
zoom = new_zoom
var new_size := Vector2(
float(x_size_input.value) * 6 * zoom,
float(y_size_input.value) * 4 * zoom
)
preview_texture_rect.custom_minimum_size = new_size
overlay_texture_rect.custom_minimum_size = new_size
guide_texture_rect.custom_minimum_size = new_size
reset_zoom_button.text = str(zoom * 100) + "%"
for c : Node2D in collision_previews.values():
c.scale = Vector2(float(x_size_input.value), float(y_size_input.value)) * zoom
func _on_images_container_terrain_list_entry_selected(resource_id: RID) -> void:
preview_texture_rect.texture = resource_map[resource_id]
_show_collision_preview(resource_id)
func _on_preview_panel_container_gui_input(event: InputEvent) -> void:
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_WHEEL_UP and event.pressed:
resize_texture_rects(zoom + 0.25)
if event.button_index == MOUSE_BUTTON_WHEEL_DOWN and event.pressed:
resize_texture_rects(zoom - 0.25)
func _on_zoom_out_button_pressed() -> void:
resize_texture_rects(zoom - 0.25)
func _on_reset_zoom_button_pressed() -> void:
resize_texture_rects(1)
func _on_zoom_in_button_pressed() -> void:
resize_texture_rects(zoom + 0.25)
func _on_generate_template_button_pressed() -> void:
save_template_file_dialog.set_current_path(
"res://template_%dx%d.png" % [x_size_input.value, y_size_input.value])
save_template_file_dialog.popup_file_dialog()
func _on_save_template_file_selected(path : String) -> void:
var export_image := Image.create_empty(overlay_texture_rect.texture.get_size().x, overlay_texture_rect.texture.get_size().y, false, Image.FORMAT_RGBA8)
var overlay_image := overlay_texture_rect.texture.get_image()
var guide_image := guide_texture_rect.texture.get_image()
var tile_size := Vector2(float(x_size_input.value), float(y_size_input.value))
for x in range(overlay_image.get_size().x):
for y in range(overlay_image.get_size().y):
if overlay_image.get_pixel(x, y).a > 0.0:
export_image.set_pixel(x, y, hint_color)
elif guide_image.get_pixel(int((x / tile_size.x) * 256), int((y / tile_size.y) * 256)).a > 0.0:
export_image.set_pixel(x, y, hint_color)
export_image.save_png(path)
EditorInterface.get_resource_filesystem().scan()
func _on_color_picker_button_color_changed(color: Color) -> void:
hint_color = color
_redraw_overlay_texture()
func _on_collision_layer_color_picker_button_color_changed(color: Color) -> void:
collision_layer_color = color
for c : Node2D in collision_previews.values():
c.modulate = collision_layer_color
func _on_generate_tile_set_button_pressed() -> void:
save_tile_set_file_dialog.set_current_path("res://tile_set.tres")
save_tile_set_file_dialog.popup_file_dialog()
func _on_save_tile_set_file_selected(path : String) -> void:
var tile_set := generate_tileset()
ResourceSaver.save(tile_set, path)
EditorInterface.get_resource_filesystem().scan()
func _on_generate_tile_map_layer_button_pressed() -> void:
var tile_set := generate_tileset()
request_tile_map_layer.emit(tile_set)
func generate_tileset() -> TileSet:
var raw_intel := images_container.gather_data()
var tile_set := TileSet.new()
var physics_layer_added := false
var nav_layer_added := false
tile_set.add_terrain_set()
tile_set.set_terrain_set_mode(0, TileSet.TERRAIN_MODE_MATCH_SIDES)
tile_set.tile_size = Vector2i(x_size_input.value, y_size_input.value)
for terrain_id in range(raw_intel.size()):
tile_set.add_terrain(0, terrain_id)
tile_set.set_terrain_name(0, terrain_id, raw_intel[terrain_id]["terrain_name"])
if raw_intel[terrain_id]["layer_type"] != CollisionType.NONE and not physics_layer_added:
tile_set.add_physics_layer()
physics_layer_added = true
if raw_intel[terrain_id]["layer_type"] == CollisionType.NAVIGABLE and not nav_layer_added:
tile_set.add_navigation_layer()
nav_layer_added = true
for terrain_id in range(raw_intel.size()):
var atlas_source := TileSetAtlasSource.new()
atlas_source.texture_region_size = tile_set.tile_size
atlas_source.texture = raw_intel[terrain_id]["texture_resource"]
tile_set.add_source(atlas_source)
var created_tiles : Array[TileData] = []
# row
created_tiles.append(create_tile(atlas_source, terrain_id, Vector2i(0,0), _get_collision_polygon_for_tile("MC", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_single_neighbour_tile(atlas_source, terrain_id, Vector2i(1,0), raw_intel.size(), TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, _get_collision_polygon_for_tile("VT", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(3,0), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE], _get_collision_polygon_for_tile("TL", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_triple_neighbour_tile(atlas_source, terrain_id, Vector2i(4,0), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE, TileSet.CELL_NEIGHBOR_LEFT_SIDE], _get_collision_polygon_for_tile("TM", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(5,0), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_LEFT_SIDE], _get_collision_polygon_for_tile("TR", atlas_source.texture.get_rid(), tile_set.tile_size)))
# row
created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(1,1), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_TOP_SIDE], _get_collision_polygon_for_tile("VM", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_triple_neighbour_tile(atlas_source, terrain_id, Vector2i(3,1), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE, TileSet.CELL_NEIGHBOR_TOP_SIDE], _get_collision_polygon_for_tile("LM", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_all_sides_neighbour_tile(atlas_source, terrain_id, Vector2i(4,1), raw_intel.size(), _get_collision_polygon_for_tile("CM", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_triple_neighbour_tile(atlas_source, terrain_id, Vector2i(5,1), raw_intel.size(), [TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, TileSet.CELL_NEIGHBOR_LEFT_SIDE, TileSet.CELL_NEIGHBOR_TOP_SIDE], _get_collision_polygon_for_tile("RM", atlas_source.texture.get_rid(), tile_set.tile_size)))
# row
created_tiles.append(create_single_neighbour_tile(atlas_source, terrain_id, Vector2i(1,2), raw_intel.size(), TileSet.CELL_NEIGHBOR_TOP_SIDE, _get_collision_polygon_for_tile("VB", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(3,2), raw_intel.size(), [TileSet.CELL_NEIGHBOR_TOP_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE], _get_collision_polygon_for_tile("BL", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_triple_neighbour_tile(atlas_source, terrain_id, Vector2i(4,2), raw_intel.size(), [TileSet.CELL_NEIGHBOR_TOP_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE, TileSet.CELL_NEIGHBOR_LEFT_SIDE], _get_collision_polygon_for_tile("BC", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(5,2), raw_intel.size(), [TileSet.CELL_NEIGHBOR_TOP_SIDE, TileSet.CELL_NEIGHBOR_LEFT_SIDE], _get_collision_polygon_for_tile("BR", atlas_source.texture.get_rid(), tile_set.tile_size)))
# row
created_tiles.append(create_single_neighbour_tile(atlas_source, terrain_id, Vector2i(0,3), raw_intel.size(), TileSet.CELL_NEIGHBOR_RIGHT_SIDE, _get_collision_polygon_for_tile("HL", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_dual_neighbour_tile(atlas_source, terrain_id, Vector2i(1,3), raw_intel.size(), [TileSet.CELL_NEIGHBOR_LEFT_SIDE, TileSet.CELL_NEIGHBOR_RIGHT_SIDE], _get_collision_polygon_for_tile("HM", atlas_source.texture.get_rid(), tile_set.tile_size)))
created_tiles.append(create_single_neighbour_tile(atlas_source, terrain_id, Vector2i(2,3), raw_intel.size(), TileSet.CELL_NEIGHBOR_LEFT_SIDE, _get_collision_polygon_for_tile("HR", atlas_source.texture.get_rid(), tile_set.tile_size)))
if raw_intel[terrain_id]["layer_type"] == CollisionType.NAVIGABLE:
for tile_data : TileData in created_tiles:
tile_data.set_navigation_polygon(0, _get_new_navigation_rect(Vector2(tile_set.tile_size)))
return tile_set
func _get_new_navigation_rect(tile_size : Vector2) -> NavigationPolygon:
var new_navigation_mesh = NavigationPolygon.new()
var new_vertices = PackedVector2Array([
Vector2(-0.5, -0.5) * tile_size,
Vector2(0.5, -0.5) * tile_size,
Vector2(0.5, 0.5) * tile_size,
Vector2(-0.5, 0.5) * tile_size
])
new_navigation_mesh.vertices = new_vertices
var new_polygon_indices = PackedInt32Array([0, 1, 2, 3])
new_navigation_mesh.add_polygon(new_polygon_indices)
return new_navigation_mesh
func _get_collision_polygon_for_tile(node_name : String, resource_id : RID, tile_size : Vector2) -> PackedVector2Array:
#print(resource_id, collision_type_map.has(resource_id))
if not collision_type_map.has(resource_id):
return PackedVector2Array([])
if not collision_previews.has(collision_type_map[resource_id]):
return PackedVector2Array([])
var polygon_node : Polygon2D = collision_previews[collision_type_map[resource_id]].find_child(node_name)
if is_instance_valid(polygon_node):
var poly_points : Array[Vector2] = []
for point : Vector2 in polygon_node.polygon:
poly_points.append((point - Vector2(0.5, 0.5)) * tile_size)
return PackedVector2Array(poly_points)
return PackedVector2Array([])
func create_tile(atlas_source : TileSetAtlasSource, terrain_id : int, at_pos : Vector2i, collision_polygon_points : PackedVector2Array) -> TileData:
atlas_source.create_tile(at_pos)
var new_tile := atlas_source.get_tile_data(at_pos, 0)
new_tile.terrain_set = 0
new_tile.terrain = terrain_id
if not collision_polygon_points.is_empty():
new_tile.add_collision_polygon(0)
new_tile.set_collision_polygon_points(0, 0, PackedVector2Array(collision_polygon_points))
return new_tile
func create_single_neighbour_tile(atlas_source : TileSetAtlasSource, terrain_id : int, at_pos : Vector2i, num_terrains : int, neighbour : int, collision_polygon_points : PackedVector2Array) -> TileData:
var new_tile := create_tile(atlas_source, terrain_id, at_pos, collision_polygon_points)
new_tile.set_terrain_peering_bit(neighbour, terrain_id)
return new_tile
func create_dual_neighbour_tile(atlas_source : TileSetAtlasSource, terrain_id : int, at_pos : Vector2i, num_terrains : int, neighbours : Array[int], collision_polygon_points : PackedVector2Array) -> TileData:
var new_tile := create_tile(atlas_source, terrain_id, at_pos, collision_polygon_points)
new_tile.set_terrain_peering_bit(neighbours[0], terrain_id)
new_tile.set_terrain_peering_bit(neighbours[1], terrain_id)
return new_tile
func create_triple_neighbour_tile(atlas_source : TileSetAtlasSource, terrain_id : int, at_pos : Vector2i, num_terrains : int, neighbours : Array[int], collision_polygon_points : PackedVector2Array) -> TileData:
var new_tile := create_tile(atlas_source, terrain_id, at_pos, collision_polygon_points)
new_tile.set_terrain_peering_bit(neighbours[0], terrain_id)
new_tile.set_terrain_peering_bit(neighbours[1], terrain_id)
new_tile.set_terrain_peering_bit(neighbours[2], terrain_id)
return new_tile
func create_all_sides_neighbour_tile(atlas_source : TileSetAtlasSource, terrain_id : int, at_pos : Vector2i, num_terrains : int, collision_polygon_points : PackedVector2Array) -> TileData:
var new_tile := create_tile(atlas_source, terrain_id, at_pos, collision_polygon_points)
new_tile.set_terrain_peering_bit(TileSet.CELL_NEIGHBOR_RIGHT_SIDE, terrain_id)
new_tile.set_terrain_peering_bit(TileSet.CELL_NEIGHBOR_BOTTOM_SIDE, terrain_id)
new_tile.set_terrain_peering_bit(TileSet.CELL_NEIGHBOR_LEFT_SIDE, terrain_id)
new_tile.set_terrain_peering_bit(TileSet.CELL_NEIGHBOR_TOP_SIDE, terrain_id)
return new_tile

View File

@@ -0,0 +1 @@
uid://dlwkkly71ed7v

View File

@@ -0,0 +1,211 @@
[gd_scene load_steps=22 format=3 uid="uid://ci7u5r1qc0aob"]
[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_dock.gd" id="1_xlstp"]
[ext_resource type="Script" path="res://addons/ez_tiles/load_files_button.gd" id="2_8dh4w"]
[ext_resource type="PackedScene" uid="uid://1u5mrsioaaon" path="res://addons/ez_tiles/images_container.tscn" id="3_vxumx"]
[ext_resource type="Texture2D" uid="uid://cxl4w251e8xgf" path="res://addons/ez_tiles/Save.svg" id="4_2smhm"]
[ext_resource type="Texture2D" uid="uid://njliaygubc5c" path="res://addons/ez_tiles/ZoomLess.svg" id="4_k6fm5"]
[ext_resource type="Texture2D" uid="uid://bvwx6xu0hp7mv" path="res://addons/ez_tiles/ZoomMore.svg" id="5_0phj1"]
[ext_resource type="Script" path="res://addons/ez_tiles/preview_panel_container.gd" id="6_3jtbs"]
[ext_resource type="Texture2D" uid="uid://d4a0dorx8awbg" path="res://addons/ez_tiles/guide.png" id="9_umpsr"]
[ext_resource type="PackedScene" uid="uid://cxnhqxx237lix" path="res://addons/ez_tiles/collision_polygon_templates/inverse_rounded_corners.tscn" id="9_wk7qe"]
[ext_resource type="PackedScene" uid="uid://bdtlwd7f6ojk0" path="res://addons/ez_tiles/collision_polygon_templates/rectangles.tscn" id="10_fyd7t"]
[ext_resource type="PackedScene" uid="uid://cm4063l3dfehn" path="res://addons/ez_tiles/collision_polygon_templates/rounded_corners.tscn" id="11_cnbjd"]
[ext_resource type="PackedScene" uid="uid://lfnyjmnayoqe" path="res://addons/ez_tiles/collision_polygon_templates/slopes.tscn" id="12_x4rcv"]
[ext_resource type="PackedScene" uid="uid://ckfu3f4u350bg" path="res://addons/ez_tiles/collision_polygon_templates/slopes_bottom.tscn" id="13_3furq"]
[ext_resource type="PackedScene" uid="uid://3gmoem8hi2hi" path="res://addons/ez_tiles/collision_polygon_templates/slopes_top.tscn" id="14_djl3r"]
[ext_resource type="PackedScene" uid="uid://ywxhlehtt18d" path="res://addons/ez_tiles/collision_polygon_templates/cactus.tscn" id="15_ll5rq"]
[ext_resource type="PackedScene" uid="uid://bp35luh5na8o7" path="res://addons/ez_tiles/collision_polygon_templates/tree.tscn" id="16_02naq"]
[sub_resource type="LabelSettings" id="LabelSettings_2svd6"]
font_color = Color(0.619608, 0.619608, 0.619608, 1)
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_wkbrg"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3l5ec"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ikc07"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fl86h"]
bg_color = Color(0.12549, 0.145098, 0.172549, 1)
[node name="EZTilesDock" type="HBoxContainer"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_xlstp")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 2
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
custom_minimum_size = Vector2(0, 40)
layout_mode = 2
[node name="LoadFilesButton" type="Button" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 0
text = "Import Images"
script = ExtResource("2_8dh4w")
[node name="GenerateTileSetButton" type="Button" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
disabled = true
text = "Save TileSet"
[node name="GenerateTileMapLayerButton" type="Button" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
disabled = true
text = "Create TileMapLayer"
[node name="ImagesContainer" parent="VBoxContainer" instance=ExtResource("3_vxumx")]
layout_mode = 2
[node name="VBoxContainer2" type="VBoxContainer" parent="."]
layout_mode = 2
size_flags_horizontal = 3
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer2"]
custom_minimum_size = Vector2(0, 40)
layout_mode = 2
[node name="TileSizeLabel" type="Label" parent="VBoxContainer2/HBoxContainer"]
layout_mode = 2
tooltip_text = "The tile size is determined automatically from the first image you import. As you can see in the template below, EZ Tiles expects a 6 by 4 grid; the tiles do not have to be square."
mouse_filter = 0
text = "Tile Size* "
label_settings = SubResource("LabelSettings_2svd6")
[node name="XSizeInputContainer" type="PanelContainer" parent="VBoxContainer2/HBoxContainer"]
custom_minimum_size = Vector2(84, 0)
layout_mode = 2
size_flags_horizontal = 0
[node name="YSizeInputContainer" type="PanelContainer" parent="VBoxContainer2/HBoxContainer"]
custom_minimum_size = Vector2(84, 0)
layout_mode = 2
size_flags_horizontal = 0
[node name="HintColorLabel" type="Label" parent="VBoxContainer2/HBoxContainer"]
layout_mode = 2
mouse_filter = 0
text = "Hint colors: "
label_settings = SubResource("LabelSettings_2svd6")
[node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer2/HBoxContainer"]
custom_minimum_size = Vector2(40, 0)
layout_mode = 2
tooltip_text = "Overlay Color"
color = Color(0, 0, 0, 0.701961)
[node name="CollisionLayerColorPickerButton" type="ColorPickerButton" parent="VBoxContainer2/HBoxContainer"]
custom_minimum_size = Vector2(40, 0)
layout_mode = 2
tooltip_text = "Collision Polygon color"
color = Color(1, 0, 0, 0.392157)
[node name="GenerateTemplateButton" type="Button" parent="VBoxContainer2/HBoxContainer"]
layout_mode = 2
disabled = true
text = "Save template"
icon = ExtResource("4_2smhm")
[node name="ZoomPreviewLabel" type="Label" parent="VBoxContainer2/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
text = "Zoom Preview: "
label_settings = SubResource("LabelSettings_2svd6")
horizontal_alignment = 2
[node name="ZoomOutButton" type="Button" parent="VBoxContainer2/HBoxContainer"]
layout_mode = 2
theme_override_styles/normal = SubResource("StyleBoxEmpty_wkbrg")
icon = ExtResource("4_k6fm5")
[node name="ResetZoomButton" type="Button" parent="VBoxContainer2/HBoxContainer"]
layout_mode = 2
theme_override_styles/normal = SubResource("StyleBoxEmpty_3l5ec")
text = "100%"
[node name="ZoomInButton" type="Button" parent="VBoxContainer2/HBoxContainer"]
layout_mode = 2
theme_override_styles/normal = SubResource("StyleBoxEmpty_ikc07")
icon = ExtResource("5_0phj1")
[node name="PreviewScrollContainer" type="ScrollContainer" parent="VBoxContainer2"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_styles/panel = SubResource("StyleBoxFlat_fl86h")
[node name="PreviewPanelContainer" type="CenterContainer" parent="VBoxContainer2/PreviewScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("6_3jtbs")
[node name="PreviewTextureRect" type="TextureRect" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer"]
texture_filter = 1
layout_mode = 2
expand_mode = 3
[node name="Rounded Corners (Inverse)" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("9_wk7qe")]
visible = false
modulate = Color(0.970763, 0, 0.452533, 0.42)
[node name="Rectangles" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("10_fyd7t")]
visible = false
modulate = Color(0.970763, 0, 0.452533, 0.42)
[node name="Rounded Corners" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("11_cnbjd")]
visible = false
modulate = Color(0.970763, 0, 0.452533, 0.42)
[node name="Sloped (All Corners)" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("12_x4rcv")]
visible = false
modulate = Color(0.970763, 0, 0.452533, 0.42)
[node name="Sloped (Bottom Corners)" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("13_3furq")]
visible = false
modulate = Color(0.970763, 0, 0.452533, 0.42)
[node name="Sloped (Top Corners)" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("14_djl3r")]
visible = false
modulate = Color(0.970763, 0, 0.452533, 0.42)
[node name="Cactus" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("15_ll5rq")]
visible = false
[node name="Tree" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer/PreviewTextureRect" instance=ExtResource("16_02naq")]
visible = false
[node name="OverlayTextureRect" type="TextureRect" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer"]
texture_filter = 1
layout_mode = 2
expand_mode = 3
[node name="GuideTextureRect" type="TextureRect" parent="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer"]
modulate = Color(1, 1, 1, 0.701961)
texture_filter = 1
layout_mode = 2
texture = ExtResource("9_umpsr")
expand_mode = 3
[connection signal="load_files" from="VBoxContainer/HBoxContainer/LoadFilesButton" to="." method="_on_file_menu_load_files"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/LoadFilesButton" to="VBoxContainer/HBoxContainer/LoadFilesButton" method="_on_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/GenerateTileSetButton" to="." method="_on_generate_tile_set_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/GenerateTileMapLayerButton" to="." method="_on_generate_tile_map_layer_button_pressed"]
[connection signal="drop_files" from="VBoxContainer/ImagesContainer" to="." method="_on_images_container_drop_files"]
[connection signal="terrain_list_collision_type_selected" from="VBoxContainer/ImagesContainer" to="." method="_on_images_container_terrain_list_collision_type_selected"]
[connection signal="terrain_list_entry_removed" from="VBoxContainer/ImagesContainer" to="." method="_on_images_container_terrain_list_entry_removed"]
[connection signal="terrain_list_entry_selected" from="VBoxContainer/ImagesContainer" to="." method="_on_images_container_terrain_list_entry_selected"]
[connection signal="color_changed" from="VBoxContainer2/HBoxContainer/ColorPickerButton" to="." method="_on_color_picker_button_color_changed"]
[connection signal="color_changed" from="VBoxContainer2/HBoxContainer/CollisionLayerColorPickerButton" to="." method="_on_collision_layer_color_picker_button_color_changed"]
[connection signal="pressed" from="VBoxContainer2/HBoxContainer/GenerateTemplateButton" to="." method="_on_generate_template_button_pressed"]
[connection signal="pressed" from="VBoxContainer2/HBoxContainer/ZoomOutButton" to="." method="_on_zoom_out_button_pressed"]
[connection signal="pressed" from="VBoxContainer2/HBoxContainer/ResetZoomButton" to="." method="_on_reset_zoom_button_pressed"]
[connection signal="pressed" from="VBoxContainer2/HBoxContainer/ZoomInButton" to="." method="_on_zoom_in_button_pressed"]
[connection signal="gui_input" from="VBoxContainer2/PreviewScrollContainer" to="." method="_on_preview_panel_container_gui_input"]
[connection signal="drop_files" from="VBoxContainer2/PreviewScrollContainer/PreviewPanelContainer" to="." method="_on_preview_panel_container_drop_files"]

View File

@@ -0,0 +1,381 @@
@tool
extends Control
class_name AreaDraw
signal connect_mode_toggled(toggled : bool)
enum Shape {
RECTANGLE,
SLOPE_TL,
SLOPE_TR,
SLOPE_BR,
SLOPE_BL,
HARD_RECTANGLE,
HILL_TOP,
HILL_BOTTOM,
HILL_RIGHT,
HILL_LEFT,
ISLAND,
RECTANGLE_BASIC
}
var shape := Shape.RECTANGLE_BASIC
var preview_container : GridContainer
const TL := Vector2i(3, 0)
const TR := Vector2i(5, 0)
const TM := Vector2i(4, 0)
const BL := Vector2i(3, 2)
const BR := Vector2i(5, 2)
const BM := Vector2i(4, 2)
const LM := Vector2i(3, 1)
const RM := Vector2i(5, 1)
const CM := Vector2i(4, 1)
const XX := null
const SHAPE_MAP := {
Shape.RECTANGLE_BASIC: [
[CM, CM, CM, CM, CM],
[CM, CM, CM, CM, CM],
[CM, CM, CM, CM, CM],
[CM, CM, CM, CM, CM],
[CM, CM, CM, CM, CM],
],
Shape.RECTANGLE: [
[TL, TM, TM, TM, TR],
[LM, CM, CM, CM, RM],
[LM, CM, CM, CM, RM],
[BL, BM, BM, BM, BR],
[XX, XX, XX, XX, XX],
],
Shape.SLOPE_TL: [
[XX, XX, XX, TL, TM],
[XX, XX, TL, CM, CM],
[XX, TL, CM, CM, CM],
[TL, CM, CM, CM, CM],
[XX, XX, XX, XX, XX],
],
Shape.SLOPE_TR: [
[TM, TR, XX, XX, XX],
[CM, CM, TR, XX, XX],
[CM, CM, CM, TR, XX],
[CM, CM, CM, CM, TR],
[XX, XX, XX, XX, XX],
],
Shape.SLOPE_BR: [
[CM, CM, CM, CM, BR],
[CM, CM, CM, BR, XX],
[CM, CM, BR, XX, XX],
[BM, BR, XX, XX, XX],
[XX, XX, XX, XX, XX],
],
Shape.SLOPE_BL: [
[BL, CM, CM, CM, CM],
[XX, BL, CM, CM, CM],
[XX, XX, BL, CM, CM],
[XX, XX, XX, BL, BM],
[XX, XX, XX, XX, XX],
],
Shape.HARD_RECTANGLE: [
[TM, TM, TM, TM, TM],
[LM, CM, CM, CM, RM],
[LM, CM, CM, CM, RM],
[BM, BM, BM, BM, BM],
[XX, XX, XX, XX, XX],
],
Shape.HILL_TOP: [
[XX, TL, TM, TR, XX],
[TL, CM, CM, CM, TR],
[LM, CM, CM, CM, RM],
[LM, CM, CM, CM, RM],
[XX, XX, XX, XX, XX],
],
Shape.HILL_BOTTOM: [
[LM, CM, CM, CM, RM],
[LM, CM, CM, CM, RM],
[BL, CM, CM, CM, BR],
[XX, BL, BM, BR, XX],
[XX, XX, XX, XX, XX],
],
Shape.HILL_LEFT: [
[XX, TL, TM, TM, TM],
[TL, CM, CM, CM, CM],
[LM, CM, CM, CM, CM],
[BL, CM, CM, CM, CM],
[XX, BL, BM, BM, BM],
],
Shape.HILL_RIGHT: [
[TM, TM, TM, TR, XX],
[CM, CM, CM, CM, TR],
[CM, CM, CM, CM, RM],
[CM, CM, CM, CM, BR],
[BM, BM, BM, BR, XX],
],
Shape.ISLAND: [
[XX, TL, TM, TR, XX],
[TL, CM, CM, CM, TR],
[CM, CM, CM, CM, RM],
[BL, CM, CM, CM, BR],
[XX, BL, BM, BR, XX],
],
}
var cur_terrain_texture : Texture2D
var cur_tile_size : Vector2i
var connect_terrains_button : Button
var tile_button : Button
func _enter_tree() -> void:
preview_container = find_child("PreviewGridContainer")
connect_terrains_button = find_child("ConnectTerrainsButton")
tile_button = find_child("TileButton1")
func _get_empty_tex(tile_size : Vector2i) -> Texture2D:
var plc_tex := GradientTexture2D.new()
plc_tex.width = tile_size.x
plc_tex.height = tile_size.y
plc_tex.gradient = Gradient.new()
plc_tex.gradient.colors = [Color.TRANSPARENT]
return plc_tex
func update_grid_preview(terrain_texture : Texture2D = cur_terrain_texture, tile_size : Vector2i = cur_tile_size):
tile_button.icon = AtlasTexture.new()
tile_button.icon.atlas = terrain_texture
tile_button.icon.region = Rect2i(CM * tile_size, tile_size)
cur_terrain_texture = terrain_texture
cur_tile_size = tile_size
var i := 0
for y in range(SHAPE_MAP[shape].size()):
for x in range(SHAPE_MAP[shape][y].size()):
var tex_rect : TextureRect = preview_container.get_child(i)
i += 1
if not is_instance_valid(tex_rect):
continue
if SHAPE_MAP[shape][y][x] == null:
tex_rect.texture = _get_empty_tex(tile_size)
continue
var atlas_texture : AtlasTexture = tex_rect.texture if tex_rect.texture is AtlasTexture else AtlasTexture.new()
atlas_texture.atlas = terrain_texture
atlas_texture.region = Rect2i(SHAPE_MAP[shape][y][x] * tile_size, tile_size)
tex_rect.texture = atlas_texture
static func get_cells_rectangle_basic(p1 : Vector2i, p2 : Vector2i) -> Dictionary:
var cells := {}
for x in range(p1.x, p2.x + 1):
for y in range(p1.y, p2.y + 1):
cells[Vector2i(x, y)] = CM
return cells
static func get_cells_rectangle(p1 : Vector2i, p2 : Vector2i, soft := false) -> Dictionary:
var cells := {}
for x in range(p1.x, p2.x + 1):
for y in range(p1.y, p2.y + 1):
if x == p1.x and y == p1.y and soft:
cells[Vector2i(x, y)] = TL
elif x == p2.x and y == p1.y and soft:
cells[Vector2i(x, y)] = TR
elif x == p1.x and y == p2.y and soft:
cells[Vector2i(x, y)] = BL
elif x == p2.x and y == p2.y and soft:
cells[Vector2i(x, y)] = BR
elif x == p2.x and y > p1.y and y < p2.y:
cells[Vector2i(x, y)] = RM
elif x == p1.x and y > p1.y and y < p2.y:
cells[Vector2i(x, y)] = LM
elif y == p2.y:
cells[Vector2i(x, y)] = BM
elif y == p1.y:
cells[Vector2i(x, y)] = TM
else:
cells[Vector2i(x, y)] = CM
return cells
static func get_cells_slope_tl(p1 : Vector2i, p2 : Vector2i) -> Dictionary:
var cells := {}
var width := p2.x - p1.x + 1
var height := p2.y - p1.y + 1
var sq_siz := min(width, height)
for y : int in range(sq_siz):
var range_start = sq_siz - y - 1 if sq_siz - y - 1 > 0 else 0
for x in range(range_start, sq_siz):
cells[Vector2i(p1.x + x, p1.y + y)] = TL if x == range_start else CM
if width > sq_siz:
for x in range(sq_siz, width):
for y in range(height):
cells[Vector2i(p1.x + x, p1.y + y)] = TM if y == 0 else CM
else:
for y in range(sq_siz, height):
for x in range(width):
cells[Vector2i(p1.x + x, p1.y + y)] = LM if x == 0 else CM
return cells
static func get_cells_slope_tr(p1 : Vector2i, p2 : Vector2i) -> Dictionary:
var cells := {}
var width := p2.x - p1.x + 1
var height := p2.y - p1.y + 1
var sq_siz := min(width, height)
for y : int in range(sq_siz):
var range_start = sq_siz - y - 1 if sq_siz - y - 1 > 0 else 0
for x in range(range_start, sq_siz):
cells[Vector2i(p1.x + (width-x-1), p1.y + y)] = TR if x == range_start else CM
if width > sq_siz:
for x in range(sq_siz, width):
for y in range(height):
cells[Vector2i(p1.x + (width-x-1), p1.y + y)] = TM if y == 0 else CM
else:
for y in range(sq_siz, height):
for x in range(width):
cells[Vector2i(p1.x + (width-x-1), p1.y + y)] = RM if x == 0 else CM
return cells
static func get_cells_slope_bl(p1 : Vector2i, p2 : Vector2i) -> Dictionary:
var cells := {}
var width := p2.x - p1.x + 1
var height := p2.y - p1.y + 1
var sq_siz := min(width, height)
for y : int in range(sq_siz):
var range_start = sq_siz - y - 1 if sq_siz - y - 1 > 0 else 0
for x in range(range_start, sq_siz):
cells[Vector2i(p1.x + x, p1.y + (height - y - 1))] = BL if x == range_start else CM
if width > sq_siz:
for x in range(sq_siz, width):
for y in range(height):
cells[Vector2i(p1.x + x, p1.y + (height - y - 1))] = BM if y == 0 else CM
else:
for y in range(sq_siz, height):
for x in range(width):
cells[Vector2i(p1.x + x, p1.y + (height - y - 1))] = LM if x == 0 else CM
return cells
static func get_cells_slope_br(p1 : Vector2i, p2 : Vector2i) -> Dictionary:
var cells := {}
var width := p2.x - p1.x + 1
var height := p2.y - p1.y + 1
var sq_siz := min(width, height)
for y : int in range(sq_siz):
var range_start = sq_siz - y - 1 if sq_siz - y - 1 > 0 else 0
for x in range(range_start, sq_siz):
cells[Vector2i(p1.x + (width-x-1), p1.y + (height - y - 1))] = BR if x == range_start else CM
if width > sq_siz:
for x in range(sq_siz, width):
for y in range(height):
cells[Vector2i(p1.x + (width-x-1), p1.y + (height - y - 1))] = BM if y == 0 else CM
else:
for y in range(sq_siz, height):
for x in range(width):
cells[Vector2i(p1.x + (width-x-1), p1.y + (height - y - 1))] = RM if x == 0 else CM
return cells
static func get_cells_hill_top(p1 : Vector2i, p2 : Vector2i) -> Dictionary:
var width := p2.x - p1.x
var height := p2.y - p1.y
var out = get_cells_slope_tl(p1, p1 + Vector2i(ceil(width / 2.0) - 1, height))
out.merge(get_cells_slope_tr(p1 + Vector2i(ceil(width / 2.0), 0), p2))
return out
static func get_cells_hill_bottom(p1 : Vector2i, p2 : Vector2i) -> Dictionary:
var width := p2.x - p1.x
var height := p2.y - p1.y
var out = get_cells_slope_bl(p1, p1 + Vector2i(ceil(width / 2.0) - 1, height))
out.merge(get_cells_slope_br(p1 + Vector2i(ceil(width / 2.0), 0), p2))
return out
static func get_cells_hill_left(p1 : Vector2i, p2 : Vector2i) -> Dictionary:
var width := p2.x - p1.x
var height := p2.y - p1.y
var out = get_cells_slope_tl(p1, p1 + Vector2i(width, ceil(height / 2.0) - 1))
out.merge(get_cells_slope_bl(p1 + Vector2i(0, ceil(height / 2.0)), p2))
return out
static func get_cells_hill_right(p1 : Vector2i, p2 : Vector2i) -> Dictionary:
var width := p2.x - p1.x
var height := p2.y - p1.y
var out = get_cells_slope_tr(p1, p1 + Vector2i(width, ceil(height / 2.0) - 1))
out.merge(get_cells_slope_br(p1 + Vector2i(0, ceil(height / 2.0)), p2))
return out
static func get_cells_island(p1 : Vector2i, p2 : Vector2i) -> Dictionary:
var width := p2.x - p1.x
var height := p2.y - p1.y
var out = get_cells_slope_tl(p1, p1 + Vector2i(ceil(width / 2.0) - 1, ceil(height / 2.0) - 1))
out.merge(get_cells_slope_tr(p1 + Vector2i(ceil(width / 2.0), 0), Vector2i(p2.x, p1.y + ceil(height / 2.0) - 1)))
out.merge(get_cells_slope_bl(p1 + Vector2i(0, ceil(height / 2.0)), Vector2i(p1.x + ceil(width / 2.0) - 1, p2.y)))
out.merge(get_cells_slope_br(p1 + Vector2i(ceil(width / 2.0), ceil(height / 2.0)), p2), true)
return out
func _on_connect_terrains_button_pressed() -> void:
connect_mode_toggled.emit(true)
func _on_tile_button_1_pressed() -> void:
connect_mode_toggled.emit(false)
func _on_rectangles_button_pressed() -> void:
shape = Shape.RECTANGLE
update_grid_preview()
func _on_slopes_tl_button_pressed() -> void:
shape = Shape.SLOPE_TL
update_grid_preview()
func _on_slopes_tr_button_pressed() -> void:
shape = Shape.SLOPE_TR
update_grid_preview()
func _on_slopes_br_button_pressed() -> void:
shape = Shape.SLOPE_BR
update_grid_preview()
func _on_slopes_bl_button_pressed() -> void:
shape = Shape.SLOPE_BL
update_grid_preview()
func _on_hard_rectangles_button_pressed() -> void:
shape = Shape.HARD_RECTANGLE
update_grid_preview()
func _on_hill_top_button_pressed() -> void:
shape = Shape.HILL_TOP
update_grid_preview()
func _on_hill_bottom_button_pressed() -> void:
shape = Shape.HILL_BOTTOM
update_grid_preview()
func _on_hill_left_button_pressed() -> void:
shape = Shape.HILL_LEFT
update_grid_preview()
func _on_hill_right_button_pressed() -> void:
shape = Shape.HILL_RIGHT
update_grid_preview()
func _on_island_button_pressed() -> void:
shape = Shape.ISLAND
update_grid_preview()
func _on_rectangles_basic_button_pressed() -> void:
shape = Shape.RECTANGLE_BASIC
update_grid_preview()

View File

@@ -0,0 +1 @@
uid://b87n11kajm34

View File

@@ -0,0 +1,389 @@
[gd_scene load_steps=18 format=3 uid="uid://bitqwiwmn3s0r"]
[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/area_draw.gd" id="1_ee3lv"]
[ext_resource type="Texture2D" uid="uid://dooqg3fapf15x" path="res://addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg" id="2_0c16j"]
[ext_resource type="Texture2D" uid="uid://xetkyyw6y8ff" path="res://addons/ez_tiles/ez_tiles_draw/icons/RectangleSoft.svg" id="2_lfgj6"]
[ext_resource type="Texture2D" uid="uid://behgjlyeldpdv" path="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeTL.svg" id="3_j68q8"]
[ext_resource type="Texture2D" uid="uid://dbjof7q6tq4d6" path="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeTR.svg" id="4_703fo"]
[ext_resource type="Texture2D" uid="uid://7crpolmxjj2r" path="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeBR.svg" id="5_f5qx1"]
[ext_resource type="Texture2D" uid="uid://clpg11r4kdy8v" path="res://addons/ez_tiles/ez_tiles_draw/icons/SlopeBL.svg" id="6_r38ls"]
[ext_resource type="Texture2D" uid="uid://c7u17hgk6jvet" path="res://addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg" id="8_05x1s"]
[ext_resource type="Texture2D" uid="uid://cri2mdk3hr6s1" path="res://addons/ez_tiles/ez_tiles_draw/icons/HillT.svg" id="8_trf31"]
[ext_resource type="Texture2D" uid="uid://dntkx0h8qim1n" path="res://addons/ez_tiles/ez_tiles_draw/icons/HillB.svg" id="9_abenc"]
[ext_resource type="Texture2D" uid="uid://dpmrju1gvdr16" path="res://addons/ez_tiles/ez_tiles_draw/icons/HillL.svg" id="10_dsu38"]
[ext_resource type="Texture2D" uid="uid://dv855gccwqgu" path="res://addons/ez_tiles/ez_tiles_draw/icons/HillR.svg" id="11_nyydi"]
[ext_resource type="Texture2D" uid="uid://frudvs8p10ea" path="res://addons/ez_tiles/ez_tiles_draw/icons/Island.svg" id="12_qvlkp"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_51lt4"]
content_margin_left = 10.0
content_margin_top = 10.0
content_margin_right = 10.0
content_margin_bottom = 10.0
bg_color = Color(0.211765, 0.239216, 0.290196, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ehgjy"]
content_margin_left = 10.0
content_margin_top = 10.0
content_margin_right = 10.0
content_margin_bottom = 10.0
bg_color = Color(0.12549, 0.145098, 0.172549, 1)
[sub_resource type="ButtonGroup" id="ButtonGroup_82nql"]
[sub_resource type="ButtonGroup" id="ButtonGroup_3cdnu"]
[node name="AreaDraw" type="PanelContainer"]
clip_children = 2
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_51lt4")
script = ExtResource("1_ee3lv")
metadata/_tab_index = 0
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 2
[node name="Panel2" type="Panel" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 0.3
theme_override_styles/panel = SubResource("StyleBoxFlat_ehgjy")
[node name="ScrollContainer" type="ScrollContainer" parent="HBoxContainer/Panel2"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/Panel2/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="RectanglesBasicButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_pressed = true
button_group = SubResource("ButtonGroup_82nql")
text = "Rectangle"
icon = ExtResource("2_0c16j")
alignment = 0
[node name="RectanglesButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Rectangle (Soft)"
icon = ExtResource("2_lfgj6")
alignment = 0
[node name="HardRectanglesButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Rectangle (Hard)"
icon = ExtResource("2_0c16j")
alignment = 0
[node name="SlopesTLButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Slope (Top Left)"
icon = ExtResource("3_j68q8")
alignment = 0
[node name="SlopesTRButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Slope (Top Right)"
icon = ExtResource("4_703fo")
alignment = 0
[node name="SlopesBRButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Slope (Bottom Right)"
icon = ExtResource("5_f5qx1")
alignment = 0
[node name="SlopesBLButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Slope (Bottom Left)"
icon = ExtResource("6_r38ls")
alignment = 0
[node name="HillTopButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Hill (Top)"
icon = ExtResource("8_trf31")
alignment = 0
[node name="HillBottomButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Hill (Bottom)"
icon = ExtResource("9_abenc")
alignment = 0
[node name="HillLeftButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Hill (Left)"
icon = ExtResource("10_dsu38")
alignment = 0
[node name="HillRightButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Hill (Right)"
icon = ExtResource("11_nyydi")
alignment = 0
[node name="IslandButton" type="Button" parent="HBoxContainer/Panel2/ScrollContainer/VBoxContainer"]
layout_mode = 2
mouse_default_cursor_shape = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_82nql")
text = "Island"
icon = ExtResource("12_qvlkp")
alignment = 0
[node name="Panel" type="Panel" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_styles/panel = SubResource("StyleBoxFlat_ehgjy")
[node name="ScrollContainer" type="ScrollContainer" parent="HBoxContainer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="PreviewGridContainer" type="GridContainer" parent="HBoxContainer/Panel/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 6
size_flags_vertical = 6
theme_override_constants/h_separation = 0
theme_override_constants/v_separation = 0
columns = 5
[node name="TextureRect" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect2" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect3" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect4" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect5" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect6" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect7" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect8" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect9" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect10" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect11" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect12" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect13" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect14" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect15" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect16" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect17" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect18" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect19" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect20" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect21" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect22" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect23" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect24" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="TextureRect25" type="TextureRect" parent="HBoxContainer/Panel/ScrollContainer/PreviewGridContainer"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
[node name="HFlowContainer" type="HFlowContainer" parent="HBoxContainer/Panel"]
layout_mode = 1
anchors_preset = 10
anchor_right = 1.0
offset_bottom = 84.0
grow_horizontal = 2
theme_override_constants/h_separation = 5
[node name="ConnectTerrainsButton" type="Button" parent="HBoxContainer/Panel/HFlowContainer"]
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 0
toggle_mode = true
button_group = SubResource("ButtonGroup_3cdnu")
icon = ExtResource("8_05x1s")
[node name="TileButton1" type="Button" parent="HBoxContainer/Panel/HFlowContainer"]
custom_minimum_size = Vector2(40, 40)
layout_mode = 2
theme_override_colors/icon_normal_color = Color(0.556863, 0.556863, 0.556863, 1)
theme_override_colors/icon_pressed_color = Color(1, 1, 1, 1)
theme_override_colors/icon_hover_color = Color(1, 1, 1, 1)
toggle_mode = true
button_pressed = true
button_group = SubResource("ButtonGroup_3cdnu")
flat = true
icon_alignment = 1
expand_icon = true
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/RectanglesBasicButton" to="." method="_on_rectangles_basic_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/RectanglesButton" to="." method="_on_rectangles_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/HardRectanglesButton" to="." method="_on_hard_rectangles_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/SlopesTLButton" to="." method="_on_slopes_tl_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/SlopesTRButton" to="." method="_on_slopes_tr_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/SlopesBRButton" to="." method="_on_slopes_br_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/SlopesBLButton" to="." method="_on_slopes_bl_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/HillTopButton" to="." method="_on_hill_top_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/HillBottomButton" to="." method="_on_hill_bottom_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/HillLeftButton" to="." method="_on_hill_left_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/HillRightButton" to="." method="_on_hill_right_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel2/ScrollContainer/VBoxContainer/IslandButton" to="." method="_on_island_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel/HFlowContainer/ConnectTerrainsButton" to="." method="_on_connect_terrains_button_pressed"]
[connection signal="pressed" from="HBoxContainer/Panel/HFlowContainer/TileButton1" to="." method="_on_tile_button_1_pressed"]

View File

@@ -0,0 +1,64 @@
@tool
extends PanelContainer
class_name BrushDraw
var brush_size : int = 1
var TileButtonScene : PackedScene
enum BrushShape {CIRCLE, SQUARE}
signal connect_mode_toggled(toggled : bool)
var tile_coords := Vector2i.ZERO
var connect_terrains_button : Button
var brush_shape := BrushShape.SQUARE
var button_container : Control
var first_tile_button : Button
func _enter_tree() -> void:
TileButtonScene = preload("res://addons/ez_tiles/ez_tiles_draw/tile_button.tscn")
connect_terrains_button = find_child("ConnectTerrainsButton")
connect_terrains_button.pressed.connect(func(): connect_mode_toggled.emit(true))
button_container = find_child("TileButtonContainer")
func _on_tile_button_pressed(coords : Vector2i):
tile_coords = coords
connect_mode_toggled.emit(false)
func _on_range_slider_with_line_edit_value_changed(value: int) -> void:
brush_size = value
func update_tile_buttons(tileset_source : TileSetAtlasSource, tile_size : Vector2i):
first_tile_button = null
for c in button_container.get_children():
if c is TileButton:
c.queue_free()
var terrain_texture := tileset_source.texture
for idx in range(tileset_source.get_tiles_count()):
var pos := tileset_source.get_tile_id(idx)
var tile_button : TileButton = TileButtonScene.instantiate()
tile_button.clicked.connect(_on_tile_button_pressed)
tile_button.coords = pos
var texture := AtlasTexture.new()
tile_button.icon = texture
tile_button.icon.atlas = terrain_texture
tile_button.icon.region = Rect2i(pos * tile_size, tile_size)
button_container.add_child(tile_button)
if not is_instance_valid(first_tile_button):
first_tile_button = tile_button
first_tile_button.button_pressed = true
func toggle_off_connected_brush() -> void:
if is_instance_valid(first_tile_button):
first_tile_button.button_pressed = true
func _on_brush_shape_square_button_pressed() -> void:
brush_shape = BrushShape.SQUARE
func _on_brush_shape_circle_button_pressed() -> void:
brush_shape = BrushShape.CIRCLE

View File

@@ -0,0 +1 @@
uid://dap4bbli16fp6

View File

@@ -0,0 +1,110 @@
[gd_scene load_steps=11 format=3 uid="uid://is8n20fchd2q"]
[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/brush_draw.gd" id="1_qrfye"]
[ext_resource type="PackedScene" uid="uid://chi7cp6qp6vki" path="res://addons/ez_tiles/ez_tiles_draw/range_slider_with_line_edit.tscn" id="2_g17n4"]
[ext_resource type="Texture2D" uid="uid://bps21xe8h1m2p" path="res://addons/ez_tiles/ez_tiles_draw/icons/Square.svg" id="3_eksbm"]
[ext_resource type="Texture2D" uid="uid://c7u17hgk6jvet" path="res://addons/ez_tiles/ez_tiles_draw/icons/TerrainConnect.svg" id="3_lefkq"]
[ext_resource type="Texture2D" uid="uid://bb3xfpcrmc8gc" path="res://addons/ez_tiles/ez_tiles_draw/icons/Circle.svg" id="4_04hac"]
[ext_resource type="ButtonGroup" uid="uid://dtpx52d0n4ff1" path="res://addons/ez_tiles/ez_tiles_draw/brush_tile_button_group.tres" id="5_wkw32"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gwowe"]
content_margin_left = 10.0
content_margin_top = 10.0
content_margin_right = 10.0
content_margin_bottom = 10.0
bg_color = Color(0.211765, 0.239216, 0.290196, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qgks4"]
content_margin_left = 10.0
content_margin_top = 2.0
content_margin_right = 10.0
content_margin_bottom = 2.0
bg_color = Color(0.12549, 0.145098, 0.172549, 1)
[sub_resource type="ButtonGroup" id="ButtonGroup_461xu"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_r4hko"]
content_margin_left = 10.0
content_margin_top = 10.0
content_margin_right = 10.0
content_margin_bottom = 10.0
bg_color = Color(0.12549, 0.145098, 0.172549, 1)
[node name="BrushDraw" type="PanelContainer"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_gwowe")
script = ExtResource("1_qrfye")
metadata/_tab_index = 1
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 2
[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer"]
custom_minimum_size = Vector2(0, 40)
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_qgks4")
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/PanelContainer"]
custom_minimum_size = Vector2(0, 35)
layout_mode = 2
size_flags_vertical = 0
theme_override_constants/separation = 10
[node name="Label" type="Label" parent="VBoxContainer/PanelContainer/HBoxContainer"]
layout_mode = 2
text = "Brush Size"
[node name="RangeSliderWithLineEdit" parent="VBoxContainer/PanelContainer/HBoxContainer" instance=ExtResource("2_g17n4")]
layout_mode = 2
[node name="Label2" type="Label" parent="VBoxContainer/PanelContainer/HBoxContainer"]
layout_mode = 2
text = "Shape"
[node name="BrushShapeSquareButton" type="Button" parent="VBoxContainer/PanelContainer/HBoxContainer"]
custom_minimum_size = Vector2(32, 0)
layout_mode = 2
toggle_mode = true
button_pressed = true
button_group = SubResource("ButtonGroup_461xu")
icon = ExtResource("3_eksbm")
icon_alignment = 1
[node name="BrushShapeCircleButton" type="Button" parent="VBoxContainer/PanelContainer/HBoxContainer"]
custom_minimum_size = Vector2(32, 0)
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_461xu")
icon = ExtResource("4_04hac")
icon_alignment = 1
[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="PanelContainer2" type="PanelContainer" parent="VBoxContainer/ScrollContainer"]
clip_contents = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_styles/panel = SubResource("StyleBoxFlat_r4hko")
[node name="TileButtonContainer" type="HFlowContainer" parent="VBoxContainer/ScrollContainer/PanelContainer2"]
layout_mode = 2
theme_override_constants/h_separation = 5
[node name="ConnectTerrainsButton" type="Button" parent="VBoxContainer/ScrollContainer/PanelContainer2/TileButtonContainer"]
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 0
toggle_mode = true
button_group = ExtResource("5_wkw32")
icon = ExtResource("3_lefkq")
[connection signal="value_changed" from="VBoxContainer/PanelContainer/HBoxContainer/RangeSliderWithLineEdit" to="." method="_on_range_slider_with_line_edit_value_changed"]
[connection signal="pressed" from="VBoxContainer/PanelContainer/HBoxContainer/BrushShapeSquareButton" to="." method="_on_brush_shape_square_button_pressed"]
[connection signal="pressed" from="VBoxContainer/PanelContainer/HBoxContainer/BrushShapeCircleButton" to="." method="_on_brush_shape_circle_button_pressed"]

View File

@@ -0,0 +1,5 @@
[gd_resource type="ButtonGroup" format=3 uid="uid://dtpx52d0n4ff1"]
[resource]
resource_local_to_scene = false
allow_unpress = true

View File

@@ -0,0 +1,694 @@
@tool
extends Control
class_name EZTilesDrawDock
enum NeighbourMode {OVERWRITE, PEERING_BIT, INCLUSIVE, EXCLUSIVE}
enum DragMode {BRUSH, AREA, STAMP, SNAPSHOT}
const EZ_TILE_CUSTOM_META := "_is_ez_tiles_generated"
var StampScene : PackedScene
var StampTileScene : PackedScene
var TerrainPickerEntryScene : PackedScene
var under_edit : TileMapLayer = null
var hint_label : Label
var main_container : Control
var default_editor_check_button : Button
var terrain_list_container : VBoxContainer
var drag_start := Vector2i.ZERO
var drag_mode := DragMode.BRUSH
var remembered_cells := {}
var viewport_has_mouse := false
var lmb_is_down := false
var rmb_is_down := false
var current_terrain_id := 0
var neighbour_mode := NeighbourMode.OVERWRITE
var suppress_preview := false
var using_eraser := false
var undo_redo : EditorUndoRedoManager
var area_draw_tab : AreaDraw
var brush_tab : BrushDraw
var stamp_tab : StampTab
var area_draw_toggle_button : Button
var brush_draw_toggle_button : Button
var stamp_draw_toggle_button : Button
var select_snap_shot_button : Button
var eraser_button : Button
var connect_toggle_button : Button
var connect_icon_connected : Texture2D
var connect_icon_disconnected : Texture2D
var neighbor_mode_option_button : OptionButton
const EZ_NEIGHBOUR_MAP := {
"....O...." : Vector2i.ZERO,
"....OX..." : Vector2i(0,3),
"....O..X." : Vector2i(1,0),
".X..O..X." : Vector2i(1,1),
".X..O...." : Vector2i(1,2),
"...XOX..." : Vector2i(1,3),
"...XO...." : Vector2i(2,3),
"....OX.X." : Vector2i(3,0),
".X..OX.X." : Vector2i(3,1),
".X..OX..." : Vector2i(3,2),
"...XOX.X." : Vector2i(4,0),
".X.XOX.X." : Vector2i(4,1),
".X.XOX..." : Vector2i(4,2),
"...XO..X." : Vector2i(5,0),
".X.XO..X." : Vector2i(5,1),
".X.XO...." : Vector2i(5,2)
}
func _enter_tree() -> void:
StampScene = preload("res://addons/ez_tiles/ez_tiles_draw/stamp.tscn")
StampTileScene = preload("res://addons/ez_tiles/ez_tiles_draw/stamp_tile.tscn")
TerrainPickerEntryScene = preload("res://addons/ez_tiles/ez_tiles_draw/terrain_picker_entry.tscn")
hint_label = find_child("HintLabel")
main_container = find_child("MainVBoxContainer")
default_editor_check_button = find_child("DefaultEditorCheckButton")
terrain_list_container = find_child("TerrainListVboxContainer")
area_draw_tab = find_child("Area Draw")
brush_tab = find_child("Brush Draw")
stamp_tab = find_child("Stamp")
area_draw_toggle_button = find_child("AreaDrawButton")
brush_draw_toggle_button = find_child("BrushDrawButton")
stamp_draw_toggle_button = find_child("StampDrawButton")
select_snap_shot_button = find_child("SelectSnapShotButton")
eraser_button = find_child("EraserButton")
connect_toggle_button = find_child("ConnectingToggle")
connect_icon_disconnected = preload("res://addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg")
connect_icon_connected = preload("res://addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg")
neighbor_mode_option_button = find_child("NeighbourModeOptionButton")
func activate(node : TileMapLayer):
current_terrain_id = 0
remembered_cells = {}
under_edit = node
hint_label.hide()
main_container.show()
for child in terrain_list_container.get_children():
if is_instance_valid(child):
child.queue_free()
if under_edit.tile_set.get_terrain_sets_count() > 0:
for terrain_id in range(under_edit.tile_set.get_terrains_count(0)):
var entry : TerrainPickerEntry = TerrainPickerEntryScene.instantiate()
entry.terrain_name = under_edit.tile_set.get_terrain_name(0, terrain_id)
entry.texture_resource = _get_first_texture_for_terrain(terrain_id)
entry.terrain_id = terrain_id
entry.selected.connect(_on_terrain_selected)
terrain_list_container.add_child(entry)
area_draw_tab.update_grid_preview(
_get_first_texture_for_terrain(current_terrain_id),
under_edit.tile_set.tile_size)
brush_tab.update_tile_buttons(
_get_first_tileset_source_for_terrain(current_terrain_id),
under_edit.tile_set.tile_size)
if under_edit.has_meta(EZ_TILE_CUSTOM_META):
default_editor_check_button.button_pressed = true
else:
default_editor_check_button.button_pressed = false
stamp_tab.show_stamps_for_tile_map_layer(under_edit)
func _get_first_source_id_for_terrain(terrain_id : int) -> int:
for i in range(under_edit.tile_set.get_source_count()):
var source_id := under_edit.tile_set.get_source_id(i)
var source : TileSetAtlasSource = under_edit.tile_set.get_source(source_id)
if source.get_tiles_count() > 0:
for j in source.get_tiles_count():
var tile_data = source.get_tile_data(source.get_tile_id(j), 0)
if tile_data.terrain == terrain_id:
return source_id
printerr("Terrain %d not found in tile set sources: " % terrain_id)
return terrain_id # assume equal in case of inconsistent data
func _get_first_texture_for_terrain(terrain_id : int) -> Texture2D:
var source := _get_first_tileset_source_for_terrain(terrain_id)
if is_instance_valid(source):
return source.texture
return null
func _get_first_tileset_source_for_terrain(terrain_id : int) -> TileSetAtlasSource:
for i in range(under_edit.tile_set.get_source_count()):
var source_id := under_edit.tile_set.get_source_id(i)
var source : TileSetAtlasSource = under_edit.tile_set.get_source(source_id)
if source.get_tiles_count() > 0:
for j in source.get_tiles_count():
var tile_data = source.get_tile_data(source.get_tile_id(j), 0)
if tile_data.terrain == terrain_id:
return source
printerr("Terrain %d not found in tile set sources: " % terrain_id)
return null
func deactivate():
under_edit = null
hint_label.show()
main_container.hide()
func _on_terrain_selected(id : int) -> void:
current_terrain_id = id
area_draw_tab.update_grid_preview(
_get_first_texture_for_terrain(id), under_edit.tile_set.tile_size)
brush_tab.update_tile_buttons(
_get_first_tileset_source_for_terrain(id), under_edit.tile_set.tile_size)
if neighbour_mode != NeighbourMode.OVERWRITE:
brush_tab.connect_terrains_button.button_pressed = true
if stamp_tab.visible:
brush_tab.show()
func _place_back_remembered_cells() -> void:
for prev_pos in remembered_cells.keys():
if remembered_cells[prev_pos][0] > -1:
under_edit.set_cell(prev_pos, remembered_cells[prev_pos][0], remembered_cells[prev_pos][1])
else:
under_edit.erase_cell(prev_pos)
remembered_cells.clear()
func _remember_cell(tile_pos : Vector2i) -> void:
if under_edit.get_cell_source_id(tile_pos) > -1:
remembered_cells[tile_pos] = [under_edit.get_cell_source_id(tile_pos), under_edit.get_cell_atlas_coords(tile_pos)]
else:
remembered_cells[tile_pos] = [-1, Vector2i.ZERO]
func _take_snapshot(drag_end : Vector2i) -> void:
var stamp : Stamp = StampScene.instantiate()
var from_x := drag_start.x if drag_start.x < drag_end.x else drag_end.x
var to_x := drag_start.x if drag_start.x > drag_end.x else drag_end.x
var from_y := drag_start.y if drag_start.y < drag_end.y else drag_end.y
var to_y := drag_start.y if drag_start.y > drag_end.y else drag_end.y
stamp.stamp_size = Vector2i(to_x - from_x + 1, to_y - from_y + 1)
var stamp_tile_size := Vector2(under_edit.tile_set.tile_size)
while (stamp.stamp_size.x * stamp_tile_size.x) > 512:
stamp_tile_size *= 0.5
for y in range(from_y, to_y + 1):
for x in range(from_x, to_x + 1):
var tile_pos := Vector2i(x, y)
var stamp_tile : TextureRect = StampTileScene.instantiate()
stamp_tile.custom_minimum_size = Vector2i(stamp_tile_size)
if under_edit.get_cell_source_id(tile_pos) > -1:
stamp.stamp_cell_data[Vector2i(x - from_x, y - from_y)] = [under_edit.get_cell_source_id(tile_pos), under_edit.get_cell_atlas_coords(tile_pos)]
stamp_tile.texture = AtlasTexture.new()
stamp_tile.texture.atlas = under_edit.tile_set.get_source(under_edit.get_cell_source_id(tile_pos)).texture
stamp_tile.texture.region = Rect2i(
under_edit.get_cell_atlas_coords(tile_pos) * under_edit.tile_set.tile_size,
under_edit.tile_set.tile_size)
else:
stamp.stamp_cell_data[Vector2i(x - from_x, y - from_y)] = [-1, Vector2i.ZERO]
stamp.tile_textures.append(stamp_tile)
stamp.tile_map_layer_under_edit = under_edit
stamp_tab.add_stamp(stamp)
func _grow_cells(area_cells : Array, diagonal := false, base_dir := Vector2i.ZERO) -> Array:
var expanded_region := {}
for cell in area_cells:
if cell not in expanded_region:
expanded_region[cell] = true
for neighour in _get_neighbors(cell, diagonal, base_dir):
if neighour not in expanded_region:
expanded_region[neighour] = true
return expanded_region.keys()
func _straighten_line_direction(from : Vector2i, to : Vector2i) -> Vector2:
var angle := fmod(rad_to_deg(Vector2(from).angle_to_point(Vector2(to))), 360)
if angle < 0:
angle += 360
match(snappedi(angle, 45)):
45:
return Vector2(0.7071, 0.7071)
90:
return Vector2.DOWN
135:
return Vector2(-0.7071, 0.7071)
180:
return Vector2.LEFT
225:
return Vector2(-0.7071, -0.7071)
270:
return Vector2.UP
315:
return Vector2(0.7071, -0.7071)
0, 360, _:
return Vector2.RIGHT
func _get_brush_sized_line(from : Vector2i, cell : Dictionary) -> Dictionary:
var to := cell.keys()[0] as Vector2i
var direction = _straighten_line_direction(from, to)
var cur := Vector2(from)
var out := {}
for _i in range(floor(from.distance_to(to))):
cur += direction
out.merge(_get_brush_for_cell({Vector2i(cur.floor()): cell.values()[0]}))
return out
func _get_brush_for_cell(cell : Dictionary) -> Dictionary:
if brush_tab.brush_size == 1:
return cell
var out := Dictionary()
var cur_keys := []
if brush_tab.brush_shape == BrushDraw.BrushShape.SQUARE:
var middle : Vector2i = cell.keys()[0] + Vector2i.ONE
for x in range(middle.x - ceil(brush_tab.brush_size / 2.0), middle.x + floor(brush_tab.brush_size / 2.0)):
for y in range(middle.y - ceil(brush_tab.brush_size / 2.0), middle.y + floor(brush_tab.brush_size / 2.0)):
cur_keys.append(Vector2i(x, y))
elif brush_tab.brush_shape == BrushDraw.BrushShape.CIRCLE:
var m : Vector2i = cell.keys()[0]
var sz := brush_tab.brush_size
for x in range(m.x - sz - 1, m.x + sz + 1):
for y in range(m.y - sz - 1, m.y + sz + 1):
if Vector2i(x, y).distance_to(m) <= sz * 0.67:
cur_keys.append(Vector2i(x, y))
for k in cur_keys:
out[k] = cell.values()[0]
return out
func _get_sized_brush(cell : Dictionary) -> Dictionary:
if Input.is_key_pressed(KEY_SHIFT):
return _get_brush_sized_line(drag_start, cell)
return _get_brush_for_cell(cell)
func _get_stamp_placement_area(stamp : Stamp, tile_pos : Vector2i, include_empty_cells := false) -> Array[Vector2i]:
var out : Array[Vector2i] = []
for stamp_tile_pos in stamp.stamp_cell_data.keys():
if stamp.stamp_cell_data[stamp_tile_pos][0] > -1 or include_empty_cells:
out.append(tile_pos + stamp_tile_pos)
return out
func _place_stamp_preview(stamp : Stamp, cursor_tile_pos : Vector2i) -> void:
var overwrite_with_empty_cells := Input.is_key_pressed(KEY_SHIFT)
var stamp_plc_area := _get_stamp_placement_area(stamp, cursor_tile_pos, overwrite_with_empty_cells)
var all_cells = _grow_cells(stamp_plc_area, neighbour_mode == NeighbourMode.PEERING_BIT)
for tile_pos in all_cells:
_remember_cell(tile_pos)
for stamp_tile_pos in stamp.stamp_cell_data.keys():
if stamp.stamp_cell_data[stamp_tile_pos][0] > -1:
under_edit.set_cell(cursor_tile_pos + stamp_tile_pos, stamp.stamp_cell_data[stamp_tile_pos][0],
stamp.stamp_cell_data[stamp_tile_pos][1])
elif overwrite_with_empty_cells:
under_edit.erase_cell(cursor_tile_pos + stamp_tile_pos)
if neighbour_mode != NeighbourMode.PEERING_BIT and neighbour_mode != NeighbourMode.OVERWRITE:
_update_atlas_coords(_get_neighbors(cursor_tile_pos + stamp_tile_pos))
if neighbour_mode == NeighbourMode.PEERING_BIT:
for tile_pos in stamp_plc_area:
under_edit.set_cells_terrain_connect([tile_pos], 0, under_edit.get_cell_source_id(tile_pos), true)
func _place_cells_preview(cells_in_current_draw_area : Dictionary, terrain_id : int) -> void:
var all_cells := _grow_cells(cells_in_current_draw_area.keys(), neighbour_mode == NeighbourMode.PEERING_BIT)
for tile_pos in all_cells:
_remember_cell(tile_pos)
for tile_pos in cells_in_current_draw_area:
if terrain_id < 0:
under_edit.erase_cell(tile_pos)
else:
var coord : Vector2i = (
cells_in_current_draw_area[tile_pos] if neighbour_mode == NeighbourMode.OVERWRITE
else _get_ez_atlas_coord(tile_pos, terrain_id)
)
under_edit.set_cell(tile_pos, _get_first_source_id_for_terrain(terrain_id), coord)
if neighbour_mode != NeighbourMode.PEERING_BIT and neighbour_mode != NeighbourMode.OVERWRITE:
_update_atlas_coords(_get_neighbors(tile_pos))
if neighbour_mode == NeighbourMode.PEERING_BIT:
under_edit.set_cells_terrain_connect(cells_in_current_draw_area.keys(), 0, terrain_id, true)
func _commit_cell_placement(cells_in_current_draw_area : Array) -> void:
undo_redo.create_action("Update cells in: " + under_edit.name)
for cell in remembered_cells:
if remembered_cells[cell][0] < 0:
undo_redo.add_undo_method(under_edit, "erase_cell", cell)
else:
undo_redo.add_undo_method(under_edit, "set_cell", cell,
remembered_cells[cell][0], remembered_cells[cell][1])
remembered_cells.clear()
for cell in _grow_cells(cells_in_current_draw_area):
if under_edit.get_cell_source_id(cell) > -1:
undo_redo.add_do_method(under_edit, "set_cell", cell,
under_edit.get_cell_source_id(cell),
under_edit.get_cell_atlas_coords(cell))
else:
undo_redo.add_do_method(under_edit, "erase_cell", cell)
undo_redo.commit_action(false)
func _update_atlas_coords(cells : Array[Vector2i]) -> void:
for tile_pos in cells:
under_edit.set_cell(tile_pos, under_edit.get_cell_source_id(tile_pos),
_get_ez_atlas_coord(tile_pos, under_edit.get_cell_source_id(tile_pos)))
func _erase_cells(cells : Dictionary):
# prevent current preview placement from being added to the undo list
if drag_mode == DragMode.BRUSH:
for cell in cells.keys():
if cell in remembered_cells and remembered_cells[cell][0] > -1:
under_edit.set_cell(cell, remembered_cells[cell][0], remembered_cells[cell][1])
else:
under_edit.erase_cell(cell)
_place_cells_preview(cells, -1)
func _get_neighbors(tile_pos : Vector2i, diagonal := false, base_dir := Vector2i.ZERO) -> Array[Vector2i]:
if base_dir:
return [
tile_pos + base_dir,
tile_pos + Vector2i(base_dir.x , 0),
tile_pos + Vector2i(0, base_dir.y)
]
if diagonal:
return [
tile_pos + Vector2i.LEFT,
tile_pos + Vector2i.UP,
tile_pos + Vector2i.DOWN,
tile_pos + Vector2i.RIGHT,
tile_pos - Vector2i.ONE,
tile_pos + Vector2i.ONE,
tile_pos + Vector2i(-1, 1),
tile_pos + Vector2i(1, -1)
]
return [tile_pos + Vector2i.LEFT, tile_pos + Vector2i.UP, tile_pos + Vector2i.DOWN, tile_pos + Vector2i.RIGHT]
func _consider_a_neighbour(cell : Vector2i, for_source_id : int) -> bool:
var neighbour_source_id := under_edit.get_cell_source_id(cell)
match(neighbour_mode):
NeighbourMode.INCLUSIVE:
return neighbour_source_id > -1
NeighbourMode.EXCLUSIVE:
return neighbour_source_id > -1 and neighbour_source_id == for_source_id
NeighbourMode.OVERWRITE:
printerr("illegal state: should not be considering neighbours")
return false
NeighbourMode.PEERING_BIT:
printerr("illegal state: should invoke `under_edit.set_cells_terrain_connect`")
return false
return false
func _get_ez_atlas_coord(tile_pos : Vector2i, for_terrain_id : int) -> Vector2i:
if neighbour_mode == NeighbourMode.PEERING_BIT:
var source := _get_first_tileset_source_for_terrain(for_terrain_id)
for id in range(source.get_tiles_count()):
return source.get_tile_id(id)
printerr("could not find a tile in terrain: " + str(for_terrain_id))
return Vector2i.ZERO
# EZ Tiles considers the source_id to be equal to the terrain_id
# Therefore, in these modes the complexity of searching the correct texture is lost
# (thus, making things EZ. is a lot less flexible)
# - In inclusive mode all terrains in neighboring tiles are considered to be the same terrain
# - in exclusive mode the terrains from the exact same TileSetSource are considered the same terrain
var l = "X" if _consider_a_neighbour(tile_pos + Vector2i.LEFT, for_terrain_id) else "."
var r = "X" if _consider_a_neighbour(tile_pos + Vector2i.RIGHT, for_terrain_id) else ".";
var t = "X" if _consider_a_neighbour(tile_pos + Vector2i.UP, for_terrain_id) else "."
var b = "X" if _consider_a_neighbour(tile_pos + Vector2i.DOWN, for_terrain_id) else ".";
var fmt = ".%s.%sO%s.%s." % [t, l, r, b]
return EZ_NEIGHBOUR_MAP[fmt] if fmt in EZ_NEIGHBOUR_MAP else Vector2i.ZERO
func get_draw_rect(tile_pos : Vector2i) -> Rect2i:
match(drag_mode):
DragMode.SNAPSHOT:
if lmb_is_down:
var from_x := drag_start.x if drag_start.x < tile_pos.x else tile_pos.x
var to_x := drag_start.x if drag_start.x > tile_pos.x else tile_pos.x
var from_y := drag_start.y if drag_start.y < tile_pos.y else tile_pos.y
var to_y := drag_start.y if drag_start.y > tile_pos.y else tile_pos.y
return Rect2i(Vector2i(from_x, from_y), Vector2i(to_x, to_y) - Vector2i(from_x, from_y) + Vector2i.ONE)
else:
return Rect2i(tile_pos, Vector2i.ONE)
DragMode.AREA:
if rmb_is_down or lmb_is_down:
var from_x := drag_start.x if drag_start.x < tile_pos.x else tile_pos.x
var to_x := drag_start.x if drag_start.x > tile_pos.x else tile_pos.x
var from_y := drag_start.y if drag_start.y < tile_pos.y else tile_pos.y
var to_y := drag_start.y if drag_start.y > tile_pos.y else tile_pos.y
return Rect2i(Vector2i(from_x, from_y), Vector2i(to_x, to_y) - Vector2i(from_x, from_y) + Vector2i.ONE)
else:
return Rect2i(tile_pos, Vector2i.ONE)
DragMode.STAMP:
var stamp := stamp_tab.get_selected_stamp()
if is_instance_valid(stamp):
return Rect2i(tile_pos, stamp.stamp_size)
else:
Rect2i()
DragMode.BRUSH, _:
return Rect2i()
return Rect2i()
func get_draw_area(tile_pos : Vector2i) -> Array:
match(drag_mode):
DragMode.SNAPSHOT:
return []
DragMode.AREA:
if rmb_is_down or lmb_is_down:
return _get_draw_shape_for_area(drag_start, tile_pos).keys()
else:
return []
DragMode.BRUSH:
return _get_sized_brush({tile_pos: Vector2.ZERO}).keys()
_:
return []
func _get_draw_shape_for_area(p1 : Vector2i, p2 : Vector2i, for_shape : AreaDraw.Shape = area_draw_tab.shape) -> Dictionary:
var from_x := p1.x if p1.x < p2.x else p2.x
var to_x := p1.x if p1.x > p2.x else p2.x
var from_y := p1.y if p1.y < p2.y else p2.y
var to_y := p1.y if p1.y > p2.y else p2.y
match(for_shape):
AreaDraw.Shape.RECTANGLE_BASIC:
return AreaDraw.get_cells_rectangle_basic(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
AreaDraw.Shape.HARD_RECTANGLE:
return AreaDraw.get_cells_rectangle(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
AreaDraw.Shape.RECTANGLE:
return AreaDraw.get_cells_rectangle(Vector2i(from_x, from_y), Vector2i(to_x, to_y), true)
AreaDraw.Shape.SLOPE_TL:
return AreaDraw.get_cells_slope_tl(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
AreaDraw.Shape.SLOPE_BL:
return AreaDraw.get_cells_slope_bl(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
AreaDraw.Shape.SLOPE_TR:
return AreaDraw.get_cells_slope_tr(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
AreaDraw.Shape.SLOPE_BR:
return AreaDraw.get_cells_slope_br(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
AreaDraw.Shape.HILL_TOP:
return AreaDraw.get_cells_hill_top(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
AreaDraw.Shape.HILL_BOTTOM:
return AreaDraw.get_cells_hill_bottom(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
AreaDraw.Shape.HILL_LEFT:
return AreaDraw.get_cells_hill_left(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
AreaDraw.Shape.HILL_RIGHT:
return AreaDraw.get_cells_hill_right(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
AreaDraw.Shape.ISLAND:
return AreaDraw.get_cells_island(Vector2i(from_x, from_y), Vector2i(to_x, to_y))
return {}
func handle_mouse_move(tile_pos : Vector2i) -> void:
if suppress_preview:
pass
if is_instance_valid(under_edit):
if drag_mode == DragMode.BRUSH:
_place_back_remembered_cells()
if using_eraser:
_place_cells_preview(_get_sized_brush({tile_pos: brush_tab.tile_coords}), -1)
else:
_place_cells_preview(_get_sized_brush({tile_pos: brush_tab.tile_coords}), current_terrain_id)
if lmb_is_down:
_commit_cell_placement(_get_sized_brush({tile_pos: brush_tab.tile_coords}).keys())
elif drag_mode == DragMode.AREA:
_place_back_remembered_cells()
if rmb_is_down or (using_eraser and lmb_is_down):
_erase_cells(_get_draw_shape_for_area(drag_start, tile_pos, AreaDraw.Shape.RECTANGLE))
elif lmb_is_down:
_place_cells_preview(_get_draw_shape_for_area(drag_start, tile_pos), current_terrain_id)
elif drag_mode == DragMode.STAMP:
_place_back_remembered_cells()
var stamp := stamp_tab.get_selected_stamp()
if is_instance_valid(stamp):
_place_stamp_preview(stamp, tile_pos)
func handle_mouse_up(button : MouseButton, tile_pos: Vector2i):
rmb_is_down = false if button == MouseButton.MOUSE_BUTTON_RIGHT else rmb_is_down
lmb_is_down = false if button == MouseButton.MOUSE_BUTTON_LEFT else lmb_is_down
if button == MouseButton.MOUSE_BUTTON_RIGHT or (using_eraser and button == MouseButton.MOUSE_BUTTON_LEFT):
if drag_mode == DragMode.AREA:
_commit_cell_placement(_get_draw_shape_for_area(drag_start, tile_pos, AreaDraw.Shape.RECTANGLE).keys())
elif button == MouseButton.MOUSE_BUTTON_LEFT:
if drag_mode == DragMode.AREA:
_commit_cell_placement(_get_draw_shape_for_area(drag_start, tile_pos).keys())
if drag_mode == DragMode.SNAPSHOT:
_take_snapshot(tile_pos)
_on_stamp_snapshot_toggled(false)
if drag_mode == DragMode.STAMP:
var stamp := stamp_tab.get_selected_stamp()
if is_instance_valid(stamp):
_commit_cell_placement(_get_stamp_placement_area(stamp, tile_pos))
func handle_mouse_down(button : MouseButton, tile_pos: Vector2i):
drag_start = tile_pos
rmb_is_down = true if button == MouseButton.MOUSE_BUTTON_RIGHT else rmb_is_down
lmb_is_down = true if button == MouseButton.MOUSE_BUTTON_LEFT else lmb_is_down
if using_eraser and button == MouseButton.MOUSE_BUTTON_RIGHT:
eraser_button.button_pressed = false
if drag_mode == DragMode.BRUSH:
_place_back_remembered_cells()
elif button == MouseButton.MOUSE_BUTTON_RIGHT:
if drag_mode == DragMode.AREA and not suppress_preview:
_place_back_remembered_cells()
_erase_cells(_get_draw_shape_for_area(drag_start, tile_pos))
elif drag_mode == DragMode.BRUSH:
_place_back_remembered_cells()
area_draw_toggle_button.button_pressed = true
area_draw_tab.show()
elif drag_mode == DragMode.SNAPSHOT:
_on_stamp_snapshot_toggled(false)
elif drag_mode == DragMode.STAMP:
var stamp := stamp_tab.get_selected_stamp()
if is_instance_valid(stamp):
_place_back_remembered_cells()
stamp.deselect()
elif button == MouseButton.MOUSE_BUTTON_LEFT:
if drag_mode == DragMode.AREA and not suppress_preview:
_place_back_remembered_cells()
_place_cells_preview(_get_draw_shape_for_area(drag_start, tile_pos), current_terrain_id)
elif drag_mode == DragMode.BRUSH:
_commit_cell_placement(_get_sized_brush({tile_pos: brush_tab.tile_coords}).keys())
func handle_mouse_entered():
viewport_has_mouse = true
remembered_cells.clear()
func handle_mouse_out():
viewport_has_mouse = false
if not lmb_is_down:
_place_back_remembered_cells()
func _on_area_draw_button_pressed() -> void:
area_draw_tab.show()
func _on_brush_draw_button_pressed() -> void:
brush_tab.show()
func _on_stamp_draw_button_pressed() -> void:
stamp_tab.show()
func _on_stamp_snapshot_toggled(on_off: bool) -> void:
select_snap_shot_button.button_pressed = on_off
if on_off:
stamp_tab.show()
stamp_tab.start_snapshot()
drag_mode = DragMode.SNAPSHOT
else:
stamp_tab.stop_snapshotting()
select_snap_shot_button.focus_mode = Control.FOCUS_NONE
drag_mode = DragMode.STAMP
func _on_default_editor_check_button_toggled(toggled_on: bool) -> void:
if toggled_on:
under_edit.set_meta(EZ_TILE_CUSTOM_META, true)
else:
under_edit.remove_meta(EZ_TILE_CUSTOM_META)
func _on_tab_container_tab_changed(tab: DragMode) -> void:
drag_mode = tab
if tab != DragMode.STAMP:
stamp_tab.stop_snapshotting()
select_snap_shot_button.button_pressed = false
match(drag_mode):
DragMode.AREA:
area_draw_toggle_button.button_pressed = true
eraser_button.disabled = false
DragMode.BRUSH:
brush_draw_toggle_button.button_pressed = true
eraser_button.disabled = false
DragMode.STAMP:
stamp_draw_toggle_button.button_pressed = true
eraser_button.button_pressed = false
eraser_button.disabled = true
func _on_neighbour_mode_option_button_item_selected(index: NeighbourMode) -> void:
neighbour_mode = index
if neighbour_mode == NeighbourMode.OVERWRITE:
connect_toggle_button.icon = connect_icon_disconnected
connect_toggle_button.button_pressed = false
brush_tab.toggle_off_connected_brush()
area_draw_tab.find_child("TileButton1").button_pressed = true
else:
connect_toggle_button.icon = connect_icon_connected
connect_toggle_button.button_pressed = true
brush_tab.connect_terrains_button.button_pressed = true
area_draw_tab.connect_terrains_button.button_pressed = true
func _on_connecting_toggle_toggled(toggled_on: bool) -> void:
if toggled_on:
connect_toggle_button.icon = connect_icon_connected
connect_toggle_button.button_pressed = true
if neighbour_mode == NeighbourMode.OVERWRITE:
neighbour_mode = NeighbourMode.PEERING_BIT
neighbor_mode_option_button.selected = NeighbourMode.PEERING_BIT
brush_tab.connect_terrains_button.button_pressed = true
area_draw_tab.connect_terrains_button.button_pressed = true
# else it's already in a connected mode
else:
connect_toggle_button.icon = connect_icon_disconnected
connect_toggle_button.button_pressed = false
neighbour_mode = NeighbourMode.OVERWRITE
neighbor_mode_option_button.selected = NeighbourMode.OVERWRITE
brush_tab.toggle_off_connected_brush()
area_draw_tab.find_child("TileButton1").button_pressed = true
func _on_eraser_button_toggled(toggled_on: bool) -> void:
using_eraser = toggled_on

View File

@@ -0,0 +1 @@
uid://6bvphp60kmbq

View File

@@ -0,0 +1,169 @@
[gd_scene load_steps=13 format=3 uid="uid://bylxp7tq3yo5s"]
[ext_resource type="Script" path="res://addons/ez_tiles/ez_tiles_draw/ez_tiles_draw_dock.gd" id="1_wtbry"]
[ext_resource type="Texture2D" uid="uid://pyivvoarllad" path="res://addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg" id="2_dplls"]
[ext_resource type="PackedScene" uid="uid://bitqwiwmn3s0r" path="res://addons/ez_tiles/ez_tiles_draw/area_draw.tscn" id="2_k0y3s"]
[ext_resource type="Texture2D" uid="uid://dooqg3fapf15x" path="res://addons/ez_tiles/ez_tiles_draw/icons/Rectangle.svg" id="2_urupm"]
[ext_resource type="Texture2D" uid="uid://d10gshlv0aq2d" path="res://addons/ez_tiles/ez_tiles_draw/icons/Edit.svg" id="3_qgjav"]
[ext_resource type="Texture2D" uid="uid://dhhtq6kkxpaus" path="res://addons/ez_tiles/ez_tiles_draw/icons/Stamp.svg" id="4_uxbhq"]
[ext_resource type="Texture2D" uid="uid://cj2hivk8xemhb" path="res://addons/ez_tiles/ez_tiles_draw/icons/SnapShotSmall.svg" id="6_lleak"]
[ext_resource type="PackedScene" uid="uid://is8n20fchd2q" path="res://addons/ez_tiles/ez_tiles_draw/brush_draw.tscn" id="7_sh02n"]
[ext_resource type="Texture2D" uid="uid://bbpao1cndqvwr" path="res://addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg" id="7_vvdr0"]
[ext_resource type="PackedScene" uid="uid://catlvg1l82g5v" path="res://addons/ez_tiles/ez_tiles_draw/stamp_tab.tscn" id="8_6lfv8"]
[sub_resource type="ButtonGroup" id="ButtonGroup_m6mfs"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fl86h"]
content_margin_left = 10.0
content_margin_top = 10.0
content_margin_right = 10.0
content_margin_bottom = 10.0
bg_color = Color(0.12549, 0.145098, 0.172549, 1)
[node name="EzTilesDrawDock" type="HBoxContainer"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_wtbry")
[node name="MainVBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 2
size_flags_horizontal = 3
[node name="HBoxContainer" type="HBoxContainer" parent="MainVBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="MainVBoxContainer/HBoxContainer"]
layout_mode = 2
tooltip_text = "Determines how to connect neighbouring tiles.
- Overwrite/Ignore (draw over other tiles without connecting to them)
- Use Terrain Peering Bit (the Godot default way of connecting tiles)
- Inclusive (consider all terrains in my terrain set my neighbour - as per the EZ Tiles template)
- Exclusive (consider only my terrain - as per the EZ Tiles template - as neighbour)
"
mouse_filter = 0
text = "Connect mode* "
[node name="NeighbourModeOptionButton" type="OptionButton" parent="MainVBoxContainer/HBoxContainer"]
layout_mode = 2
tooltip_text = "Determines in which cases a neighbouring tile is considered a neighbour. When a tile is considered a neighbour, this tile will act as if it is 'glued' to it."
selected = 0
item_count = 4
popup/item_0/text = "Overwrite"
popup/item_1/text = "Use Terrain Peering Bit"
popup/item_1/id = 3
popup/item_2/text = "Inclusive"
popup/item_2/id = 1
popup/item_3/text = "Exclusive"
popup/item_3/id = 2
[node name="ConnectingToggle" type="Button" parent="MainVBoxContainer/HBoxContainer"]
layout_mode = 2
tooltip_text = "Toggle connected drawing off or on (See connect modes for more options)"
toggle_mode = true
icon = ExtResource("2_dplls")
[node name="BrushDrawButton" type="Button" parent="MainVBoxContainer/HBoxContainer"]
layout_mode = 2
tooltip_text = "Brush/Pencil draw (Square, Circle)"
toggle_mode = true
button_pressed = true
button_group = SubResource("ButtonGroup_m6mfs")
icon = ExtResource("3_qgjav")
[node name="AreaDrawButton" type="Button" parent="MainVBoxContainer/HBoxContainer"]
layout_mode = 2
tooltip_text = "Area draw (Rectangles, Slopes, Island)"
toggle_mode = true
button_group = SubResource("ButtonGroup_m6mfs")
icon = ExtResource("2_urupm")
[node name="StampDrawButton" type="Button" parent="MainVBoxContainer/HBoxContainer"]
layout_mode = 2
tooltip_text = "Stamp, Copy/Paste draw"
toggle_mode = true
button_group = SubResource("ButtonGroup_m6mfs")
icon = ExtResource("4_uxbhq")
[node name="SelectSnapShotButton" type="Button" parent="MainVBoxContainer/HBoxContainer"]
layout_mode = 2
tooltip_text = "Take snapshot for stamp"
toggle_mode = true
icon = ExtResource("6_lleak")
[node name="EraserButton" type="Button" parent="MainVBoxContainer/HBoxContainer"]
layout_mode = 2
tooltip_text = "Eraser, toggle on the eraser to remove tiles with the left mouse button (this works the same as using the right mouse button).
Can be used in both brush mode and in area mode."
toggle_mode = true
icon = ExtResource("7_vvdr0")
[node name="DefaultEditorCheckButton" type="CheckButton" parent="MainVBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 10
tooltip_text = "When you select a TileMapLayer in your scene, Godot will normally open the builtin TileMap or TileSet bottom pane.
When this toggle is on, EZ Tiles Draw will automatically open for the current TileMapLayer."
text = "Default Editor"
[node name="MainHBoxContainer" type="HBoxContainer" parent="MainVBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="TerrainPickerScrollContainer" type="ScrollContainer" parent="MainVBoxContainer/MainHBoxContainer"]
custom_minimum_size = Vector2(200, 0)
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 3
theme_override_styles/panel = SubResource("StyleBoxFlat_fl86h")
horizontal_scroll_mode = 0
[node name="TerrainListVboxContainer" type="VBoxContainer" parent="MainVBoxContainer/MainHBoxContainer/TerrainPickerScrollContainer"]
custom_minimum_size = Vector2(200, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_constants/separation = 10
[node name="TabContainer" type="TabContainer" parent="MainVBoxContainer/MainHBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
current_tab = 0
[node name="Brush Draw" parent="MainVBoxContainer/MainHBoxContainer/TabContainer" instance=ExtResource("7_sh02n")]
layout_mode = 2
metadata/_tab_index = 0
[node name="Area Draw" parent="MainVBoxContainer/MainHBoxContainer/TabContainer" instance=ExtResource("2_k0y3s")]
visible = false
clip_contents = true
layout_mode = 2
metadata/_tab_index = 1
[node name="Stamp" parent="MainVBoxContainer/MainHBoxContainer/TabContainer" instance=ExtResource("8_6lfv8")]
visible = false
layout_mode = 2
[node name="HintLabel" type="Label" parent="."]
visible = false
layout_mode = 2
size_flags_horizontal = 3
text = "Select a TileMapLayer generated by EZ Tiles to use EZ Tiles Draw"
horizontal_alignment = 1
vertical_alignment = 1
[connection signal="item_selected" from="MainVBoxContainer/HBoxContainer/NeighbourModeOptionButton" to="." method="_on_neighbour_mode_option_button_item_selected"]
[connection signal="toggled" from="MainVBoxContainer/HBoxContainer/ConnectingToggle" to="." method="_on_connecting_toggle_toggled"]
[connection signal="pressed" from="MainVBoxContainer/HBoxContainer/BrushDrawButton" to="." method="_on_brush_draw_button_pressed"]
[connection signal="pressed" from="MainVBoxContainer/HBoxContainer/AreaDrawButton" to="." method="_on_area_draw_button_pressed"]
[connection signal="pressed" from="MainVBoxContainer/HBoxContainer/StampDrawButton" to="." method="_on_stamp_draw_button_pressed"]
[connection signal="toggled" from="MainVBoxContainer/HBoxContainer/SelectSnapShotButton" to="." method="_on_stamp_snapshot_toggled"]
[connection signal="toggled" from="MainVBoxContainer/HBoxContainer/EraserButton" to="." method="_on_eraser_button_toggled"]
[connection signal="toggled" from="MainVBoxContainer/HBoxContainer/DefaultEditorCheckButton" to="." method="_on_default_editor_check_button_toggled"]
[connection signal="tab_changed" from="MainVBoxContainer/MainHBoxContainer/TabContainer" to="." method="_on_tab_container_tab_changed"]
[connection signal="connect_mode_toggled" from="MainVBoxContainer/MainHBoxContainer/TabContainer/Brush Draw" to="." method="_on_connecting_toggle_toggled"]
[connection signal="connect_mode_toggled" from="MainVBoxContainer/MainHBoxContainer/TabContainer/Area Draw" to="." method="_on_connecting_toggle_toggled"]
[connection signal="snapshot_toggled" from="MainVBoxContainer/MainHBoxContainer/TabContainer/Stamp" to="." method="_on_stamp_snapshot_toggled"]

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="16"
height="16"
viewBox="0 0 4.2333332 4.2333333"
version="1.1"
id="svg1"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
sodipodi:docname="Circle.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="25.228956"
inkscape:cx="3.3691445"
inkscape:cy="9.5525157"
inkscape:current-layer="layer1">
<inkscape:grid
id="grid1"
units="px"
originx="0"
originy="0"
spacingx="0.26458332"
spacingy="0.26458333"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="4"
dotted="false"
gridanglex="30"
gridanglez="30"
visible="true" />
</sodipodi:namedview>
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<circle
style="fill:#e0e0e0;stroke-width:2.80458;stroke-linecap:square;stroke-miterlimit:80;stroke-dashoffset:127.298;paint-order:markers fill stroke"
id="path1"
cx="2.1105669"
cy="2.1000795"
r="1.591446" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bb3xfpcrmc8gc"
path="res://.godot/imported/Circle.svg-8d5a72a976af170c5462c4822817bc86.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Circle.svg"
dest_files=["res://.godot/imported/Circle.svg-8d5a72a976af170c5462c4822817bc86.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="Connect1.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
inkscape:zoom="34.4375"
inkscape:cx="15.288566"
inkscape:cy="12.950998"
inkscape:current-layer="svg1"
showguides="true">
<sodipodi:guide
position="-0.33879526,12.488849"
orientation="0,-1"
id="guide2"
inkscape:locked="false" />
<sodipodi:guide
position="10.250454,9.8439201"
orientation="0,-1"
id="guide3"
inkscape:locked="false" />
<sodipodi:guide
position="5.1107078,16.232305"
orientation="1,0"
id="guide4"
inkscape:locked="false" />
<sodipodi:guide
position="7.3610971,9.2856939"
orientation="1,0"
id="guide5"
inkscape:locked="false" />
<sodipodi:guide
position="9.6696915,6.6206897"
orientation="0,-1"
id="guide6"
inkscape:locked="false" />
<sodipodi:guide
position="10.163339,4.3266788"
orientation="0,-1"
id="guide7"
inkscape:locked="false" />
<sodipodi:guide
position="10.584392,9.9600726"
orientation="1,0"
id="guide8"
inkscape:locked="false" />
<sodipodi:guide
position="11.949183,2.4246824"
orientation="0,-1"
id="guide9"
inkscape:locked="false" />
</sodipodi:namedview>
<path
id="path1"
style="fill:#e0e0e0;fill-opacity:1;stroke-width:3.46966"
d="M 7.4320342,0.18238402 C 5.7415205,0.18242166 3.1472107,1.940753 3.1472107,4.1263644 V 7.1847778 H 0.03947243 v 2.286455 H 3.1472107 v 2.5455882 c 0,2.18561 2.5943098,3.946477 4.2848235,3.946477 h 0.8366325 v -2.328946 l -1.9199791,-0.01748 0.024962,-4.05828 1.8825363,0.01747 0.012486,-2.5410661 -1.9099943,-0.005 0.012486,-3.8696751 1.9099944,0.019969 -0.012486,-2.99792441 z m 2.9251338,0.0748859 -0.01748,2.94051208 -1.6694318,0.037443 0.005,3.8122627 1.6918988,-0.017473 V 10.002839 L 8.6827446,9.98287 l 0.005,3.626522 1.6519594,-0.03994 v 2.468732 c 1.539424,0.241385 2.733117,-0.774398 2.733117,-3.943981 V 9.7103828 h 2.887466 V 7.2596635 H 13.072812 V 4.2037463 c 0,-3.91742421 -0.689574,-3.97068131 -2.715644,-3.94647638 z"
sodipodi:nodetypes="ssccccssccccccccccsccccccccccsccccsc" />
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://pyivvoarllad"
path="res://.godot/imported/Connect1.svg-e03696726517e376a9f1cb9904cf4c39.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Connect1.svg"
dest_files=["res://.godot/imported/Connect1.svg-e03696726517e376a9f1cb9904cf4c39.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="Connect2.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
inkscape:zoom="24.35099"
inkscape:cx="8.2132185"
inkscape:cy="-0.28746265"
inkscape:current-layer="svg1"
showguides="true">
<sodipodi:guide
position="-0.33879526,12.488849"
orientation="0,-1"
id="guide2"
inkscape:locked="false" />
<sodipodi:guide
position="10.250454,9.8439201"
orientation="0,-1"
id="guide3"
inkscape:locked="false" />
<sodipodi:guide
position="5.1107078,16.232305"
orientation="1,0"
id="guide4"
inkscape:locked="false" />
<sodipodi:guide
position="7.3610971,9.2856939"
orientation="1,0"
id="guide5"
inkscape:locked="false" />
<sodipodi:guide
position="9.6696915,6.6206897"
orientation="0,-1"
id="guide6"
inkscape:locked="false" />
<sodipodi:guide
position="10.163339,4.3266788"
orientation="0,-1"
id="guide7"
inkscape:locked="false" />
<sodipodi:guide
position="10.584392,9.9600726"
orientation="1,0"
id="guide8"
inkscape:locked="false" />
<sodipodi:guide
position="11.949183,2.4246824"
orientation="0,-1"
id="guide9"
inkscape:locked="false" />
</sodipodi:namedview>
<path
id="path1"
style="fill:#e0e0e0;fill-opacity:1;stroke-width:3.47802"
d="M 7.5715605,0.06207122 C 5.8770753,0.08041901 4.5113688,1.8246744 4.5113688,4.0155486 V 7.0813268 H 0.85565317 v 2.7447754 c 0.59043283,-0.3140696 2.43714373,0 3.65571563,0 v 2.0989038 c 0,2.190872 1.3656073,4.02832 3.0601917,4.02832 h 1.0111382 l 0.8154684,-2.406894 -2.9125619,-0.01751 0.025022,-3.6152385 2.875029,0.017516 0.012517,-3 -2.902553,-0.00501 0.012517,-3.8789934 2.9025532,0.020018 L 8.786571,0.0489152 Z m 1.2234334,0.0049452 c -0.076304,0.0029338 -0.1565114,0.0085964 -0.2377092,0.01751557 l 0.074557,2.89498191 -2.3262459,-0.015078 0.05762,3.9792753 2.2369682,0.041672 v 2.9207951 l -2.2294617,-0.020017 0.00501,3.6352537 2.354765,0.117801 -0.1578331,2.316838 c 2.2327058,0 2.6723538,-2.071122 2.6723538,-3.953478 V 9.9011681 H 14.90073 V 7.1563927 H 11.245003 V 4.0931168 c 0,-1.3484853 -0.0845,-4.11711155 -2.4500091,-4.02610568 z"
sodipodi:nodetypes="ssccccssccccccccccssccccccccccsccccss" />
<path
id="path9"
style="fill:#e0e0e0;fill-opacity:1;stroke-width:3.47802"
d="M 7.5715605,0.06207122 C 5.8770753,0.08041901 4.5113688,1.8246744 4.5113688,4.0155486 V 7.0813268 H 0.85565317 v 2.7447754 c 0.59043283,-0.3140696 2.43714373,0 3.65571563,0 v 2.0989038 c 0,2.190872 1.3656073,4.02832 3.0601917,4.02832 h 1.0111382 l 0.8154684,-2.406894 -2.9125619,-0.01751 0.025022,-3.6152385 2.875029,0.017516 0.012517,-3 -2.902553,-0.00501 0.012517,-3.8789934 2.9025532,0.020018 L 8.786571,0.0489152 Z m 1.2234334,0.0049452 c -0.076304,0.0029338 -0.1565114,0.0085964 -0.2377092,0.01751557 l 0.074557,2.89498191 -2.3262459,-0.015078 0.05762,3.9792753 2.2369682,0.041672 v 2.9207951 l -2.2294617,-0.020017 0.00501,3.6352537 2.354765,0.117801 -0.1578331,2.316838 c 2.2327058,0 2.6723538,-2.071122 2.6723538,-3.953478 V 9.9011681 H 14.90073 V 7.1563927 H 11.245003 V 4.0931168 c 0,-1.3484853 -0.0845,-4.11711155 -2.4500091,-4.02610568 z"
sodipodi:nodetypes="ssccccssccccccccccssccccccccccsccccss" />
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://un7sibaoyeeo"
path="res://.godot/imported/Connect2.svg-6e813cff05f022d485f4d95296800abe.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Connect2.svg"
dest_files=["res://.godot/imported/Connect2.svg-6e813cff05f022d485f4d95296800abe.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#e0e0e0" d="m7 1c-.554 0-1 .446-1 1v2h4v-2c0-.554-.446-1-1-1zm-1 4v7l2 3 2-3v-7zm1 1h1v5h-1z"/></svg>

After

Width:  |  Height:  |  Size: 176 B

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d10gshlv0aq2d"
path="res://.godot/imported/Edit.svg-206c08cdfe2c86e6e36fbd0ea67b4db7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Edit.svg"
dest_files=["res://.godot/imported/Edit.svg-206c08cdfe2c86e6e36fbd0ea67b4db7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#e0e0e0" d="M10 1.5.5 11 4 14.5h4L15.5 7Zm-4.5 7 3 3-1 1h-3L3 11Z"/></svg>

After

Width:  |  Height:  |  Size: 149 B

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bbpao1cndqvwr"
path="res://.godot/imported/Eraser.svg-a188c3a7a38a6aac8c5d49fe081b58f3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ez_tiles_draw/icons/Eraser.svg"
dest_files=["res://.godot/imported/Eraser.svg-a188c3a7a38a6aac8c5d49fe081b58f3.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="HillB.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
showguides="true"
inkscape:zoom="38.139572"
inkscape:cx="9.753649"
inkscape:cy="9.4390152"
inkscape:current-layer="svg1">
<sodipodi:guide
position="15.181083,13.010979"
orientation="0,-1"
id="guide1"
inkscape:locked="false" />
<sodipodi:guide
position="7.9969434,11.90976"
orientation="1,0"
id="guide2"
inkscape:locked="false" />
</sodipodi:namedview>
<path
fill="none"
stroke="#e0e0e0"
stroke-linejoin="round"
stroke-width="2"
d="M 5.9243978,11.984778 10.675649,12 14,4.0372167 H 2 Z"
id="path1"
sodipodi:nodetypes="ccccc" />
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dntkx0h8qim1n"
path="res://.godot/imported/HillB.svg-2b1e837b4005cfdb77e758705f71d6c7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ez_tiles_draw/icons/HillB.svg"
dest_files=["res://.godot/imported/HillB.svg-2b1e837b4005cfdb77e758705f71d6c7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="HillL.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
showguides="true"
inkscape:zoom="13.484375"
inkscape:cx="0.22247972"
inkscape:cy="15.351101"
inkscape:current-layer="svg1">
<sodipodi:guide
position="15.181083,13.010979"
orientation="0,-1"
id="guide1"
inkscape:locked="false" />
<sodipodi:guide
position="7.9969434,11.90976"
orientation="1,0"
id="guide2"
inkscape:locked="false" />
</sodipodi:namedview>
<path
fill="none"
stroke="#e0e0e0"
stroke-linejoin="round"
stroke-width="2"
d="m 4.0338356,5.9430007 -0.015222,4.7512513 7.9627834,3.324351 V 2.0186029 Z"
id="path1"
sodipodi:nodetypes="ccccc" />
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dpmrju1gvdr16"
path="res://.godot/imported/HillL.svg-f186ea095ce3e10ae26d57f879ef2e31.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ez_tiles_draw/icons/HillL.svg"
dest_files=["res://.godot/imported/HillL.svg-f186ea095ce3e10ae26d57f879ef2e31.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="HillR.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
showguides="true"
inkscape:zoom="13.484375"
inkscape:cx="0.22247972"
inkscape:cy="15.351101"
inkscape:current-layer="svg1">
<sodipodi:guide
position="15.181083,13.010979"
orientation="0,-1"
id="guide1"
inkscape:locked="false" />
<sodipodi:guide
position="7.9969434,11.90976"
orientation="1,0"
id="guide2"
inkscape:locked="false" />
</sodipodi:namedview>
<path
fill="none"
stroke="#e0e0e0"
stroke-linejoin="round"
stroke-width="2"
d="m 11.966175,5.9430007 0.01522,4.7512513 -7.9627832,3.324351 V 2.0186029 Z"
id="path1"
sodipodi:nodetypes="ccccc" />
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dv855gccwqgu"
path="res://.godot/imported/HillR.svg-11714009d9d53e804e759b93eeefee15.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ez_tiles_draw/icons/HillR.svg"
dest_files=["res://.godot/imported/HillR.svg-11714009d9d53e804e759b93eeefee15.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="HillT.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
showguides="true"
inkscape:zoom="38.139572"
inkscape:cx="9.7798685"
inkscape:cy="9.4521249"
inkscape:current-layer="svg1">
<sodipodi:guide
position="15.181083,13.010979"
orientation="0,-1"
id="guide1"
inkscape:locked="false" />
<sodipodi:guide
position="7.9969434,11.90976"
orientation="1,0"
id="guide2"
inkscape:locked="false" />
</sodipodi:namedview>
<path
fill="none"
stroke="#e0e0e0"
stroke-linejoin="round"
stroke-width="2"
d="M 5.9243978,4.052439 10.675649,4.0372165 14,12 H 2 Z"
id="path1"
sodipodi:nodetypes="ccccc" />
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cri2mdk3hr6s1"
path="res://.godot/imported/HillT.svg-598ff05abd20ebbb7b4a78e8535c9357.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/ez_tiles/ez_tiles_draw/icons/HillT.svg"
dest_files=["res://.godot/imported/HillT.svg-598ff05abd20ebbb7b4a78e8535c9357.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

Some files were not shown because too many files have changed in this diff Show More