@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)