diff --git a/modules/terraman/world/terrain_chunk.cpp b/modules/terraman/world/terrain_chunk.cpp index 2d203d7ef..c96ec717a 100644 --- a/modules/terraman/world/terrain_chunk.cpp +++ b/modules/terraman/world/terrain_chunk.cpp @@ -85,6 +85,13 @@ void TerrainChunk::set_is_immediate_build(const bool value) { _is_immediate_build = value; } +bool TerrainChunk::get_is_terrain_generated() const { + return _is_terrain_generated; +} +void TerrainChunk::set_is_terrain_generated(const bool value) { + _is_terrain_generated = value; +} + bool TerrainChunk::is_build_aborted() const { return _abort_build; } @@ -1156,6 +1163,7 @@ TerrainChunk::TerrainChunk() { _is_generating = false; _is_immediate_build = false; + _is_terrain_generated = false; _dirty = false; _state = TERRAIN_CHUNK_STATE_OK; @@ -1436,6 +1444,10 @@ void TerrainChunk::_bind_methods() { ClassDB::bind_method(D_METHOD("set_is_immediate_build", "value"), &TerrainChunk::set_is_immediate_build); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "is_immediate_build", PROPERTY_HINT_NONE, "", 0), "set_is_immediate_build", "get_is_immediate_build"); + ClassDB::bind_method(D_METHOD("get_is_terrain_generated"), &TerrainChunk::get_is_terrain_generated); + ClassDB::bind_method(D_METHOD("set_is_terrain_generated", "value"), &TerrainChunk::set_is_terrain_generated); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "is_terrain_generated"), "set_is_terrain_generated", "get_is_terrain_generated"); + ClassDB::bind_method(D_METHOD("is_build_aborted"), &TerrainChunk::is_build_aborted); ClassDB::bind_method(D_METHOD("get_dirty"), &TerrainChunk::get_dirty); diff --git a/modules/terraman/world/terrain_chunk.h b/modules/terraman/world/terrain_chunk.h index 72d89b7df..4eacd7848 100644 --- a/modules/terraman/world/terrain_chunk.h +++ b/modules/terraman/world/terrain_chunk.h @@ -92,6 +92,9 @@ public: bool get_is_immediate_build() const; void set_is_immediate_build(const bool value); + bool get_is_terrain_generated() const; + void set_is_terrain_generated(const bool value); + bool is_build_aborted() const; bool is_in_tree() const; @@ -369,6 +372,7 @@ protected: bool _is_generating; bool _is_immediate_build; + bool _is_terrain_generated; bool _dirty; int _state; diff --git a/modules/terraman/world/terrain_world.cpp b/modules/terraman/world/terrain_world.cpp index d20c95041..27a450d9a 100644 --- a/modules/terraman/world/terrain_world.cpp +++ b/modules/terraman/world/terrain_world.cpp @@ -457,11 +457,14 @@ Ref TerrainWorld::_create_chunk(const int x, const int z, Ref chunk) { ERR_FAIL_COND(!chunk.is_valid()); - if (has_method("_prepare_chunk_for_generation")) { - call("_prepare_chunk_for_generation", chunk); - } + if (!chunk->get_is_terrain_generated()) { + if (has_method("_prepare_chunk_for_generation")) { + call("_prepare_chunk_for_generation", chunk); + } - call("_generate_chunk", chunk); + call("_generate_chunk", chunk); + chunk->set_is_terrain_generated(true); + } chunk->build(); }