summaryrefslogtreecommitdiff
path: root/main.gd
diff options
context:
space:
mode:
Diffstat (limited to 'main.gd')
-rw-r--r--main.gd90
1 files changed, 68 insertions, 22 deletions
diff --git a/main.gd b/main.gd
index 1f125d9..ba3d146 100644
--- a/main.gd
+++ b/main.gd
@@ -4,39 +4,80 @@ extends Node3D
@onready var noise := FastNoiseLite.new()
+var chunks_to_generate: Array[Vector3i] = []
var chunks_to_update: Array[Vector3i] = []
-var active_task_id: int = -1
+var active_generate_task_id: int = -1
+var active_update_task_id: int = -1
+
+var player_last_chunk := Vector3i.ZERO
+var chunk_generation_radius := Vector3i(2, 2, 2)
+
+@onready var chunks_container := $Chunks
func _ready() -> void:
Global.player = $Player
noise.seed = randi()
- #var world_size := Vector3i(4, 2, 4)
- #
- #for column in range(world_size.y, 0, -1):
- #for row in range(- world_size.x * 0.5, world_size.x * 0.5):
- #for depth in range(- world_size.z * 0.5, world_size.z * 0.5):
- #chunks_to_update.append(Vector3i(row, column, depth))
- chunks_to_update.append(Vector3i(0, 0, 0))
- chunks_to_update.append(Vector3i(0, 1, 0))
- #chunks_to_update.append(Vector3i(0, 2, 0))
+ var world_size := Vector3i(2, 1, 2)
+
+ for column in range(world_size.y, 0, -1):
+ for row in range(- world_size.x * 0.5, world_size.x * 0.5):
+ for depth in range(- world_size.z * 0.5, world_size.z * 0.5):
+ chunks_to_generate.append(Vector3i(row, column, depth))
+
+ # TODO: 2*1*2 worldgen on main thread
+ # TODO: show loading anim. how?
+ # TODO: worldgen not on main thread.
+ # TODO: get number of chunks to be gen
+ # TODO: ++number and show progress %
func _process(_delta: float) -> void:
- if chunks_to_update.size() > 0:
- if active_task_id == -1:
- active_task_id = WorkerThreadPool.add_group_task(update_chunk_task, chunks_to_update.size())
+ if chunks_to_generate.size() > 0:
+ if active_generate_task_id == -1:
+ active_generate_task_id = WorkerThreadPool.add_task(generate_chunk_task.bind(0))
else:
- if WorkerThreadPool.is_group_task_completed(active_task_id):
- WorkerThreadPool.wait_for_group_task_completion(active_task_id)
- chunks_to_update.clear()
- active_task_id = -1
+ if WorkerThreadPool.is_task_completed(active_generate_task_id):
+ WorkerThreadPool.wait_for_task_completion(active_generate_task_id)
+ chunks_to_generate.remove_at(0)
+ active_generate_task_id = -1
- # TODO: get player current chunk
- # TODO: get all chunk positions in radius
- # TODO: add missing chunks. remove surplus chunks
-
+ if chunks_to_update.size() > 0:
+ if active_update_task_id == -1:
+ active_update_task_id = WorkerThreadPool.add_group_task(update_chunk_task, chunks_to_update.size())
+ else:
+ if WorkerThreadPool.is_group_task_completed(active_update_task_id):
+ WorkerThreadPool.wait_for_group_task_completion(active_update_task_id)
+ chunks_to_update.remove_at(0)
+ active_update_task_id = -1
+
+
+func _physics_process(_delta: float) -> void:
+ if player_last_chunk != Global.player.current_chunk_position:
+ player_last_chunk = Global.player.current_chunk_position
+ var chunks_in_radius := []
+ for x in range(- chunk_generation_radius.x * 0.5, chunk_generation_radius.x * 0.5 + 1):
+ for y in range(- chunk_generation_radius.y * 0.5, chunk_generation_radius.y * 0.5 + 1):
+ for z in range(- chunk_generation_radius.z * 0.5, chunk_generation_radius.z * 0.5 + 1):
+ var chunk_to_check := Global.player.current_chunk_position + Vector3i(x, y, z)
+ chunks_in_radius.append(chunk_to_check)
+
+ # generate new or re-generate existing nodes
+ for p in chunks_in_radius:
+ if not Chunk.chunk_exists(p):
+ chunks_to_generate.append(p)
+ elif not chunks_container.has_node("Chunk_%s_%s_%s" % [p.x, p.y, p.z]):
+ chunks_to_generate.append(p)
+
+ # remove surplus nodes
+ for node: Chunk in chunks_container.get_children():
+ if not chunks_in_radius.has(node.grid_position):
+ chunks_container.remove_child(node)
+
+
+func generate_chunk_task(index: int) -> void:
+ update_chunk(chunks_to_generate[index])
func update_chunk_task(index: int) -> void:
update_chunk(chunks_to_update[index])
@@ -46,12 +87,17 @@ func update_chunk(chunk_position: Vector3i) -> void:
var chunk: Chunk = Global.chunks[chunk_position]
chunk.generate_mesh()
chunk.update_mesh.call_deferred()
+
+ (func():
+ if not chunks_container.has_node("Chunk_%s_%s_%s" % [chunk_position.x, chunk_position.y, chunk_position.z]):
+ chunk.add_to(chunks_container)
+ ).call_deferred()
else:
var chunk := create_chunk(chunk_position)
chunk.generate_block_data(chunk_position.x, chunk_position.y, chunk_position.z)
chunk.generate_mesh()
- chunk.add_to.call_deferred(self)
+ chunk.add_to.call_deferred(chunks_container)
func create_chunk(chunk_position: Vector3i) -> Chunk: