ile-de-test/addons/zylann.hterrain/hterrain_chunk_debug.gd
2023-10-05 20:02:23 +02:00

67 lines
1.7 KiB
GDScript

@tool
extends "hterrain_chunk.gd"
# I wrote this because Godot has no debug option to show AABBs.
# https://github.com/godotengine/godot/issues/20722
const HT_DirectMeshInstance = preload("./util/direct_mesh_instance.gd")
const HT_Util = preload("./util/util.gd")
var _debug_cube : HT_DirectMeshInstance = null
var _aabb := AABB()
var _parent_transform := Transform3D()
func _init(p_parent: Node3D, p_cell_x: int, p_cell_y: int, p_material: Material):
super(p_parent, p_cell_x, p_cell_y, p_material)
var wirecube : Mesh
if not p_parent.has_meta("debug_wirecube_mesh"):
wirecube = HT_Util.create_wirecube_mesh()
var mat := StandardMaterial3D.new()
mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
wirecube.surface_set_material(0, mat)
# Cache the debug cube in the parent node to avoid re-creating each time
p_parent.set_meta("debug_wirecube_mesh", wirecube)
else:
wirecube = p_parent.get_meta("debug_wirecube_mesh")
_debug_cube = HT_DirectMeshInstance.new()
_debug_cube.set_mesh(wirecube)
_debug_cube.set_world(p_parent.get_world_3d())
func enter_world(world: World3D):
super(world)
_debug_cube.enter_world(world)
func exit_world():
super()
_debug_cube.exit_world()
func parent_transform_changed(parent_transform: Transform3D):
super(parent_transform)
_parent_transform = parent_transform
_debug_cube.set_transform(_compute_aabb())
func set_visible(visible: bool):
super(visible)
_debug_cube.set_visible(visible)
func set_aabb(aabb: AABB):
super(aabb)
#aabb.position.y += 0.2*randf()
_aabb = aabb
_debug_cube.set_transform(_compute_aabb())
func _compute_aabb():
var pos = Vector3(cell_origin_x, 0, cell_origin_y)
return _parent_transform * Transform3D(Basis().scaled(_aabb.size), pos + _aabb.position)