mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-04-14 23:58:26 +02:00
Added an option to enable and disable branch and twig meshes.
This commit is contained in:
parent
5e7264b292
commit
ad642e3f16
@ -187,8 +187,37 @@ void ProceduralTreeMesh::trunk_set_length(const float p_value) {
|
|||||||
_request_update();
|
_request_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Meshes
|
||||||
|
bool ProceduralTreeMesh::get_enable_branch_mesh() const {
|
||||||
|
return _enable_branch_mesh;
|
||||||
|
}
|
||||||
|
void ProceduralTreeMesh::set_enable_branch_mesh(const bool p_value) {
|
||||||
|
_enable_branch_mesh = p_value;
|
||||||
|
_request_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ProceduralTreeMesh::get_enable_twig_mesh() const {
|
||||||
|
return _enable_twig_mesh;
|
||||||
|
}
|
||||||
|
void ProceduralTreeMesh::set_enable_twig_mesh(const bool p_value) {
|
||||||
|
_enable_twig_mesh = p_value;
|
||||||
|
_request_update();
|
||||||
|
}
|
||||||
|
|
||||||
void ProceduralTreeMesh::_update() const {
|
void ProceduralTreeMesh::_update() const {
|
||||||
|
|
||||||
|
RenderingServer::get_singleton()->mesh_clear(mesh);
|
||||||
|
|
||||||
|
for (int i = 0; i < TREE_SURFACE_COUNT; ++i) {
|
||||||
|
_surfaces[i].surface_index = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
aabb = AABB();
|
||||||
|
|
||||||
|
if (!_enable_branch_mesh && !_enable_twig_mesh) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Proctree::Tree tree;
|
Proctree::Tree tree;
|
||||||
|
|
||||||
// Grneral
|
// Grneral
|
||||||
@ -221,12 +250,7 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
|
|
||||||
tree.generate();
|
tree.generate();
|
||||||
|
|
||||||
|
if (_enable_twig_mesh) {
|
||||||
RenderingServer::get_singleton()->mesh_clear(mesh);
|
|
||||||
|
|
||||||
aabb = AABB();
|
|
||||||
|
|
||||||
{
|
|
||||||
int vert_count = tree.mTwigVertCount;
|
int vert_count = tree.mTwigVertCount;
|
||||||
|
|
||||||
PoolVector<Vector2> uvs;
|
PoolVector<Vector2> uvs;
|
||||||
@ -275,12 +299,13 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
|
|
||||||
{
|
{
|
||||||
PoolVector<Vector3>::Read r = verts.read();
|
PoolVector<Vector3>::Read r = verts.read();
|
||||||
for (int i = 0; i < vert_count; i++) {
|
|
||||||
if (i == 0) {
|
if (vert_count > 0) {
|
||||||
aabb.position = r[i];
|
aabb.position = r[0];
|
||||||
} else {
|
}
|
||||||
aabb.expand_to(r[i]);
|
|
||||||
}
|
for (int i = 1; i < vert_count; ++i) {
|
||||||
|
aabb.expand_to(r[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,10 +317,12 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
arr[RS::ARRAY_INDEX] = indices;
|
arr[RS::ARRAY_INDEX] = indices;
|
||||||
|
|
||||||
RenderingServer::get_singleton()->mesh_add_surface_from_arrays(mesh, RenderingServer::PRIMITIVE_TRIANGLES, arr);
|
RenderingServer::get_singleton()->mesh_add_surface_from_arrays(mesh, RenderingServer::PRIMITIVE_TRIANGLES, arr);
|
||||||
RenderingServer::get_singleton()->mesh_surface_set_material(mesh, TREE_SURFACE_TWIG, _surfaces[TREE_SURFACE_TWIG].material.is_null() ? RID() : _surfaces[TREE_SURFACE_TWIG].material->get_rid());
|
int sc = RenderingServer::get_singleton()->mesh_get_surface_count(mesh) - 1;
|
||||||
|
_surfaces[TREE_SURFACE_TWIG].surface_index = sc;
|
||||||
|
RenderingServer::get_singleton()->mesh_surface_set_material(mesh, sc, _surfaces[TREE_SURFACE_TWIG].material.is_null() ? RID() : _surfaces[TREE_SURFACE_TWIG].material->get_rid());
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if (_enable_branch_mesh) {
|
||||||
int vert_count = tree.mVertCount;
|
int vert_count = tree.mVertCount;
|
||||||
|
|
||||||
PoolVector<Vector2> uvs;
|
PoolVector<Vector2> uvs;
|
||||||
@ -344,12 +371,13 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
|
|
||||||
{
|
{
|
||||||
PoolVector<Vector3>::Read r = verts.read();
|
PoolVector<Vector3>::Read r = verts.read();
|
||||||
for (int i = 0; i < vert_count; i++) {
|
|
||||||
//if (i == 0) {
|
if (!_enable_twig_mesh && vert_count > 0) {
|
||||||
// aabb.position = r[i];
|
aabb.position = r[0];
|
||||||
//} else {
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < vert_count; ++i) {
|
||||||
aabb.expand_to(r[i]);
|
aabb.expand_to(r[i]);
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -359,8 +387,12 @@ void ProceduralTreeMesh::_update() const {
|
|||||||
arr[RS::ARRAY_TEX_UV] = uvs;
|
arr[RS::ARRAY_TEX_UV] = uvs;
|
||||||
arr[RS::ARRAY_NORMAL] = normals;
|
arr[RS::ARRAY_NORMAL] = normals;
|
||||||
arr[RS::ARRAY_INDEX] = indices;
|
arr[RS::ARRAY_INDEX] = indices;
|
||||||
|
|
||||||
|
|
||||||
RenderingServer::get_singleton()->mesh_add_surface_from_arrays(mesh, RenderingServer::PRIMITIVE_TRIANGLES, arr);
|
RenderingServer::get_singleton()->mesh_add_surface_from_arrays(mesh, RenderingServer::PRIMITIVE_TRIANGLES, arr);
|
||||||
RenderingServer::get_singleton()->mesh_surface_set_material(mesh, TREE_SURFACE_TRUNK, _surfaces[TREE_SURFACE_TRUNK].material.is_null() ? RID() : _surfaces[TREE_SURFACE_TRUNK].material->get_rid());
|
int sc = RenderingServer::get_singleton()->mesh_get_surface_count(mesh) - 1;
|
||||||
|
_surfaces[TREE_SURFACE_TRUNK].surface_index = sc;
|
||||||
|
RenderingServer::get_singleton()->mesh_surface_set_material(mesh, sc, _surfaces[TREE_SURFACE_TRUNK].material.is_null() ? RID() : _surfaces[TREE_SURFACE_TRUNK].material->get_rid());
|
||||||
}
|
}
|
||||||
|
|
||||||
pending_request = false;
|
pending_request = false;
|
||||||
@ -390,7 +422,13 @@ int ProceduralTreeMesh::surface_get_array_len(int p_idx) const {
|
|||||||
_update();
|
_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
return RenderingServer::get_singleton()->mesh_surface_get_array_len(mesh, p_idx);
|
int si = _surfaces[p_idx].surface_index;
|
||||||
|
|
||||||
|
if (si == -1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RenderingServer::get_singleton()->mesh_surface_get_array_len(mesh, si);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ProceduralTreeMesh::surface_get_array_index_len(int p_idx) const {
|
int ProceduralTreeMesh::surface_get_array_index_len(int p_idx) const {
|
||||||
@ -399,7 +437,13 @@ int ProceduralTreeMesh::surface_get_array_index_len(int p_idx) const {
|
|||||||
_update();
|
_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
return RenderingServer::get_singleton()->mesh_surface_get_array_index_len(mesh, p_idx);
|
int si = _surfaces[p_idx].surface_index;
|
||||||
|
|
||||||
|
if (si == -1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RenderingServer::get_singleton()->mesh_surface_get_array_index_len(mesh, si);
|
||||||
}
|
}
|
||||||
|
|
||||||
Array ProceduralTreeMesh::surface_get_arrays(int p_surface) const {
|
Array ProceduralTreeMesh::surface_get_arrays(int p_surface) const {
|
||||||
@ -408,7 +452,13 @@ Array ProceduralTreeMesh::surface_get_arrays(int p_surface) const {
|
|||||||
_update();
|
_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
return RenderingServer::get_singleton()->mesh_surface_get_arrays(mesh, p_surface);
|
int si = _surfaces[p_surface].surface_index;
|
||||||
|
|
||||||
|
if (si == -1) {
|
||||||
|
return Array();
|
||||||
|
}
|
||||||
|
|
||||||
|
return RenderingServer::get_singleton()->mesh_surface_get_arrays(mesh, si);
|
||||||
}
|
}
|
||||||
|
|
||||||
Array ProceduralTreeMesh::surface_get_blend_shape_arrays(int p_surface) const {
|
Array ProceduralTreeMesh::surface_get_blend_shape_arrays(int p_surface) const {
|
||||||
@ -426,7 +476,13 @@ uint32_t ProceduralTreeMesh::surface_get_format(int p_idx) const {
|
|||||||
_update();
|
_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
return RenderingServer::get_singleton()->mesh_surface_get_format(mesh, p_idx);
|
int si = _surfaces[p_idx].surface_index;
|
||||||
|
|
||||||
|
if (si == -1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RenderingServer::get_singleton()->mesh_surface_get_format(mesh, si);
|
||||||
}
|
}
|
||||||
|
|
||||||
Mesh::PrimitiveType ProceduralTreeMesh::surface_get_primitive_type(int p_idx) const {
|
Mesh::PrimitiveType ProceduralTreeMesh::surface_get_primitive_type(int p_idx) const {
|
||||||
@ -484,8 +540,13 @@ RID ProceduralTreeMesh::get_rid() const {
|
|||||||
void ProceduralTreeMesh::set_twig_material(const Ref<Material> &p_material) {
|
void ProceduralTreeMesh::set_twig_material(const Ref<Material> &p_material) {
|
||||||
_surfaces[TREE_SURFACE_TWIG].material = p_material;
|
_surfaces[TREE_SURFACE_TWIG].material = p_material;
|
||||||
if (!pending_request) {
|
if (!pending_request) {
|
||||||
// just apply it, else it'll happen when _update is called.
|
int si = _surfaces[TREE_SURFACE_TWIG].surface_index;
|
||||||
RenderingServer::get_singleton()->mesh_surface_set_material(mesh, TREE_SURFACE_TWIG, _surfaces[TREE_SURFACE_TWIG].material.is_null() ? RID() : _surfaces[TREE_SURFACE_TWIG].material->get_rid());
|
|
||||||
|
if (si != -1) {
|
||||||
|
// just apply it, else it'll happen when _update is called.
|
||||||
|
RenderingServer::get_singleton()->mesh_surface_set_material(mesh, si, _surfaces[TREE_SURFACE_TWIG].material.is_null() ? RID() : _surfaces[TREE_SURFACE_TWIG].material->get_rid());
|
||||||
|
}
|
||||||
|
|
||||||
_change_notify();
|
_change_notify();
|
||||||
emit_changed();
|
emit_changed();
|
||||||
};
|
};
|
||||||
@ -498,8 +559,13 @@ Ref<Material> ProceduralTreeMesh::get_twig_material() const {
|
|||||||
void ProceduralTreeMesh::set_trunk_material(const Ref<Material> &p_material) {
|
void ProceduralTreeMesh::set_trunk_material(const Ref<Material> &p_material) {
|
||||||
_surfaces[TREE_SURFACE_TRUNK].material = p_material;
|
_surfaces[TREE_SURFACE_TRUNK].material = p_material;
|
||||||
if (!pending_request) {
|
if (!pending_request) {
|
||||||
// just apply it, else it'll happen when _update is called.
|
int si = _surfaces[TREE_SURFACE_TWIG].surface_index;
|
||||||
RenderingServer::get_singleton()->mesh_surface_set_material(mesh, TREE_SURFACE_TRUNK, _surfaces[TREE_SURFACE_TRUNK].material.is_null() ? RID() : _surfaces[TREE_SURFACE_TRUNK].material->get_rid());
|
|
||||||
|
if (si != -1) {
|
||||||
|
// just apply it, else it'll happen when _update is called.
|
||||||
|
RenderingServer::get_singleton()->mesh_surface_set_material(mesh, si, _surfaces[TREE_SURFACE_TRUNK].material.is_null() ? RID() : _surfaces[TREE_SURFACE_TRUNK].material->get_rid());
|
||||||
|
}
|
||||||
|
|
||||||
_change_notify();
|
_change_notify();
|
||||||
emit_changed();
|
emit_changed();
|
||||||
};
|
};
|
||||||
@ -513,6 +579,13 @@ Array ProceduralTreeMesh::get_mesh_arrays() const {
|
|||||||
Array arr;
|
Array arr;
|
||||||
|
|
||||||
for (int i = 0; i < TREE_SURFACE_COUNT; ++i) {
|
for (int i = 0; i < TREE_SURFACE_COUNT; ++i) {
|
||||||
|
int si = _surfaces[i].surface_index;
|
||||||
|
|
||||||
|
if (si == -1) {
|
||||||
|
arr.push_back(Array());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
arr.push_back(surface_get_arrays(i));
|
arr.push_back(surface_get_arrays(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,6 +636,9 @@ ProceduralTreeMesh::ProceduralTreeMesh() {
|
|||||||
_trunk_taper_rate = 0.947;
|
_trunk_taper_rate = 0.947;
|
||||||
_trunk_twists = 3.02;
|
_trunk_twists = 3.02;
|
||||||
_trunk_length = 2.4;
|
_trunk_length = 2.4;
|
||||||
|
|
||||||
|
_enable_branch_mesh = true;
|
||||||
|
_enable_twig_mesh = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProceduralTreeMesh::~ProceduralTreeMesh() {
|
ProceduralTreeMesh::~ProceduralTreeMesh() {
|
||||||
@ -676,6 +752,14 @@ void ProceduralTreeMesh::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("set_custom_aabb", "aabb"), &ProceduralTreeMesh::set_custom_aabb);
|
ClassDB::bind_method(D_METHOD("set_custom_aabb", "aabb"), &ProceduralTreeMesh::set_custom_aabb);
|
||||||
ClassDB::bind_method(D_METHOD("get_custom_aabb"), &ProceduralTreeMesh::get_custom_aabb);
|
ClassDB::bind_method(D_METHOD("get_custom_aabb"), &ProceduralTreeMesh::get_custom_aabb);
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("get_enable_branch_mesh"), &ProceduralTreeMesh::get_enable_branch_mesh);
|
||||||
|
ClassDB::bind_method(D_METHOD("set_enable_branch_mesh", "value"), &ProceduralTreeMesh::set_enable_branch_mesh);
|
||||||
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enable_branch_mesh"), "set_enable_branch_mesh", "get_enable_branch_mesh");
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("get_enable_twig_mesh"), &ProceduralTreeMesh::get_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::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");
|
||||||
|
|
||||||
|
@ -76,6 +76,13 @@ public:
|
|||||||
float trunk_get_length() const;
|
float trunk_get_length() const;
|
||||||
void trunk_set_length(const float p_value);
|
void trunk_set_length(const float p_value);
|
||||||
|
|
||||||
|
// Meshes
|
||||||
|
bool get_enable_branch_mesh() const;
|
||||||
|
void set_enable_branch_mesh(const bool p_value);
|
||||||
|
|
||||||
|
bool get_enable_twig_mesh() const;
|
||||||
|
void set_enable_twig_mesh(const bool p_value);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum TreeSurfaces {
|
enum TreeSurfaces {
|
||||||
TREE_SURFACE_TWIG = 0,
|
TREE_SURFACE_TWIG = 0,
|
||||||
@ -146,14 +153,23 @@ private:
|
|||||||
float _trunk_twists; //mProperties.mTwistRate
|
float _trunk_twists; //mProperties.mTwistRate
|
||||||
float _trunk_length; //mProperties.mTrunkLength
|
float _trunk_length; //mProperties.mTrunkLength
|
||||||
|
|
||||||
|
// Meshes
|
||||||
|
bool _enable_branch_mesh;
|
||||||
|
bool _enable_twig_mesh;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RID mesh;
|
RID mesh;
|
||||||
|
|
||||||
struct TreeSurface {
|
struct TreeSurface {
|
||||||
|
int surface_index;
|
||||||
Ref<Material> material;
|
Ref<Material> material;
|
||||||
|
|
||||||
|
TreeSurface() {
|
||||||
|
surface_index = -1;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
TreeSurface _surfaces[TREE_SURFACE_COUNT];
|
mutable TreeSurface _surfaces[TREE_SURFACE_COUNT];
|
||||||
|
|
||||||
mutable AABB aabb;
|
mutable AABB aabb;
|
||||||
AABB custom_aabb;
|
AABB custom_aabb;
|
||||||
|
Loading…
Reference in New Issue
Block a user