godot_voxel/streams/voxel_stream_block_files.h

57 lines
1.5 KiB
C
Raw Normal View History

#ifndef VOXEL_STREAM_BLOCK_FILES_H
#define VOXEL_STREAM_BLOCK_FILES_H
#include "../storage/voxel_buffer_internal.h"
#include "file_utils.h"
2021-02-01 14:25:25 -08:00
#include "voxel_stream.h"
class FileAccess;
2022-01-09 14:13:10 -08:00
namespace zylann::voxel {
// Loads and saves blocks to the filesystem, under a directory.
// Each block gets its own file, which may produce a lot of them, but it makes it simple to implement.
// This is a naive implementation and may be very slow in practice, so maybe it will be removed in the future.
2021-02-01 14:25:25 -08:00
class VoxelStreamBlockFiles : public VoxelStream {
GDCLASS(VoxelStreamBlockFiles, VoxelStream)
public:
VoxelStreamBlockFiles();
void load_voxel_block(VoxelStream::VoxelQueryData &q) override;
void save_voxel_block(VoxelStream::VoxelQueryData &q) override;
int get_used_channels_mask() const override;
String get_directory() const;
void set_directory(String dirpath);
int get_block_size_po2() const override;
protected:
static void _bind_methods();
private:
2022-01-09 14:13:10 -08:00
FileResult save_meta();
FileResult load_meta();
FileResult load_or_create_meta();
String get_block_file_path(const Vector3i &block_pos, unsigned int lod) const;
Vector3i get_block_position(const Vector3i &origin_in_voxels) const;
String _directory_path;
struct Meta {
uint8_t version = -1;
uint8_t lod_count = 0;
uint8_t block_size_po2 = 0; // How many voxels in a block
2022-01-09 14:13:10 -08:00
FixedArray<VoxelBufferInternal::Depth, VoxelBufferInternal::MAX_CHANNELS> channel_depths;
};
Meta _meta;
bool _meta_loaded = false;
bool _meta_saved = false;
};
2022-01-09 14:13:10 -08:00
} // namespace zylann::voxel
#endif // VOXEL_STREAM_BLOCK_FILES_H