godot_voxel/generators/voxel_generator.cpp
Marc Gilleron 61b27491f9 Initial implementation of binary search in Transvoxel.
It is very slow but seems to be working. It affines vertex positions,
but normals are not improved. Maybe more work will be done in the future
if that technique becomes more relevant.

Partly based on a prior experiment:
11f716f79d0ade59c0e9547a2333183e96b17b43
2022-03-27 21:36:30 +01:00

49 lines
1.5 KiB
C++

#include "voxel_generator.h"
#include "../constants/voxel_string_names.h"
#include "../storage/voxel_buffer_gd.h"
namespace zylann::voxel {
VoxelGenerator::VoxelGenerator() {}
VoxelGenerator::Result VoxelGenerator::generate_block(VoxelQueryData &input) {
return Result();
}
int VoxelGenerator::get_used_channels_mask() const {
return 0;
}
VoxelSingleValue VoxelGenerator::generate_single(Vector3i pos, unsigned int channel) {
// Default slow implementation
// TODO Optimize: a small part of the slowness is caused by the allocator.
// It is not a good use of `VoxelMemoryPool` for such a small size called so often.
// Instead it would be faster if it was a thread-local using the default allocator.
VoxelBufferInternal buffer;
buffer.create(1, 1, 1);
VoxelQueryData q{ buffer, pos, 0 };
generate_block(q);
VoxelSingleValue v;
if (channel == VoxelBufferInternal::CHANNEL_SDF) {
v.f = buffer.get_voxel_f(0, 0, 0, channel);
} else {
v.i = buffer.get_voxel(0, 0, 0, channel);
}
return v;
}
void VoxelGenerator::_b_generate_block(Ref<gd::VoxelBuffer> out_buffer, Vector3 origin_in_voxels, int lod) {
ERR_FAIL_COND(lod < 0);
ERR_FAIL_COND(lod >= int(constants::MAX_LOD));
ERR_FAIL_COND(out_buffer.is_null());
VoxelQueryData q = { out_buffer->get_buffer(), origin_in_voxels, uint8_t(lod) };
generate_block(q);
}
void VoxelGenerator::_bind_methods() {
ClassDB::bind_method(
D_METHOD("generate_block", "out_buffer", "origin_in_voxels", "lod"), &VoxelGenerator::_b_generate_block);
}
} // namespace zylann::voxel