mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-04-15 16:16:03 +02:00
Added flip twig and branch faces options to procedural tree mesh.
This commit is contained in:
parent
a02d73b035
commit
2124f48710
@ -204,6 +204,22 @@ void ProceduralTreeMesh::set_enable_twig_mesh(const bool p_value) {
|
|||||||
_request_update();
|
_request_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ProceduralTreeMesh::get_flip_branch_mesh_faces() const {
|
||||||
|
return _flip_branch_mesh_faces;
|
||||||
|
}
|
||||||
|
void ProceduralTreeMesh::set_flip_branch_mesh_faces(const bool p_value) {
|
||||||
|
_flip_branch_mesh_faces = p_value;
|
||||||
|
_request_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ProceduralTreeMesh::get_flip_twig_mesh_faces() const {
|
||||||
|
return _flip_twig_mesh_faces;
|
||||||
|
}
|
||||||
|
void ProceduralTreeMesh::set_flip_twig_mesh_faces(const bool p_value) {
|
||||||
|
_flip_twig_mesh_faces = p_value;
|
||||||
|
_request_update();
|
||||||
|
}
|
||||||
|
|
||||||
void ProceduralTreeMesh::_update() const {
|
void ProceduralTreeMesh::_update() const {
|
||||||
|
|
||||||
RenderingServer::get_singleton()->mesh_clear(mesh);
|
RenderingServer::get_singleton()->mesh_clear(mesh);
|
||||||
@ -261,7 +277,7 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
normals.resize(vert_count);
|
normals.resize(vert_count);
|
||||||
verts.resize(vert_count);
|
verts.resize(vert_count);
|
||||||
|
|
||||||
{
|
if (!_flip_twig_mesh_faces) {
|
||||||
PoolVector<Vector2>::Write uvw = uvs.write();
|
PoolVector<Vector2>::Write uvw = uvs.write();
|
||||||
PoolVector<Vector3>::Write nw = normals.write();
|
PoolVector<Vector3>::Write nw = normals.write();
|
||||||
PoolVector<Vector3>::Write vw = verts.write();
|
PoolVector<Vector3>::Write vw = verts.write();
|
||||||
@ -275,6 +291,20 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
nw[i] = Vector3(tnormal.x, tnormal.y, tnormal.z);
|
nw[i] = Vector3(tnormal.x, tnormal.y, tnormal.z);
|
||||||
vw[i] = Vector3(tvert.x, tvert.y, tvert.z);
|
vw[i] = Vector3(tvert.x, tvert.y, tvert.z);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
PoolVector<Vector2>::Write uvw = uvs.write();
|
||||||
|
PoolVector<Vector3>::Write nw = normals.write();
|
||||||
|
PoolVector<Vector3>::Write vw = verts.write();
|
||||||
|
|
||||||
|
for (int i = 0; i < vert_count; ++i) {
|
||||||
|
Proctree::fvec2 tuv = tree.mTwigUV[i];
|
||||||
|
Proctree::fvec3 tnormal = tree.mTwigNormal[i];
|
||||||
|
Proctree::fvec3 tvert = tree.mTwigVert[i];
|
||||||
|
|
||||||
|
uvw[i] = Vector2(tuv.u, tuv.v);
|
||||||
|
nw[i] = -Vector3(tnormal.x, tnormal.y, tnormal.z);
|
||||||
|
vw[i] = Vector3(tvert.x, tvert.y, tvert.z);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PoolVector<int> indices;
|
PoolVector<int> indices;
|
||||||
@ -283,7 +313,7 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
|
|
||||||
indices.resize(face_count * 3);
|
indices.resize(face_count * 3);
|
||||||
|
|
||||||
{
|
if (!_flip_twig_mesh_faces) {
|
||||||
PoolVector<int>::Write iw = indices.write();
|
PoolVector<int>::Write iw = indices.write();
|
||||||
|
|
||||||
for (int i = 0; i < face_count; ++i) {
|
for (int i = 0; i < face_count; ++i) {
|
||||||
@ -295,6 +325,18 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
iw[ind + 1] = tface.x;
|
iw[ind + 1] = tface.x;
|
||||||
iw[ind + 2] = tface.z;
|
iw[ind + 2] = tface.z;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
PoolVector<int>::Write iw = indices.write();
|
||||||
|
|
||||||
|
for (int i = 0; i < face_count; ++i) {
|
||||||
|
Proctree::ivec3 tface = tree.mTwigFace[i];
|
||||||
|
|
||||||
|
int ind = i * 3;
|
||||||
|
|
||||||
|
iw[ind] = tface.x;
|
||||||
|
iw[ind + 1] = tface.y;
|
||||||
|
iw[ind + 2] = tface.z;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -333,7 +375,7 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
normals.resize(vert_count);
|
normals.resize(vert_count);
|
||||||
verts.resize(vert_count);
|
verts.resize(vert_count);
|
||||||
|
|
||||||
{
|
if (!_flip_branch_mesh_faces) {
|
||||||
PoolVector<Vector2>::Write uvw = uvs.write();
|
PoolVector<Vector2>::Write uvw = uvs.write();
|
||||||
PoolVector<Vector3>::Write nw = normals.write();
|
PoolVector<Vector3>::Write nw = normals.write();
|
||||||
PoolVector<Vector3>::Write vw = verts.write();
|
PoolVector<Vector3>::Write vw = verts.write();
|
||||||
@ -347,6 +389,20 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
nw[i] = Vector3(tnormal.x, tnormal.y, tnormal.z);
|
nw[i] = Vector3(tnormal.x, tnormal.y, tnormal.z);
|
||||||
vw[i] = Vector3(tvert.x, tvert.y, tvert.z);
|
vw[i] = Vector3(tvert.x, tvert.y, tvert.z);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
PoolVector<Vector2>::Write uvw = uvs.write();
|
||||||
|
PoolVector<Vector3>::Write nw = normals.write();
|
||||||
|
PoolVector<Vector3>::Write vw = verts.write();
|
||||||
|
|
||||||
|
for (int i = 0; i < vert_count; ++i) {
|
||||||
|
Proctree::fvec2 tuv = tree.mUV[i];
|
||||||
|
Proctree::fvec3 tnormal = tree.mNormal[i];
|
||||||
|
Proctree::fvec3 tvert = tree.mVert[i];
|
||||||
|
|
||||||
|
uvw[i] = Vector2(tuv.u, tuv.v);
|
||||||
|
nw[i] = -Vector3(tnormal.x, tnormal.y, tnormal.z);
|
||||||
|
vw[i] = Vector3(tvert.x, tvert.y, tvert.z);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PoolVector<int> indices;
|
PoolVector<int> indices;
|
||||||
@ -355,7 +411,7 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
|
|
||||||
indices.resize(face_count * 3);
|
indices.resize(face_count * 3);
|
||||||
|
|
||||||
{
|
if (!_flip_branch_mesh_faces) {
|
||||||
PoolVector<int>::Write iw = indices.write();
|
PoolVector<int>::Write iw = indices.write();
|
||||||
|
|
||||||
for (int i = 0; i < face_count; ++i) {
|
for (int i = 0; i < face_count; ++i) {
|
||||||
@ -367,6 +423,18 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
iw[ind + 1] = tface.x;
|
iw[ind + 1] = tface.x;
|
||||||
iw[ind + 2] = tface.z;
|
iw[ind + 2] = tface.z;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
PoolVector<int>::Write iw = indices.write();
|
||||||
|
|
||||||
|
for (int i = 0; i < face_count; ++i) {
|
||||||
|
Proctree::ivec3 tface = tree.mFace[i];
|
||||||
|
|
||||||
|
int ind = i * 3;
|
||||||
|
|
||||||
|
iw[ind] = tface.x;
|
||||||
|
iw[ind + 1] = tface.y;
|
||||||
|
iw[ind + 2] = tface.z;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -639,6 +707,9 @@ ProceduralTreeMesh::ProceduralTreeMesh() {
|
|||||||
|
|
||||||
_enable_branch_mesh = true;
|
_enable_branch_mesh = true;
|
||||||
_enable_twig_mesh = true;
|
_enable_twig_mesh = true;
|
||||||
|
|
||||||
|
_flip_branch_mesh_faces = false;
|
||||||
|
_flip_twig_mesh_faces = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProceduralTreeMesh::~ProceduralTreeMesh() {
|
ProceduralTreeMesh::~ProceduralTreeMesh() {
|
||||||
@ -760,6 +831,14 @@ void ProceduralTreeMesh::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("set_enable_twig_mesh", "value"), &ProceduralTreeMesh::set_enable_twig_mesh);
|
ClassDB::bind_method(D_METHOD("set_enable_twig_mesh", "value"), &ProceduralTreeMesh::set_enable_twig_mesh);
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enable_twig_mesh"), "set_enable_twig_mesh", "get_enable_twig_mesh");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enable_twig_mesh"), "set_enable_twig_mesh", "get_enable_twig_mesh");
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("get_flip_branch_mesh_faces"), &ProceduralTreeMesh::get_flip_branch_mesh_faces);
|
||||||
|
ClassDB::bind_method(D_METHOD("set_flip_branch_mesh_faces", "value"), &ProceduralTreeMesh::set_flip_branch_mesh_faces);
|
||||||
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_branch_mesh_faces"), "set_flip_branch_mesh_faces", "get_flip_branch_mesh_faces");
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("get_flip_twig_mesh_faces"), &ProceduralTreeMesh::get_flip_twig_mesh_faces);
|
||||||
|
ClassDB::bind_method(D_METHOD("set_flip_twig_mesh_faces", "value"), &ProceduralTreeMesh::set_flip_twig_mesh_faces);
|
||||||
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_twig_mesh_faces"), "set_flip_twig_mesh_faces", "get_flip_twig_mesh_faces");
|
||||||
|
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "twig_material", PROPERTY_HINT_RESOURCE_TYPE, "SpatialMaterial,ShaderMaterial"), "set_twig_material", "get_twig_material");
|
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "twig_material", PROPERTY_HINT_RESOURCE_TYPE, "SpatialMaterial,ShaderMaterial"), "set_twig_material", "get_twig_material");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "trunk_material", PROPERTY_HINT_RESOURCE_TYPE, "SpatialMaterial,ShaderMaterial"), "set_trunk_material", "get_trunk_material");
|
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "trunk_material", PROPERTY_HINT_RESOURCE_TYPE, "SpatialMaterial,ShaderMaterial"), "set_trunk_material", "get_trunk_material");
|
||||||
|
|
||||||
|
@ -83,6 +83,12 @@ public:
|
|||||||
bool get_enable_twig_mesh() const;
|
bool get_enable_twig_mesh() const;
|
||||||
void set_enable_twig_mesh(const bool p_value);
|
void set_enable_twig_mesh(const bool p_value);
|
||||||
|
|
||||||
|
bool get_flip_branch_mesh_faces() const;
|
||||||
|
void set_flip_branch_mesh_faces(const bool p_value);
|
||||||
|
|
||||||
|
bool get_flip_twig_mesh_faces() const;
|
||||||
|
void set_flip_twig_mesh_faces(const bool p_value);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum TreeSurfaces {
|
enum TreeSurfaces {
|
||||||
TREE_SURFACE_TWIG = 0,
|
TREE_SURFACE_TWIG = 0,
|
||||||
@ -157,6 +163,9 @@ private:
|
|||||||
bool _enable_branch_mesh;
|
bool _enable_branch_mesh;
|
||||||
bool _enable_twig_mesh;
|
bool _enable_twig_mesh;
|
||||||
|
|
||||||
|
bool _flip_branch_mesh_faces;
|
||||||
|
bool _flip_twig_mesh_faces;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RID mesh;
|
RID mesh;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user