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; _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 { bool TerrainChunk::is_build_aborted() const {
return _abort_build; return _abort_build;
} }
@ -1156,6 +1163,7 @@ TerrainChunk::TerrainChunk() {
_is_generating = false; _is_generating = false;
_is_immediate_build = false; _is_immediate_build = false;
_is_terrain_generated = false;
_dirty = false; _dirty = false;
_state = TERRAIN_CHUNK_STATE_OK; _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); 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"); 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("is_build_aborted"), &TerrainChunk::is_build_aborted);
ClassDB::bind_method(D_METHOD("get_dirty"), &TerrainChunk::get_dirty); ClassDB::bind_method(D_METHOD("get_dirty"), &TerrainChunk::get_dirty);

View File

@ -92,6 +92,9 @@ public:
bool get_is_immediate_build() const; bool get_is_immediate_build() const;
void set_is_immediate_build(const bool value); 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_build_aborted() const;
bool is_in_tree() const; bool is_in_tree() const;
@ -369,6 +372,7 @@ protected:
bool _is_generating; bool _is_generating;
bool _is_immediate_build; bool _is_immediate_build;
bool _is_terrain_generated;
bool _dirty; bool _dirty;
int _state; 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) { void TerrainWorld::chunk_generate(Ref<TerrainChunk> chunk) {
ERR_FAIL_COND(!chunk.is_valid()); ERR_FAIL_COND(!chunk.is_valid());
if (!chunk->get_is_terrain_generated()) {
if (has_method("_prepare_chunk_for_generation")) { if (has_method("_prepare_chunk_for_generation")) {
call("_prepare_chunk_for_generation", chunk); call("_prepare_chunk_for_generation", chunk);
} }
call("_generate_chunk", chunk); call("_generate_chunk", chunk);
chunk->set_is_terrain_generated(true);
}
chunk->build(); chunk->build();
} }