blob: 9f1d9b325e81aa4cfe4f695f8b12bce69cec7503 (
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://world/chunk/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)
|