Now TerrainWorld uses TerrainWorldChunkDataManagers if they are available.

This commit is contained in:
Relintai 2025-04-07 12:53:51 +02:00
parent e88789ba9e
commit 5dbfdac48e
3 changed files with 107 additions and 2 deletions

View File

@ -89,6 +89,13 @@
<description>
</description>
</method>
<method name="chunk_get_or_load">
<return type="TerrainChunk" />
<argument index="0" name="x" type="int" />
<argument index="1" name="z" type="int" />
<description>
</description>
</method>
<method name="chunk_has" qualifiers="const">
<return type="bool" />
<argument index="0" name="x" type="int" />
@ -96,6 +103,13 @@
<description>
</description>
</method>
<method name="chunk_load">
<return type="TerrainChunk" />
<argument index="0" name="x" type="int" />
<argument index="1" name="z" type="int" />
<description>
</description>
</method>
<method name="chunk_remove">
<return type="TerrainChunk" />
<argument index="0" name="x" type="int" />
@ -456,6 +470,8 @@
</member>
<member name="voxel_structures" type="Array" setter="voxel_structures_set" getter="voxel_structures_get" default="[ ]">
</member>
<member name="world_chunk_data_manager" type="TerrainWorldChunkDataManager" setter="set_world_chunk_data_manager" getter="get_world_chunk_data_manager">
</member>
<member name="world_height" type="float" setter="set_world_height" getter="get_world_height" default="256.0">
</member>
</members>

View File

@ -42,6 +42,8 @@
#include "../defines.h"
#include "../chunk_data_managers/terrain_world_chunk_data_manager.h"
#include "modules/modules_enabled.gen.h"
#ifdef MODULE_PROPS_ENABLED
@ -158,6 +160,13 @@ void TerrainWorld::set_level_generator(const Ref<TerrainLevelGenerator> &level_g
_level_generator = level_generator;
}
Ref<TerrainWorldChunkDataManager> TerrainWorld::get_world_chunk_data_manager() const {
return _world_chunk_data_manager;
}
void TerrainWorld::set_world_chunk_data_manager(const Ref<TerrainWorldChunkDataManager> &p_data_manager) {
_world_chunk_data_manager = p_data_manager;
}
float TerrainWorld::get_voxel_scale() const {
return _voxel_scale;
}
@ -324,6 +333,10 @@ void TerrainWorld::chunk_add(Ref<TerrainChunk> chunk, const int x, const int z)
}
}
if (_world_chunk_data_manager.is_valid()) {
_world_chunk_data_manager->on_world_chunk_added(chunk);
}
if (has_method("_chunk_added")) {
call("_chunk_added", chunk);
}
@ -381,6 +394,10 @@ Ref<TerrainChunk> TerrainWorld::chunk_remove(const int x, const int z) {
_chunks.erase(pos);
if (_world_chunk_data_manager.is_valid()) {
_world_chunk_data_manager->on_world_chunk_removed(chunk);
}
emit_signal("chunk_removed", chunk);
return chunk;
@ -410,6 +427,10 @@ Ref<TerrainChunk> TerrainWorld::chunk_remove_index(const int index) {
//never remove from this here
//_generating.erase(chunk);
if (_world_chunk_data_manager.is_valid()) {
_world_chunk_data_manager->on_world_chunk_removed(chunk);
}
emit_signal("chunk_removed", chunk);
return chunk;
@ -430,6 +451,10 @@ void TerrainWorld::chunks_clear() {
chunk->exit_tree();
if (_world_chunk_data_manager.is_valid()) {
_world_chunk_data_manager->on_world_chunk_removed(chunk);
}
emit_signal("chunk_removed", chunk);
}
@ -454,8 +479,55 @@ void TerrainWorld::chunks_clear() {
Ref<TerrainChunk> TerrainWorld::chunk_get_or_create(int x, int z) {
Ref<TerrainChunk> chunk = chunk_get(x, z);
if (!chunk.is_valid()) {
chunk = chunk_create(x, z);
if (chunk.is_valid()) {
return chunk;
}
// Try to load first
if (_world_chunk_data_manager.is_valid()) {
chunk = _world_chunk_data_manager->load_chunk(Vector2i(x, z));
if (chunk.is_valid()) {
chunk_add(chunk, x, z);
return chunk;
}
}
chunk = chunk_create(x, z);
return chunk;
}
Ref<TerrainChunk> TerrainWorld::chunk_get_or_load(const int x, const int z) {
Ref<TerrainChunk> chunk = chunk_get(x, z);
if (chunk.is_valid()) {
return chunk;
}
// Try to load first
if (_world_chunk_data_manager.is_valid()) {
chunk = _world_chunk_data_manager->load_chunk(Vector2i(x, z));
if (chunk.is_valid()) {
chunk_add(chunk, x, z);
return chunk;
}
}
return chunk;
}
Ref<TerrainChunk> TerrainWorld::chunk_load(const int x, const int z) {
Ref<TerrainChunk> chunk;
if (_world_chunk_data_manager.is_valid()) {
chunk = _world_chunk_data_manager->load_chunk(Vector2i(x, z));
if (chunk.is_valid()) {
chunk_add(chunk, x, z);
return chunk;
}
}
return chunk;
@ -465,6 +537,10 @@ Ref<TerrainChunk> TerrainWorld::chunk_create(const int x, const int z) {
Ref<TerrainChunk> c;
c = call("_create_chunk", x, z, Ref<TerrainChunk>());
if (_world_chunk_data_manager.is_valid()) {
_world_chunk_data_manager->on_world_chunk_created(c);
}
generation_queue_add_to(c);
return c;
@ -1638,6 +1714,10 @@ void TerrainWorld::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_level_generator", "level_generator"), &TerrainWorld::set_level_generator);
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "level_generator", PROPERTY_HINT_RESOURCE_TYPE, "TerrainLevelGenerator"), "set_level_generator", "get_level_generator");
ClassDB::bind_method(D_METHOD("get_world_chunk_data_manager"), &TerrainWorld::get_world_chunk_data_manager);
ClassDB::bind_method(D_METHOD("set_world_chunk_data_manager", "level_generator"), &TerrainWorld::set_world_chunk_data_manager);
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "world_chunk_data_manager", PROPERTY_HINT_RESOURCE_TYPE, "TerrainWorldChunkDataManager"), "set_world_chunk_data_manager", "get_world_chunk_data_manager");
ClassDB::bind_method(D_METHOD("get_voxel_scale"), &TerrainWorld::get_voxel_scale);
ClassDB::bind_method(D_METHOD("set_voxel_scale", "value"), &TerrainWorld::set_voxel_scale);
ADD_PROPERTY(PropertyInfo(Variant::REAL, "voxel_scale"), "set_voxel_scale", "get_voxel_scale");
@ -1714,6 +1794,8 @@ void TerrainWorld::_bind_methods() {
BIND_VMETHOD(MethodInfo("_generate_chunk", PropertyInfo(Variant::OBJECT, "chunk", PROPERTY_HINT_RESOURCE_TYPE, "TerrainChunk")));
ClassDB::bind_method(D_METHOD("chunk_get_or_create", "x", "z"), &TerrainWorld::chunk_get_or_create);
ClassDB::bind_method(D_METHOD("chunk_get_or_load", "x", "z"), &TerrainWorld::chunk_get_or_load);
ClassDB::bind_method(D_METHOD("chunk_load", "x", "z"), &TerrainWorld::chunk_load);
ClassDB::bind_method(D_METHOD("chunk_create", "x", "z"), &TerrainWorld::chunk_create);
ClassDB::bind_method(D_METHOD("chunk_setup", "chunk"), &TerrainWorld::chunk_setup);

View File

@ -55,6 +55,7 @@ class TerrainStructure;
class TerrainChunk;
class PropData;
class MeshDataResource;
class TerrainWorldChunkDataManager;
class TerrainWorld : public Spatial {
GDCLASS(TerrainWorld, Spatial);
@ -108,6 +109,9 @@ public:
Ref<TerrainLevelGenerator> get_level_generator() const;
void set_level_generator(const Ref<TerrainLevelGenerator> &level_generator);
Ref<TerrainWorldChunkDataManager> get_world_chunk_data_manager() const;
void set_world_chunk_data_manager(const Ref<TerrainWorldChunkDataManager> &p_data_manager);
float get_voxel_scale() const;
void set_voxel_scale(const float value);
@ -158,6 +162,8 @@ public:
void chunks_clear();
Ref<TerrainChunk> chunk_get_or_create(const int x, const int z);
Ref<TerrainChunk> chunk_get_or_load(const int x, const int z);
Ref<TerrainChunk> chunk_load(const int x, const int z);
Ref<TerrainChunk> chunk_create(const int x, const int z);
void chunk_setup(Ref<TerrainChunk> chunk);
@ -286,6 +292,7 @@ private:
Ref<TerrainLibrary> _library;
Ref<TerrainLevelGenerator> _level_generator;
Ref<TerrainWorldChunkDataManager> _world_chunk_data_manager;
float _voxel_scale;
int _chunk_spawn_range;