diff --git a/modules/terraman/doc_classes/TerrainWorld.xml b/modules/terraman/doc_classes/TerrainWorld.xml
index 8d5a3868a..c8964c03b 100644
--- a/modules/terraman/doc_classes/TerrainWorld.xml
+++ b/modules/terraman/doc_classes/TerrainWorld.xml
@@ -89,6 +89,13 @@
+
+
+
+
+
+
+
@@ -96,6 +103,13 @@
+
+
+
+
+
+
+
@@ -456,6 +470,8 @@
+
+
diff --git a/modules/terraman/world/terrain_world.cpp b/modules/terraman/world/terrain_world.cpp
index f38cdc03a..35ec06d36 100644
--- a/modules/terraman/world/terrain_world.cpp
+++ b/modules/terraman/world/terrain_world.cpp
@@ -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 &level_g
_level_generator = level_generator;
}
+Ref TerrainWorld::get_world_chunk_data_manager() const {
+ return _world_chunk_data_manager;
+}
+void TerrainWorld::set_world_chunk_data_manager(const Ref &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 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 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 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 TerrainWorld::chunk_get_or_create(int x, int z) {
Ref 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 TerrainWorld::chunk_get_or_load(const int x, const int z) {
+ Ref 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 TerrainWorld::chunk_load(const int x, const int z) {
+ Ref 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 TerrainWorld::chunk_create(const int x, const int z) {
Ref c;
c = call("_create_chunk", x, z, Ref());
+ 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);
diff --git a/modules/terraman/world/terrain_world.h b/modules/terraman/world/terrain_world.h
index b89dc4475..bb9adb055 100644
--- a/modules/terraman/world/terrain_world.h
+++ b/modules/terraman/world/terrain_world.h
@@ -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 get_level_generator() const;
void set_level_generator(const Ref &level_generator);
+ Ref get_world_chunk_data_manager() const;
+ void set_world_chunk_data_manager(const Ref &p_data_manager);
+
float get_voxel_scale() const;
void set_voxel_scale(const float value);
@@ -158,6 +162,8 @@ public:
void chunks_clear();
Ref chunk_get_or_create(const int x, const int z);
+ Ref chunk_get_or_load(const int x, const int z);
+ Ref chunk_load(const int x, const int z);
Ref chunk_create(const int x, const int z);
void chunk_setup(Ref chunk);
@@ -286,6 +292,7 @@ private:
Ref _library;
Ref _level_generator;
+ Ref _world_chunk_data_manager;
float _voxel_scale;
int _chunk_spawn_range;