From fb220e1c75e72a536c19aa1283f905850a91cf44 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Tue, 23 Sep 2025 20:16:05 -0400 Subject: [Client] Render meshes on minimap --- client/Archipelago/minimap.gd | 84 ++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 25 deletions(-) (limited to 'client/Archipelago') diff --git a/client/Archipelago/minimap.gd b/client/Archipelago/minimap.gd index 4fb1214..5640716 100644 --- a/client/Archipelago/minimap.gd +++ b/client/Archipelago/minimap.gd @@ -9,6 +9,8 @@ var cell_left var cell_top var cell_right var cell_bottom +var cell_width +var cell_height var center_x_min var center_x_max var center_y_min @@ -74,28 +76,10 @@ func _ready(): 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 + cell_width = cell_right - cell_left + 1 + 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 rendered = _renderMap(gridmap) var image_texture = ImageTexture.create_from_image(rendered) sprite = Sprite2D.new() @@ -111,10 +95,10 @@ func _ready(): 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) + #var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top)) + #var global_tl = gridmap.to_global(local_tl) + #var local_br = gridmap.map_to_local(Vector3i(cell_right, 0, cell_bottom)) + #var global_br = gridmap.to_global(local_br) center_x_min = 0 center_x_max = cell_width - 128 @@ -139,3 +123,53 @@ func _process(_delta): label.position.x = (player.position.x - cell_left) * 2 - 16 label.position.y = (player.position.z - cell_top) * 2 - 16 + + +func _renderMap(gridmap): + var heights = {} + + var rendered = Image.create_empty(cell_width, cell_height, false, Image.FORMAT_RGBA8) + rendered.fill(Color.TRANSPARENT) + + var meshes_node = get_tree().get_root().get_node("scene/Meshes") + if meshes_node != null: + _renderMeshNode(gridmap, meshes_node, rendered) + + 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) + + return rendered + + +func _renderMeshNode(gridmap, mesh, rendered): + if mesh is MeshInstance3D: + var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top)) + var global_tl = gridmap.to_global(local_tl) + var mesh_material = mesh.get_surface_override_material(0) + if mesh_material != null: + var mesh_color = mesh_material.albedo_color + + for y in range( + max(mesh.position.z - mesh.scale.z / 2 - global_tl.z, 0), + min(mesh.position.z + mesh.scale.z / 2 - global_tl.z, cell_height) + ): + for x in range( + max(mesh.position.x - mesh.scale.x / 2 - global_tl.x, 0), + min(mesh.position.x + mesh.scale.x / 2 - global_tl.x, cell_width) + ): + rendered.set_pixel(x, y, mesh_color) + + for child in mesh.get_children(): + _renderMeshNode(gridmap, child, rendered) -- cgit 1.4.1