LandGrifter/addons/editor_helper/dock.gd
2025-02-10 05:24:04 +01:00

150 lines
4.5 KiB
GDScript

@tool
extends Control
#func _ready():
#EditorInterface.get_selection().selection_changed.connect(update_layer_number)
func _process(_delta):
update_layer_number()
func _on_expand_pressed():
var scene = get_scene()
if !is_scene_expanded(scene): return await error_not_expanded()
update_proj_map()
func _on_up_pressed():
move_up_or_down(1)
func _on_down_pressed():
move_up_or_down(-1)
func _on_edit_2d_pressed():
var scene = get_scene()
if !is_scene_expanded(scene): return await error_not_expanded()
focus_node(scene.get_node("TileMap").get_child(0))
func _on_edit_3d_pressed():
var scene = get_scene()
if !is_scene_expanded(scene): return await error_not_expanded()
update_proj_map()
focus_node(scene.get_node("HeightMap"))
func _on_update_pressed():
update_proj_map()
func _on_create_baseplate_pressed():
var scene = get_scene()
if !is_scene_expanded(scene): return await error_not_expanded()
var heightmap: GridMap = scene.get_node("HeightMap")
var maps = scene.get_node("TileMap")
var item_list = heightmap.mesh_library.get_item_list()
var cube = item_list[0]
print(cube)
for map: TileMapLayer in maps.get_children():
if map is not TileMapLayer: continue
for cell in map.get_used_cells():
heightmap.set_cell_item(Vector3i(cell.x, -1, cell.y), cube)
func move_up_or_down(direction: int):
var selection = EditorInterface.get_selection().get_selected_nodes()
if len(selection) != 1: return await error_not_editing_tilemap()
selection = selection[0]
if selection is GridMap:
#EditorCommandPalette
#var event = InputEventKey.new()
#event.physical_keycode = KEY_Q
#event.pressed = true
#Input.parse_input_event(event)
#event.pressed = false
#Input.parse_input_event(event)
#InputMap.action_get_events("floor")
var floor: Vector3 = selection.get(&"metadata/_editor_floor_")
floor.y += direction
selection.set(&"metadata/_editor_floor_", floor)
EditorInterface.save_scene()
EditorInterface.reload_scene_from_path(get_scene().scene_file_path)
update_proj_map()
elif selection is TileMapLayer:
var index = selection.get_index() + direction
if index == -1: return
var target = selection.get_parent().get_child(index)
if target != null: focus_node(target)
#update_layer_number()
func update_layer_number():
var s = "N/A ¯\\_(ツ)_/¯"
var selection = EditorInterface.get_selection().get_selected_nodes()
if len(selection) == 1:
selection = selection[0]
if selection is GridMap:
var v = selection.get(&"metadata/_editor_floor_").y
if v == -1:
s = "-1 (Baseplate)"
else:
s = str(v)
if selection is TileMapLayer:
s = str(selection.get_index())
$"VBoxContainer/Current Layer".text = "Current layer: %s" % s
func focus_node(node: Node):
var selection = EditorInterface.get_selection()
selection.clear()
selection.add_node(node)
func get_scene() -> Node:
return EditorInterface.get_edited_scene_root()
func is_scene_expanded(scene: Node) -> bool:
if !scene: return false
return scene.has_node("NotMinified")
func error(message: String):
var dialog = AcceptDialog.new()
dialog.dialog_text = message
EditorInterface.popup_dialog_centered(dialog)
await dialog.close_requested
dialog.queue_free()
func error_not_expanded():
error("This scene is not an expanded map!")
func error_not_editing_tilemap():
error("Please start editing a map before using this button!")
func heightmap_set_proj_map(height_map: GridMap, proj_vp: SubViewport, rect: Rect2i):
var ml = load("res://Assets/heightmap_meshlibrary.tres").duplicate()
var cube: BoxMesh = ml.get(&"item/0/mesh").duplicate()
var sm = ShaderMaterial.new()
sm.shader = load("res://Assets/Editor/Project.gdshader")
sm.set(&"shader_parameter/tilemap_camera", proj_vp.get_texture())
sm.set(&"shader_parameter/offset", -rect.position as Vector2)
sm.set(&"shader_parameter/scale", rect.size as Vector2)
cube.material = sm
ml.set(&"item/0/mesh", cube)
height_map.mesh_library = ml
func update_proj_map():
var scene = get_scene()
if !is_scene_expanded(scene): return error_not_expanded()
var maps = scene.get_node("TileMap").duplicate(0)
var proj_vp = scene.get_node("ProjectionViewport")
if proj_vp.has_node("TileMap"): proj_vp.get_node("TileMap").free()
proj_vp.add_child(maps)
#maps.owner = scene
var total_rect = Rect2i()
for map: TileMapLayer in maps.get_children():
if map is not TileMapLayer: continue
total_rect = total_rect.merge(map.get_used_rect())
#map.owner = scene
maps.position = total_rect.position * -128
proj_vp.size = total_rect.size.max(Vector2i.ONE) * 128
heightmap_set_proj_map(scene.get_node("HeightMap"), proj_vp, total_rect)