mirror of
https://github.com/Relintai/voxelman.git
synced 2024-11-12 10:15:12 +01:00
Now voxelman can actually make meshes.
This commit is contained in:
parent
b50c9be4e7
commit
71de54d9a0
@ -1,7 +1,7 @@
|
|||||||
#ifndef VOXEL_TOOLS_H
|
#ifndef VOXEL_TOOLS_H
|
||||||
#define VOXEL_TOOLS_H
|
#define VOXEL_TOOLS_H
|
||||||
|
|
||||||
#include "core/resource.h"
|
#include "core/reference.h"
|
||||||
#include "core/color.h"
|
#include "core/color.h"
|
||||||
#include "core/math/vector2.h"
|
#include "core/math/vector2.h"
|
||||||
#include "core/math/vector3.h"
|
#include "core/math/vector3.h"
|
||||||
@ -25,8 +25,8 @@ const double PI = 3.141592653589793238463;
|
|||||||
class VoxelmanLibrary;
|
class VoxelmanLibrary;
|
||||||
class Voxel;
|
class Voxel;
|
||||||
|
|
||||||
class VoxelMesher : public Resource {
|
class VoxelMesher : public Reference {
|
||||||
GDCLASS(VoxelMesher, Resource);
|
GDCLASS(VoxelMesher, Reference);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Ref<VoxelmanLibrary> get_library() { return _library; }
|
Ref<VoxelmanLibrary> get_library() { return _library; }
|
||||||
|
@ -58,6 +58,11 @@ void TransvoxelTransitionCellData::_bind_methods() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Vector3 VoxelMesherTransvoxel::corner_id_to_vertex(int corner_id) const {
|
||||||
|
ERR_FAIL_COND_V(corner_id < 0 || corner_id > 8, Vector3());
|
||||||
|
|
||||||
|
return transvoxel_vertices[corner_id];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int VoxelMesherTransvoxel::get_regular_cell_class(int index) const {
|
int VoxelMesherTransvoxel::get_regular_cell_class(int index) const {
|
||||||
@ -85,10 +90,16 @@ int VoxelMesherTransvoxel::get_regular_vertex_data_second_vertex(int index1, int
|
|||||||
return vert2;
|
return vert2;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 VoxelMesherTransvoxel::get_regular_vertex_start_position(int index1, int index2) const {
|
Vector3 VoxelMesherTransvoxel::get_regular_vertex_first_position(int index1, int index2) const {
|
||||||
int vert1 = regularVertexData[index1][index2] & 0x000F;
|
int vert = regularVertexData[index1][index2] & 0x000F;
|
||||||
|
|
||||||
return transvoxel_vertices[vert1];
|
return transvoxel_vertices[vert];
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3 VoxelMesherTransvoxel::get_regular_vertex_second_position(int index1, int index2) const {
|
||||||
|
int vert = (regularVertexData[index1][index2] & 0x00F0) >> 4;
|
||||||
|
|
||||||
|
return transvoxel_vertices[vert];
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 VoxelMesherTransvoxel::get_regular_vertex_direction(int index1, int index2) const {
|
Vector3 VoxelMesherTransvoxel::get_regular_vertex_direction(int index1, int index2) const {
|
||||||
@ -130,15 +141,21 @@ int VoxelMesherTransvoxel::get_transition_vertex_data_second_vertex(int index1,
|
|||||||
return static_cast<int>(vert);
|
return static_cast<int>(vert);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 VoxelMesherTransvoxel::get_transition_vertex_start_position(int index1, int index2) const {
|
Vector3 VoxelMesherTransvoxel::get_transition_vertex_first_position(int index1, int index2) const {
|
||||||
int vert1 = regularVertexData[index1][index2] & 0x000F;
|
int vert = transitionVertexData[index1][index2] & 0x000F;
|
||||||
|
|
||||||
return transvoxel_vertices[vert1];
|
return transvoxel_vertices[vert];
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3 VoxelMesherTransvoxel::get_transition_vertex_second_position(int index1, int index2) const {
|
||||||
|
int vert = (transitionVertexData[index1][index2] & 0x00F0) >> 4;
|
||||||
|
|
||||||
|
return transvoxel_vertices[vert];
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 VoxelMesherTransvoxel::get_transition_vertex_direction(int index1, int index2) const {
|
Vector3 VoxelMesherTransvoxel::get_transition_vertex_direction(int index1, int index2) const {
|
||||||
int vert1 = regularVertexData[index1][index2] & 0x000F;
|
int vert1 = transitionVertexData[index1][index2] & 0x000F;
|
||||||
int vert2 = (regularVertexData[index1][index2] & 0x00F0) >> 4;
|
int vert2 = (transitionVertexData[index1][index2] & 0x00F0) >> 4;
|
||||||
|
|
||||||
return transvoxel_vertices[vert2] - transvoxel_vertices[vert1];
|
return transvoxel_vertices[vert2] - transvoxel_vertices[vert1];
|
||||||
}
|
}
|
||||||
@ -160,12 +177,15 @@ VoxelMesherTransvoxel::~VoxelMesherTransvoxel() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void VoxelMesherTransvoxel::_bind_methods() {
|
void VoxelMesherTransvoxel::_bind_methods() {
|
||||||
|
ClassDB::bind_method(D_METHOD("corner_id_to_vertex", "index1"), &VoxelMesherTransvoxel::corner_id_to_vertex);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_regular_cell_class", "index"), &VoxelMesherTransvoxel::get_regular_cell_class);
|
ClassDB::bind_method(D_METHOD("get_regular_cell_class", "index"), &VoxelMesherTransvoxel::get_regular_cell_class);
|
||||||
ClassDB::bind_method(D_METHOD("get_regular_cell_data", "index"), &VoxelMesherTransvoxel::get_regular_cell_data);
|
ClassDB::bind_method(D_METHOD("get_regular_cell_data", "index"), &VoxelMesherTransvoxel::get_regular_cell_data);
|
||||||
ClassDB::bind_method(D_METHOD("get_regular_vertex_data", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_data);
|
ClassDB::bind_method(D_METHOD("get_regular_vertex_data", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_data);
|
||||||
ClassDB::bind_method(D_METHOD("get_regular_vertex_data_first_vertex", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_data_first_vertex);
|
ClassDB::bind_method(D_METHOD("get_regular_vertex_data_first_vertex", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_data_first_vertex);
|
||||||
ClassDB::bind_method(D_METHOD("get_regular_vertex_data_second_vertex", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_data_second_vertex);
|
ClassDB::bind_method(D_METHOD("get_regular_vertex_data_second_vertex", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_data_second_vertex);
|
||||||
ClassDB::bind_method(D_METHOD("get_regular_vertex_start_position", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_start_position);
|
ClassDB::bind_method(D_METHOD("get_regular_vertex_first_position", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_first_position);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_regular_vertex_second_position", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_second_position);
|
||||||
ClassDB::bind_method(D_METHOD("get_regular_vertex_direction", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_direction);
|
ClassDB::bind_method(D_METHOD("get_regular_vertex_direction", "index1", "index2"), &VoxelMesherTransvoxel::get_regular_vertex_direction);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_transition_cell_class", "index"), &VoxelMesherTransvoxel::get_transition_cell_class);
|
ClassDB::bind_method(D_METHOD("get_transition_cell_class", "index"), &VoxelMesherTransvoxel::get_transition_cell_class);
|
||||||
@ -174,7 +194,8 @@ void VoxelMesherTransvoxel::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("get_transition_vertex_data", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_data);
|
ClassDB::bind_method(D_METHOD("get_transition_vertex_data", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_data);
|
||||||
ClassDB::bind_method(D_METHOD("get_transition_vertex_data_first_vertex", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_data_first_vertex);
|
ClassDB::bind_method(D_METHOD("get_transition_vertex_data_first_vertex", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_data_first_vertex);
|
||||||
ClassDB::bind_method(D_METHOD("get_transition_vertex_data_second_vertex", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_data_second_vertex);
|
ClassDB::bind_method(D_METHOD("get_transition_vertex_data_second_vertex", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_data_second_vertex);
|
||||||
ClassDB::bind_method(D_METHOD("get_transition_vertex_start_position", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_start_position);
|
ClassDB::bind_method(D_METHOD("get_transition_vertex_first_position", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_first_position);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_transition_vertex_second_position", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_second_position);
|
||||||
ClassDB::bind_method(D_METHOD("get_transition_vertex_direction", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_direction);
|
ClassDB::bind_method(D_METHOD("get_transition_vertex_direction", "index1", "index2"), &VoxelMesherTransvoxel::get_transition_vertex_direction);
|
||||||
|
|
||||||
BIND_ENUM_CONSTANT(VOXEL_ENTRY_INDEX_000);
|
BIND_ENUM_CONSTANT(VOXEL_ENTRY_INDEX_000);
|
||||||
|
@ -81,6 +81,7 @@ public:
|
|||||||
VOXEL_ENTRY_MASK_111 = 1 << 7,
|
VOXEL_ENTRY_MASK_111 = 1 << 7,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Vector3 corner_id_to_vertex(int corner_id) const;
|
||||||
|
|
||||||
int get_regular_cell_class(int index) const;
|
int get_regular_cell_class(int index) const;
|
||||||
|
|
||||||
@ -88,10 +89,10 @@ public:
|
|||||||
int get_regular_vertex_data(int index10, int index2) const;
|
int get_regular_vertex_data(int index10, int index2) const;
|
||||||
int get_regular_vertex_data_first_vertex(int index1, int index2) const;
|
int get_regular_vertex_data_first_vertex(int index1, int index2) const;
|
||||||
int get_regular_vertex_data_second_vertex(int index1, int index2) const;
|
int get_regular_vertex_data_second_vertex(int index1, int index2) const;
|
||||||
Vector3 get_regular_vertex_start_position(int index1, int index2) const;
|
Vector3 get_regular_vertex_first_position(int index1, int index2) const;
|
||||||
|
Vector3 get_regular_vertex_second_position(int index1, int index2) const;
|
||||||
Vector3 get_regular_vertex_direction(int index1, int index2) const;
|
Vector3 get_regular_vertex_direction(int index1, int index2) const;
|
||||||
|
|
||||||
|
|
||||||
int get_transition_cell_class(int index) const;
|
int get_transition_cell_class(int index) const;
|
||||||
|
|
||||||
Ref<TransvoxelTransitionCellData> get_transition_cell_data(int index) const;
|
Ref<TransvoxelTransitionCellData> get_transition_cell_data(int index) const;
|
||||||
@ -99,7 +100,8 @@ public:
|
|||||||
int get_transition_vertex_data(int index1, int index2) const;
|
int get_transition_vertex_data(int index1, int index2) const;
|
||||||
int get_transition_vertex_data_first_vertex(int index1, int index2) const;
|
int get_transition_vertex_data_first_vertex(int index1, int index2) const;
|
||||||
int get_transition_vertex_data_second_vertex(int index1, int index2) const;
|
int get_transition_vertex_data_second_vertex(int index1, int index2) const;
|
||||||
Vector3 get_transition_vertex_start_position(int index1, int index2) const;
|
Vector3 get_transition_vertex_first_position(int index1, int index2) const;
|
||||||
|
Vector3 get_transition_vertex_second_position(int index1, int index2) const;
|
||||||
Vector3 get_transition_vertex_direction(int index1, int index2) const;
|
Vector3 get_transition_vertex_direction(int index1, int index2) const;
|
||||||
|
|
||||||
VoxelMesherTransvoxel();
|
VoxelMesherTransvoxel();
|
||||||
|
@ -73,7 +73,12 @@ void VoxelChunk::clear() {
|
|||||||
|
|
||||||
void VoxelChunk::build() {
|
void VoxelChunk::build() {
|
||||||
ERR_FAIL_COND(!_library.is_valid());
|
ERR_FAIL_COND(!_library.is_valid());
|
||||||
ERR_FAIL_COND(!_mesher.is_valid());
|
|
||||||
|
if (!_mesher.is_valid()) {
|
||||||
|
call("_create_mesher");
|
||||||
|
|
||||||
|
ERR_FAIL_COND(!_mesher.is_valid());
|
||||||
|
}
|
||||||
|
|
||||||
_mesher->set_library(_library);
|
_mesher->set_library(_library);
|
||||||
|
|
||||||
@ -100,6 +105,10 @@ void VoxelChunk::build() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VoxelChunk::_create_mesher() {
|
||||||
|
_mesher = Ref<VoxelMesher>(memnew(VoxelMesher()));
|
||||||
|
}
|
||||||
|
|
||||||
void VoxelChunk::finalize_mesh() {
|
void VoxelChunk::finalize_mesh() {
|
||||||
_mesher->set_library(_library);
|
_mesher->set_library(_library);
|
||||||
|
|
||||||
@ -229,7 +238,7 @@ void VoxelChunk::draw_debug_voxels(int max, Color color) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
draw_cross_voxels(Vector3(x + 0.5, y + 0.5, z + 0.5), _buffer->get_voxel(x, y, z, VoxelBuffer::CHANNEL_ISOLEVEL) / 255.0);
|
draw_cross_voxels(Vector3(x, y, z), _buffer->get_voxel(x, y, z, VoxelBuffer::CHANNEL_ISOLEVEL) / 255.0);
|
||||||
|
|
||||||
++a;
|
++a;
|
||||||
|
|
||||||
@ -289,6 +298,9 @@ void VoxelChunk::draw_debug_voxel_lights(int max, bool localPosition) {
|
|||||||
|
|
||||||
void VoxelChunk::_bind_methods() {
|
void VoxelChunk::_bind_methods() {
|
||||||
BIND_VMETHOD(MethodInfo("_create_mesh"));
|
BIND_VMETHOD(MethodInfo("_create_mesh"));
|
||||||
|
BIND_VMETHOD(MethodInfo("_create_mesher"));
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("_create_mesher"), &VoxelChunk::_create_mesher);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_library_path"), &VoxelChunk::get_library_path);
|
ClassDB::bind_method(D_METHOD("get_library_path"), &VoxelChunk::get_library_path);
|
||||||
ClassDB::bind_method(D_METHOD("set_library_path", "value"), &VoxelChunk::set_library_path);
|
ClassDB::bind_method(D_METHOD("set_library_path", "value"), &VoxelChunk::set_library_path);
|
||||||
|
@ -53,6 +53,8 @@ public:
|
|||||||
|
|
||||||
Ref<VoxelBuffer> get_buffer() const;
|
Ref<VoxelBuffer> get_buffer() const;
|
||||||
|
|
||||||
|
void _create_mesher();
|
||||||
|
|
||||||
void finalize_mesh();
|
void finalize_mesh();
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
Loading…
Reference in New Issue
Block a user