Implement TerrainWorldChunkDataManagerStaticFolderResources.

This commit is contained in:
Relintai 2025-04-07 22:01:12 +02:00
parent bb32eab4ca
commit 32487af081
2 changed files with 135 additions and 13 deletions

View File

@ -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<TerrainChunk> TerrainWorldChunkDataManagerStaticFolderResources::_load_chunk(const Vector2i &p_chunk_position) {
String fn = get_chunk_file_path(p_chunk_position);
if (!FileAccess::exists(fn)) {
return Ref<TerrainChunk>();
}
return ResourceLoader::load(fn, "TerrainChunk");
}
Vector<Vector2i> TerrainWorldChunkDataManagerStaticFolderResources::_get_available_chunk_list() {
Vector<Vector2i> 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<String> 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<TerrainChunk> &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<TerrainChunk> &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<Vector2i> 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<TerrainChunk> &p_chunk) {
save_chunk(p_chunk);
}
void TerrainWorldChunkDataManagerStaticFolderResources::_on_world_chunk_removed(const Ref<TerrainChunk> &p_chunk) {
}
void TerrainWorldChunkDataManagerStaticFolderResources::_on_world_chunk_added(const Ref<TerrainChunk> &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");
}

View File

@ -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<TerrainChunk> _load_chunk(const Vector2i &p_chunk_position);
virtual Vector<Vector2i> _get_available_chunk_list();
// Save
virtual void _save_chunk(const Ref<TerrainChunk> &p_chunk);
// Delete
virtual void _delete_chunk_data_at(const Vector2i &p_chunk_position);
virtual void _delete_chunk_data(const Ref<TerrainChunk> &p_chunk);
virtual void _delete_all_chunk_data();
// Callbacks
virtual void _on_world_chunk_created(const Ref<TerrainChunk> &p_chunk);
virtual void _on_world_chunk_removed(const Ref<TerrainChunk> &p_chunk);
virtual void _on_world_chunk_added(const Ref<TerrainChunk> &p_chunk);
TerrainWorldChunkDataManagerStaticFolderResources();
~TerrainWorldChunkDataManagerStaticFolderResources();
@ -48,8 +69,7 @@ protected:
static void _bind_methods();
private:
int _floor_position;
Dictionary _channel_map;
String _chunks_path;
};
#endif