Add Physics 2D benchmarks (#72)

This commit is contained in:
Emmanouil Papadeas
2024-06-14 23:47:53 +03:00
committed by GitHub
parent baf024d674
commit 85bb12d1d5
7 changed files with 707 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
extends Benchmark
class TestScene:
extends Node2D
var num_character_bodies: int
var num_area_2d: int
var visualize := true
var area_2d_nodes: Array[Area2D]
var window_size: Vector2i
var time_accum := 0.0
var shapes: Array[Shape2D] = [
RectangleShape2D.new(),
CapsuleShape2D.new(),
CircleShape2D.new(),
]
var meshes: Array[Mesh] = [
QuadMesh.new(),
CapsuleMesh.new(),
SphereMesh.new(),
]
func _init(_num_character_bodies: int, _num_area_2d: int, _visualize: bool) -> void:
num_character_bodies = _num_character_bodies
num_area_2d = _num_area_2d
visualize = _visualize
meshes[0].size = Vector2(20.0, 20.0)
meshes[1].radius = 10.0
meshes[1].height = 28.0
meshes[2].radius = 10.0
meshes[2].height = 20.0
func _ready() -> void:
window_size = get_window().size
for i in num_character_bodies:
var character_body := CharacterBody2D.new()
character_body.position = Vector2(
randf_range(0.0, window_size.x), randf_range(0.0, window_size.y)
)
add_random_shape(character_body)
add_child(character_body)
for i in num_area_2d:
var area_2d := Area2D.new()
area_2d.position = Vector2(
randf_range(0.0, window_size.x), randf_range(0.0, window_size.y)
)
add_random_shape(area_2d)
add_child(area_2d)
area_2d_nodes.append(area_2d)
func _physics_process(delta: float) -> void:
for i in area_2d_nodes.size():
time_accum += delta
area_2d_nodes[i].position += Vector2(sin(time_accum), cos(time_accum)) * 20.0
func add_random_shape(parent: CollisionObject2D) -> void:
var r := randi() % shapes.size()
var collision_shape := CollisionShape2D.new()
collision_shape.shape = shapes[r]
if visualize:
var mesh_instance := MeshInstance2D.new()
mesh_instance.mesh = meshes[r]
parent.add_child(mesh_instance)
parent.add_child(collision_shape)
func _init() -> void:
test_physics = true
test_idle = true
func benchmark_1000_area_2d() -> TestScene:
return TestScene.new(2000, 1000, true)

View File

@@ -0,0 +1,66 @@
extends Benchmark
const SPEED := 300.0
const JUMP_VELOCITY := -400.0
class TestScene:
extends Node2D
var tile_map_scene := preload("res://supplemental/tilemap_scene.tscn")
var tile_map_node: Node2D
var n_of_character_bodies: int
var visualize := true
var character_bodies: Array[CharacterBody2D] = []
var capsule_mesh := CapsuleMesh.new()
var window_size: Vector2i
func _init(_n_of_character_bodies: int, _visualize: bool) -> void:
n_of_character_bodies = _n_of_character_bodies
visualize = _visualize
capsule_mesh.radius = 10.0
capsule_mesh.height = 28.0
func _ready() -> void:
window_size = get_window().size
tile_map_node = tile_map_scene.instantiate()
add_child(tile_map_node)
for i in n_of_character_bodies:
var body := CharacterBody2D.new()
body.position = Vector2(
randf_range(0.0, window_size.x), randf_range(0.0, window_size.y)
)
var collision_shape := CollisionShape2D.new()
collision_shape.shape = CapsuleShape2D.new()
body.add_child(collision_shape)
if visualize:
var mesh_instance := MeshInstance2D.new()
mesh_instance.mesh = capsule_mesh
body.add_child(mesh_instance)
tile_map_node.add_child(body)
character_bodies.append(body)
func _physics_process(delta: float) -> void:
for body in character_bodies:
if not body.is_on_floor():
body.velocity += body.get_gravity() * delta
if body.is_on_floor():
body.velocity.y = JUMP_VELOCITY
var direction := randf_range(-1.0, 1.0)
if direction:
body.velocity.x = direction * SPEED
else:
body.velocity.x = move_toward(body.velocity.x, 0, SPEED)
body.move_and_slide()
func _init() -> void:
test_physics = true
test_idle = true
func benchmark_1000_character_bodies_2d() -> TestScene:
return TestScene.new(1000, true)

View File

@@ -0,0 +1,60 @@
extends Benchmark
const N_OF_RAYCASTS := 10_000
const N_OF_SHAPES := 2000
var space: RID
var bodies: Array[RID]
var shapes: Array[RID]
var viewport_size := Vector2(
ProjectSettings.get_setting("display/window/size/viewport_width"),
ProjectSettings.get_setting("display/window/size/viewport_height")
)
func _setup_scene() -> void:
space = PhysicsServer2D.space_create()
PhysicsServer2D.space_set_active(space, true)
for i in N_OF_SHAPES:
var body := PhysicsServer2D.body_create()
var shape: RID
var r := randi() % 3
match r:
0:
shape = PhysicsServer2D.rectangle_shape_create()
1:
shape = PhysicsServer2D.capsule_shape_create()
2:
shape = PhysicsServer2D.circle_shape_create()
PhysicsServer2D.body_add_shape(body, shape)
shapes.append(shape)
PhysicsServer2D.body_set_space(body, space)
bodies.append(body)
var transform := Transform2D()
transform.origin = _rand_pos()
PhysicsServer2D.body_set_state(body, PhysicsServer2D.BODY_STATE_TRANSFORM, transform)
func _cast_raycasts() -> void:
var space_state := PhysicsServer2D.space_get_direct_state(space)
for i in N_OF_RAYCASTS:
var query := PhysicsRayQueryParameters2D.create(_rand_pos(), _rand_pos())
space_state.intersect_ray(query)
func _clear_scene() -> void:
for i in shapes.size(): # shapes and bodies should have the same size
PhysicsServer2D.free_rid(shapes[i])
PhysicsServer2D.free_rid(bodies[i])
PhysicsServer2D.free_rid(space)
func _rand_pos() -> Vector2:
return Vector2(randf_range(0.0, viewport_size.x), randf_range(0.0, viewport_size.y))
func benchmark_10_000_raycast_2d() -> void:
_setup_scene()
_cast_raycasts()
_clear_scene()

File diff suppressed because one or more lines are too long

BIN
supplemental/tiles.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ctopmbnc1hyat"
path="res://.godot/imported/tiles.png-4a02c4ccd12b5de441312a2c42470c61.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://supplemental/tiles.png"
dest_files=["res://.godot/imported/tiles.png-4a02c4ccd12b5de441312a2c42470c61.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

461
supplemental/tileset.tres Normal file
View File

@@ -0,0 +1,461 @@
[gd_resource type="TileSet" load_steps=15 format=3 uid="uid://bb0jy3rmsdxpx"]
[ext_resource type="Texture2D" uid="uid://ctopmbnc1hyat" path="res://supplemental/tiles.png" id="1"]
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_va8am"]
texture = ExtResource("1")
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -12, -16, -12, -16, 16, 16, 16)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 12, 16, 12, 16, -16, -16, -16)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 12, -16, 12, -16, -16, 16, -16)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -12, 16, -12, 16, 16, -16, 16)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -12, -16, -12, -16, 16, 16, 16)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 12, 16, 12, 16, -16, -16, -16)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 12, -16, 12, -16, -16, 16, -16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_dri2i"]
texture = ExtResource("1")
margins = Vector2i(32, 0)
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -12, 12, -12, 12, 16)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -12, -12, -12, -12, 16)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 12, 12, 12, 12, -16)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 12, -12, 12, -12, -16)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -12, 12, -12, 12, 16)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -12, -12, -12, -12, 16)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 12, 12, 12, 12, -16)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 12, -12, 12, -12, -16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_hfgct"]
texture = ExtResource("1")
margins = Vector2i(0, 32)
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_7xlxp"]
texture = ExtResource("1")
margins = Vector2i(192, 32)
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -16, -16, -16, 16, 16, 16)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -16, 16, -16, -16, 16, -16)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -16, -16, -16, 16, 16, 16)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -16, 16, -16, -16, 16, -16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_64p8q"]
texture = ExtResource("1")
margins = Vector2i(64, 32)
texture_region_size = Vector2i(32, 96)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 16, 22, 16, 48, -16, 48)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 22, 16, -10, 16, 48, -16, 48)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -48, 16, -48, 16, -22, -16, 10)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -48, 16, -48, 16, 10, -16, -22)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -28, 16, 4, 16, 32, -16, 32)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -28, -16, 4, -16, 32, 16, 32)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 28, 16, -4, 16, -32, -16, -32)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 28, -16, -4, -16, -32, 16, -32)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_bgjgk"]
texture = ExtResource("1")
margins = Vector2i(224, 32)
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -16, 12, -16, 12, 16)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -16, -12, -16, -12, 16)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 12, 16, 12, -16)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 16, -12, 16, -12, -16)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -16, 12, -16, 12, 16)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -16, -12, -16, -12, 16)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 12, 16, 12, -16)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 16, -12, 16, -12, -16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_uq55q"]
texture = ExtResource("1")
margins = Vector2i(64, 0)
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -12, 16, -12, 16, 12, -16, 12)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -12, -16, -12, -16, 12, 16, 12)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 12, 16, 12, 16, -12, -16, -12)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 12, -16, 12, -16, -12, 16, -12)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -12, 16, -12, 16, 12, -16, 12)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -12, -16, -12, -16, 12, 16, 12)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 12, 16, 12, 16, -12, -16, -12)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 12, -16, 12, -16, -12, 16, -12)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_l5dh6"]
texture = ExtResource("1")
margins = Vector2i(96, 0)
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -12, 12, -12, 12, 12, -16, 12)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -12, -12, -12, -12, 12, 16, 12)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 12, 12, 12, 12, -12, -16, -12)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 12, -12, 12, -12, -12, 16, -12)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -12, 12, -12, 12, 12, -16, 12)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -12, -12, -12, -12, 12, 16, 12)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 12, 12, 12, 12, -12, -16, -12)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 12, -12, 12, -12, -12, 16, -12)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_w6c8t"]
texture = ExtResource("1")
margins = Vector2i(32, 32)
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -16, -12, -16, -12, 16)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 12, 16, 12, -16)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 16, -12, 16, -12, -16)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -16, 12, -16, 12, 16)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -16, -12, -16, -12, 16)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 12, 16, 12, -16)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 16, -12, 16, -12, -16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_05nbk"]
texture = ExtResource("1")
margins = Vector2i(160, 64)
texture_region_size = Vector2i(96, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 16, -48, -16, -20, -16, -20, 16)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(48, 16, 48, -16, 20, -16.5, 20, 16)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -16, -32, 16, -4, 16, -4, -16)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(32, -16, 32, 16, 4, 16, 4, -16)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-32, 16, -32, -16, -4, -16, -4, 16)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(32, 16, 32, -16, 4, -16, 4, 16)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -16, -32, 16, -4, 16, -4, -16)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(32, -16, 32, 16, 4, 16, 4, -16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_ee0gv"]
texture = ExtResource("1")
margins = Vector2i(32, 64)
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -16, 12, -16, 16, -12, 16, 16)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -16, -12, -16, -16, -12, -16, 16)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 12, 16, 16, 12, 16, -16)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 16, -12, 16, -16, 12, -16, -16)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -16, 12, -16, 16, -12, 16, 16)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -16, -12, -16, -16, -12, -16, 16)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 12, 16, 16, 12, 16, -16)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 16, -12, 16, -16, 12, -16, -16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_lnu6d"]
texture = ExtResource("1")
margins = Vector2i(96, 96)
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -12, 16, -12, 16, 16)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -12, -16, -12, -16, 16)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 12, 16, 12, 16, -16)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 12, -16, 12, -16, -16)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -12, 16, -12, 16, 16)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -12, -16, -12, -16, 16)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 12, 16, 12, 16, -16)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 12, -16, 12, -16, -16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_8javq"]
texture = ExtResource("1")
margins = Vector2i(128, 96)
texture_region_size = Vector2i(32, 32)
0:0/next_alternative_id = 8
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -12, 16, -12, 16, 16)
0:0/1 = 1
0:0/1/flip_h = true
0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -12, -16, -12, -16, 16)
0:0/2 = 2
0:0/2/flip_v = true
0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 12, 16, 12, 16, -16)
0:0/3 = 3
0:0/3/flip_h = true
0:0/3/flip_v = true
0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 12, -16, 12, -16, -16)
0:0/4 = 4
0:0/4/transpose = true
0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -12, 16, -12, 16, 16)
0:0/5 = 5
0:0/5/flip_h = true
0:0/5/transpose = true
0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, 16, -12, -16, -12, -16, 16)
0:0/6 = 6
0:0/6/flip_v = true
0:0/6/transpose = true
0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 12, 16, 12, 16, -16)
0:0/7 = 7
0:0/7/flip_h = true
0:0/7/flip_v = true
0:0/7/transpose = true
0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, 16, 12, -16, 12, -16, -16)
[resource]
tile_size = Vector2i(32, 32)
physics_layer_0/collision_layer = 1
sources/0 = SubResource("TileSetAtlasSource_va8am")
sources/1 = SubResource("TileSetAtlasSource_dri2i")
sources/2 = SubResource("TileSetAtlasSource_w6c8t")
sources/3 = SubResource("TileSetAtlasSource_05nbk")
sources/4 = SubResource("TileSetAtlasSource_ee0gv")
sources/5 = SubResource("TileSetAtlasSource_lnu6d")
sources/6 = SubResource("TileSetAtlasSource_8javq")
sources/10 = SubResource("TileSetAtlasSource_hfgct")
sources/11 = SubResource("TileSetAtlasSource_7xlxp")
sources/12 = SubResource("TileSetAtlasSource_64p8q")
sources/13 = SubResource("TileSetAtlasSource_bgjgk")
sources/14 = SubResource("TileSetAtlasSource_uq55q")
sources/15 = SubResource("TileSetAtlasSource_l5dh6")