mirror of
https://github.com/Relintai/godot_voxel.git
synced 2024-11-19 02:47:18 +01:00
Rename VoxelMesherSmooth => VoxelMesherTransvoxel
This commit is contained in:
parent
d53e43f115
commit
35ff5fd546
@ -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];
|
||||||
|
@ -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 {
|
||||||
|
@ -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>();
|
||||||
|
@ -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()));
|
||||||
}
|
}
|
@ -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);
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user