diff --git a/CLAUDE.md b/CLAUDE.md index 7296d42..2388236 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -29,6 +29,8 @@ I am a **Godot 4.6+ expert**. I follow current best practices for GDScript, scen | `levels/level_def.gd` | `LevelDef` resource — a level's name / map colour / `scene_path` (always the shell) / `level_scene` (the level module instanced into the shell) / optional `enemy_scene` (arena wave vs. a boss like the bear) | | `levels/map_node.gd` | `MapNode` — one runtime node on the run map (position, level, links) | | `levels/MapScreen.tscn` / `levels/map_screen.gd` | Between-fights map screen; win → pick a node → next level | +| `crowd_marker.gd` | `CrowdMarker` (`@tool Node3D`, `class_name`) — designer drops one per billboard spectator via the editor's Add-Node dialog; picks one of six 60°-spaced facings from the `orientation` dropdown. Draws an editor-only preview (slab + forward arrow, never serialised) and joins the `&"crowd_marker"` group | +| `crowd_billboards.gd` / `crowd_billboard.gdshader` | `MultiMeshInstance3D` that harvests every `CrowdMarker` (group `&"crowd_marker"`) into one draw call, using each marker's world position + chosen facing. Front/back sprite sheet baked by `tools/bake_crowd_sheet.gd`; falls back to a generated inward-facing ring when no markers are placed | | `debug_params.gd` | Runtime-tunable parameter registry (autoload `DP`) | | `Assets/` | Raw 3D assets (`.glb`, `.fbx`) | | `Blender/` | Blender source files, animation scripts, FBX exports | diff --git a/crowd_billboards.gd b/crowd_billboards.gd index e1d0e8c..be24ffc 100644 --- a/crowd_billboards.gd +++ b/crowd_billboards.gd @@ -1,19 +1,16 @@ extends MultiMeshInstance3D -## A whole stand of cheering spectators rendered as camera-facing billboards in a -## single draw call — the performant replacement for dozens of skinned crowd skeletons. -## The sprite sheet is baked from the existing crowd figure by tools/bake_crowd_sheet.gd. +## A whole stand of cheering spectators rendered as flat billboards in a single draw +## call — the performant replacement for dozens of skinned crowd skeletons. The sprite +## sheet is baked from the existing crowd figure by tools/bake_crowd_sheet.gd. ## -## Placement mirrors an existing crowd node (default: the sibling PublikNode) so the -## billboards land exactly where the crowd was authored; if that node is missing it -## falls back to a generated tribune so the scene still populates. +## Placement comes from CrowdMarker nodes the designer drops into the level (collected +## via the &"crowd_marker" group): each marker gives one spectator its world position and +## a chosen facing (one of six 60°-spaced headings). If no markers are present the scene +## falls back to a generated tribune so it still populates. const SHEET_PATH := "res://Assets/crowd_clap_sheet.png" const SHADER_PATH := "res://crowd_billboard.gdshader" -## Node whose descendant figures (names starting with `figure_prefix`) donate their -## world positions. Empty = use the generated fallback stand. -@export var source_path: NodePath = ^"../PublikNode" -@export var figure_prefix: String = "mees" ## World height of a spectator billboard, in metres. Sheet aspect sets the width. @export var figure_height: float = 2.0 @export var frames: int = 8 @@ -36,7 +33,8 @@ var _rng := RandomNumberGenerator.new() func _ready() -> void: _rng.seed = hash("bullosseum-crowd") # deterministic layout/phases across runs - _build() + # Deferred so every CrowdMarker has run _ready and joined the group before we harvest. + _build.call_deferred() func _build() -> void: @@ -58,71 +56,53 @@ func _build() -> void: mat.set_shader_parameter("fps", clap_fps) material_override = mat - var seats := _seat_positions() - var center := _arena_center(seats) + # Each seat is a (global feet-position, unit forward) pair. + var positions := PackedVector3Array() + var facings: Array[Vector3] = [] + _collect_seats(positions, facings) var mm := MultiMesh.new() mm.transform_format = MultiMesh.TRANSFORM_3D mm.use_custom_data = true mm.mesh = quad - mm.instance_count = seats.size() + mm.instance_count = positions.size() - for i in seats.size(): + for i in positions.size(): var s := 1.0 + _rng.randf_range(-0.06, 0.06) # slight height variety - mm.set_instance_transform(i, Transform3D(_facing_basis(seats[i], center, s), seats[i])) + mm.set_instance_transform(i, Transform3D(_upright_basis(facings[i], s), positions[i])) var b := 1.0 + _rng.randf_range(-tint_variation, tint_variation) mm.set_instance_custom_data(i, Color(_rng.randf(), b, b * 0.99, b * 0.98)) multimesh = mm -# Orientation for a seat: the sprite's forward (+Z, the quad's face) points horizontally -# inward at the arena centre, so each ring segment faces the action instead of the -# camera. Upright (world +Y), uniformly scaled by `s`. -func _facing_basis(seat: Vector3, center: Vector3, s: float) -> Basis: - var look := center - seat +# Upright basis whose forward (+Z, the quad's face) points along `look`, uniformly +# scaled by `s`. World +Y stays up so spectators never tilt. +func _upright_basis(look: Vector3, s: float) -> Basis: look.y = 0.0 - look = look.normalized() if look.length() > 0.001 else Vector3(0.0, 0.0, -1.0) + look = look.normalized() if look.length() > 0.001 else Vector3(0.0, 0.0, 1.0) var up := Vector3.UP - var right := up.cross(look).normalized() var basis := Basis() - basis.x = right + basis.x = up.cross(look).normalized() basis.y = up basis.z = look return basis.scaled(Vector3.ONE * s) -# Horizontal centre the crowd faces — the mean of the seat positions (the ring/stand -# centroid), which for an arena crowd is the middle of the pitch. -func _arena_center(seats: PackedVector3Array) -> Vector3: - if seats.is_empty(): - return global_position - var sum := Vector3.ZERO - for p in seats: - sum += p - return sum / float(seats.size()) +# Seats from designer-placed CrowdMarker nodes: each contributes its world position and +# its chosen 60°-spaced facing. With no markers present, fall back to a generated ring +# that faces inward so the scene still shows a crowd. +func _collect_seats(positions: PackedVector3Array, facings: Array[Vector3]) -> void: + for node in get_tree().get_nodes_in_group(&"crowd_marker"): + var marker := node as Node3D + if marker == null or not marker.has_method(&"facing_dir"): + continue + positions.append(marker.global_position) + facings.append(marker.facing_dir()) + if positions.is_empty(): + _fallback_stand(positions, facings) -# Global feet-positions for every spectator: harvested from the source crowd if present, -# otherwise the generated fallback tribune. -func _seat_positions() -> PackedVector3Array: - var out := PackedVector3Array() - var src := get_node_or_null(source_path) - if src != null: - _collect_figures(src, out) - if out.is_empty(): - _fallback_stand(out) - return out - - -func _collect_figures(node: Node, out: PackedVector3Array) -> void: - if node is Node3D and node != self and (node as Node3D).name.begins_with(figure_prefix): - out.append((node as Node3D).global_position) - return # don't descend into a figure's own rig - for c in node.get_children(): - _collect_figures(c, out) - - -func _fallback_stand(out: PackedVector3Array) -> void: +func _fallback_stand(positions: PackedVector3Array, facings: Array[Vector3]) -> void: var placed := 0 for row in fallback_rows: var radius := fallback_inner_radius + float(row) * fallback_row_step @@ -133,5 +113,7 @@ func _fallback_stand(out: PackedVector3Array) -> void: if placed >= fallback_count: return var ang := TAU * float(s) / float(seats_in_row) - out.append(Vector3(cos(ang) * radius, y, sin(ang) * radius)) + var pos := Vector3(cos(ang) * radius, y, sin(ang) * radius) + positions.append(pos) + facings.append(-pos) # face the ring centre (origin) placed += 1 diff --git a/crowd_marker.gd b/crowd_marker.gd new file mode 100644 index 0000000..31a706c --- /dev/null +++ b/crowd_marker.gd @@ -0,0 +1,89 @@ +@tool +extends Node3D +class_name CrowdMarker +## A designer-placed spot for one billboard spectator. Drop these into a level in the +## editor; crowd_billboards.gd harvests every marker (via the &"crowd_marker" group) into +## its MultiMesh at runtime, using each marker's global position and chosen facing. +## +## The marker draws a lightweight preview (a slab standing in for the sprite + a forward +## arrow) so its position and orientation are visible in the viewport. That preview is +## editor-only and never serialised into the scene, so it costs nothing at runtime. + +## The six selectable facings, one every 60° about the Y axis. DEG_0 faces the quad's +## front (+Z) along world +Z; increasing values rotate clockwise looking down. +enum Orientation { + DEG_0, + DEG_60, + DEG_120, + DEG_180, + DEG_240, + DEG_300, +} + +const ORIENTATION_STEPS := 6 +## Metres — matches crowd_billboards.figure_height so the editor preview reads true to scale. +const PREVIEW_HEIGHT := 2.0 + +@export var orientation := Orientation.DEG_0: + set(value): + orientation = value + _apply_orientation() + +var _preview: Node3D + + +func _ready() -> void: + add_to_group(&"crowd_marker") + if Engine.is_editor_hint(): + _build_preview() + _apply_orientation() + + +# Facing about Y for the current orientation: 0, 60, 120 … degrees as radians. +func facing_yaw() -> float: + return float(orientation) * (TAU / float(ORIENTATION_STEPS)) + + +# Unit forward the spectator's front (+Z) points along, on the horizontal plane. +func facing_dir() -> Vector3: + var a := facing_yaw() + return Vector3(sin(a), 0.0, cos(a)) + + +func _apply_orientation() -> void: + if _preview != null: + _preview.rotation = Vector3(0.0, facing_yaw(), 0.0) + + +# Editor-only preview. Children are added without an owner so they are excluded from the +# saved .tscn (Godot only serialises nodes owned by the scene root). +func _build_preview() -> void: + _preview = Node3D.new() + add_child(_preview) + + var aspect := 0.5 + var slab := MeshInstance3D.new() + var quad := QuadMesh.new() + quad.size = Vector2(PREVIEW_HEIGHT * aspect, PREVIEW_HEIGHT) + quad.center_offset = Vector3(0.0, PREVIEW_HEIGHT * 0.5, 0.0) # stand on the marker + slab.mesh = quad + slab.material_override = _preview_material(Color(0.3, 0.7, 1.0, 0.35)) + _preview.add_child(slab) + + var arrow := MeshInstance3D.new() + var shaft := BoxMesh.new() + shaft.size = Vector3(0.08, 0.08, PREVIEW_HEIGHT * 0.5) + arrow.mesh = shaft + # Push the shaft out along +Z (the facing) and up to chest height. + arrow.position = Vector3(0.0, PREVIEW_HEIGHT * 0.5, PREVIEW_HEIGHT * 0.25) + arrow.material_override = _preview_material(Color(1.0, 0.85, 0.2, 0.9)) + _preview.add_child(arrow) + + +func _preview_material(col: Color) -> StandardMaterial3D: + var mat := StandardMaterial3D.new() + mat.albedo_color = col + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + mat.cull_mode = BaseMaterial3D.CULL_DISABLED + return mat diff --git a/crowd_marker.gd.uid b/crowd_marker.gd.uid new file mode 100644 index 0000000..23bcb9f --- /dev/null +++ b/crowd_marker.gd.uid @@ -0,0 +1 @@ +uid://70j3ks1emhkd diff --git a/debug_params.gd b/debug_params.gd index 9b573e6..1dbd97f 100644 --- a/debug_params.gd +++ b/debug_params.gd @@ -256,12 +256,14 @@ func _register_all() -> void: _reg_f("Bear", "bear_stagger_cd", 1.0, 0.0, 4.0, 0.05) # ── Sword ───────────────────────────────────────────────────────────────── # Local seating of the sword in the right hand (drawn / fighting). - # Defaults are identity — the bone is oriented in Blender to seat the sword - # directly; these exist to fine-tune in-game without re-exporting. + # The blade model runs along its local +Z, but weapon_bone (like every rig bone) + # points down its local +Y — so identity leaves the blade jutting out sideways. + # rot_x = -90 maps the blade's +Z onto the bone's +Y so it thrusts straight along + # the bone; rot_y is then the free roll (crossguard tilt) about the blade axis. _reg_f("Sword", "sword_pos_x", 0.0, -1.0, 1.0, 0.01) _reg_f("Sword", "sword_pos_y", 0.0, -1.0, 1.0, 0.01) _reg_f("Sword", "sword_pos_z", 0.0, -1.0, 1.0, 0.01) - _reg_f("Sword", "sword_rot_x", 0.0, -180.0, 180.0, 1.0) + _reg_f("Sword", "sword_rot_x", -90.0, -180.0, 180.0, 1.0) _reg_f("Sword", "sword_rot_y", 0.0, -180.0, 180.0, 1.0) _reg_f("Sword", "sword_rot_z", 0.0, -180.0, 180.0, 1.0) # Local seating of the sword in the hip holster (sheathed / wandering). diff --git a/levels/arena_level.tscn b/levels/arena_level.tscn index d945efd..dd94efe 100644 --- a/levels/arena_level.tscn +++ b/levels/arena_level.tscn @@ -3,10 +3,7 @@ [ext_resource type="PackedScene" uid="uid://dio67r8ambe7h" path="res://Assets/arena_placeholder_v01.glb" id="2_nxogm"] [ext_resource type="PackedScene" uid="uid://cl54dt38yj2x" path="res://Assets/Arena.glb" id="3_fy5k1"] [ext_resource type="Script" uid="uid://dou5ar6tkmng1" path="res://levels/matador_spawn.gd" id="3_spawn"] -[ext_resource type="PackedScene" uid="uid://cmxqocsdbgufr" path="res://Animations/mees_plaksutab.glb" id="5_m7jmp"] -[ext_resource type="PackedScene" uid="uid://1y07gn65ktsi" path="res://Animations/ANIM_publik_mees.glb" id="7_xlvrw"] -[ext_resource type="Script" uid="uid://dr6phggarm73e" path="res://Animations/anim_publik_mees.gd" id="8_73fnb"] -[ext_resource type="Script" uid="uid://di0jafakftp3n" path="res://publikum_controller.gd" id="9_pubctrl"] +[ext_resource type="Script" uid="uid://70j3ks1emhkd" path="res://crowd_marker.gd" id="9_agtuu"] [ext_resource type="Script" uid="uid://cj0ytlkuavmf4" path="res://crowd_billboards.gd" id="11_crowd"] [sub_resource type="BoxShape3D" id="BoxShape3D_ulcgi"] @@ -25,16 +22,17 @@ shape = SubResource("BoxShape3D_ulcgi") [node name="arena_placeholder_v01" parent="Node3D" unique_id=173047470 instance=ExtResource("2_nxogm")] -[node name="Arena_draft" parent="Node3D/arena_placeholder_v01" index="0" unique_id=603097973] +[node name="Arena_draft" parent="Node3D/arena_placeholder_v01" index="0" unique_id=727602018] visible = false -[node name="Wall" parent="Node3D/arena_placeholder_v01" index="1" unique_id=171701243] +[node name="Wall" parent="Node3D/arena_placeholder_v01" index="1" unique_id=1457821831] visible = false -[node name="CollisionShape3D" parent="Node3D/arena_placeholder_v01/Wall/StaticBody3D" parent_id_path=PackedInt32Array(173047470, 1793167121) index="0" unique_id=404958985] +[node name="CollisionShape3D" parent="Node3D/arena_placeholder_v01/Wall/StaticBody3D" parent_id_path=PackedInt32Array(173047470, 1904923047) index="0" unique_id=1063849009] transform = Transform3D(0.98309773, 0, 0, 0, 0.9558868, 0, 0, 0, 4.061706, 0.13596812, -0.091219574, -5.4371103e-09) [node name="Arena2" parent="Node3D/arena_placeholder_v01" unique_id=1270130903 instance=ExtResource("3_fy5k1")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.017679214, 9.536743e-07, -0.013886452) [node name="MatadorSpawner" type="Node3D" parent="." unique_id=1524912967] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 14) @@ -81,346 +79,34 @@ light_energy = 0.106 shadow_enabled = true shadow_blur = 10.0 -[node name="PublikNode" type="Node3D" parent="." unique_id=537560774] -visible = false - -[node name="publikum2" type="Node3D" parent="PublikNode" unique_id=632248377] -transform = Transform3D(-0.91522944, 0, -0.4029331, 0, 1, 0, 0.4029331, 0, -0.91522944, 4.195425, 3.6553268, 13.885913) -visible = false -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum2" unique_id=1523494533 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum2" unique_id=1136452990 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum2" unique_id=1034056333 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum2" unique_id=1301549876 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum2" unique_id=426787640 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum2" unique_id=264608279 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="publikum4" type="Node3D" parent="PublikNode" unique_id=627563732] -transform = Transform3D(-0.629974, 0, -0.77661633, 0, 1, 0, 0.77661633, 0, -0.629974, 9.842437, 3.6553268, 10.401334) -visible = false -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum4" unique_id=1220293959 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum4" unique_id=1450591086 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum4" unique_id=1560510378 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum4" unique_id=37533204 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum4" unique_id=1261306009 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum4" unique_id=1900385491 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="publikum5" type="Node3D" parent="PublikNode" unique_id=1812640124] -transform = Transform3D(-0.39064395, 0, 0.920542, 0, 1, 0, -0.920542, 0, -0.39064395, -14.538336, 3.6553268, 3.9378712) -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum5" unique_id=83635667 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum5" unique_id=1143183809 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum5" unique_id=1283965822 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum5" unique_id=1691614127 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum5" unique_id=1236404634 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum5" unique_id=606457826 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="publikum6" type="Node3D" parent="PublikNode" unique_id=629778401] -transform = Transform3D(-0.7681126, 0, 0.64031476, 0, 1, 0, -0.64031476, 0, -0.7681126, -11.103292, 3.6553288, 9.335619) -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum6" unique_id=1894579943 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum6" unique_id=1361331032 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum6" unique_id=1108954377 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum6" unique_id=300775025 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum6" unique_id=1733379910 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum6" unique_id=903641089 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="publikum7" type="Node3D" parent="PublikNode" unique_id=1108195583] -transform = Transform3D(0.55061686, 0, -0.8347584, 0, 1, 0, 0.8347584, 0, 0.55061686, 13.163043, 3.4379854, -5.268345) -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum7" unique_id=365348429 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum7" unique_id=1699361442 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum7" unique_id=934639622 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum7" unique_id=1585045587 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum7" unique_id=501748248 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum7" unique_id=92474890 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="publikum8" type="Node3D" parent="PublikNode" unique_id=1138908471] -transform = Transform3D(0.85247177, 0, -0.5227735, 0, 1, 0, 0.5227735, 0, 0.85247177, 11.217102, 4.568224, -10.151715) -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum8" unique_id=2110447734 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum8" unique_id=1304761336 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum8" unique_id=1725684741 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum8" unique_id=2002512340 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum8" unique_id=1527416664 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum8" unique_id=1248985994 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="publikum3" type="Node3D" parent="PublikNode" unique_id=1978237178] -transform = Transform3D(0.8698311, 0, 0.49334967, 0, 1, 0, -0.49334967, 0, 0.8698311, -4.8910522, 4.627474, -14.224113) -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum3" unique_id=878298260 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum3" unique_id=1331430063 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum3" unique_id=263054039 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum3" unique_id=374864807 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum3" unique_id=674678014 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum3" unique_id=2055934328 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="publikum9" type="Node3D" parent="PublikNode" unique_id=1005200820] -transform = Transform3D(0.9760592, 0, 0.21750516, 0, 1, 0, -0.21750516, 0, 0.9760592, -2.1318102, 3.6553268, -13.557504) -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum9" unique_id=1436817061 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum9" unique_id=375947457 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum9" unique_id=71021140 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum9" unique_id=2106738663 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum9" unique_id=283876866 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum9" unique_id=1033622841 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="publikum11" type="Node3D" parent="PublikNode" unique_id=407707263] -transform = Transform3D(-0.95107377, 0, -0.30896416, 0, 1, 0, 0.30896416, 0, -0.95107377, 2.4321594, 3.6553268, 14.119543) -visible = false -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum11" unique_id=1140359395 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum11" unique_id=5897282 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum11" unique_id=528539077 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum11" unique_id=693156815 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum11" unique_id=1138785564 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum11" unique_id=576184958 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="publikum13" type="Node3D" parent="PublikNode" unique_id=332757108] -transform = Transform3D(-0.2962035, 0, 0.95512486, 0, 1, 0, -0.95512486, 0, -0.2962035, -14.037817, 3.6553268, 2.0647745) -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum13" unique_id=214289805 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum13" unique_id=1147139958 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.1134007, 0, 0.6326933) - -[node name="mees_plaksutab3" parent="PublikNode/publikum13" unique_id=662075088 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum13" unique_id=664162740 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum13" unique_id=1967822989 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum13" unique_id=1108301136 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="publikum15" type="Node3D" parent="PublikNode" unique_id=485853358] -transform = Transform3D(0.43092924, 0, -0.90238583, 0, 1, 0, 0.90238583, 0, 0.43092924, 14.766085, 4.568224, -2.378694) -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum15" unique_id=525464827 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum15" unique_id=852905531 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum15" unique_id=1785117697 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum15" unique_id=1380611321 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum15" unique_id=322138980 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum15" unique_id=1360012012 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - -[node name="ANIM_publik_mees" parent="PublikNode" unique_id=941250087 instance=ExtResource("7_xlvrw")] -transform = Transform3D(-0.9976194, 0, 0.0689602, 0, 1, 0, -0.0689602, 0, -0.9976194, -2.9310942, 4.1751385, 14.861324) -script = ExtResource("8_73fnb") - -[node name="publikum" type="Node3D" parent="PublikNode" unique_id=1122462483] -transform = Transform3D(0.70069104, 0, 0.7134648, 0, 1, 0, -0.7134648, 0, 0.70069104, -9.04294, 3.6553268, -10.339719) -script = ExtResource("9_pubctrl") - -[node name="mees_plaksutab" parent="PublikNode/publikum" unique_id=1481053606 instance=ExtResource("5_m7jmp")] - -[node name="mees_plaksutab2" parent="PublikNode/publikum" unique_id=984780880 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.8139224, 0, -0.33299255) - -[node name="mees_plaksutab3" parent="PublikNode/publikum" unique_id=1137984224 instance=ExtResource("5_m7jmp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5662975, 0, 0.3316717) - -[node name="mees_plaksutab4" parent="PublikNode/publikum" unique_id=1462909335 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -8.003071, 0, 1.5986013) - -[node name="mees_plaksutab5" parent="PublikNode/publikum" unique_id=227073959 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.89589787, 0, 0.44426048, 0, 1, 0, -0.44426048, 0, 0.89589787, -7.1850557, 0.8316374, 0.36604595) - -[node name="mees_plaksutab6" parent="PublikNode/publikum" unique_id=1680469468 instance=ExtResource("5_m7jmp")] -transform = Transform3D(0.97025216, 0, 0.24209678, 0, 1, 0, -0.24209678, 0, 0.97025216, -4.039103, 0.8316374, -0.8892679) - [node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1750284504] environment = SubResource("Environment_73fnb") [node name="CrowdBillboards" type="MultiMeshInstance3D" parent="." unique_id=106730614] -visible = false script = ExtResource("11_crowd") +[node name="CrowdMarker1" type="Node3D" parent="." unique_id=2100000001] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 14) +script = ExtResource("9_agtuu") +orientation = 3 +metadata/_custom_type_script = "uid://70j3ks1emhkd" + +[node name="CrowdMarker2" type="Node3D" parent="." unique_id=2100000002] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 5, 0) +script = ExtResource("9_agtuu") +orientation = 5 +metadata/_custom_type_script = "uid://70j3ks1emhkd" + +[node name="CrowdMarker3" type="Node3D" parent="." unique_id=2100000003] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, -14) +script = ExtResource("9_agtuu") +orientation = 0 +metadata/_custom_type_script = "uid://70j3ks1emhkd" + +[node name="CrowdMarker4" type="Node3D" parent="." unique_id=2100000004] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14, 5, 0) +script = ExtResource("9_agtuu") +orientation = 1 +metadata/_custom_type_script = "uid://70j3ks1emhkd" + [editable path="Node3D/arena_placeholder_v01"] -[editable path="PublikNode/publikum2/mees_plaksutab"] -[editable path="PublikNode/publikum2/mees_plaksutab2"] -[editable path="PublikNode/publikum2/mees_plaksutab3"] -[editable path="PublikNode/publikum2/mees_plaksutab4"] -[editable path="PublikNode/publikum2/mees_plaksutab5"] -[editable path="PublikNode/publikum2/mees_plaksutab6"] -[editable path="PublikNode/publikum4/mees_plaksutab"] -[editable path="PublikNode/publikum4/mees_plaksutab2"] -[editable path="PublikNode/publikum4/mees_plaksutab3"] -[editable path="PublikNode/publikum4/mees_plaksutab4"] -[editable path="PublikNode/publikum4/mees_plaksutab5"] -[editable path="PublikNode/publikum4/mees_plaksutab6"] -[editable path="PublikNode/publikum5/mees_plaksutab"] -[editable path="PublikNode/publikum5/mees_plaksutab2"] -[editable path="PublikNode/publikum5/mees_plaksutab3"] -[editable path="PublikNode/publikum5/mees_plaksutab4"] -[editable path="PublikNode/publikum5/mees_plaksutab5"] -[editable path="PublikNode/publikum5/mees_plaksutab6"] -[editable path="PublikNode/publikum6/mees_plaksutab"] -[editable path="PublikNode/publikum6/mees_plaksutab2"] -[editable path="PublikNode/publikum6/mees_plaksutab3"] -[editable path="PublikNode/publikum6/mees_plaksutab4"] -[editable path="PublikNode/publikum6/mees_plaksutab5"] -[editable path="PublikNode/publikum6/mees_plaksutab6"] -[editable path="PublikNode/publikum7/mees_plaksutab"] -[editable path="PublikNode/publikum7/mees_plaksutab2"] -[editable path="PublikNode/publikum7/mees_plaksutab3"] -[editable path="PublikNode/publikum7/mees_plaksutab4"] -[editable path="PublikNode/publikum7/mees_plaksutab5"] -[editable path="PublikNode/publikum7/mees_plaksutab6"] -[editable path="PublikNode/publikum8/mees_plaksutab"] -[editable path="PublikNode/publikum8/mees_plaksutab2"] -[editable path="PublikNode/publikum8/mees_plaksutab3"] -[editable path="PublikNode/publikum8/mees_plaksutab4"] -[editable path="PublikNode/publikum8/mees_plaksutab5"] -[editable path="PublikNode/publikum8/mees_plaksutab6"] -[editable path="PublikNode/publikum3/mees_plaksutab"] -[editable path="PublikNode/publikum3/mees_plaksutab2"] -[editable path="PublikNode/publikum3/mees_plaksutab3"] -[editable path="PublikNode/publikum3/mees_plaksutab4"] -[editable path="PublikNode/publikum3/mees_plaksutab5"] -[editable path="PublikNode/publikum3/mees_plaksutab6"] -[editable path="PublikNode/publikum9/mees_plaksutab"] -[editable path="PublikNode/publikum9/mees_plaksutab2"] -[editable path="PublikNode/publikum9/mees_plaksutab3"] -[editable path="PublikNode/publikum9/mees_plaksutab4"] -[editable path="PublikNode/publikum9/mees_plaksutab5"] -[editable path="PublikNode/publikum9/mees_plaksutab6"] -[editable path="PublikNode/publikum11/mees_plaksutab"] -[editable path="PublikNode/publikum11/mees_plaksutab2"] -[editable path="PublikNode/publikum11/mees_plaksutab3"] -[editable path="PublikNode/publikum11/mees_plaksutab4"] -[editable path="PublikNode/publikum11/mees_plaksutab5"] -[editable path="PublikNode/publikum11/mees_plaksutab6"] -[editable path="PublikNode/publikum13/mees_plaksutab"] -[editable path="PublikNode/publikum13/mees_plaksutab2"] -[editable path="PublikNode/publikum13/mees_plaksutab3"] -[editable path="PublikNode/publikum13/mees_plaksutab4"] -[editable path="PublikNode/publikum13/mees_plaksutab5"] -[editable path="PublikNode/publikum13/mees_plaksutab6"] -[editable path="PublikNode/publikum15/mees_plaksutab"] -[editable path="PublikNode/publikum15/mees_plaksutab2"] -[editable path="PublikNode/publikum15/mees_plaksutab3"] -[editable path="PublikNode/publikum15/mees_plaksutab4"] -[editable path="PublikNode/publikum15/mees_plaksutab5"] -[editable path="PublikNode/publikum15/mees_plaksutab6"] -[editable path="PublikNode/ANIM_publik_mees"] -[editable path="PublikNode/publikum/mees_plaksutab"] -[editable path="PublikNode/publikum/mees_plaksutab2"] -[editable path="PublikNode/publikum/mees_plaksutab3"] -[editable path="PublikNode/publikum/mees_plaksutab4"] -[editable path="PublikNode/publikum/mees_plaksutab5"] -[editable path="PublikNode/publikum/mees_plaksutab6"]