summaryrefslogtreecommitdiffstats
path: root/ChunkLoader.gd
blob: 90cac4f320c2c796881b6847a11721d56faaff69 (plain) (blame)
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
61
62
63
64
65
66
extends Node

var world = null

var Chunk = preload("res://Chunk.tscn")
var chunks = {}
var loaded_chunks = {}
var chunk_thread = Thread.new()
var mtx = Mutex.new()
var sgnl = Semaphore.new()
var exit = false
var chunk_to_load = null

func _ready():
    chunk_thread.start(self, "chunk_loader")
    
func _exit_tree():
    mtx.lock()
    exit = true
    sgnl.post()
    mtx.unlock()
    chunk_thread.wait_to_finish()

func add_chunk(coords:Vector2):
    chunks[coords] = coords.length()

func chunk_update():
    var closest_unloaded_chunk = null
    var closest_len = 0.0
    for chunk in chunks.keys():
        if !loaded_chunks.has(chunk):
            if closest_unloaded_chunk == null || closest_len > chunks[chunk]:
                closest_unloaded_chunk = chunk
                closest_len = chunks[chunk]
    if closest_unloaded_chunk != null:
        mtx.lock()
        if chunk_to_load == null:
            chunk_to_load = closest_unloaded_chunk
            sgnl.post()
        mtx.unlock()
    for chunk in loaded_chunks.keys():
        if !chunks.has(chunk):
            var c = loaded_chunks[chunk].get_ref()
            if c != null:
                c.queue_free()
            loaded_chunks.erase(chunk)
    chunks = {}

func chunk_loader():
    while true:
        sgnl.wait()
        mtx.lock()
        var x = exit
        var coords = chunk_to_load
        chunk_to_load = null
        mtx.unlock()
        if x:
            break
        var chunk = Chunk.instance()
        chunk.transform.origin = Vector3(coords.x,0.0,coords.y)
        ChunkGen.gen_chunk(chunk)
        self.call_deferred("finish_chunk", chunk)

func finish_chunk(chunk):
    world.get_node("Chunks").add_child(chunk)
    loaded_chunks[Vector2(chunk.transform.origin.x,chunk.transform.origin.z)] = weakref(chunk)