mirror of
https://github.com/Relintai/godot_voxel.git
synced 2025-05-01 17:57:55 +02:00
Facet extraction works with transparent sides
This commit is contained in:
parent
c452d73a3a
commit
ad124f418a
@ -3,7 +3,7 @@
|
|||||||
#include "voxel_mesh_builder.h"
|
#include "voxel_mesh_builder.h"
|
||||||
|
|
||||||
Voxel::Voxel() : Reference(),
|
Voxel::Voxel() : Reference(),
|
||||||
_id(0),
|
_id(-1),
|
||||||
_material_id(0),
|
_material_id(0),
|
||||||
_is_transparent(false),
|
_is_transparent(false),
|
||||||
_library(NULL),
|
_library(NULL),
|
||||||
@ -12,7 +12,11 @@ Voxel::Voxel() : Reference(),
|
|||||||
|
|
||||||
Ref<Voxel> Voxel::set_id(int id) {
|
Ref<Voxel> Voxel::set_id(int id) {
|
||||||
ERR_FAIL_COND_V(id < 0 || id >= 256, Ref<Voxel>(this));
|
ERR_FAIL_COND_V(id < 0 || id >= 256, Ref<Voxel>(this));
|
||||||
|
// Cannot modify ID after creation
|
||||||
|
ERR_FAIL_COND_V(_id != -1, Ref<Voxel>(this));
|
||||||
|
|
||||||
_id = id;
|
_id = id;
|
||||||
|
|
||||||
return Ref<Voxel>(this);
|
return Ref<Voxel>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,6 +177,9 @@ void Voxel::_bind_methods() {
|
|||||||
ObjectTypeDB::bind_method(_MD("set_transparent:Voxel", "color"), &Voxel::set_transparent, DEFVAL(true));
|
ObjectTypeDB::bind_method(_MD("set_transparent:Voxel", "color"), &Voxel::set_transparent, DEFVAL(true));
|
||||||
ObjectTypeDB::bind_method(_MD("is_transparent"), &Voxel::is_transparent);
|
ObjectTypeDB::bind_method(_MD("is_transparent"), &Voxel::is_transparent);
|
||||||
|
|
||||||
|
ObjectTypeDB::bind_method(_MD("set_material_id", "id"), &Voxel::set_material_id);
|
||||||
|
ObjectTypeDB::bind_method(_MD("get_material_id"), &Voxel::get_material_id);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("set_cube_geometry:Voxel", "height"), &Voxel::set_cube_geometry, DEFVAL(1.f));
|
ObjectTypeDB::bind_method(_MD("set_cube_geometry:Voxel", "height"), &Voxel::set_cube_geometry, DEFVAL(1.f));
|
||||||
ObjectTypeDB::bind_method(_MD("set_cube_uv_all_sides:Voxel", "atlas_pos"), &Voxel::set_cube_uv_all_sides);
|
ObjectTypeDB::bind_method(_MD("set_cube_uv_all_sides:Voxel", "atlas_pos"), &Voxel::set_cube_uv_all_sides);
|
||||||
ObjectTypeDB::bind_method(_MD("set_cube_uv_tbs_sides:Voxel", "top_atlas_pos", "side_atlas_pos", "bottom_atlas_pos"), &Voxel::set_cube_uv_tbs_sides);
|
ObjectTypeDB::bind_method(_MD("set_cube_uv_tbs_sides:Voxel", "top_atlas_pos", "side_atlas_pos", "bottom_atlas_pos"), &Voxel::set_cube_uv_tbs_sides);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "voxel_library.h"
|
#include "voxel_library.h"
|
||||||
|
|
||||||
VoxelLibrary::VoxelLibrary() : Reference(), _atlas_size(1) {
|
VoxelLibrary::VoxelLibrary() : Reference(), _atlas_size(1) {
|
||||||
|
create_voxel(0, "air")->set_transparent(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
VoxelLibrary::~VoxelLibrary() {
|
VoxelLibrary::~VoxelLibrary() {
|
||||||
|
@ -149,6 +149,22 @@ void VoxelMeshBuilder::set_occlusion_enabled(bool enable) {
|
|||||||
|
|
||||||
inline Color Color_greyscale(float c) { return Color(c, c, c); }
|
inline Color Color_greyscale(float c) { return Color(c, c, c); }
|
||||||
|
|
||||||
|
inline bool is_face_visible(const VoxelLibrary & lib, const Voxel & vt, int other_voxel_id) {
|
||||||
|
if (other_voxel_id == 0) // air
|
||||||
|
return true;
|
||||||
|
if (lib.has_voxel(other_voxel_id)) {
|
||||||
|
const Voxel & other_vt = lib.get_voxel_const(other_voxel_id);
|
||||||
|
return other_vt.is_transparent() && vt.get_id() != other_voxel_id;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_transparent(const VoxelLibrary & lib, int voxel_id) {
|
||||||
|
if (lib.has_voxel(voxel_id))
|
||||||
|
return lib.get_voxel_const(voxel_id).is_transparent();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<Mesh> VoxelMeshBuilder::build(Ref<VoxelBuffer> buffer_ref) {
|
Ref<Mesh> VoxelMeshBuilder::build(Ref<VoxelBuffer> buffer_ref) {
|
||||||
ERR_FAIL_COND_V(buffer_ref.is_null(), Ref<Mesh>());
|
ERR_FAIL_COND_V(buffer_ref.is_null(), Ref<Mesh>());
|
||||||
ERR_FAIL_COND_V(_library.is_null(), Ref<Mesh>());
|
ERR_FAIL_COND_V(_library.is_null(), Ref<Mesh>());
|
||||||
@ -194,7 +210,7 @@ Ref<Mesh> VoxelMeshBuilder::build(Ref<VoxelBuffer> buffer_ref) {
|
|||||||
|
|
||||||
int neighbor_voxel_id = buffer.get_voxel_local(nx, ny, nz, 0);
|
int neighbor_voxel_id = buffer.get_voxel_local(nx, ny, nz, 0);
|
||||||
// TODO Better face visibility test
|
// TODO Better face visibility test
|
||||||
if (neighbor_voxel_id == 0) {
|
if (is_face_visible(library, voxel, neighbor_voxel_id)) {
|
||||||
|
|
||||||
// The face is visible
|
// The face is visible
|
||||||
|
|
||||||
@ -210,7 +226,7 @@ Ref<Mesh> VoxelMeshBuilder::build(Ref<VoxelBuffer> buffer_ref) {
|
|||||||
unsigned ex = x + edge_normal.x;
|
unsigned ex = x + edge_normal.x;
|
||||||
unsigned ey = y + edge_normal.y;
|
unsigned ey = y + edge_normal.y;
|
||||||
unsigned ez = z + edge_normal.z;
|
unsigned ez = z + edge_normal.z;
|
||||||
if (buffer.get_voxel_local(ex, ey, ez) != 0) {
|
if (!is_transparent(library, buffer.get_voxel_local(ex, ey, ez))) {
|
||||||
shaded_corner[g_edge_corners[edge][0]] += 1;
|
shaded_corner[g_edge_corners[edge][0]] += 1;
|
||||||
shaded_corner[g_edge_corners[edge][1]] += 1;
|
shaded_corner[g_edge_corners[edge][1]] += 1;
|
||||||
}
|
}
|
||||||
@ -225,7 +241,7 @@ Ref<Mesh> VoxelMeshBuilder::build(Ref<VoxelBuffer> buffer_ref) {
|
|||||||
unsigned int cx = x + corner_normal.x;
|
unsigned int cx = x + corner_normal.x;
|
||||||
unsigned int cy = y + corner_normal.y;
|
unsigned int cy = y + corner_normal.y;
|
||||||
unsigned int cz = z + corner_normal.z;
|
unsigned int cz = z + corner_normal.z;
|
||||||
if (buffer.get_voxel_local(cx, cy, cz) != 0) {
|
if (!is_transparent(library, buffer.get_voxel_local(cx, cy, cz))) {
|
||||||
shaded_corner[corner] += 1;
|
shaded_corner[corner] += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,7 @@ public:
|
|||||||
Ref<Mesh> build(Ref<VoxelBuffer> buffer_ref);
|
Ref<Mesh> build(Ref<VoxelBuffer> buffer_ref);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user