From 3f53502a5907ed1982d28a392c54331f0c1c2c42 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Thu, 25 Sep 2025 12:09:50 -0400 Subject: Move the client into the apworld Only works on source right now, not as an apworld. --- apworld/client/minimap.gd | 175 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 apworld/client/minimap.gd (limited to 'apworld/client/minimap.gd') diff --git a/apworld/client/minimap.gd b/apworld/client/minimap.gd new file mode 100644 index 0000000..5640716 --- /dev/null +++ b/apworld/client/minimap.gd @@ -0,0 +1,175 @@ +extends CanvasLayer + +var player +var drawer +var sprite +var label + +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 +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 + + cell_width = cell_right - cell_left + 1 + cell_height = cell_bottom - cell_top + 1 + + var rendered = _renderMap(gridmap) + + 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 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 + 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 + + +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