Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <campbell@blender.org>2022-03-07 13:35:21 +0300
committerCampbell Barton <campbell@blender.org>2022-03-07 13:35:21 +0300
commit57c5f2a50329d6591eea41ac65ec94890c3c33df (patch)
treee1025ed2ec5187d1100805815e8d6c2e3d8616b4 /source/blender/bmesh/intern
parent25fc5876d3bb37018adcfe1a1b943b90d45f5f9a (diff)
parent72e20785e1e2ed7b15a9765ebb6df646fd32dbff (diff)
Merge branch 'blender-v3.1-release'
Diffstat (limited to 'source/blender/bmesh/intern')
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_convert.cc26
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_convert.h5
2 files changed, 23 insertions, 8 deletions
diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.cc b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
index f581e2967c0..dcbb14e3578 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
@@ -677,8 +677,16 @@ static int bm_to_mesh_shape_layer_index_from_kb(BMesh *bm, KeyBlock *currkey)
* \param bm: The source BMesh.
* \param key: The destination key.
* \param mvert: The destination vertex array (in some situations it's coordinates are updated).
+ * \param active_shapekey_to_mvert: When editing a non-basis shape key, the coordinates for the
+ * basis are typically copied into the `mvert` array since it makes sense for the meshes
+ * vertex coordinates to match the "Basis" key.
+ * When enabled, skip this step and copy #BMVert.co directly to #MVert.co,
+ * See #BMeshToMeshParams.active_shapekey_to_mvert doc-string.
*/
-static void bm_to_mesh_shape(BMesh *bm, Key *key, MVert *mvert)
+static void bm_to_mesh_shape(BMesh *bm,
+ Key *key,
+ MVert *mvert,
+ const bool active_shapekey_to_mvert)
{
KeyBlock *actkey = static_cast<KeyBlock *>(BLI_findlink(&key->block, bm->shapenr - 1));
@@ -762,12 +770,14 @@ static void bm_to_mesh_shape(BMesh *bm, Key *key, MVert *mvert)
* In this case it's important to overwrite these coordinates with the basis-keys coordinates. */
bool update_vertex_coords_from_refkey = false;
int cd_shape_offset_refkey = -1;
- if ((actkey != key->refkey) && (cd_shape_keyindex_offset != -1)) {
- const int refkey_uuid = bm_to_mesh_shape_layer_index_from_kb(bm, key->refkey);
- if (refkey_uuid != -1) {
- cd_shape_offset_refkey = CustomData_get_n_offset(&bm->vdata, CD_SHAPEKEY, refkey_uuid);
- if (cd_shape_offset_refkey != -1) {
- update_vertex_coords_from_refkey = true;
+ if (active_shapekey_to_mvert == false) {
+ if ((actkey != key->refkey) && (cd_shape_keyindex_offset != -1)) {
+ const int refkey_uuid = bm_to_mesh_shape_layer_index_from_kb(bm, key->refkey);
+ if (refkey_uuid != -1) {
+ cd_shape_offset_refkey = CustomData_get_n_offset(&bm->vdata, CD_SHAPEKEY, refkey_uuid);
+ if (cd_shape_offset_refkey != -1) {
+ update_vertex_coords_from_refkey = true;
+ }
}
}
}
@@ -1137,7 +1147,7 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
}
if (me->key) {
- bm_to_mesh_shape(bm, me->key, me->mvert);
+ bm_to_mesh_shape(bm, me->key, me->mvert, params->active_shapekey_to_mvert);
}
/* Run this even when shape keys aren't used since it may be used for hooks or vertex parents. */
diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.h b/source/blender/bmesh/intern/bmesh_mesh_convert.h
index 8e87fc86b6d..0bd70749cb1 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_convert.h
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert.h
@@ -53,6 +53,11 @@ struct BMeshToMeshParams {
* that have become invalid from updating the shape-key, see T71865.
*/
uint update_shapekey_indices : 1;
+ /**
+ * Instead of copying the basis shape-key into the #MVert array,
+ * copy the #BMVert.co directly to #MVert.co (used for reading undo data).
+ */
+ uint active_shapekey_to_mvert : 1;
struct CustomData_MeshMasks cd_mask_extra;
};
/**