about summary refs log tree commit diff stats
path: root/client/Archipelago/minimap.gd
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2025-09-23 11:49:35 -0400
committerStar Rauchenberger <fefferburbia@gmail.com>2025-09-23 11:49:35 -0400
commit558fabd029f52dafdf04c6de29ef09d7789ef27b (patch)
treef9f412986989410f111ee4b9cc3eba708cf0a302 /client/Archipelago/minimap.gd
parentb78c93122f856940f7492e3dbc7dc5fbb798e14b (diff)
downloadlingo2-archipelago-558fabd029f52dafdf04c6de29ef09d7789ef27b.tar.gz
lingo2-archipelago-558fabd029f52dafdf04c6de29ef09d7789ef27b.tar.bz2
lingo2-archipelago-558fabd029f52dafdf04c6de29ef09d7789ef27b.zip
[Client] Stop using a camera for minimap
Diffstat (limited to 'client/Archipelago/minimap.gd')
-rw-r--r--client/Archipelago/minimap.gd178
1 files changed, 118 insertions, 60 deletions
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 @@
1extends CanvasLayer 1extends CanvasLayer
2 2
3var player 3var player
4var camera 4var drawer
5var sprite
5var label 6var label
6var map_bounds = null 7
8var cell_left
9var cell_top
10var cell_right
11var cell_bottom
12var center_x_min
13var center_x_max
14var center_y_min
15var center_y_max
7 16
8 17
9func _ready(): 18func _ready():
@@ -22,72 +31,121 @@ func _ready():
22 31
23 var sv = SubViewport.new() 32 var sv = SubViewport.new()
24 sv.size = Vector2i(256, 256) 33 sv.size = Vector2i(256, 256)
34 sv.disable_3d = true
25 svc.add_child(sv) 35 svc.add_child(sv)
26 36
27 camera = Camera3D.new() 37 var background_color = Color.WHITE
28 camera.position.y = 5 38
29 camera.rotation_degrees.x = -90 39 var world_env = get_tree().get_root().get_node("scene/WorldEnvironment")
30 camera.projection = Camera3D.PROJECTION_ORTHOGONAL 40 if world_env != null and world_env.environment != null:
31 camera.size = 128.0 41 if world_env.environment.background_mode == Environment.BG_COLOR:
32 camera.far = 10 42 background_color = world_env.environment.background_color
33 sv.add_child(camera) 43 elif (
44 world_env.environment.background_mode == Environment.BG_SKY
45 and world_env.environment.sky != null
46 and world_env.environment.sky.sky_material != null
47 ):
48 var sky = world_env.environment.sky.sky_material
49 if sky is PhysicalSkyMaterial:
50 background_color = sky.ground_color
51 elif sky is ProceduralSkyMaterial:
52 background_color = sky.sky_top_color
53
54 var background_image = Image.create_empty(256, 256, false, Image.FORMAT_RGBA8)
55 background_image.fill(background_color)
56
57 var background_texture = ImageTexture.create_from_image(background_image)
58 var background = Sprite2D.new()
59 background.texture = background_texture
60 background.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
61 background.centered = false
62 sv.add_child(background)
63
64 drawer = Node2D.new()
65 sv.add_child(drawer)
66
67 var gridmap = get_tree().get_root().get_node("scene/GridMap")
68 if gridmap == null:
69 visible = false
70 return
71
72 cell_left = 0
73 cell_top = 0
74 cell_right = 0
75 cell_bottom = 0
76
77 for pos in gridmap.get_used_cells():
78 if pos.x < cell_left:
79 cell_left = pos.x
80 if pos.x > cell_right:
81 cell_right = pos.x
82 if pos.z < cell_top:
83 cell_top = pos.z
84 if pos.z > cell_bottom:
85 cell_bottom = pos.z
86
87 var cell_width = cell_right - cell_left + 1
88 var cell_height = cell_bottom - cell_top + 1
89
90 var heights = {}
91
92 var rendered = Image.create_empty(cell_width, cell_height, false, Image.FORMAT_RGBA8)
93 rendered.fill(Color.TRANSPARENT)
94
95 for pos in gridmap.get_used_cells():
96 var in_plane = Vector2i(pos.x, pos.z)
97
98 if in_plane in heights and heights[in_plane] > pos.y:
99 continue
100
101 heights[in_plane] = pos.y
102
103 var cell_item = gridmap.get_cell_item(pos)
104 var mesh = gridmap.mesh_library.get_item_mesh(cell_item)
105 var material = mesh.surface_get_material(0)
106 var color = material.albedo_color
107
108 rendered.set_pixel(pos.x - cell_left, pos.z - cell_top, color)
109
110 var image_texture = ImageTexture.create_from_image(rendered)
111 sprite = Sprite2D.new()
112 sprite.texture = image_texture
113 sprite.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
114 sprite.scale = Vector2(2, 2)
115 sprite.centered = false
116 drawer.add_child(sprite)
34 117
35 label = Label.new() 118 label = Label.new()
36 label.theme = preload("res://assets/themes/baseUI.tres") 119 label.theme = preload("res://assets/themes/baseUI.tres")
37 label.add_theme_font_size_override("font_size", 32) 120 label.add_theme_font_size_override("font_size", 32)
38 label.text = "@" 121 label.text = "@"
39 add_child(label) 122 drawer.add_child(label)
40 123
41 var gridmap = get_tree().get_root().get_node("scene/GridMap") 124 var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top))
42 if gridmap != null: 125 var local_br = gridmap.map_to_local(Vector3i(cell_right, 0, cell_bottom))
43 var cell_left = 0 126 var global_tl = gridmap.to_global(local_tl)
44 var cell_top = 0 127 var global_br = gridmap.to_global(local_br)
45 var cell_right = 0 128
46 var cell_bottom = 0 129 center_x_min = 0
47 130 center_x_max = cell_width - 128
48 for pos in gridmap.get_used_cells(): 131 center_y_min = 0
49 if pos.x < cell_left: 132 center_y_max = cell_height - 128
50 cell_left = pos.x 133
51 if pos.x > cell_right: 134 if center_x_max < center_x_min:
52 cell_right = pos.x 135 center_x_min = (center_x_min + center_x_max) / 2
53 if pos.z < cell_top: 136 center_x_max = center_x_min
54 cell_top = pos.z 137
55 if pos.z > cell_bottom: 138 if center_y_max < center_y_min:
56 cell_bottom = pos.z 139 center_y_min = (center_y_min + center_y_max) / 2
57 140 center_y_max = center_y_min
58 var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top))
59 var local_br = gridmap.map_to_local(Vector3i(cell_right, 0, cell_bottom))
60 var global_tl = gridmap.to_global(local_tl)
61 var global_br = gridmap.to_global(local_br)
62 map_bounds = [
63 min(global_tl.x, global_br.x) + 64,
64 max(global_tl.x, global_br.x) - 64,
65 min(global_tl.z, global_br.z) + 64,
66 max(global_tl.z, global_br.z) - 64
67 ]
68
69 if map_bounds[1] < map_bounds[0]:
70 map_bounds[0] = (map_bounds[0] + map_bounds[1]) / 2
71 map_bounds[1] = map_bounds[0]
72
73 if map_bounds[3] < map_bounds[2]:
74 map_bounds[2] = (map_bounds[2] + map_bounds[3]) / 2
75 map_bounds[3] = map_bounds[2]
76
77 if map_bounds == null:
78 label.position.x = 1712.0
79 label.position.y = 872.0
80 #label.offset_right = 1743.0
81 #label.offset_bottom = 907.0
82 141
83 142
84func _process(_delta): 143func _process(_delta):
85 if map_bounds == null: 144 if visible == false:
86 camera.position.x = player.position.x 145 return
87 camera.position.z = player.position.z 146
88 else: 147 drawer.position.x = clamp(player.position.x - cell_left - 64, center_x_min, center_x_max) * -2
89 camera.position.x = clamp(player.position.x, map_bounds[0], map_bounds[1]) 148 drawer.position.y = clamp(player.position.z - cell_top - 64, center_y_min, center_y_max) * -2
90 camera.position.z = clamp(player.position.z, map_bounds[2], map_bounds[3]) 149
91 150 label.position.x = (player.position.x - cell_left) * 2 - 16
92 label.position.x = 1600 + (player.position.x - camera.position.x) * 2 + 128 - 16 151 label.position.y = (player.position.z - cell_top) * 2 - 16
93 label.position.y = 760 + (player.position.z - camera.position.z) * 2 + 128 - 16