mirror of
https://github.com/Relintai/voxelman.git
synced 2024-11-12 10:15:12 +01:00
Now Voxel Surfaces work again.
This commit is contained in:
parent
9ae53b157c
commit
2ed334dade
@ -1,53 +1,77 @@
|
||||
#include "voxel_surface.h"
|
||||
|
||||
int VoxelSurface::get_id() const {
|
||||
return _id;
|
||||
return _id;
|
||||
}
|
||||
void VoxelSurface::set_id(int value) {
|
||||
_id = value;
|
||||
_id = value;
|
||||
}
|
||||
|
||||
int VoxelSurface::get_atlas_x() const {
|
||||
return _atlas_x;
|
||||
int VoxelSurface::get_atlas_x(const int side) const {
|
||||
int indx = (side * 2);
|
||||
|
||||
ERR_FAIL_INDEX_V(indx, VOXEL_SIDES_ARRAY_SIZE, 0);
|
||||
|
||||
return _atlas_positions[indx];
|
||||
}
|
||||
void VoxelSurface::set_atlas_x(int value) {
|
||||
_atlas_x = value;
|
||||
void VoxelSurface::set_atlas_x(const int side, int value) {
|
||||
int indx = (side * 2);
|
||||
|
||||
ERR_FAIL_INDEX(indx, VOXEL_SIDES_ARRAY_SIZE);
|
||||
|
||||
_atlas_positions[indx] = value;
|
||||
}
|
||||
|
||||
int VoxelSurface::get_atlas_y() const {
|
||||
return _atlas_y;
|
||||
int VoxelSurface::get_atlas_y(const int side) const {
|
||||
int indx = (side * 2) + 1;
|
||||
|
||||
ERR_FAIL_INDEX_V(indx, VOXEL_SIDES_ARRAY_SIZE, 0);
|
||||
|
||||
return _atlas_positions[indx];
|
||||
}
|
||||
void VoxelSurface::set_atlas_y(int value) {
|
||||
_atlas_y = value;
|
||||
void VoxelSurface::set_atlas_y(const int side, int value) {
|
||||
int indx = (side * 2) + 1;
|
||||
|
||||
ERR_FAIL_INDEX(indx, VOXEL_SIDES_ARRAY_SIZE);
|
||||
|
||||
_atlas_positions[indx] = value;
|
||||
}
|
||||
|
||||
bool VoxelSurface::is_transparent() const {
|
||||
return _is_transparent;
|
||||
return _is_transparent;
|
||||
}
|
||||
void VoxelSurface::set_transparent(bool transparent) {
|
||||
_is_transparent = transparent;
|
||||
_is_transparent = transparent;
|
||||
}
|
||||
|
||||
String VoxelSurface::get_voxel_name() const {
|
||||
return _name;
|
||||
return _name;
|
||||
}
|
||||
void VoxelSurface::set_voxel_name(String name) {
|
||||
_name = name;
|
||||
_name = name;
|
||||
}
|
||||
|
||||
Ref<VoxelmanLibrary> VoxelSurface::get_library() const {
|
||||
return Ref<VoxelmanLibrary>(_library);
|
||||
return Ref<VoxelmanLibrary>(_library);
|
||||
}
|
||||
|
||||
void VoxelSurface::set_library(Ref<VoxelmanLibrary> library) {
|
||||
_library = library;
|
||||
_library = library;
|
||||
}
|
||||
|
||||
Vector2 VoxelSurface::transform_uv(const int side, const Vector2 uv) const {
|
||||
float culomn = 1.0 / static_cast<float>(_library->get_atlas_columns());
|
||||
float row = 1.0 / static_cast<float>(_library->get_atlas_rows());
|
||||
|
||||
return Vector2(get_atlas_x(side) * culomn + culomn * uv.x, get_atlas_y(side) * row + row * uv.y);
|
||||
}
|
||||
|
||||
VoxelSurface::VoxelSurface() {
|
||||
_id = 0;
|
||||
|
||||
_atlas_x = 0;
|
||||
_atlas_y = 0;
|
||||
for (int i = 0; i < VOXEL_SIDES_ARRAY_SIZE; ++i) {
|
||||
_atlas_positions[i] = 0;
|
||||
}
|
||||
|
||||
_is_transparent = false;
|
||||
}
|
||||
@ -55,8 +79,9 @@ VoxelSurface::VoxelSurface() {
|
||||
VoxelSurface::VoxelSurface(int id) {
|
||||
_id = id;
|
||||
|
||||
_atlas_x = 0;
|
||||
_atlas_y = 0;
|
||||
for (int i = 0; i < VOXEL_SIDES_ARRAY_SIZE; ++i) {
|
||||
_atlas_positions[i] = 0;
|
||||
}
|
||||
|
||||
_is_transparent = false;
|
||||
}
|
||||
@ -66,32 +91,39 @@ VoxelSurface::~VoxelSurface() {
|
||||
}
|
||||
|
||||
void VoxelSurface::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("get_id"), &VoxelSurface::get_id);
|
||||
ClassDB::bind_method(D_METHOD("set_id", "value"), &VoxelSurface::set_id);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "id"), "set_id", "get_id");
|
||||
ClassDB::bind_method(D_METHOD("get_id"), &VoxelSurface::get_id);
|
||||
ClassDB::bind_method(D_METHOD("set_id", "value"), &VoxelSurface::set_id);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "id"), "set_id", "get_id");
|
||||
|
||||
//create an array
|
||||
ClassDB::bind_method(D_METHOD("get_atlas_x"), &VoxelSurface::get_atlas_x);
|
||||
ClassDB::bind_method(D_METHOD("set_atlas_x", "value"), &VoxelSurface::set_atlas_x);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "atlas_x"), "set_atlas_x", "get_atlas_x");
|
||||
ClassDB::bind_method(D_METHOD("get_atlas_x", "side"), &VoxelSurface::get_atlas_x);
|
||||
ClassDB::bind_method(D_METHOD("set_atlas_x", "side", "value"), &VoxelSurface::set_atlas_x);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_atlas_y", "side"), &VoxelSurface::get_atlas_y);
|
||||
ClassDB::bind_method(D_METHOD("set_atlas_y", "side", "value"), &VoxelSurface::set_atlas_y);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_atlas_y"), &VoxelSurface::get_atlas_y);
|
||||
ClassDB::bind_method(D_METHOD("set_atlas_y", "value"), &VoxelSurface::set_atlas_y);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "atlas_y"), "set_atlas_y", "get_atlas_y");
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::INT, "top_atlas_x"), "set_atlas_x", "get_atlas_x", VOXEL_SIDE_TOP);
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::INT, "top_atlas_y"), "set_atlas_y", "get_atlas_y", VOXEL_SIDE_TOP);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_transparent", "transparent"), &VoxelSurface::set_transparent, DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("is_transparent"), &VoxelSurface::is_transparent);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "transparent"), "set_transparent", "is_transparent");
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::INT, "bottom_atlas_x"), "set_atlas_x", "get_atlas_x", VOXEL_SIDE_BOTTOM);
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::INT, "bottom_atlas_y"), "set_atlas_y", "get_atlas_y", VOXEL_SIDE_BOTTOM);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_voxel_name", "name"), &VoxelSurface::set_voxel_name);
|
||||
ClassDB::bind_method(D_METHOD("get_voxel_name"), &VoxelSurface::get_voxel_name);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::STRING, "voxel_name"), "set_name", "get_name");
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::INT, "side_atlas_x"), "set_atlas_x", "get_atlas_x", VOXEL_SIDE_SIDE);
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::INT, "side_atlas_y"), "set_atlas_y", "get_atlas_y", VOXEL_SIDE_SIDE);
|
||||
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_transparent", "transparent"), &VoxelSurface::set_transparent, DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("is_transparent"), &VoxelSurface::is_transparent);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "transparent"), "set_transparent", "is_transparent");
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_voxel_name", "name"), &VoxelSurface::set_voxel_name);
|
||||
ClassDB::bind_method(D_METHOD("get_voxel_name"), &VoxelSurface::get_voxel_name);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::STRING, "voxel_name"), "set_name", "get_name");
|
||||
|
||||
ClassDB::bind_method(D_METHOD("transform_uv", "side", "uv"), &VoxelSurface::transform_uv);
|
||||
|
||||
BIND_ENUM_CONSTANT(VOXEL_SIDE_TOP);
|
||||
BIND_ENUM_CONSTANT(VOXEL_SIDE_BOTTOM);
|
||||
BIND_ENUM_CONSTANT(VOXEL_SIDE_LEFT);
|
||||
BIND_ENUM_CONSTANT(VOXEL_SIDE_FRONT);
|
||||
BIND_ENUM_CONSTANT(VOXEL_SIDE_RIGHT);
|
||||
BIND_ENUM_CONSTANT(VOXEL_SIDE_BACK);
|
||||
BIND_ENUM_CONSTANT(VOXEL_SIDE_SIDE);
|
||||
BIND_ENUM_CONSTANT(VOXEL_SIDES_COUNT);
|
||||
}
|
||||
|
@ -30,24 +30,22 @@ public:
|
||||
*/
|
||||
|
||||
enum VoxelSurfaceSides {
|
||||
VOXEL_SIDE_TOP = 1 << 0,
|
||||
VOXEL_SIDE_BOTTOM = 1 << 1,
|
||||
VOXEL_SIDE_LEFT = 1 << 2,
|
||||
VOXEL_SIDE_FRONT = 1 << 3,
|
||||
VOXEL_SIDE_RIGHT = 1 << 4,
|
||||
VOXEL_SIDE_BACK = 1 << 5,
|
||||
VOXEL_SIDE_TOP = 0,
|
||||
VOXEL_SIDE_BOTTOM = 1,
|
||||
VOXEL_SIDE_SIDE = 2,
|
||||
|
||||
VOXEL_SIDES_COUNT = 6,
|
||||
VOXEL_SIDES_COUNT = 3,
|
||||
VOXEL_SIDES_ARRAY_SIZE = VOXEL_SIDES_COUNT * 2,
|
||||
};
|
||||
|
||||
int get_id() const;
|
||||
void set_id(int value);
|
||||
|
||||
int get_atlas_x() const;
|
||||
void set_atlas_x(int value);
|
||||
int get_atlas_x(const int side) const;
|
||||
void set_atlas_x(const int side, int value);
|
||||
|
||||
int get_atlas_y() const;
|
||||
void set_atlas_y(int value);
|
||||
int get_atlas_y(const int side) const;
|
||||
void set_atlas_y(const int side, int value);
|
||||
|
||||
bool is_transparent() const;
|
||||
void set_transparent(bool transparent);
|
||||
@ -57,6 +55,8 @@ public:
|
||||
|
||||
Ref<VoxelmanLibrary> get_library() const;
|
||||
void set_library(Ref<VoxelmanLibrary> library);
|
||||
|
||||
Vector2 transform_uv(const int side, const Vector2 uv) const;
|
||||
|
||||
VoxelSurface();
|
||||
VoxelSurface(int id);
|
||||
@ -70,8 +70,7 @@ private:
|
||||
|
||||
int _id;
|
||||
String _name;
|
||||
int _atlas_x;
|
||||
int _atlas_y;
|
||||
int _atlas_positions[VOXEL_SIDES_ARRAY_SIZE];
|
||||
|
||||
bool _is_transparent;
|
||||
};
|
||||
|
@ -16,7 +16,6 @@ VoxelmanLibrary::VoxelmanLibrary() {
|
||||
_voxel_types[i]->set_library(Ref<VoxelmanLibrary>(this));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
VoxelmanLibrary::~VoxelmanLibrary() {
|
||||
@ -33,7 +32,7 @@ void VoxelmanLibrary::set_voxel_surface(int index, Ref<VoxelSurface> value) {
|
||||
ERR_FAIL_COND(value == NULL);
|
||||
|
||||
if (value != NULL) {
|
||||
|
||||
|
||||
value->set_library(Ref<VoxelmanLibrary>(this));
|
||||
|
||||
_voxel_types[index] = Ref<VoxelSurface>(value);
|
||||
@ -69,16 +68,13 @@ int VoxelmanLibrary::get_voxel_count() const {
|
||||
return count;
|
||||
}
|
||||
|
||||
void VoxelmanLibrary::load_default() {
|
||||
}
|
||||
|
||||
void VoxelmanLibrary::set_atlas_columns(int s) {
|
||||
ERR_FAIL_COND(s <= 0);
|
||||
ERR_FAIL_COND(s < 0);
|
||||
_atlas_columns = s;
|
||||
}
|
||||
|
||||
void VoxelmanLibrary::set_atlas_rows(int s) {
|
||||
ERR_FAIL_COND(s <= 0);
|
||||
ERR_FAIL_COND(s < 0);
|
||||
_atlas_rows = s;
|
||||
}
|
||||
|
||||
@ -100,11 +96,6 @@ Ref<VoxelSurface> VoxelmanLibrary::create_voxel(int id, String name) {
|
||||
return voxel;
|
||||
}
|
||||
|
||||
Ref<VoxelSurface> VoxelmanLibrary::_get_voxel_bind(int id) {
|
||||
ERR_FAIL_COND_V(id < 0 || id >= MAX_VOXEL_TYPES, Ref<VoxelSurface>());
|
||||
return _voxel_types[id];
|
||||
}
|
||||
|
||||
void VoxelmanLibrary::_validate_property(PropertyInfo &property) const {
|
||||
|
||||
String prop = property.name;
|
||||
@ -118,12 +109,12 @@ void VoxelmanLibrary::_validate_property(PropertyInfo &property) const {
|
||||
|
||||
void VoxelmanLibrary::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("create_voxel", "id", "name"), &VoxelmanLibrary::create_voxel);
|
||||
ClassDB::bind_method(D_METHOD("get_voxel", "id"), &VoxelmanLibrary::_get_voxel_bind);
|
||||
ClassDB::bind_method(D_METHOD("get_surface", "id"), &VoxelmanLibrary::get_surface);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_atlas_columns"), &VoxelmanLibrary::get_atlas_columns);
|
||||
ClassDB::bind_method(D_METHOD("set_atlas_columns", "value"), &VoxelmanLibrary::set_atlas_columns);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "atlas_columns"), "set_atlas_columns", "get_atlas_columns");
|
||||
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_atlas_rows"), &VoxelmanLibrary::get_atlas_rows);
|
||||
ClassDB::bind_method(D_METHOD("set_atlas_rows", "value"), &VoxelmanLibrary::set_atlas_rows);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "atlas_rows"), "set_atlas_rows", "get_atlas_rows");
|
||||
|
@ -14,7 +14,6 @@ class VoxelmanLibrary : public Resource {
|
||||
GDCLASS(VoxelmanLibrary, Resource)
|
||||
|
||||
public:
|
||||
|
||||
VoxelmanLibrary();
|
||||
~VoxelmanLibrary();
|
||||
|
||||
@ -37,8 +36,6 @@ public:
|
||||
|
||||
int get_voxel_count() const;
|
||||
|
||||
void load_default();
|
||||
|
||||
Ref<VoxelSurface> get_voxel_surface(int index) const;
|
||||
void set_voxel_surface(int index, Ref<VoxelSurface> value);
|
||||
|
||||
@ -49,15 +46,12 @@ public:
|
||||
void set_voxel_types_page(int value);
|
||||
|
||||
_FORCE_INLINE_ bool has_voxel(int id) const { return _voxel_types[id].is_valid(); }
|
||||
_FORCE_INLINE_ const VoxelSurface &get_voxel_const(int id) const { return **_voxel_types[id]; }
|
||||
_FORCE_INLINE_ Ref<VoxelSurface> get_surface(int id) { return Ref<VoxelSurface>(*_voxel_types[id]); }
|
||||
_FORCE_INLINE_ Ref<VoxelSurface> get_surface(int id) const { return _voxel_types[id]; }
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
void _validate_property(PropertyInfo &property) const;
|
||||
|
||||
Ref<VoxelSurface> _get_voxel_bind(int id);
|
||||
|
||||
private:
|
||||
enum {
|
||||
MAX_VOXEL_TYPES = 256,
|
||||
|
@ -40,6 +40,11 @@ void VoxelMesher::build_mesh(RID mesh) {
|
||||
|
||||
VS::get_singleton()->mesh_clear(mesh);
|
||||
|
||||
if (_vertices.size() == 0) {
|
||||
//Nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
_surface_tool->begin(Mesh::PRIMITIVE_TRIANGLES);
|
||||
_surface_tool->set_material(_library->get_material());
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user