mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-04-14 23:58:26 +02:00
Implement TerrainWorldChunkDataManagerStaticFolderResources.
This commit is contained in:
parent
bb32eab4ca
commit
32487af081
@ -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");
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user