62 lines
2.1 KiB
GDScript
62 lines
2.1 KiB
GDScript
extends Node3D
|
|
# Attach to the ROOT node (DartboardProto).
|
|
# Leave `dartboard_root` empty to auto-search, or drag the glb node in.
|
|
|
|
@export var dartboard_root: Node
|
|
|
|
var dartboard: MeshInstance3D
|
|
|
|
func _ready() -> void:
|
|
dartboard = _find_mesh_instance(dartboard_root if dartboard_root else self)
|
|
if dartboard == null:
|
|
push_error("Could not find a MeshInstance3D. Check that the glb is in the scene.")
|
|
return
|
|
print("Found dartboard mesh node: ", dartboard.name)
|
|
_print_surfaces()
|
|
_ensure_collision()
|
|
|
|
func _find_mesh_instance(node: Node) -> MeshInstance3D:
|
|
if node is MeshInstance3D and node.mesh != null:
|
|
return node
|
|
for child in node.get_children():
|
|
var found := _find_mesh_instance(child)
|
|
if found:
|
|
return found
|
|
return null
|
|
|
|
func _print_surfaces() -> void:
|
|
var mesh := dartboard.mesh
|
|
print("=== Dartboard surfaces ===")
|
|
for i in mesh.get_surface_count():
|
|
var mat := mesh.surface_get_material(i)
|
|
var mat_name := mat.resource_name if mat else "(no material)"
|
|
print("Surface ", i, " material name: '", mat_name, "'")
|
|
print("==========================")
|
|
var aabb := dartboard.get_aabb()
|
|
print("Board local size (x,y,z): ", aabb.size)
|
|
|
|
# CHEAP collision: one box that matches the board's bounding box.
|
|
# This replaces create_trimesh_collision(), which was making it run at ~3 FPS
|
|
# because it built a collision triangle for every face of the board.
|
|
func _ensure_collision() -> void:
|
|
# Remove any existing auto-added body so we don't stack shapes on re-runs.
|
|
for child in dartboard.get_children():
|
|
if child is StaticBody3D and child.name == "AutoBoardBody":
|
|
child.queue_free()
|
|
|
|
var body := StaticBody3D.new()
|
|
body.name = "AutoBoardBody"
|
|
|
|
var col := CollisionShape3D.new()
|
|
var box := BoxShape3D.new()
|
|
# Match the mesh's bounding box. Use the AABB size directly as the box size.
|
|
var aabb := dartboard.get_aabb()
|
|
box.size = aabb.size
|
|
col.shape = box
|
|
# Center the box on the mesh's bounding-box center (not always the origin).
|
|
col.position = aabb.position + aabb.size * 0.5
|
|
|
|
body.add_child(col)
|
|
dartboard.add_child(body)
|
|
print("Created cheap box collision for the dartboard.")
|