aboutsummaryrefslogtreecommitdiff
path: root/client/map/map.gd
diff options
context:
space:
mode:
Diffstat (limited to 'client/map/map.gd')
-rw-r--r--client/map/map.gd59
1 files changed, 59 insertions, 0 deletions
diff --git a/client/map/map.gd b/client/map/map.gd
new file mode 100644
index 00000000..af80d9ac
--- /dev/null
+++ b/client/map/map.gd
@@ -0,0 +1,59 @@
+class_name Map
+extends Node3D
+
+var tile_by_pos: Dictionary = {}
+var baking = false
+
+func get_tile_name(pos: Vector2i):
+ var e = tile_by_pos[str(pos)]
+ if e != null: return e[1]
+ else: return null
+func get_tile_instance(pos: Vector2i) -> Tile:
+ var e = tile_by_pos[str(pos)]
+ if e != null: return e[2]
+ else: return null
+
+func set_tile(pos: Vector2i, name_: String, neighbors: Array = [null,null,null,null]) -> Tile:
+ var tile = TileFactory.produce(name_, str(pos), neighbors)
+ add_child(tile)
+ tile.position = Vector3(pos.x, 0, pos.y)
+ tile_by_pos[str(pos)] = [pos, name_, tile, neighbors]
+ if not baking: voxelgi_timer.start(1)
+ return tile
+
+func remove_tile_if_exists(pos: Vector2i):
+ var tile = get_tile_instance(pos)
+ if tile == null: return
+ if tile.item != null: tile.item.queue_free()
+ tile_by_pos.erase(str(pos))
+ tile.name += "_queued_free"
+ tile.queue_free()
+
+@onready var voxelgi_timer: Timer = $Timer
+@onready var voxelgi: VoxelGI = $VoxelGI
+
+func _ready():
+ if baking: return
+ voxelgi_timer.connect("timeout", gi_bake)
+
+func gi_bake():
+ print("Map: Rebaking VoxelGI")
+ gi_bake_blocking()
+
+func gi_bake_blocking():
+ var extent_min = Vector2(0,0)
+ var extent_max = Vector2(0,0)
+ for e in tile_by_pos.values():
+ extent_min.x = min(extent_min.x, e[0].x)
+ extent_min.y = min(extent_min.y, e[0].y)
+ extent_max.x = max(extent_max.x, e[0].x)
+ extent_max.y = max(extent_max.y, e[0].y)
+
+ var center = (extent_max + extent_min) / 2
+ var size = extent_max - extent_min
+ voxelgi.position = Vector3(center.x, 2, center.y)
+ voxelgi.size = Vector3(size.x, 5., size.y)
+ print("Baking now!")
+ var start = Time.get_ticks_msec()
+ voxelgi.bake()
+ print("Bake done. elapsed=", Time.get_ticks_msec() - start)