diff options
Diffstat (limited to 'client/map/map.gd')
-rw-r--r-- | client/map/map.gd | 59 |
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) |