level + enemy spawner refactor

This commit is contained in:
Michael Campbell 2026-03-04 01:42:11 -05:00
parent ebdb9c7074
commit 2cc3eaa859
15 changed files with 942 additions and 93 deletions

View file

@ -16,6 +16,7 @@ func _physics_process(delta: float) -> void:
move_and_slide()
rotation.y = Vector2(velocity.x, -velocity.z).angle()
position.y = 0.01
func hit(_proj: PlayerProjectile, damage: float) -> bool:
health -= damage

File diff suppressed because one or more lines are too long

57
levels/enemy_spawner.gd Normal file
View file

@ -0,0 +1,57 @@
extends Node3D
var boxes: Array[CSGBox3D]
var points: Array[Vector3]
const MAX_CACHED_POINTS := 100
var doomed_point_idx := 0
func _get_point() -> Vector3:
assert(not boxes.is_empty())
var box: CSGBox3D = boxes.pick_random()
var x_stride := box.size.x / 2
var y_stride := box.size.y / 2
var ret := box.global_position
ret.x += randf_range(-x_stride, x_stride)
ret.y += randf_range(-y_stride, y_stride)
return ret
func _ready() -> void:
for child in get_children():
if child is CSGBox3D:
boxes.push_back(child)
func _process(_delta: float) -> void:
var v := _get_point()
v.y = 50.
var col_mask := 16 # floor collision layer
var params := PhysicsRayQueryParameters3D.create(
v, v + Vector3.DOWN * 100., col_mask
)
var raycast := get_world_3d().direct_space_state.intersect_ray(params)
if not raycast.is_empty():
var hitpos: Vector3 = raycast.position
if points.size() < MAX_CACHED_POINTS:
points.push_back(hitpos)
else:
points[doomed_point_idx] = hitpos
doomed_point_idx += 1
doomed_point_idx = doomed_point_idx % MAX_CACHED_POINTS
func _on_timer_timeout() -> void:
if points.is_empty(): return
var pos: Vector3 = points.pick_random()
pos += Vector3.UP * 0.02
var scene := preload("res://enemies/police_car/police_car.tscn")
var car: Node3D = scene.instantiate()
car.global_position = pos
get_tree().current_scene.add_child(car)

View file

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

File diff suppressed because one or more lines are too long

9
levels/trees.gd Normal file
View file

@ -0,0 +1,9 @@
@tool
extends Node3D
@export_tool_button("Randomize Tree Rotations")
var _rot_button = _randomize_rotations
func _randomize_rotations() -> void:
for child in get_children():
child.rotation.y = randf() * TAU

1
levels/trees.gd.uid Normal file
View file

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

View file

@ -52,7 +52,7 @@ func exp_lerp(a: Variant, b: Variant, decay: float, dt: float) -> Variant:
func _process_movement(delta: float) -> void:
var input = Input.get_vector("move_left", "move_right", "move_up", "move_down")
input.normalized()
var mul := 5. if DebugMenu.high_speed_hack else 1.
var mul := 10. if DebugMenu.high_speed_hack else 1.
var desired_velocity = Vector3(input.x, 0., input.y) * MOVE_SPEED * mul
velocity = exp_lerp(velocity, desired_velocity, 20, delta)
move_and_slide()
@ -103,6 +103,10 @@ func _process_shoot(delta: float) -> void:
func _process_cam_shake(delta: float) -> void:
shake_duration -= delta
%Camera3D.transform = camera_transform
if DebugMenu.zoomed_out:
%Camera3D.position += %Camera3D.basis.z * 20.
if shake_duration <= 0:
return
@ -142,4 +146,5 @@ func damage(damager: Node3D) -> void:
shake_duration = .25
if health == 0:
get_tree().reload_current_scene()
pass
#get_tree().reload_current_scene()

View file

@ -11,7 +11,7 @@ config_version=5
[application]
config/name="Road Rage Tank"
run/main_scene="uid://civwljgkv3m53"
run/main_scene="uid://6t6382ugkyft"
config/features=PackedStringArray("4.6")
config/icon="res://icon.svg"
@ -27,6 +27,8 @@ enabled=PackedStringArray()
[global_group]
navigation_mesh_source_group=""
floor=""
grass=""
[input]
@ -77,3 +79,12 @@ debug_menu={
3d_physics/layer_2="Player"
3d_physics/layer_3="Building"
3d_physics/layer_4="Police"
3d_physics/layer_5="Floor"
[physics]
3d/physics_engine="Jolt Physics"
[rendering]
anti_aliasing/quality/screen_space_aa=2

View file

@ -1,6 +1,7 @@
extends CanvasLayer
var high_speed_hack := false
var zoomed_out := false
func _ready() -> void:
hide()
@ -13,3 +14,6 @@ func _process(_delta: float) -> void:
func _on_high_speed_button_pressed() -> void:
high_speed_hack = not high_speed_hack
func _on_toggle_zoom_button_pressed() -> void:
zoomed_out = not zoomed_out

View file

@ -45,4 +45,11 @@ size_flags_vertical = 4
theme_override_font_sizes/font_size = 30
text = "High Speed"
[node name="ToggleZoomButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer" unique_id=1729373000]
layout_mode = 2
size_flags_horizontal = 4
theme_override_font_sizes/font_size = 30
text = "Zoom Out Camera"
[connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/HighSpeedButton" to="." method="_on_high_speed_button_pressed"]
[connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/ToggleZoomButton" to="." method="_on_toggle_zoom_button_pressed"]

View file

@ -0,0 +1,18 @@
[gd_scene format=3 uid="uid://yseykcc08n25"]
[ext_resource type="Script" uid="uid://bnr37lfj76u7n" path="res://world/building/building.gd" id="1_xdgb6"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_d2kbb"]
[node name="BaseBuilding" type="StaticBody3D" unique_id=713127214]
collision_layer = 5
collision_mask = 0
script = ExtResource("1_xdgb6")
shake_noise = SubResource("FastNoiseLite_d2kbb")
[node name="DestroyedMesh" type="Node3D" parent="." unique_id=1889390235]
unique_name_in_owner = true
visible = false
[node name="Shaker" type="Node3D" parent="." unique_id=2089389922]
unique_name_in_owner = true

View file

@ -1,11 +1,11 @@
class_name Building
extends CollisionObject3D
var health := 10.
@export var health := 10.
@export var shake_noise: FastNoiseLite
var shake_duration := 0.
@onready var initial_mesh_pos: Vector3 = %Mesh.position
@onready var initial_shaker_pos: Vector3 = %Shaker.position
func _ready() -> void:
scale.y = randf_range(.5, 1.25)
@ -13,11 +13,11 @@ func _ready() -> void:
func _process(delta: float) -> void:
if shake_duration <= 0:
%Mesh.position = initial_mesh_pos
%Shaker.position = initial_shaker_pos
else:
var x := shake_noise.get_noise_1d(shake_duration * 10000)
var y := shake_noise.get_noise_1d(-shake_duration * 10000)
%Mesh.position = initial_mesh_pos + (Vector3(x, 0, y) * 0.75)
%Shaker.position = initial_shaker_pos + (Vector3(x, 0, y) * 0.75)
shake_duration = move_toward(shake_duration, 0., delta)
@ -28,7 +28,7 @@ func hit(_proj: PlayerProjectile, damage: float) -> bool:
SignalBus.building_destroyed.emit(self)
collision_layer = 1 # World collision only
%Mesh.hide()
%Shaker.hide()
%DestroyedMesh.show()
%GPUParticles3D.preprocess = randf()
else:

View file

@ -1,11 +1,6 @@
[gd_scene format=3 uid="uid://cm86dxphvhbb"]
[ext_resource type="Script" uid="uid://bnr37lfj76u7n" path="res://world/building/building.gd" id="1_5j34s"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_d2kbb"]
[sub_resource type="BoxMesh" id="BoxMesh_rqn35"]
size = Vector3(3, 5, 3)
[ext_resource type="PackedScene" uid="uid://yseykcc08n25" path="res://world/building/base_building.tscn" id="1_d2kbb"]
[sub_resource type="BoxShape3D" id="BoxShape3D_5j34s"]
size = Vector3(3, 5, 3)
@ -46,26 +41,16 @@ material = SubResource("StandardMaterial3D_2vvqs")
[sub_resource type="BoxMesh" id="BoxMesh_5j34s"]
[node name="Building" type="StaticBody3D" unique_id=713127214]
collision_layer = 5
collision_mask = 0
script = ExtResource("1_5j34s")
shake_noise = SubResource("FastNoiseLite_d2kbb")
[sub_resource type="BoxMesh" id="BoxMesh_rqn35"]
size = Vector3(3, 5, 3)
[node name="Mesh" type="MeshInstance3D" parent="." unique_id=1919101154]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 0)
mesh = SubResource("BoxMesh_rqn35")
[node name="Building" unique_id=713127214 instance=ExtResource("1_d2kbb")]
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1627500046]
[node name="CollisionShape3D" type="CollisionShape3D" parent="." index="0" unique_id=661727263]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 0)
shape = SubResource("BoxShape3D_5j34s")
[node name="DestroyedMesh" type="Node3D" parent="." unique_id=1889390235]
unique_name_in_owner = true
visible = false
[node name="GPUParticles3D" type="GPUParticles3D" parent="DestroyedMesh" unique_id=405124106]
[node name="GPUParticles3D" type="GPUParticles3D" parent="DestroyedMesh" parent_id_path=PackedInt32Array(1889390235) index="0" unique_id=349729190]
unique_name_in_owner = true
amount = 1
lifetime = 0.5
@ -73,56 +58,61 @@ speed_scale = 0.5
process_material = SubResource("ParticleProcessMaterial_ow2p3")
draw_pass_1 = SubResource("SphereMesh_8evq1")
[node name="Cubez" type="Node3D" parent="DestroyedMesh" unique_id=84909385]
[node name="Cubez" type="Node3D" parent="DestroyedMesh" parent_id_path=PackedInt32Array(1889390235) index="1" unique_id=289648386]
[node name="MeshInstance3D" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=936603106]
[node name="MeshInstance3D" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="0" unique_id=1483935163]
transform = Transform3D(-0.020582985, -0.013163342, -0.9997015, 0.53877074, -0.8424524, -2.0764832e-08, -0.84220093, -0.5386099, 0.02443221, 0, 0, 0)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=1902773756]
[node name="MeshInstance3D2" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="1" unique_id=1721508190]
transform = Transform3D(0.55269843, 0.35346538, -0.7547096, 0.53877074, -0.8424524, -2.0764832e-08, -0.6358069, -0.40661544, -0.65605897, 0, 0, 0)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D3" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=693829807]
[node name="MeshInstance3D3" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="2" unique_id=1453671131]
transform = Transform3D(0.55269843, 0.35346538, -0.7547096, 0.53877074, -0.8424524, -2.0764832e-08, -0.6358069, -0.40661544, -0.65605897, -0.5652933, 0, -0.5979067)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D4" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=1318120052]
[node name="MeshInstance3D4" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="3" unique_id=593181716]
transform = Transform3D(0.011722982, 0.9259946, -0.37735477, 0.35865596, 0.34837604, 0.86602545, 0.9333962, -0.14549291, -0.32802945, 0.41309977, 0, -0.7827141)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D5" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=1106985548]
[node name="MeshInstance3D5" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="4" unique_id=1719125877]
transform = Transform3D(0.011722982, 0.9259946, -0.37735477, 0.35865596, 0.34837604, 0.86602545, 0.9333962, -0.14549291, -0.32802945, 0.91316706, 0, -0.43484128)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D6" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=1830889998]
[node name="MeshInstance3D6" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="5" unique_id=1454957802]
transform = Transform3D(0.011722982, 0.9259946, -0.37735477, 0.35865596, 0.34837604, 0.86602545, 0.9333962, -0.14549291, -0.32802945, -0.90229505, 0, 0.19567871)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D7" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=223786894]
[node name="MeshInstance3D7" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="6" unique_id=192394078]
transform = Transform3D(-0.4571105, 0.47059897, -0.7547096, 0.717312, 0.69675213, -2.0764832e-08, 0.5258455, -0.5413622, -0.65605897, -1.4241041, 0, -0.9131663)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D8" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=220079864]
[node name="MeshInstance3D8" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="7" unique_id=1974385658]
transform = Transform3D(0.55269843, 0.35346538, -0.7547096, 0.53877074, -0.8424524, -2.0764832e-08, -0.6358069, -0.40661544, -0.65605897, 0.5758959, 0, 0.086833715)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D9" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=235651157]
[node name="MeshInstance3D9" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="8" unique_id=652075050]
transform = Transform3D(0.55269843, 0.35346538, -0.7547096, 0.53877074, -0.8424524, -2.0764832e-08, -0.6358069, -0.40661544, -0.65605897, 0.94551057, 0, 0.86954826)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D10" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=1163044184]
[node name="MeshInstance3D10" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="9" unique_id=1495304389]
transform = Transform3D(-0.4571105, 0.47059897, -0.7547096, 0.717312, 0.69675213, -2.0764832e-08, 0.5258455, -0.5413622, -0.65605897, -0.26117355, 0, 0.8586771)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D11" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=804770500]
[node name="MeshInstance3D11" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="10" unique_id=1593134047]
transform = Transform3D(0.55074334, -0.56699485, -0.61253464, 0.71731204, 0.6967521, 0, 0.42678478, -0.43937847, 0.7904438, -1.022146, 0, 1.0760975)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D12" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=1102483093]
[node name="MeshInstance3D12" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="11" unique_id=1005652425]
transform = Transform3D(0.55074334, -0.56699485, -0.61253464, 0.71731204, 0.6967521, 0, 0.42678478, -0.43937847, 0.7904438, 0.977854, 0, -0.9239025)
mesh = SubResource("BoxMesh_5j34s")
[node name="MeshInstance3D13" type="MeshInstance3D" parent="DestroyedMesh/Cubez" unique_id=1341429344]
[node name="MeshInstance3D13" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="12" unique_id=1957113469]
transform = Transform3D(-0.020582985, -0.013163342, -0.9997015, 0.53877074, -0.8424524, -2.0764832e-08, -0.84220093, -0.5386099, 0.02443221, -0.4571221, 0, -1.3370018)
mesh = SubResource("BoxMesh_5j34s")
[node name="Mesh" type="MeshInstance3D" parent="Shaker" parent_id_path=PackedInt32Array(2089389922) index="0" unique_id=26690267]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 0)
mesh = SubResource("BoxMesh_rqn35")

141
world/building/tree.tscn Normal file
View file

@ -0,0 +1,141 @@
[gd_scene format=3 uid="uid://dnl2jhf7rj33h"]
[ext_resource type="PackedScene" uid="uid://yseykcc08n25" path="res://world/building/base_building.tscn" id="1_hn3k1"]
[sub_resource type="Gradient" id="Gradient_hn3k1"]
offsets = PackedFloat32Array(0.06315789, 0.6421053, 1)
colors = PackedColorArray(0, 0, 0, 1, 0.1, 0.1, 0.1, 1, 0.58, 0.58, 0.58, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_f1gjg"]
gradient = SubResource("Gradient_hn3k1")
[sub_resource type="Gradient" id="Gradient_11lcc"]
offsets = PackedFloat32Array(0.69473684, 1)
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_0rysw"]
gradient = SubResource("Gradient_11lcc")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_iwclo"]
emission_shape = 3
emission_box_extents = Vector3(1.575, 0.185, 1.465)
direction = Vector3(0, 1, 0)
spread = 0.0
initial_velocity_min = 3.0
initial_velocity_max = 5.0
gravity = Vector3(0, 0, 0)
scale_min = 0.19999999
scale_max = 0.75
color_ramp = SubResource("GradientTexture1D_0rysw")
color_initial_ramp = SubResource("GradientTexture1D_f1gjg")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2vvqs"]
transparency = 1
vertex_color_use_as_albedo = true
[sub_resource type="SphereMesh" id="SphereMesh_wueys"]
material = SubResource("StandardMaterial3D_2vvqs")
[sub_resource type="BoxMesh" id="BoxMesh_hfj6b"]
[sub_resource type="BoxMesh" id="BoxMesh_hn3k1"]
[sub_resource type="BoxMesh" id="BoxMesh_11lcc"]
[sub_resource type="BoxShape3D" id="BoxShape3D_hn3k1"]
size = Vector3(4.137268, 6.5753174, 4.334961)
[node name="Tree" unique_id=713127214 instance=ExtResource("1_hn3k1")]
[node name="GPUParticles3D" type="GPUParticles3D" parent="DestroyedMesh" parent_id_path=PackedInt32Array(1889390235) index="0" unique_id=1508601722]
unique_name_in_owner = true
amount = 1
lifetime = 0.5
speed_scale = 0.5
process_material = SubResource("ParticleProcessMaterial_iwclo")
draw_pass_1 = SubResource("SphereMesh_wueys")
[node name="Cubez" type="Node3D" parent="DestroyedMesh" parent_id_path=PackedInt32Array(1889390235) index="1" unique_id=95076974]
[node name="MeshInstance3D" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="0" unique_id=360006017]
transform = Transform3D(-0.020582985, -0.013163342, -0.9997015, 0.53877074, -0.8424524, -2.0764832e-08, -0.84220093, -0.5386099, 0.02443221, 0, 0, 0)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="1" unique_id=1427047813]
transform = Transform3D(0.55269843, 0.35346538, -0.7547096, 0.53877074, -0.8424524, -2.0764832e-08, -0.6358069, -0.40661544, -0.65605897, 0, 0, 0)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D3" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="2" unique_id=1659669617]
transform = Transform3D(0.55269843, 0.35346538, -0.7547096, 0.53877074, -0.8424524, -2.0764832e-08, -0.6358069, -0.40661544, -0.65605897, -0.5652933, 0, -0.5979067)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D4" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="3" unique_id=1339180229]
transform = Transform3D(0.011722982, 0.9259946, -0.37735477, 0.35865596, 0.34837604, 0.86602545, 0.9333962, -0.14549291, -0.32802945, 0.41309977, 0, -0.7827141)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D5" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="4" unique_id=233543180]
transform = Transform3D(0.011722982, 0.9259946, -0.37735477, 0.35865596, 0.34837604, 0.86602545, 0.9333962, -0.14549291, -0.32802945, 0.91316706, 0, -0.43484128)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D6" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="5" unique_id=577523110]
transform = Transform3D(0.011722982, 0.9259946, -0.37735477, 0.35865596, 0.34837604, 0.86602545, 0.9333962, -0.14549291, -0.32802945, -0.90229505, 0, 0.19567871)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D7" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="6" unique_id=827181079]
transform = Transform3D(-0.4571105, 0.47059897, -0.7547096, 0.717312, 0.69675213, -2.0764832e-08, 0.5258455, -0.5413622, -0.65605897, -1.4241041, 0, -0.9131663)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D8" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="7" unique_id=466240924]
transform = Transform3D(0.55269843, 0.35346538, -0.7547096, 0.53877074, -0.8424524, -2.0764832e-08, -0.6358069, -0.40661544, -0.65605897, 0.5758959, 0, 0.086833715)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D9" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="8" unique_id=407993931]
transform = Transform3D(0.55269843, 0.35346538, -0.7547096, 0.53877074, -0.8424524, -2.0764832e-08, -0.6358069, -0.40661544, -0.65605897, 0.94551057, 0, 0.86954826)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D10" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="9" unique_id=1070885811]
transform = Transform3D(-0.4571105, 0.47059897, -0.7547096, 0.717312, 0.69675213, -2.0764832e-08, 0.5258455, -0.5413622, -0.65605897, -0.26117355, 0, 0.8586771)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D11" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="10" unique_id=479502476]
transform = Transform3D(0.55074334, -0.56699485, -0.61253464, 0.71731204, 0.6967521, 0, 0.42678478, -0.43937847, 0.7904438, -1.022146, 0, 1.0760975)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D12" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="11" unique_id=7305593]
transform = Transform3D(0.55074334, -0.56699485, -0.61253464, 0.71731204, 0.6967521, 0, 0.42678478, -0.43937847, 0.7904438, 0.977854, 0, -0.9239025)
mesh = SubResource("BoxMesh_hfj6b")
[node name="MeshInstance3D13" type="MeshInstance3D" parent="DestroyedMesh/Cubez" index="12" unique_id=70448867]
transform = Transform3D(-0.020582985, -0.013163342, -0.9997015, 0.53877074, -0.8424524, -2.0764832e-08, -0.84220093, -0.5386099, 0.02443221, -0.4571221, 0, -1.3370018)
mesh = SubResource("BoxMesh_hfj6b")
[node name="Shaker" parent="." index="1" unique_id=2089389922]
transform = Transform3D(0.70885205, 0, 0, 0, 0.70885205, 0, 0, 0, 0.70885205, 0, 0, 0)
[node name="Stem" type="MeshInstance3D" parent="Shaker" index="0" unique_id=156669749]
transform = Transform3D(0.70718205, -0.9436787, 0.92297167, 0.46422693, 3.5198092, -4.3827896e-08, -0.8511094, 1.1357385, 0.7668921, 0, 1.3363686, 0)
mesh = SubResource("BoxMesh_hn3k1")
[node name="Stem2" type="MeshInstance3D" parent="Shaker" index="1" unique_id=229856999]
transform = Transform3D(0.43096656, -1.1965598, 0.6871064, -0.07412759, 3.6609116, 0.33437824, -0.72888476, -1.0798028, 0.37225807, -0.637649, 3.8433223, -0.3629342)
mesh = SubResource("BoxMesh_hn3k1")
[node name="Leaves" type="MeshInstance3D" parent="Shaker" index="2" unique_id=1530775788]
transform = Transform3D(2.148287, 0.21797568, -1.0967563, 0.7066671, 1.5762988, 1.6974771, 0.86660796, -1.8257309, 1.3346244, -2.450163, 5.5032597, -1.1231996)
mesh = SubResource("BoxMesh_11lcc")
[node name="Leaves2" type="MeshInstance3D" parent="Shaker" index="3" unique_id=1147999215]
transform = Transform3D(-1.8328239, -1.5762837, 0.1470051, -0.5105396, 0.8013866, 2.2277014, -1.4985428, 1.6548818, -0.93875486, -1.4362912, 5.5032597, 0.44623435)
mesh = SubResource("BoxMesh_11lcc")
[node name="Leaves3" type="MeshInstance3D" parent="Shaker" index="4" unique_id=1274378627]
transform = Transform3D(1.0111561, -0.38601488, -2.1665826, -0.9885437, -2.209917, -0.06762316, -1.9661813, 0.91256994, -1.0802182, -0.24229479, 6.480358, -1.5169011)
mesh = SubResource("BoxMesh_11lcc")
[node name="Leaves4" type="MeshInstance3D" parent="Shaker" index="5" unique_id=1988467257]
transform = Transform3D(1.8163599, 1.086452, -1.1772779, 1.159343, 0.3368203, 2.099524, 1.1055702, -2.138153, -0.26747093, -0.8257134, 6.480358, 0.4875511)
mesh = SubResource("BoxMesh_11lcc")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." index="2" unique_id=370360243]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.94939756, 3.2876587, -0.28125)
shape = SubResource("BoxShape3D_hn3k1")