From 558fabd029f52dafdf04c6de29ef09d7789ef27b Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Tue, 23 Sep 2025 11:49:35 -0400 Subject: [Client] Stop using a camera for minimap --- client/Archipelago/minimap.gd | 178 ++++++++++++++++++++++++++++-------------- 1 file changed, 118 insertions(+), 60 deletions(-) (limited to 'client') diff --git a/client/Archipelago/minimap.gd b/client/Archipelago/minimap.gd index 2702bb1..15993fb 100644 --- a/client/Archipelago/minimap.gd +++ b/client/Archipelago/minimap.gd @@ -1,9 +1,18 @@ extends CanvasLayer var player -var camera +var drawer +var sprite var label -var map_bounds = null + +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(): @@ -22,72 +31,121 @@ func _ready(): var sv = SubViewport.new() sv.size = Vector2i(256, 256) + sv.disable_3d = true svc.add_child(sv) - camera = Camera3D.new() - camera.position.y = 5 - camera.rotation_degrees.x = -90 - camera.projection = Camera3D.PROJECTION_ORTHOGONAL - camera.size = 128.0 - camera.far = 10 - sv.add_child(camera) + 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 background_image = Image.create_empty(256, 256, false, Image.FORMAT_RGBA8) + background_image.fill(background_color) + + var background_texture = ImageTexture.create_from_image(background_image) + var background = Sprite2D.new() + background.texture = background_texture + background.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + background.centered = false + sv.add_child(background) + + drawer = Node2D.new() + sv.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 = "@" - add_child(label) + drawer.add_child(label) - var gridmap = get_tree().get_root().get_node("scene/GridMap") - if gridmap != null: - var cell_left = 0 - var cell_top = 0 - var cell_right = 0 - var 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 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) - map_bounds = [ - min(global_tl.x, global_br.x) + 64, - max(global_tl.x, global_br.x) - 64, - min(global_tl.z, global_br.z) + 64, - max(global_tl.z, global_br.z) - 64 - ] - - if map_bounds[1] < map_bounds[0]: - map_bounds[0] = (map_bounds[0] + map_bounds[1]) / 2 - map_bounds[1] = map_bounds[0] - - if map_bounds[3] < map_bounds[2]: - map_bounds[2] = (map_bounds[2] + map_bounds[3]) / 2 - map_bounds[3] = map_bounds[2] - - if map_bounds == null: - label.position.x = 1712.0 - label.position.y = 872.0 - #label.offset_right = 1743.0 - #label.offset_bottom = 907.0 + 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 map_bounds == null: - camera.position.x = player.position.x - camera.position.z = player.position.z - else: - camera.position.x = clamp(player.position.x, map_bounds[0], map_bounds[1]) - camera.position.z = clamp(player.position.z, map_bounds[2], map_bounds[3]) - - label.position.x = 1600 + (player.position.x - camera.position.x) * 2 + 128 - 16 - label.position.y = 760 + (player.position.z - camera.position.z) * 2 + 128 - 16 + 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 -- cgit 1.4.1