Blender currently has 2 algorithms for merging vertices: - `BKE_mesh_merge_verts`; - `blender::geometry::create_merged_mesh` `BKE_mesh_merge_verts` has a simplified algorithm to work with Array, Mirror and Screw modifiers. It doesn't support merge results that would create new faces. However it has shortcuts to be more efficient in these modifiers. `blender::geometry::create_merged_mesh` tries to predict all possible outcomes. So it's a more complex. But it loses in performance to `BKE_mesh_merge_verts` in some cases. The performance comparison between these two depends on many factors. `blender::geometry::create_merged_mesh` works with a context that has only the affected geometry. Thus a smaller region of the mesh is read for duplicate checking. Therefore, the smaller the affected geometry, the more efficient the operation. By my tests `blender::geometry::create_merged_mesh` beats `BKE_mesh_merge_verts` when less than 20% of the geometry is affected in worst case `MESH_MERGE_VERTS_DUMP_IF_EQUAL` or 17% in case of `MESH_MERGE_VERTS_DUMP_IF_MAPPED` . For cases where the entire geometry is affected, a 30% loss was noticed, largely due to the creation of a context that represents the entire mesh. Co-authored-by: Germano Cavalcante <germano.costa@ig.com.br> Pull Request #105136
45 lines
1.7 KiB
C++
45 lines
1.7 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2019 Blender Foundation. All rights reserved. */
|
|
|
|
#pragma once
|
|
|
|
/** \file
|
|
* \ingroup bke
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct Main;
|
|
struct Mesh;
|
|
struct MirrorModifierData;
|
|
struct Object;
|
|
|
|
struct Mesh *BKE_mesh_mirror_bisect_on_mirror_plane_for_modifier(struct MirrorModifierData *mmd,
|
|
const struct Mesh *mesh,
|
|
int axis,
|
|
const float plane_co[3],
|
|
float plane_no[3]);
|
|
|
|
void BKE_mesh_mirror_apply_mirror_on_axis(struct Main *bmain,
|
|
struct Mesh *mesh,
|
|
int axis,
|
|
float dist);
|
|
|
|
/**
|
|
* \warning This should _not_ be used to modify original meshes since
|
|
* it doesn't handle shape-keys, use #BKE_mesh_mirror_apply_mirror_on_axis instead.
|
|
*/
|
|
struct Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(struct MirrorModifierData *mmd,
|
|
struct Object *ob,
|
|
const struct Mesh *mesh,
|
|
int axis,
|
|
bool use_correct_order_on_merge,
|
|
int **r_vert_merge_map,
|
|
int *r_vert_merge_map_len);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|