[Bf-blender-cvs] [7d25a5ab3f8] sculpt-dev: Sculpt: fix adding shapekeys in sculpt mode zeroing verts.
Joseph Eagar
noreply at git.blender.org
Fri Oct 15 07:53:15 CEST 2021
Commit: 7d25a5ab3f890bbaa53369720df9c43a022327e9
Author: Joseph Eagar
Date: Thu Oct 14 22:52:40 2021 -0700
Branches: sculpt-dev
https://developer.blender.org/rB7d25a5ab3f890bbaa53369720df9c43a022327e9
Sculpt: fix adding shapekeys in sculpt mode
zeroing verts.
===================================================================
M source/blender/blenkernel/intern/paint.c
===================================================================
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 951e680b4de..615176b39f1 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -1855,13 +1855,47 @@ static void sculpt_update_object(Depsgraph *depsgraph,
}
BKE_sculptsession_check_mdyntopo(ob->sculpt, pbvh, totvert);
+
if (ss->bm && me->key && ob->shapenr != ss->bm->shapenr) {
KeyBlock *actkey = BLI_findlink(&me->key->block, ss->bm->shapenr - 1);
KeyBlock *newkey = BLI_findlink(&me->key->block, ob->shapenr - 1);
+ bool updatePBVH = false;
+
if (!actkey) {
printf("%s: failed to find active shapekey\n", __func__);
+ if (!ss->bm->shapenr || !CustomData_has_layer(&ss->bm->vdata, CD_SHAPEKEY)) {
+ printf("allocating shapekeys. . .\n");
+
+ // need to allocate customdata for keys
+ for (KeyBlock *key = (KeyBlock *)me->key->block.first; key; key = key->next) {
+
+ int idx = CustomData_get_named_layer_index(&ss->bm->vdata, CD_SHAPEKEY, key->name);
+
+ if (idx == -1) {
+ BM_data_layer_add_named(ss->bm, &ss->bm->vdata, CD_SHAPEKEY, key->name);
+ SCULPT_update_customdata_refs(ss);
+
+ idx = CustomData_get_named_layer_index(&ss->bm->vdata, CD_SHAPEKEY, key->name);
+ ss->bm->vdata.layers[idx].uid = key->uid;
+ }
+
+ int cd_shapeco = ss->bm->vdata.layers[idx].offset;
+ BMVert *v;
+ BMIter iter;
+
+ BM_ITER_MESH (v, &iter, ss->bm, BM_VERTS_OF_MESH) {
+ float *keyco = BM_ELEM_CD_GET_VOID_P(v, cd_shapeco);
+
+ copy_v3_v3(keyco, v->co);
+ }
+ }
+ }
+
+ updatePBVH = true;
+ ss->bm->shapenr = ob->shapenr;
}
+
if (!newkey) {
printf("%s: failed to find new active shapekey\n", __func__);
}
@@ -1870,21 +1904,35 @@ static void sculpt_update_object(Depsgraph *depsgraph,
int cd_co1 = CustomData_get_named_layer_index(&ss->bm->vdata, CD_SHAPEKEY, actkey->name);
int cd_co2 = CustomData_get_named_layer_index(&ss->bm->vdata, CD_SHAPEKEY, newkey->name);
+ BMVert *v;
+ BMIter iter;
+
if (cd_co1 == -1) { // non-recoverable error
printf("%s: failed to find active shapekey in customdata.\n", __func__);
return;
}
else if (cd_co2 == -1) {
+ printf("%s: failed to find new shapekey in customdata; allocating . . .\n", __func__);
+
BM_data_layer_add_named(ss->bm, &ss->bm->vdata, CD_SHAPEKEY, newkey->name);
- cd_co2 = CustomData_get_named_layer_index(&ss->bm->vdata, CD_SHAPEKEY, newkey->name);
+ int idx = CustomData_get_named_layer_index(&ss->bm->vdata, CD_SHAPEKEY, newkey->name);
+
+ int cd_co = ss->bm->vdata.layers[idx].offset;
+ ss->bm->vdata.layers[idx].uid = newkey->uid;
+
SCULPT_update_customdata_refs(ss);
+
+ BM_ITER_MESH (v, &iter, ss->bm, BM_VERTS_OF_MESH) {
+ float *keyco = BM_ELEM_CD_GET_VOID_P(v, cd_co);
+ copy_v3_v3(keyco, v->co);
+ }
+
+ cd_co2 = idx;
}
cd_co1 = ss->bm->vdata.layers[cd_co1].offset;
cd_co2 = ss->bm->vdata.layers[cd_co2].offset;
- BMVert *v;
- BMIter iter;
BM_ITER_MESH (v, &iter, ss->bm, BM_VERTS_OF_MESH) {
float *co1 = BM_ELEM_CD_GET_VOID_P(v, cd_co1);
float *co2 = BM_ELEM_CD_GET_VOID_P(v, cd_co2);
@@ -1895,15 +1943,17 @@ static void sculpt_update_object(Depsgraph *depsgraph,
ss->bm->shapenr = ob->shapenr;
- if (ss->pbvh) {
- PBVHNode **nodes;
- int totnode;
- BKE_pbvh_get_nodes(ss->pbvh, PBVH_Leaf, &nodes, &totnode);
+ updatePBVH = true;
+ }
- for (int i = 0; i < totnode; i++) {
- BKE_pbvh_node_mark_update(nodes[i]);
- BKE_pbvh_node_mark_update_tri_area(nodes[i]);
- }
+ if (updatePBVH && ss->pbvh) {
+ PBVHNode **nodes;
+ int totnode;
+ BKE_pbvh_get_nodes(ss->pbvh, PBVH_Leaf, &nodes, &totnode);
+
+ for (int i = 0; i < totnode; i++) {
+ BKE_pbvh_node_mark_update(nodes[i]);
+ BKE_pbvh_node_mark_update_tri_area(nodes[i]);
}
}
}
More information about the Bf-blender-cvs
mailing list