From 2ca94e51e4d4477709b83b487a4f5b938f24f56b Mon Sep 17 00:00:00 2001 From: PouleyKetchoupp Date: Tue, 14 Sep 2021 17:14:06 -0700 Subject: Clean convex hull decomposition code Remove unnecessary conversion between triangle data and vertex data whenever possible. --- scene/resources/mesh.cpp | 98 ++++++++++++------------------------------------ 1 file changed, 23 insertions(+), 75 deletions(-) (limited to 'scene/resources/mesh.cpp') diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp index 1edc3ff38b..8f3f25f104 100644 --- a/scene/resources/mesh.cpp +++ b/scene/resources/mesh.cpp @@ -38,7 +38,7 @@ #include -Mesh::ConvexDecompositionFunc Mesh::convex_composition_function = nullptr; +Mesh::ConvexDecompositionFunc Mesh::convex_decomposition_function = nullptr; Ref Mesh::generate_triangle_mesh() const { if (triangle_mesh.is_valid()) { @@ -167,59 +167,6 @@ Vector Mesh::get_faces() const { return tm->get_faces(); } return Vector(); - /* - for (int i=0;imesh_surface_get_primitive_type( mesh, i ) != RenderingServer::PRIMITIVE_TRIANGLES ) - continue; - - Vector indices; - Vector vertices; - - vertices=RenderingServer::get_singleton()->mesh_surface_get_array(mesh, i,RenderingServer::ARRAY_VERTEX); - - int len=RenderingServer::get_singleton()->mesh_surface_get_array_index_len(mesh, i); - bool has_indices; - - if (len>0) { - indices=RenderingServer::get_singleton()->mesh_surface_get_array(mesh, i,RenderingServer::ARRAY_INDEX); - has_indices=true; - - } else { - len=vertices.size(); - has_indices=false; - } - - if (len<=0) - continue; - - const int* indicesr = indices.ptr(); - const int *indicesptr = indicesr.ptr(); - - const Vector3* verticesr = vertices.ptr(); - const Vector3 *verticesptr = verticesr.ptr(); - - int old_faces=faces.size(); - int new_faces=old_faces+(len/3); - - faces.resize(new_faces); - - Face3* facesw = faces.ptrw(); - Face3 *facesptr=facesw.ptr(); - - - for (int i=0;i Mesh::create_convex_shape(bool p_clean, bool p_simplify) const { @@ -568,35 +515,36 @@ void Mesh::clear_cache() const { } Vector> Mesh::convex_decompose(const ConvexDecompositionSettings &p_settings) const { - ERR_FAIL_COND_V(!convex_composition_function, Vector>()); - - const Vector faces = get_faces(); + ERR_FAIL_COND_V(!convex_decomposition_function, Vector>()); - const Vector> decomposed = convex_composition_function(faces, p_settings); - - Vector> ret; + Ref tm = generate_triangle_mesh(); + ERR_FAIL_COND_V(!tm.is_valid(), Vector>()); - for (int i = 0; i < decomposed.size(); i++) { - Set points; - for (int j = 0; j < decomposed[i].size(); j++) { - points.insert(decomposed[i][j].vertex[0]); - points.insert(decomposed[i][j].vertex[1]); - points.insert(decomposed[i][j].vertex[2]); - } + const Vector &triangles = tm->get_triangles(); + int triangle_count = triangles.size(); - Vector convex_points; - convex_points.resize(points.size()); - { - Vector3 *w = convex_points.ptrw(); - int idx = 0; - for (Set::Element *E = points.front(); E; E = E->next()) { - w[idx++] = E->get(); + Vector indices; + { + indices.resize(triangle_count * 3); + uint32_t *w = indices.ptrw(); + for (int i = 0; i < triangle_count; i++) { + for (int j = 0; j < 3; j++) { + w[i * 3 + j] = triangles[i].indices[j]; } } + } + + const Vector &vertices = tm->get_vertices(); + int vertex_count = vertices.size(); + Vector> decomposed = convex_decomposition_function((real_t *)vertices.ptr(), vertex_count, indices.ptr(), triangle_count, p_settings, nullptr); + + Vector> ret; + + for (int i = 0; i < decomposed.size(); i++) { Ref shape; shape.instantiate(); - shape->set_points(convex_points); + shape->set_points(decomposed[i]); ret.push_back(shape); } -- cgit v1.2.3