summaryrefslogtreecommitdiff
path: root/main.gd
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2025-02-19 15:00:56 +0100
committerDaniel Weipert <git@mail.dweipert.de>2025-02-19 15:01:22 +0100
commitf0142a29c9a36d2b87b19b763d88c5ca2245c7dc (patch)
treeed8d45266bd329e1ad33c33bc11dc93741eebee2 /main.gd
parentf448ca4259d7f76fc58bc3b5c12ea8d04ab49a87 (diff)
next commit
Diffstat (limited to 'main.gd')
-rw-r--r--main.gd114
1 files changed, 63 insertions, 51 deletions
diff --git a/main.gd b/main.gd
index 77dcfab..1f125d9 100644
--- a/main.gd
+++ b/main.gd
@@ -4,75 +4,87 @@ extends Node3D
@onready var noise := FastNoiseLite.new()
+var chunks_to_update: Array[Vector3i] = []
+var active_task_id: int = -1
+
func _ready() -> void:
- brrr()
+ 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))
-class OtherThread extends Thread:
- func _exit_tree():
- wait_to_finish()
+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())
+ 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
+
+ # TODO: get player current chunk
+ # TODO: get all chunk positions in radius
+ # TODO: add missing chunks. remove surplus chunks
-func brrr():
- noise.seed = randi()
-
- var thread = OtherThread.new()
- var rrrb = func():
- for row in range(0, 2):
- Chunk.chunks.append([])
- for column in range(0, 1):
- Chunk.chunks[row].append([])
- for depth in range(0, 2):
- Chunk.chunks[row][column].append([])
- var chunk = Chunk.new()
- chunk.noise = noise
- chunk.generate_block_data(row, column, depth)
- Chunk.chunks[row][column][depth] = chunk
-
- #var rrrb2 = func():
- for row in Chunk.chunks.size():
- for column in Chunk.chunks[row].size():
- for depth in Chunk.chunks[row][column].size():
- var chunk: Chunk = Chunk.chunks[row][column][depth]
- var mesh = chunk.generate_mesh()
- add_child.call_deferred(mesh)
+func update_chunk_task(index: int) -> void:
+ update_chunk(chunks_to_update[index])
+
+func update_chunk(chunk_position: Vector3i) -> void:
+ if Chunk.chunk_exists(chunk_position):
+ var chunk: Chunk = Global.chunks[chunk_position]
+ chunk.generate_mesh()
+ chunk.update_mesh.call_deferred()
- thread.start(rrrb)
- #thread.wait_to_finish()
- #thread.start(rrrb2)
+ 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)
-func create_chunk(chunk_position: Vector3) -> Chunk:
- var chunk := Chunk.new()
+func create_chunk(chunk_position: Vector3i) -> Chunk:
+ var chunk: Chunk = preload("res://chunk.tscn").instantiate()
chunk.noise = noise
-
- if Chunk.chunks.size() == chunk_position.x:
- Chunk.chunks.append([])
- if Chunk.chunks[chunk_position.x].size() == chunk_position.y:
- Chunk.chunks[chunk_position.x].append([])
- if Chunk.chunks[chunk_position.x][chunk_position.y].size() == chunk_position.z:
- Chunk.chunks[chunk_position.y].append([])
-
- Chunk.chunks[chunk_position.x][chunk_position.y][chunk_position.z] = chunk
+ Global.chunks[chunk_position] = chunk
return chunk
-func add_block(target_position: Vector3, block_type: Block.Type = Block.Type.AIR):
- var chunk_idx := Chunk.global_to_chunk(target_position)
+func add_block(target_position: Vector3, normal: Vector3, block_type: Block.Type = Block.Type.AIR):
+ var chunk_idx := Chunk.global_to_chunk(target_position + normal, Vector3.ZERO)
var chunk: Chunk
- var created_new_chunk := false
- if Chunk.chunk_exists(chunk_idx.x, chunk_idx.y, chunk_idx.z):
- chunk = Chunk.chunks[chunk_idx.x][chunk_idx.y][chunk_idx.z]
+ if Chunk.chunk_exists(chunk_idx):
+ chunk = Global.chunks[chunk_idx]
else:
- created_new_chunk = true
chunk = create_chunk(Vector3(chunk_idx.x, chunk_idx.y, chunk_idx.z))
chunk.generate_block_data(chunk_idx.x, chunk_idx.y, chunk_idx.z, true)
+ chunk.add_to.call_deferred(self)
- var block_chunk_idx := Chunk.global_to_chunk_block(target_position)
+ var block_chunk_idx := Chunk.global_to_chunk_block(target_position + normal, normal)
chunk.add_block(block_chunk_idx, block_type)
-
- if created_new_chunk:
- add_child.call_deferred(chunk.generate_mesh())
+ chunks_to_update.append(chunk.grid_position)
+
+
+func remove_block(target_position: Vector3, normal: Vector3):
+ var chunk_idx := Chunk.global_to_chunk(target_position, normal)
+ if Chunk.chunk_exists(chunk_idx):
+ var chunk: Chunk = Global.chunks[chunk_idx]
+ var block_chunk_idx := Chunk.global_to_chunk_block(target_position, normal)
+ chunk.remove_block(block_chunk_idx)
+ chunks_to_update.append(chunk.grid_position)
+ chunks_to_update.append_array(chunk.get_bordering_chunks(block_chunk_idx).filter(func(item):
+ return Chunk.chunk_exists(item)
+ ))