class_name DebugCollisionShapes extends RefCounted const MARGIN = 0.01 var is_visible: bool = true var _mesh_nodes: Array[MeshInstance3D] = [] func init(children: Array[Node], parent: Node, material: Material) -> void: for child in children: if child is not CollisionShape3D: continue var shape_node: CollisionShape3D = child as CollisionShape3D if shape_node.shape == null: continue var mesh_node := MeshInstance3D.new() if shape_node.shape is BoxShape3D: var shape := shape_node.shape as BoxShape3D var mesh := BoxMesh.new() mesh.size = shape.size mesh_node.mesh = mesh if shape_node.shape is CapsuleShape3D: var shape := shape_node.shape as CapsuleShape3D var mesh := CapsuleMesh.new() mesh.radius = shape.radius + MARGIN mesh.height = shape.height + MARGIN mesh.radial_segments = 8 mesh.rings = 1 mesh_node.mesh = mesh if shape_node.shape is SphereShape3D: var shape := shape_node.shape as SphereShape3D var mesh := SphereMesh.new() mesh.radius = shape.radius + MARGIN mesh.height = shape.radius * 2 + MARGIN mesh.radial_segments = 8 mesh.rings = 4 mesh_node.mesh = mesh if shape_node.shape is CylinderShape3D: var shape := shape_node.shape as CylinderShape3D var mesh := CylinderMesh.new() mesh.top_radius = shape.radius + MARGIN mesh.bottom_radius = shape.radius + MARGIN mesh.height = shape.height + MARGIN mesh.radial_segments = 8 mesh.rings = 0 mesh_node.mesh = mesh mesh_node.material_override = material mesh_node.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF mesh_node.visible = Debugger.mode == Debugger.Mode.FULL parent.add_child(mesh_node) mesh_node.global_transform = (child as Node3D).global_transform _mesh_nodes.append(mesh_node) Debugger.mode_changed.connect(_on_debugger_mode_changed) func set_visibility(visible: bool) -> void: is_visible = visible for node in _mesh_nodes: node.visible = is_visible and Debugger.mode == Debugger.Mode.FULL func _on_debugger_mode_changed(mode: Debugger.Mode) -> void: for mesh_node in _mesh_nodes: mesh_node.visible = mode == Debugger.Mode.FULL