70 lines
3.1 KiB
GDScript
70 lines
3.1 KiB
GDScript
@tool
|
|
extends Node3D
|
|
|
|
@export var grid_size := Vector3i(1,1,1)
|
|
@export var show_coordinates := true
|
|
@export var color := Color.BLACK
|
|
@export var enable_depth_test := false
|
|
|
|
var last_grid_size = null
|
|
var last_voxel_scale = null
|
|
var last_show_coordinates = null
|
|
var last_enable_depth = null
|
|
|
|
func update_grid():
|
|
for child in %Levels.get_children():
|
|
%Levels.remove_child(child)
|
|
child.queue_free()
|
|
|
|
%Front.mesh.material.shader = preload("res://addons/SimpleDungeons/debug_visuals/WireframeCubeDepthEnabled.gdshader") if enable_depth_test else preload("res://addons/SimpleDungeons/debug_visuals/WireframeCube.gdshader")
|
|
%Right.mesh.material.shader = preload("res://addons/SimpleDungeons/debug_visuals/WireframeCubeDepthEnabled.gdshader") if enable_depth_test else preload("res://addons/SimpleDungeons/debug_visuals/WireframeCube.gdshader")
|
|
%Top.mesh.material.shader = preload("res://addons/SimpleDungeons/debug_visuals/WireframeCubeDepthEnabled.gdshader") if enable_depth_test else preload("res://addons/SimpleDungeons/debug_visuals/WireframeCube.gdshader")
|
|
|
|
%Front.mesh.material.set_shader_parameter("grid_size", Vector2(grid_size.x, grid_size.y))
|
|
%Right.mesh.material.set_shader_parameter("grid_size", Vector2(grid_size.z, grid_size.y))
|
|
%Top.mesh.material.set_shader_parameter("grid_size", Vector2(grid_size.x, grid_size.z))
|
|
|
|
%Front.mesh.material.set_shader_parameter("color", Vector3(color.r, color.g, color.b))
|
|
%Right.mesh.material.set_shader_parameter("color", Vector3(color.r, color.g, color.b))
|
|
%Top.mesh.material.set_shader_parameter("color", Vector3(color.r, color.g, color.b))
|
|
|
|
if grid_size.x < 1 or grid_size.y < 1 or grid_size.z < 1:
|
|
return
|
|
if grid_size.x <= 1 and grid_size.y <= 1 and grid_size.z <= 1:
|
|
return
|
|
|
|
for y in range(1, grid_size.y):
|
|
var level = %Top.duplicate()
|
|
%Levels.add_child(level)
|
|
level.position.y -= float(y) / grid_size.y - 0.00001
|
|
var b = grid_size - Vector3i(1,1,1)
|
|
var positions = [Vector3i(0,0,0), Vector3i(grid_size.x-1,0,0), Vector3i(0,grid_size.y-1,0), Vector3i(0,0,grid_size.z-1),
|
|
b, b - Vector3i(grid_size.x-1,0,0), b - Vector3i(0,grid_size.y-1,0), b - Vector3i(0,0,grid_size.z-1)]
|
|
|
|
if not show_coordinates:
|
|
return
|
|
|
|
var make_scale_uniform_node = Node3D.new()
|
|
%Levels.add_child(make_scale_uniform_node)
|
|
make_scale_uniform_node.scale = self.transform.basis.inverse().get_scale()
|
|
for grid_pos in positions:
|
|
var label = Label3D.new()
|
|
label.text = str(grid_pos)
|
|
make_scale_uniform_node.add_child(label)
|
|
label.position = ((Vector3(grid_pos) + Vector3(0.5, 0.5, 0.5)) / Vector3(grid_size)) * self.scale - self.scale/2
|
|
label.scale *= (Vector3(1,1,1) / Vector3(grid_size)) * self.scale
|
|
label.scale.x = min(label.scale.x, label.scale.y, label.scale.z)
|
|
label.scale.y = min(label.scale.x, label.scale.y, label.scale.z)
|
|
label.scale.z = min(label.scale.x, label.scale.y, label.scale.z)
|
|
|
|
func _ready():
|
|
update_grid()
|
|
set_process_input(false)
|
|
|
|
func _process(delta):
|
|
if last_grid_size != grid_size or last_show_coordinates != show_coordinates or last_enable_depth != enable_depth_test:
|
|
update_grid()
|
|
last_grid_size = grid_size
|
|
last_show_coordinates = show_coordinates
|
|
last_enable_depth = enable_depth_test
|