|
@@ -37,6 +37,168 @@
|
|
|
#include "scene/resources/concave_polygon_shape_3d.h"
|
|
|
#include "scene/resources/convex_polygon_shape_3d.h"
|
|
|
|
|
|
+void MeshConvexDecompositionSettings::set_max_concavity(real_t p_max_concavity) {
|
|
|
+ max_concavity = CLAMP(p_max_concavity, 0.001, 1.0);
|
|
|
+}
|
|
|
+
|
|
|
+real_t MeshConvexDecompositionSettings::get_max_concavity() const {
|
|
|
+ return max_concavity;
|
|
|
+};
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_symmetry_planes_clipping_bias(real_t p_symmetry_planes_clipping_bias) {
|
|
|
+ symmetry_planes_clipping_bias = CLAMP(p_symmetry_planes_clipping_bias, 0.0, 1.0);
|
|
|
+};
|
|
|
+
|
|
|
+real_t MeshConvexDecompositionSettings::get_symmetry_planes_clipping_bias() const {
|
|
|
+ return symmetry_planes_clipping_bias;
|
|
|
+};
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_revolution_axes_clipping_bias(real_t p_revolution_axes_clipping_bias) {
|
|
|
+ revolution_axes_clipping_bias = CLAMP(p_revolution_axes_clipping_bias, 0.0, 1.0);
|
|
|
+};
|
|
|
+
|
|
|
+real_t MeshConvexDecompositionSettings::get_revolution_axes_clipping_bias() const {
|
|
|
+ return revolution_axes_clipping_bias;
|
|
|
+};
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_min_volume_per_convex_hull(real_t p_min_volume_per_convex_hull) {
|
|
|
+ min_volume_per_convex_hull = CLAMP(p_min_volume_per_convex_hull, 0.0001, 0.01);
|
|
|
+}
|
|
|
+
|
|
|
+real_t MeshConvexDecompositionSettings::get_min_volume_per_convex_hull() const {
|
|
|
+ return min_volume_per_convex_hull;
|
|
|
+}
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_resolution(uint32_t p_resolution) {
|
|
|
+ resolution = p_resolution < 10'000 ? 10'000 : (p_resolution > 100'000 ? 100'000 : p_resolution);
|
|
|
+}
|
|
|
+
|
|
|
+uint32_t MeshConvexDecompositionSettings::get_resolution() const {
|
|
|
+ return resolution;
|
|
|
+}
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_max_num_vertices_per_convex_hull(uint32_t p_max_num_vertices_per_convex_hull) {
|
|
|
+ max_num_vertices_per_convex_hull = p_max_num_vertices_per_convex_hull < 4 ? 4 : (p_max_num_vertices_per_convex_hull > 1024 ? 1024 : p_max_num_vertices_per_convex_hull);
|
|
|
+}
|
|
|
+
|
|
|
+uint32_t MeshConvexDecompositionSettings::get_max_num_vertices_per_convex_hull() const {
|
|
|
+ return max_num_vertices_per_convex_hull;
|
|
|
+}
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_plane_downsampling(uint32_t p_plane_downsampling) {
|
|
|
+ plane_downsampling = p_plane_downsampling < 1 ? 1 : (p_plane_downsampling > 16 ? 16 : p_plane_downsampling);
|
|
|
+}
|
|
|
+
|
|
|
+uint32_t MeshConvexDecompositionSettings::get_plane_downsampling() const {
|
|
|
+ return plane_downsampling;
|
|
|
+}
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_convex_hull_downsampling(uint32_t p_convex_hull_downsampling) {
|
|
|
+ convex_hull_downsampling = p_convex_hull_downsampling < 1 ? 1 : (p_convex_hull_downsampling > 16 ? 16 : p_convex_hull_downsampling);
|
|
|
+}
|
|
|
+
|
|
|
+uint32_t MeshConvexDecompositionSettings::get_convex_hull_downsampling() const {
|
|
|
+ return convex_hull_downsampling;
|
|
|
+}
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_normalize_mesh(bool p_normalize_mesh) {
|
|
|
+ normalize_mesh = p_normalize_mesh;
|
|
|
+}
|
|
|
+
|
|
|
+bool MeshConvexDecompositionSettings::get_normalize_mesh() const {
|
|
|
+ return normalize_mesh;
|
|
|
+}
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_mode(Mode p_mode) {
|
|
|
+ mode = p_mode;
|
|
|
+}
|
|
|
+
|
|
|
+MeshConvexDecompositionSettings::Mode MeshConvexDecompositionSettings::get_mode() const {
|
|
|
+ return mode;
|
|
|
+}
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_convex_hull_approximation(bool p_convex_hull_approximation) {
|
|
|
+ convex_hull_approximation = p_convex_hull_approximation;
|
|
|
+}
|
|
|
+
|
|
|
+bool MeshConvexDecompositionSettings::get_convex_hull_approximation() const {
|
|
|
+ return convex_hull_approximation;
|
|
|
+}
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_max_convex_hulls(uint32_t p_max_convex_hulls) {
|
|
|
+ max_convex_hulls = p_max_convex_hulls < 1 ? 1 : (p_max_convex_hulls > 32 ? 32 : p_max_convex_hulls);
|
|
|
+}
|
|
|
+
|
|
|
+uint32_t MeshConvexDecompositionSettings::get_max_convex_hulls() const {
|
|
|
+ return max_convex_hulls;
|
|
|
+}
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::set_project_hull_vertices(bool p_project_hull_vertices) {
|
|
|
+ project_hull_vertices = p_project_hull_vertices;
|
|
|
+}
|
|
|
+
|
|
|
+bool MeshConvexDecompositionSettings::get_project_hull_vertices() const {
|
|
|
+ return project_hull_vertices;
|
|
|
+}
|
|
|
+
|
|
|
+void MeshConvexDecompositionSettings::_bind_methods() {
|
|
|
+ ClassDB::bind_method(D_METHOD("set_max_concavity", "max_concavity"), &MeshConvexDecompositionSettings::set_max_concavity);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_max_concavity"), &MeshConvexDecompositionSettings::get_max_concavity);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_symmetry_planes_clipping_bias", "symmetry_planes_clipping_bias"), &MeshConvexDecompositionSettings::set_symmetry_planes_clipping_bias);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_symmetry_planes_clipping_bias"), &MeshConvexDecompositionSettings::get_symmetry_planes_clipping_bias);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_revolution_axes_clipping_bias", "revolution_axes_clipping_bias"), &MeshConvexDecompositionSettings::set_revolution_axes_clipping_bias);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_revolution_axes_clipping_bias"), &MeshConvexDecompositionSettings::get_revolution_axes_clipping_bias);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_min_volume_per_convex_hull", "min_volume_per_convex_hull"), &MeshConvexDecompositionSettings::set_min_volume_per_convex_hull);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_min_volume_per_convex_hull"), &MeshConvexDecompositionSettings::get_min_volume_per_convex_hull);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_resolution", "min_volume_per_convex_hull"), &MeshConvexDecompositionSettings::set_resolution);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_resolution"), &MeshConvexDecompositionSettings::get_resolution);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_max_num_vertices_per_convex_hull", "max_num_vertices_per_convex_hull"), &MeshConvexDecompositionSettings::set_max_num_vertices_per_convex_hull);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_max_num_vertices_per_convex_hull"), &MeshConvexDecompositionSettings::get_max_num_vertices_per_convex_hull);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_plane_downsampling", "plane_downsampling"), &MeshConvexDecompositionSettings::set_plane_downsampling);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_plane_downsampling"), &MeshConvexDecompositionSettings::get_plane_downsampling);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_convex_hull_downsampling", "convex_hull_downsampling"), &MeshConvexDecompositionSettings::set_convex_hull_downsampling);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_convex_hull_downsampling"), &MeshConvexDecompositionSettings::get_convex_hull_downsampling);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_normalize_mesh", "normalize_mesh"), &MeshConvexDecompositionSettings::set_normalize_mesh);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_normalize_mesh"), &MeshConvexDecompositionSettings::get_normalize_mesh);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_mode", "mode"), &MeshConvexDecompositionSettings::set_mode);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_mode"), &MeshConvexDecompositionSettings::get_mode);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_convex_hull_approximation", "convex_hull_approximation"), &MeshConvexDecompositionSettings::set_convex_hull_approximation);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_convex_hull_approximation"), &MeshConvexDecompositionSettings::get_convex_hull_approximation);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_max_convex_hulls", "max_convex_hulls"), &MeshConvexDecompositionSettings::set_max_convex_hulls);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_max_convex_hulls"), &MeshConvexDecompositionSettings::get_max_convex_hulls);
|
|
|
+
|
|
|
+ ClassDB::bind_method(D_METHOD("set_project_hull_vertices", "project_hull_vertices"), &MeshConvexDecompositionSettings::set_project_hull_vertices);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_project_hull_vertices"), &MeshConvexDecompositionSettings::get_project_hull_vertices);
|
|
|
+
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_concavity", PROPERTY_HINT_RANGE, "0.001,1.0,0.001"), "set_max_concavity", "get_max_concavity");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "symmetry_planes_clipping_bias", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_symmetry_planes_clipping_bias", "get_symmetry_planes_clipping_bias");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "revolution_axes_clipping_bias", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_revolution_axes_clipping_bias", "get_revolution_axes_clipping_bias");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "min_volume_per_convex_hull", PROPERTY_HINT_RANGE, "0.0001,0.01,0.0001"), "set_min_volume_per_convex_hull", "get_min_volume_per_convex_hull");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "resolution"), "set_resolution", "get_resolution");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "max_num_vertices_per_convex_hull"), "set_max_num_vertices_per_convex_hull", "get_max_num_vertices_per_convex_hull");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "plane_downsampling", PROPERTY_HINT_RANGE, "1,16,1"), "set_plane_downsampling", "get_plane_downsampling");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "convex_hull_downsampling", PROPERTY_HINT_RANGE, "1,16,1"), "set_convex_hull_downsampling", "get_convex_hull_downsampling");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "normalize_mesh"), "set_normalize_mesh", "get_normalize_mesh");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "mode", PROPERTY_HINT_ENUM, "Voxel,Tetrahedron"), "set_mode", "get_mode");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "convex_hull_approximation"), "set_convex_hull_approximation", "get_convex_hull_approximation");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "max_convex_hulls"), "set_max_convex_hulls", "get_max_convex_hulls");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "project_hull_vertices"), "set_project_hull_vertices", "get_project_hull_vertices");
|
|
|
+
|
|
|
+ BIND_ENUM_CONSTANT(CONVEX_DECOMPOSITION_MODE_VOXEL);
|
|
|
+ BIND_ENUM_CONSTANT(CONVEX_DECOMPOSITION_MODE_TETRAHEDRON);
|
|
|
+}
|
|
|
+
|
|
|
Mesh::ConvexDecompositionFunc Mesh::convex_decomposition_function = nullptr;
|
|
|
|
|
|
int Mesh::get_surface_count() const {
|
|
@@ -355,8 +517,10 @@ Vector<Face3> Mesh::get_surface_faces(int p_surface) const {
|
|
|
|
|
|
Ref<ConvexPolygonShape3D> Mesh::create_convex_shape(bool p_clean, bool p_simplify) const {
|
|
|
if (p_simplify) {
|
|
|
- ConvexDecompositionSettings settings;
|
|
|
- settings.max_convex_hulls = 1;
|
|
|
+ Ref<MeshConvexDecompositionSettings> settings = Ref<MeshConvexDecompositionSettings>();
|
|
|
+ settings.instantiate();
|
|
|
+ settings->set_max_convex_hulls(1);
|
|
|
+ settings->set_max_concavity(1.0);
|
|
|
Vector<Ref<Shape3D>> decomposed = convex_decompose(settings);
|
|
|
if (decomposed.size() == 1) {
|
|
|
return decomposed[0];
|
|
@@ -725,7 +889,7 @@ void Mesh::clear_cache() const {
|
|
|
debug_lines.clear();
|
|
|
}
|
|
|
|
|
|
-Vector<Ref<Shape3D>> Mesh::convex_decompose(const ConvexDecompositionSettings &p_settings) const {
|
|
|
+Vector<Ref<Shape3D>> Mesh::convex_decompose(const Ref<MeshConvexDecompositionSettings> &p_settings) const {
|
|
|
ERR_FAIL_COND_V(!convex_decomposition_function, Vector<Ref<Shape3D>>());
|
|
|
|
|
|
Ref<TriangleMesh> tm = generate_triangle_mesh();
|