summaryrefslogtreecommitdiff
path: root/scene
diff options
context:
space:
mode:
authorLyuma <xn.lyuma@gmail.com>2023-02-23 11:07:48 +0100
committerLyuma <xn.lyuma@gmail.com>2023-02-23 11:55:28 +0100
commit51a4fe1d530be9894e56db20a271773eb63053b2 (patch)
treeaf8a41fcaca9de7ad488761e5b911bc67e320144 /scene
parent19c9fd6926b958016d562e3b2e93b0e9480300f5 (diff)
import: Fix uv2 by avoiding premature ImporterMesh::get_mesh()
Implements create_convex_shape in ImpoterMesh. Note: ImporterMeshInstance3D::get_mesh() is safe. The only dangerous function with side effects is ImpoterMesh::get_mesh()
Diffstat (limited to 'scene')
-rw-r--r--scene/resources/importer_mesh.cpp38
-rw-r--r--scene/resources/importer_mesh.h1
2 files changed, 39 insertions, 0 deletions
diff --git a/scene/resources/importer_mesh.cpp b/scene/resources/importer_mesh.cpp
index 672581bbe2..0fc72ca90f 100644
--- a/scene/resources/importer_mesh.cpp
+++ b/scene/resources/importer_mesh.cpp
@@ -31,6 +31,7 @@
#include "importer_mesh.h"
#include "core/io/marshalls.h"
+#include "core/math/convex_hull.h"
#include "core/math/random_pcg.h"
#include "core/math/static_raycaster.h"
#include "scene/resources/surface_tool.h"
@@ -984,6 +985,43 @@ Vector<Ref<Shape3D>> ImporterMesh::convex_decompose(const Mesh::ConvexDecomposit
return ret;
}
+Ref<ConvexPolygonShape3D> ImporterMesh::create_convex_shape(bool p_clean, bool p_simplify) const {
+ if (p_simplify) {
+ Mesh::ConvexDecompositionSettings settings;
+ settings.max_convex_hulls = 1;
+ Vector<Ref<Shape3D>> decomposed = convex_decompose(settings);
+ if (decomposed.size() == 1) {
+ return decomposed[0];
+ } else {
+ ERR_PRINT("Convex shape simplification failed, falling back to simpler process.");
+ }
+ }
+
+ Vector<Vector3> vertices;
+ for (int i = 0; i < get_surface_count(); i++) {
+ Array a = get_surface_arrays(i);
+ ERR_FAIL_COND_V(a.is_empty(), Ref<ConvexPolygonShape3D>());
+ Vector<Vector3> v = a[Mesh::ARRAY_VERTEX];
+ vertices.append_array(v);
+ }
+
+ Ref<ConvexPolygonShape3D> shape = memnew(ConvexPolygonShape3D);
+
+ if (p_clean) {
+ Geometry3D::MeshData md;
+ Error err = ConvexHullComputer::convex_hull(vertices, md);
+ if (err == OK) {
+ shape->set_points(md.vertices);
+ return shape;
+ } else {
+ ERR_PRINT("Convex shape cleaning failed, falling back to simpler process.");
+ }
+ }
+
+ shape->set_points(vertices);
+ return shape;
+}
+
Ref<ConcavePolygonShape3D> ImporterMesh::create_trimesh_shape() const {
Vector<Face3> faces = get_faces();
if (faces.size() == 0) {
diff --git a/scene/resources/importer_mesh.h b/scene/resources/importer_mesh.h
index 900a8851c0..33d0864342 100644
--- a/scene/resources/importer_mesh.h
+++ b/scene/resources/importer_mesh.h
@@ -119,6 +119,7 @@ public:
Vector<Face3> get_faces() const;
Vector<Ref<Shape3D>> convex_decompose(const Mesh::ConvexDecompositionSettings &p_settings) const;
+ Ref<ConvexPolygonShape3D> create_convex_shape(bool p_clean = true, bool p_simplify = false) const;
Ref<ConcavePolygonShape3D> create_trimesh_shape() const;
Ref<NavigationMesh> create_navigation_mesh();
Error lightmap_unwrap_cached(const Transform3D &p_base_transform, float p_texel_size, const Vector<uint8_t> &p_src_cache, Vector<uint8_t> &r_dst_cache);