62 lines
1.9 KiB
GDScript
62 lines
1.9 KiB
GDScript
class_name DebugCollisionShapes
|
|
extends RefCounted
|
|
|
|
const MARGIN = 0.01
|
|
|
|
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 _on_debugger_mode_changed(mode: Debugger.Mode) -> void:
|
|
for mesh_node in _mesh_nodes:
|
|
mesh_node.visible = mode == Debugger.Mode.FULL
|