aboutsummaryrefslogtreecommitdiff
path: root/client/map/map.gd
blob: ca3069adfea376f1f67c68dc71f18b3389bdc9b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class_name Map
extends Node3D

var tile_by_pos: Dictionary = {}
var baking = 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 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
	if Global.settings["voxel_gi"]["value"]:
		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)