Only generate chunks once.

This commit is contained in:
Relintai 2025-02-10 15:24:16 +01:00
parent 23614770f1
commit b0177a2c3a
3 changed files with 23 additions and 4 deletions

View File

@ -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);

View File

@ -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;

View File

@ -457,11 +457,14 @@ Ref<TerrainChunk> TerrainWorld::_create_chunk(const int x, const int z, Ref<Terr
void TerrainWorld::chunk_generate(Ref<TerrainChunk> 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();
}