extends CanvasLayer var player var drawer var sprite var label var cell_left var cell_top var cell_right var cell_bottom var center_x_min var center_x_max var center_y_min var center_y_max func _ready(): player = get_tree().get_root().get_node("scene/player") var svc = PanelContainer.new() svc.anchor_left = 1.0 svc.anchor_top = 1.0 svc.anchor_right = 1.0 svc.anchor_bottom = 1.0 svc.offset_left = -320.0 svc.offset_top = -320.0 svc.offset_right = -64.0 svc.offset_bottom = -64.0 svc.clip_contents = true add_child(svc) var background_color = Color.WHITE var world_env = get_tree().get_root().get_node("scene/WorldEnvironment") if world_env != null and world_env.environment != null: if world_env.environment.background_mode == Environment.BG_COLOR: background_color = world_env.environment.background_color elif ( world_env.environment.background_mode == Environment.BG_SKY and world_env.environment.sky != null and world_env.environment.sky.sky_material != null ): var sky = world_env.environment.sky.sky_material if sky is PhysicalSkyMaterial: background_color = sky.ground_color elif sky is ProceduralSkyMaterial: background_color = sky.sky_top_color var stylebox = StyleBoxFlat.new() stylebox.bg_color = Color(background_color, 0.6) svc.add_theme_stylebox_override("panel", stylebox) drawer = Node2D.new() svc.add_child(drawer) var gridmap = get_tree().get_root().get_node("scene/GridMap") if gridmap == null: visible = false return cell_left = 0 cell_top = 0 cell_right = 0 cell_bottom = 0 for pos in gridmap.get_used_cells(): if pos.x < cell_left: cell_left = pos.x if pos.x > cell_right: cell_right = pos.x if pos.z < cell_top: cell_top = pos.z if pos.z > cell_bottom: cell_bottom = pos.z var cell_width = cell_right - cell_left + 1 var cell_height = cell_bottom - cell_top + 1 var heights = {} var rendered = Image.create_empty(cell_width, cell_height, false, Image.FORMAT_RGBA8) rendered.fill(Color.TRANSPARENT) for pos in gridmap.get_used_cells(): var in_plane = Vector2i(pos.x, pos.z) if in_plane in heights and heights[in_plane] > pos.y: continue heights[in_plane] = pos.y var cell_item = gridmap.get_cell_item(pos) var mesh = gridmap.mesh_library.get_item_mesh(cell_item) var material = mesh.surface_get_material(0) var color = material.albedo_color rendered.set_pixel(pos.x - cell_left, pos.z - cell_top, color) var image_texture = ImageTexture.create_from_image(rendered) sprite = Sprite2D.new() sprite.texture = image_texture sprite.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST sprite.scale = Vector2(2, 2) sprite.centered = false drawer.add_child(sprite) label = Label.new() label.theme = preload("res://assets/themes/baseUI.tres") label.add_theme_font_size_override("font_size", 32) label.text = "@" drawer.add_child(label) var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top)) var local_br = gridmap.map_to_local(Vector3i(cell_right, 0, cell_bottom)) var global_tl = gridmap.to_global(local_tl) var global_br = gridmap.to_global(local_br) center_x_min = 0 center_x_max = cell_width - 128 center_y_min = 0 center_y_max = cell_height - 128 if center_x_max < center_x_min: center_x_min = (center_x_min + center_x_max) / 2 center_x_max = center_x_min if center_y_max < center_y_min: center_y_min = (center_y_min + center_y_max) / 2 center_y_max = center_y_min func _process(_delta): if visible == false: return drawer.position.x = clamp(player.position.x - cell_left - 64, center_x_min, center_x_max) * -2 drawer.position.y = clamp(player.position.z - cell_top - 64, center_y_min, center_y_max) * -2 label.position.x = (player.position.x - cell_left) * 2 - 16 label.position.y = (player.position.z - cell_top) * 2 - 16