Implement infinite world generation, also work on making mobs freeze until the chunk they are in is generated. Updated modules to get the changes from Voxelman.

This commit is contained in:
Relintai 2020-03-04 16:38:18 +01:00
parent 0258425ef3
commit c0f0022d75
4 changed files with 66 additions and 4 deletions

2
HEADS
View File

@ -1 +1 @@
{"engine": {"3.2": "f4e3701893bdf6b304ee114745def2f8ac4aa822", "master": "8c73e813134001e575b6f59e3b0100471c007410"}, "world_generator": {"master": "a08917370cdef0884042bdb49fb80ece0b2e76ec"}, "entity_spell_system": {"master": "3e10779dbc5258d1e1b08eab287189f9c1ccec64"}, "ui_extensions": {"master": "38acc650db260a831dc26ca96fe9d9a087230bdc"}, "voxelman": {"master": "ac75c78be10e0f7d60b7a6f26189523347732276"}, "texture_packer": {"master": "b17c174906f84de93d84aa60d010ffe603efaa28"}, "fastnoise": {"master": "41b7ea05a1f7aa2b8ecddaa1fd739e64d6970f7e"}, "mesh_data_resource": {"master": "4bda19b12be2c2a79a6121de6d22e48f3934e726"}, "procedural_animations": {"master": "ba464ef04500aa01b2638cf1f890f3f6582ead84"}, "ess_data": {"master": "3bd637fdd3304b64a18287a49a6b7387acf2f5de"}}
{"engine": {"3.2": "0d5e483a90c41c433056b8cf6e4e8def6316690f", "master": "8c73e813134001e575b6f59e3b0100471c007410"}, "world_generator": {"master": "a08917370cdef0884042bdb49fb80ece0b2e76ec"}, "entity_spell_system": {"master": "3e10779dbc5258d1e1b08eab287189f9c1ccec64"}, "ui_extensions": {"master": "38acc650db260a831dc26ca96fe9d9a087230bdc"}, "voxelman": {"master": "fbd2903477bc810fba8abec48f9cd6f9252e2fe5"}, "texture_packer": {"master": "b17c174906f84de93d84aa60d010ffe603efaa28"}, "fastnoise": {"master": "41b7ea05a1f7aa2b8ecddaa1fd739e64d6970f7e"}, "mesh_data_resource": {"master": "4bda19b12be2c2a79a6121de6d22e48f3934e726"}, "procedural_animations": {"master": "ba464ef04500aa01b2638cf1f890f3f6582ead84"}, "ess_data": {"master": "3bd637fdd3304b64a18287a49a6b7387acf2f5de"}}

View File

@ -64,6 +64,24 @@ func _ready() -> void:
set_process(true)
set_physics_process(true)
func _enter_tree():
var world : VoxelWorld = get_node("..") as VoxelWorld
if world != null:
if not world.is_position_walkable(get_body().transform.origin):
world.connect("chunk_mesh_generation_finished", self, "chunk_mesh_generation_finished", [], CONNECT_DEFERRED)
set_process(false)
set_physics_process(false)
func chunk_mesh_generation_finished(chunk):
var world : VoxelWorld = get_node("..") as VoxelWorld
if world.is_position_walkable(get_body().transform.origin):
world.disconnect("chunk_mesh_generation_finished", self, "chunk_mesh_generation_finished")
set_process(true)
set_physics_process(true)
func _process(delta : float) -> void:
if dead:
death_timer += delta

View File

@ -59,6 +59,7 @@ adjustment_enabled = true
data_margin_start = 1
data_margin_end = 2
max_concurrent_generations = 4
max_frame_chunk_build_steps = 1
library = ExtResource( 2 )
level_generator = SubResource( 1 )
voxel_scale = 1.6

View File

@ -39,6 +39,9 @@ var _editor_generate : bool
var _player_file_name : String
var _player : Entity
const VIS_UPDATE_INTERVAL = 5
var vis_update : float = 0
func _enter_tree():
for ch in get_children():
if ch is VoxelChunk:
@ -51,14 +54,52 @@ func _enter_tree():
add_chunk(c, c.position_x, c.position_y, c.position_z)
c.build_deferred()
if generate_on_ready and not Engine.is_editor_hint():
if level_generator != null:
level_generator.setup(self, 80, false, library)
spawn()
func _process(delta):
if _player == null:
set_process(false)
return
vis_update += delta
if vis_update >= VIS_UPDATE_INTERVAL:
vis_update = 0
var ppos : Vector3 = _player.get_body().transform.origin
var cpos : Vector3 = ppos
cpos.x = int(cpos.x / (chunk_size_x * voxel_scale))
cpos.y = int(cpos.y / (chunk_size_y * voxel_scale))
cpos.z = int(cpos.z / (chunk_size_z * voxel_scale))
var count : int = get_chunk_count()
var i : int = 0
while i < count:
var c : VoxelChunk = get_chunk_index(i)
var l : float = (Vector2(cpos.x, cpos.z) - Vector2(c.position_x, c.position_z)).length()
if l > chunk_spawn_range + 2:
# print("despawn " + str(Vector3(c.position_x, c.position_y, c.position_z)))
remove_chunk_index(i)
c.queue_free()
i -= 1
count -= 1
i += 1
for x in range(-chunk_spawn_range + int(cpos.x), chunk_spawn_range + int(cpos.x)):
for z in range(-chunk_spawn_range + int(cpos.z), chunk_spawn_range + int(cpos.z)):
for y in range(-1, 2):
if not has_chunk(x, y, z):
# print("spawn " + str(Vector3(x, y, z)))
create_chunk(x, y, z)
#func _process(delta : float) -> void:
# if not generation_queue.empty():
@ -128,7 +169,7 @@ func _create_chunk(x : int, y : int, z : int, pchunk : Node) -> VoxelChunk:
#chunk.meshing_create_collider = false
chunk.lod_size = 1
# print("added " + str(Vector3(x, y, z)))
return ._create_chunk(x, y, z, chunk)
func spawn() -> void:
@ -199,6 +240,8 @@ func load_character(file_name : String) -> void:
spawn()
set_process(true)
func needs_loading_screen() -> bool:
return show_loading_screen