Add depth format to region files stream (untested)
parent
2d1a53048c
commit
4a359a3dbd
|
@ -7,7 +7,8 @@
|
|||
#include <algorithm>
|
||||
|
||||
namespace {
|
||||
const uint8_t FORMAT_VERSION = 1;
|
||||
const uint8_t FORMAT_VERSION = 2;
|
||||
const uint8_t FORMAT_VERSION_LEGACY_1 = 1;
|
||||
const char *FORMAT_REGION_MAGIC = "VXR_";
|
||||
const char *META_FILE_NAME = "meta.vxrm";
|
||||
const int MAGIC_AND_VERSION_SIZE = 4 + 1;
|
||||
|
@ -20,6 +21,10 @@ VoxelStreamRegionFiles::VoxelStreamRegionFiles() {
|
|||
_meta.region_size_po2 = 4;
|
||||
_meta.sector_size = 512; // next_power_of_2(_meta.block_size.volume() / 10) // based on compression ratios
|
||||
_meta.lod_count = 1;
|
||||
|
||||
for (unsigned int i = 0; i < _meta.channel_depths.size(); ++i) {
|
||||
_meta.channel_depths[i] = VoxelBuffer::DEFAULT_CHANNEL_DEPTH;
|
||||
}
|
||||
}
|
||||
|
||||
VoxelStreamRegionFiles::~VoxelStreamRegionFiles() {
|
||||
|
@ -183,6 +188,11 @@ void VoxelStreamRegionFiles::_immerge_block(Ref<VoxelBuffer> voxel_buffer, Vecto
|
|||
ERR_FAIL_COND(err != OK);
|
||||
}
|
||||
|
||||
// Verify format
|
||||
for (unsigned int i = 0; i < VoxelBuffer::MAX_CHANNELS; ++i) {
|
||||
ERR_FAIL_COND(voxel_buffer->get_channel_depth(i) != _meta.channel_depths[i]);
|
||||
}
|
||||
|
||||
Vector3i block_pos = get_block_position_from_voxels(origin_in_voxels) >> lod;
|
||||
Vector3i region_pos = get_region_position_from_blocks(block_pos);
|
||||
Vector3i block_rpos = block_pos.wrap(region_size);
|
||||
|
@ -410,6 +420,14 @@ static bool from_json_varray(Array a, Vector3i &v) {
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool depth_from_json_variant(Variant &v, VoxelBuffer::Depth &d) {
|
||||
uint8_t n;
|
||||
ERR_FAIL_COND_V(!u8_from_json_variant(v, n), false);
|
||||
ERR_FAIL_INDEX_V(n, VoxelBuffer::DEPTH_COUNT, false);
|
||||
d = (VoxelBuffer::Depth)n;
|
||||
return true;
|
||||
}
|
||||
|
||||
Error VoxelStreamRegionFiles::save_meta() {
|
||||
|
||||
ERR_FAIL_COND_V(_directory_path == "", ERR_INVALID_PARAMETER);
|
||||
|
@ -421,6 +439,13 @@ Error VoxelStreamRegionFiles::save_meta() {
|
|||
d["lod_count"] = _meta.lod_count;
|
||||
d["sector_size"] = _meta.sector_size;
|
||||
|
||||
Array channel_depths;
|
||||
channel_depths.resize(_meta.channel_depths.size());
|
||||
for (unsigned int i = 0; i < _meta.channel_depths.size(); ++i) {
|
||||
channel_depths[i] = _meta.channel_depths[i];
|
||||
}
|
||||
d["channel_depths"] = channel_depths;
|
||||
|
||||
String json = JSON::print(d, "\t", true);
|
||||
|
||||
// Make sure the directory exists
|
||||
|
@ -449,6 +474,19 @@ Error VoxelStreamRegionFiles::save_meta() {
|
|||
return OK;
|
||||
}
|
||||
|
||||
static void migrate_region_meta_data(Dictionary &data) {
|
||||
|
||||
if (data["version"] == Variant(FORMAT_VERSION_LEGACY_1)) {
|
||||
Array depths;
|
||||
depths.resize(VoxelBuffer::MAX_CHANNELS);
|
||||
for (int i = 0; i < depths.size(); ++i) {
|
||||
depths[i] = VoxelBuffer::DEFAULT_CHANNEL_DEPTH;
|
||||
}
|
||||
data["channel_depths"] = depths;
|
||||
data["version"] = FORMAT_VERSION;
|
||||
}
|
||||
}
|
||||
|
||||
Error VoxelStreamRegionFiles::load_meta() {
|
||||
|
||||
ERR_FAIL_COND_V(_directory_path == "", ERR_INVALID_PARAMETER);
|
||||
|
@ -482,6 +520,7 @@ Error VoxelStreamRegionFiles::load_meta() {
|
|||
}
|
||||
|
||||
Dictionary d = res;
|
||||
migrate_region_meta_data(d);
|
||||
Meta meta;
|
||||
ERR_FAIL_COND_V(!u8_from_json_variant(d["version"], meta.version), ERR_PARSE_ERROR);
|
||||
ERR_FAIL_COND_V(!u8_from_json_variant(d["block_size_po2"], meta.block_size_po2), ERR_PARSE_ERROR);
|
||||
|
@ -490,6 +529,13 @@ Error VoxelStreamRegionFiles::load_meta() {
|
|||
ERR_FAIL_COND_V(!s32_from_json_variant(d["sector_size"], meta.sector_size), ERR_PARSE_ERROR);
|
||||
|
||||
ERR_FAIL_COND_V(meta.version < 0, ERR_PARSE_ERROR);
|
||||
|
||||
Array channel_depths_data = d["channel_depths"];
|
||||
ERR_FAIL_COND_V(channel_depths_data.size() != VoxelBuffer::MAX_CHANNELS, ERR_PARSE_ERROR);
|
||||
for (int i = 0; i < channel_depths_data.size(); ++i) {
|
||||
ERR_FAIL_COND_V(depth_from_json_variant(channel_depths_data[i], meta.channel_depths[i]), ERR_PARSE_ERROR);
|
||||
}
|
||||
|
||||
ERR_FAIL_COND_V(!check_meta(meta), ERR_INVALID_PARAMETER);
|
||||
|
||||
_meta = meta;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef VOXEL_STREAM_REGION_H
|
||||
#define VOXEL_STREAM_REGION_H
|
||||
|
||||
#include "../util/fixed_array.h"
|
||||
#include "voxel_stream_file.h"
|
||||
|
||||
class FileAccess;
|
||||
|
@ -83,6 +84,7 @@ private:
|
|||
uint8_t lod_count = 0;
|
||||
uint8_t block_size_po2 = 0; // How many voxels in a cubic block
|
||||
uint8_t region_size_po2 = 0; // How many blocks in one cubic region
|
||||
FixedArray<VoxelBuffer::Depth, VoxelBuffer::MAX_CHANNELS> channel_depths;
|
||||
int sector_size = 0; // Blocks are stored at offsets multiple of that size
|
||||
};
|
||||
|
||||
|
|
|
@ -48,6 +48,8 @@ public:
|
|||
DEPTH_COUNT
|
||||
};
|
||||
|
||||
static const Depth DEFAULT_CHANNEL_DEPTH = DEPTH_8_BIT;
|
||||
|
||||
VoxelBuffer();
|
||||
~VoxelBuffer();
|
||||
|
||||
|
@ -180,7 +182,7 @@ private:
|
|||
// Default value when data is null
|
||||
uint64_t defval = 0;
|
||||
|
||||
Depth depth = DEPTH_8_BIT;
|
||||
Depth depth = DEFAULT_CHANNEL_DEPTH;
|
||||
|
||||
uint32_t size_in_bytes = 0;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue