class_name Map extends Node3D var tile_by_pos: Dictionary = {} var autobake = false func get_tile_name(pos: Vector2i): var e = tile_by_pos.get(str(pos)) if e != null: return e[1] else: return null func get_tile_instance(pos: Vector2i) -> Tile: var e = tile_by_pos.get(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 autobake: voxelgi_timer.start(1) return tile func clear_tile(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(): voxelgi_timer.connect("timeout", gi_bake) func gi_bake(): if not Global.get_setting("voxel_gi"): return 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() voxelgi.visible = true print("Bake done. elapsed=", Time.get_ticks_msec() - start)