From 32487af081b4311e82eb45fc3f5be93c2de790cf Mon Sep 17 00:00:00 2001 From: Relintai Date: Mon, 7 Apr 2025 22:01:12 +0200 Subject: [PATCH] Implement TerrainWorldChunkDataManagerStaticFolderResources. --- ...k_data_manager_static_folder_resources.cpp | 124 ++++++++++++++++-- ...unk_data_manager_static_folder_resources.h | 24 +++- 2 files changed, 135 insertions(+), 13 deletions(-) diff --git a/modules/terraman/chunk_data_managers/terrain_world_chunk_data_manager_static_folder_resources.cpp b/modules/terraman/chunk_data_managers/terrain_world_chunk_data_manager_static_folder_resources.cpp index c337d10fc..ee0a117f8 100644 --- a/modules/terraman/chunk_data_managers/terrain_world_chunk_data_manager_static_folder_resources.cpp +++ b/modules/terraman/chunk_data_managers/terrain_world_chunk_data_manager_static_folder_resources.cpp @@ -33,6 +33,116 @@ #include "../world/terrain_chunk.h" +#include "core/os/dir_access.h" + +String TerrainWorldChunkDataManagerStaticFolderResources::get_chunks_path() const { + return _chunks_path; +} +void TerrainWorldChunkDataManagerStaticFolderResources::set_chunks_path(const String &p_chunks_path) { + _chunks_path = p_chunks_path; +} + +String TerrainWorldChunkDataManagerStaticFolderResources::get_chunk_file_path(const Vector2i &p_chunk_position) const { + return _chunks_path.append_path(String("chunk_") + String::num_int64(p_chunk_position.x) + "_" + String::num_int64(p_chunk_position.y) + ".tres"); +} + +// Load +Ref TerrainWorldChunkDataManagerStaticFolderResources::_load_chunk(const Vector2i &p_chunk_position) { + String fn = get_chunk_file_path(p_chunk_position); + + if (!FileAccess::exists(fn)) { + return Ref(); + } + + return ResourceLoader::load(fn, "TerrainChunk"); +} +Vector TerrainWorldChunkDataManagerStaticFolderResources::_get_available_chunk_list() { + Vector ret; + + DirAccess *dir = DirAccess::open(_chunks_path); + + ERR_FAIL_COND_V(!dir, ret); + + dir->list_dir_begin(); + + String f = dir->get_next(); + while (!f.empty()) { + if (dir->current_is_dir()) { + f = dir->get_next(); + continue; + } + + Vector fs = f.split("_", false); + + if (fs.size() != 3) { + f = dir->get_next(); + continue; + } + + if (fs[0] != "chunk") { + f = dir->get_next(); + continue; + } + + ret.push_back(Vector2i(fs[1].to_int(), fs[2].to_int())); + + f = dir->get_next(); + } + + dir->list_dir_end(); + + memdelete(dir); + + return ret; +} + +// Save +void TerrainWorldChunkDataManagerStaticFolderResources::_save_chunk(const Ref &p_chunk) { + String fn = get_chunk_file_path(Vector2i(p_chunk->get_position_x(), p_chunk->get_position_z())); + + ResourceSaver::save(fn, p_chunk); +} + +// Delete +void TerrainWorldChunkDataManagerStaticFolderResources::_delete_chunk_data_at(const Vector2i &p_chunk_position) { + String fn = get_chunk_file_path(p_chunk_position); + + DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + + if (da->file_exists(fn)) { + da->remove(fn); + } + + memdelete(da); +} +void TerrainWorldChunkDataManagerStaticFolderResources::_delete_chunk_data(const Ref &p_chunk) { + String fn = get_chunk_file_path(Vector2i(p_chunk->get_position_x(), p_chunk->get_position_z())); + + DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + + if (da->file_exists(fn)) { + da->remove(fn); + } + + memdelete(da); +} +void TerrainWorldChunkDataManagerStaticFolderResources::_delete_all_chunk_data() { + Vector available_chunks = get_available_chunk_list(); + + for (int i = 0; i < available_chunks.size(); ++i) { + delete_chunk_data_at(available_chunks[i]); + } +} + +// Callbacks +void TerrainWorldChunkDataManagerStaticFolderResources::_on_world_chunk_created(const Ref &p_chunk) { + save_chunk(p_chunk); +} +void TerrainWorldChunkDataManagerStaticFolderResources::_on_world_chunk_removed(const Ref &p_chunk) { +} +void TerrainWorldChunkDataManagerStaticFolderResources::_on_world_chunk_added(const Ref &p_chunk) { +} + TerrainWorldChunkDataManagerStaticFolderResources::TerrainWorldChunkDataManagerStaticFolderResources() { } @@ -40,15 +150,7 @@ TerrainWorldChunkDataManagerStaticFolderResources::~TerrainWorldChunkDataManager } void TerrainWorldChunkDataManagerStaticFolderResources::_bind_methods() { - /* - ClassDB::bind_method(D_METHOD("get_floor_position"), &TerrainWorldChunkDataManagerStaticFolderResources::get_floor_position); - ClassDB::bind_method(D_METHOD("set_floor_position", "value"), &TerrainWorldChunkDataManagerStaticFolderResources::set_floor_position); - ADD_PROPERTY(PropertyInfo(Variant::INT, "floor_position"), "set_floor_position", "get_floor_position"); - - ClassDB::bind_method(D_METHOD("get_channel_map"), &TerrainWorldChunkDataManagerStaticFolderResources::get_channel_map); - ClassDB::bind_method(D_METHOD("set_channel_map", "value"), &TerrainWorldChunkDataManagerStaticFolderResources::set_channel_map); - ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "channel_map"), "set_channel_map", "get_channel_map"); - - ClassDB::bind_method(D_METHOD("_generate_chunk", "chunk"), &TerrainWorldChunkDataManagerStaticFolderResources::_generate_chunk); - */ + ClassDB::bind_method(D_METHOD("get_chunks_path"), &TerrainWorldChunkDataManagerStaticFolderResources::get_chunks_path); + ClassDB::bind_method(D_METHOD("set_chunks_path", "value"), &TerrainWorldChunkDataManagerStaticFolderResources::set_chunks_path); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "chunks_path"), "set_chunks_path", "get_chunks_path"); } diff --git a/modules/terraman/chunk_data_managers/terrain_world_chunk_data_manager_static_folder_resources.h b/modules/terraman/chunk_data_managers/terrain_world_chunk_data_manager_static_folder_resources.h index dd41720ba..d2714217d 100644 --- a/modules/terraman/chunk_data_managers/terrain_world_chunk_data_manager_static_folder_resources.h +++ b/modules/terraman/chunk_data_managers/terrain_world_chunk_data_manager_static_folder_resources.h @@ -40,6 +40,27 @@ class TerrainWorldChunkDataManagerStaticFolderResources : public TerrainWorldChu GDCLASS(TerrainWorldChunkDataManagerStaticFolderResources, TerrainWorldChunkDataManager); public: + String get_chunks_path() const; + void set_chunks_path(const String &p_chunks_path); + + String get_chunk_file_path(const Vector2i &p_chunk_position) const; + + // Load + virtual Ref _load_chunk(const Vector2i &p_chunk_position); + virtual Vector _get_available_chunk_list(); + + // Save + virtual void _save_chunk(const Ref &p_chunk); + + // Delete + virtual void _delete_chunk_data_at(const Vector2i &p_chunk_position); + virtual void _delete_chunk_data(const Ref &p_chunk); + virtual void _delete_all_chunk_data(); + + // Callbacks + virtual void _on_world_chunk_created(const Ref &p_chunk); + virtual void _on_world_chunk_removed(const Ref &p_chunk); + virtual void _on_world_chunk_added(const Ref &p_chunk); TerrainWorldChunkDataManagerStaticFolderResources(); ~TerrainWorldChunkDataManagerStaticFolderResources(); @@ -48,8 +69,7 @@ protected: static void _bind_methods(); private: - int _floor_position; - Dictionary _channel_map; + String _chunks_path; }; #endif