Rename VoxelMesherSmooth => VoxelMesherTransvoxel

This commit is contained in:
Marc Gilleron 2019-04-21 14:47:50 +01:00
parent d53e43f115
commit 35ff5fd546
7 changed files with 26 additions and 24 deletions

View File

@ -8,13 +8,14 @@
namespace dmc { namespace dmc {
// Faster than SurfaceTool, only does what is needed // Faster than SurfaceTool, only does what is needed to build a smooth mesh
class MeshBuilder { class MeshBuilder {
public: public:
inline void add_vertex(Vector3 position, Vector3 normal) { inline void add_vertex(Vector3 position, Vector3 normal) {
int i = 0; int i = 0;
// TODO Debug this to see if it's effectively indexing
if (_position_to_index.find(position) != _position_to_index.end()) { if (_position_to_index.find(position) != _position_to_index.end()) {
i = _position_to_index[position]; i = _position_to_index[position];

View File

@ -3,6 +3,7 @@
#include "marching_cubes_tables.h" #include "marching_cubes_tables.h"
#include "mesh_builder.h" #include "mesh_builder.h"
// Dual marching cubes
// Algorithm taken from https://www.volume-gfx.com/volume-rendering/dual-marching-cubes/ // Algorithm taken from https://www.volume-gfx.com/volume-rendering/dual-marching-cubes/
namespace dmc { namespace dmc {

View File

@ -1,6 +1,6 @@
#include "register_types.h" #include "register_types.h"
#include "dmc/voxel_mesher_dmc.h" #include "dmc/voxel_mesher_dmc.h"
#include "transvoxel/voxel_mesher_smooth.h" #include "transvoxel/voxel_mesher_transvoxel.h"
#include "voxel_box_mover.h" #include "voxel_box_mover.h"
#include "voxel_buffer.h" #include "voxel_buffer.h"
#include "voxel_library.h" #include "voxel_library.h"
@ -21,7 +21,7 @@ void register_voxel_types() {
ClassDB::register_class<VoxelProvider>(); ClassDB::register_class<VoxelProvider>();
ClassDB::register_class<VoxelProviderTest>(); ClassDB::register_class<VoxelProviderTest>();
ClassDB::register_class<VoxelProviderImage>(); ClassDB::register_class<VoxelProviderImage>();
ClassDB::register_class<VoxelMesherSmooth>(); ClassDB::register_class<VoxelMesherTransvoxel>();
ClassDB::register_class<VoxelBoxMover>(); ClassDB::register_class<VoxelBoxMover>();
ClassDB::register_class<VoxelMesherDMC>(); ClassDB::register_class<VoxelMesherDMC>();

View File

@ -1,5 +1,5 @@
#include "voxel_mesher_smooth.h" #include "voxel_mesher_transvoxel.h"
#include "transvoxel_tables.cpp" #include "transvoxel_tables.cpp"
#include <core/os/os.h> #include <core/os/os.h>
@ -58,28 +58,28 @@ void copy_to(PoolVector<T> &to, Vector<T> &from) {
} }
} }
VoxelMesherSmooth::ReuseCell::ReuseCell() { VoxelMesherTransvoxel::ReuseCell::ReuseCell() {
case_index = 0; case_index = 0;
for (unsigned int i = 0; i < 4; ++i) { for (unsigned int i = 0; i < 4; ++i) {
vertices[i] = -1; vertices[i] = -1;
} }
} }
VoxelMesherSmooth::VoxelMesherSmooth() { VoxelMesherTransvoxel::VoxelMesherTransvoxel() {
} }
Ref<ArrayMesh> VoxelMesherSmooth::build_mesh(Ref<VoxelBuffer> voxels_ref, unsigned int channel, Ref<ArrayMesh> mesh) { Ref<ArrayMesh> VoxelMesherTransvoxel::build_mesh(Ref<VoxelBuffer> voxels_ref, unsigned int channel, Ref<ArrayMesh> mesh) {
ERR_FAIL_COND_V(voxels_ref.is_null(), Ref<ArrayMesh>()); ERR_FAIL_COND_V(voxels_ref.is_null(), Ref<ArrayMesh>());
VoxelBuffer &buffer = **voxels_ref; VoxelBuffer &buffer = **voxels_ref;
Array surfaces = build(buffer, channel); Array surfaces = build(buffer, channel);
if(mesh.is_null()) if (mesh.is_null())
mesh.instance(); mesh.instance();
//int surface = mesh->get_surface_count(); //int surface = mesh->get_surface_count();
for(int i = 0; i < surfaces.size(); ++i) { for (int i = 0; i < surfaces.size(); ++i) {
Array arrays = surfaces[i]; Array arrays = surfaces[i];
mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, arrays); mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, arrays);
//mesh->surface_set_material(surface, _materials[i]); //mesh->surface_set_material(surface, _materials[i]);
@ -88,7 +88,7 @@ Ref<ArrayMesh> VoxelMesherSmooth::build_mesh(Ref<VoxelBuffer> voxels_ref, unsign
return mesh; return mesh;
} }
Array VoxelMesherSmooth::build(const VoxelBuffer &voxels, unsigned int channel) { Array VoxelMesherTransvoxel::build(const VoxelBuffer &voxels, unsigned int channel) {
ERR_FAIL_COND_V(channel >= VoxelBuffer::MAX_CHANNELS, Array()); ERR_FAIL_COND_V(channel >= VoxelBuffer::MAX_CHANNELS, Array());
@ -134,11 +134,11 @@ Array VoxelMesherSmooth::build(const VoxelBuffer &voxels, unsigned int channel)
return surfaces; return surfaces;
} }
void VoxelMesherSmooth::build_internal(const VoxelBuffer &voxels, unsigned int channel) { void VoxelMesherTransvoxel::build_internal(const VoxelBuffer &voxels, unsigned int channel) {
// Each 2x2 voxel group is a "cell" // Each 2x2 voxel group is a "cell"
if(voxels.is_uniform(channel)) { if (voxels.is_uniform(channel)) {
// Nothing to extract, because constant isolevels never cross the threshold and describe no surface // Nothing to extract, because constant isolevels never cross the threshold and describe no surface
return; return;
} }
@ -381,18 +381,18 @@ void VoxelMesherSmooth::build_internal(const VoxelBuffer &voxels, unsigned int c
//OS::get_singleton()->print("\n"); //OS::get_singleton()->print("\n");
} }
VoxelMesherSmooth::ReuseCell &VoxelMesherSmooth::get_reuse_cell(Vector3i pos) { VoxelMesherTransvoxel::ReuseCell &VoxelMesherTransvoxel::get_reuse_cell(Vector3i pos) {
int j = pos.z & 1; int j = pos.z & 1;
int i = pos.y * m_block_size.y + pos.x; int i = pos.y * m_block_size.y + pos.x;
return m_cache[j].write[i]; return m_cache[j].write[i];
} }
void VoxelMesherSmooth::emit_vertex(Vector3 primary, Vector3 normal) { void VoxelMesherTransvoxel::emit_vertex(Vector3 primary, Vector3 normal) {
m_output_vertices.push_back(primary - PAD.to_vec3()); m_output_vertices.push_back(primary - PAD.to_vec3());
m_output_normals.push_back(normal); m_output_normals.push_back(normal);
} }
void VoxelMesherSmooth::_bind_methods() { void VoxelMesherTransvoxel::_bind_methods() {
ClassDB::bind_method(D_METHOD("build", "voxels", "channel", "existing_mesh"), &VoxelMesherSmooth::build_mesh, DEFVAL(Variant())); ClassDB::bind_method(D_METHOD("build", "voxels", "channel", "existing_mesh"), &VoxelMesherTransvoxel::build_mesh, DEFVAL(Variant()));
} }

View File

@ -4,11 +4,11 @@
#include "../voxel_buffer.h" #include "../voxel_buffer.h"
#include <scene/resources/mesh.h> #include <scene/resources/mesh.h>
class VoxelMesherSmooth : public Reference { class VoxelMesherTransvoxel : public Reference {
GDCLASS(VoxelMesherSmooth, Reference) GDCLASS(VoxelMesherTransvoxel, Reference)
public: public:
VoxelMesherSmooth(); VoxelMesherTransvoxel();
Ref<ArrayMesh> build_mesh(Ref<VoxelBuffer> voxels_ref, unsigned int channel, Ref<ArrayMesh> mesh = Ref<ArrayMesh>()); Ref<ArrayMesh> build_mesh(Ref<VoxelBuffer> voxels_ref, unsigned int channel, Ref<ArrayMesh> mesh = Ref<ArrayMesh>());
Array build(const VoxelBuffer &voxels, unsigned int channel); Array build(const VoxelBuffer &voxels, unsigned int channel);

View File

@ -6,7 +6,7 @@
#include <core/hash_map.h> #include <core/hash_map.h>
#include <scene/main/node.h> #include <scene/main/node.h>
// Infinite voxel storage by means of octants like Gridmap // Infinite voxel storage by means of octants like Gridmap, within a constant LOD
class VoxelMap : public Reference { class VoxelMap : public Reference {
GDCLASS(VoxelMap, Reference) GDCLASS(VoxelMap, Reference)
public: public:
@ -60,10 +60,10 @@ public:
template <typename Action_T> template <typename Action_T>
void remove_block(Vector3i bpos, Action_T pre_delete) { void remove_block(Vector3i bpos, Action_T pre_delete) {
if(_last_accessed_block && _last_accessed_block->pos == bpos) if (_last_accessed_block && _last_accessed_block->pos == bpos)
_last_accessed_block = NULL; _last_accessed_block = NULL;
VoxelBlock **pptr = _blocks.getptr(bpos); VoxelBlock **pptr = _blocks.getptr(bpos);
if(pptr) { if (pptr) {
VoxelBlock *block = *pptr; VoxelBlock *block = *pptr;
ERR_FAIL_COND(block == NULL); ERR_FAIL_COND(block == NULL);
pre_delete(block); pre_delete(block);

View File

@ -7,7 +7,7 @@
#include "voxel_buffer.h" #include "voxel_buffer.h"
#include "voxel_mesher.h" #include "voxel_mesher.h"
#include "transvoxel/voxel_mesher_smooth.h" #include "transvoxel/voxel_mesher_transvoxel.h"
class VoxelMeshUpdater { class VoxelMeshUpdater {
public: public:
@ -77,7 +77,7 @@ private:
Mutex *_output_mutex; Mutex *_output_mutex;
Ref<VoxelMesher> _model_mesher; Ref<VoxelMesher> _model_mesher;
Ref<VoxelMesherSmooth> _smooth_mesher; Ref<VoxelMesherTransvoxel> _smooth_mesher;
Input _input; Input _input;
Output _output; Output _output;