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:
authorHabib Gahbiche <habibgahbiche@gmail.com>2018-08-31 18:26:01 +0300
committerDalai Felinto <dfelinto@gmail.com>2018-08-31 20:20:56 +0300
commit3a43528274224daa2965d1cb42607216f49f2d7d (patch)
tree6590551f6f3d4e30d1cfc44269c7c02e4e86f394 /source/blender/editors/mesh/editmesh_tools.c
parent7f36fb458cbea8083d3b863da18e1cfb1fc04e1f (diff)
Multi-Objects: MESH_OT_shape_propagate_to_all
Pressing "Propagate to Shapes" now propagates the current shapes to the selected object's respective keys, if at least one selected object has shape keys. Discussion here: https://devtalk.blender.org/t/behaviour-of-shape-keys-in-multi-object-mode/1956/4 Changes from reviewer (Dalai Felinto): * Code style * Error message * Remove dead code Reviewers: dfelinto Differential Revision: https://developer.blender.org/D3651
Diffstat (limited to 'source/blender/editors/mesh/editmesh_tools.c')
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c52
1 files changed, 31 insertions, 21 deletions
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 0e0c8ba7eea..bd6029c626a 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -3028,48 +3028,58 @@ void MESH_OT_remove_doubles(wmOperatorType *ot)
* \{ */
/* BMESH_TODO this should be properly encapsulated in a bmop. but later.*/
-static void shape_propagate(BMEditMesh *em, wmOperator *op)
+static bool shape_propagate(BMEditMesh *em)
{
BMIter iter;
BMVert *eve = NULL;
float *co;
- int i, totshape = CustomData_number_of_layers(&em->bm->vdata, CD_SHAPEKEY);
+ int totshape = CustomData_number_of_layers(&em->bm->vdata, CD_SHAPEKEY);
if (!CustomData_has_layer(&em->bm->vdata, CD_SHAPEKEY)) {
- BKE_report(op->reports, RPT_ERROR, "Mesh does not have shape keys");
- return;
+ return false;
}
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- if (!BM_elem_flag_test(eve, BM_ELEM_SELECT) || BM_elem_flag_test(eve, BM_ELEM_HIDDEN))
+ if (!BM_elem_flag_test(eve, BM_ELEM_SELECT) || BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
continue;
+ }
- for (i = 0; i < totshape; i++) {
+ for (int i = 0; i < totshape; i++) {
co = CustomData_bmesh_get_n(&em->bm->vdata, eve->head.data, CD_SHAPEKEY, i);
copy_v3_v3(co, eve->co);
}
}
-
-#if 0
- //TAG Mesh Objects that share this data
- for (base = scene->base.first; base; base = base->next) {
- if (base->object && base->object->data == me) {
- DEG_id_tag_update(&base->object->id, OB_RECALC_DATA);
- }
- }
-#endif
+ return true;
}
-
static int edbm_shape_propagate_to_all_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- Mesh *me = obedit->data;
- BMEditMesh *em = me->edit_btmesh;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ int tot_shapekeys = 0;
- shape_propagate(em, op);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Mesh *me = obedit->data;
+ BMEditMesh *em = me->edit_btmesh;
- EDBM_update_generic(em, false, false);
+ if (shape_propagate(em)){
+ tot_shapekeys++;
+ };
+
+ EDBM_update_generic(em, false, false);
+ }
+ MEM_freeN(objects);
+
+ if (tot_shapekeys == 0){
+ BKE_report(op->reports,
+ RPT_ERROR,
+ objects_len > 1 ?
+ "Meshes do not have shape keys" :
+ "Mesh does not have shape keys");
+ return OPERATOR_CANCELLED;
+ }
return OPERATOR_FINISHED;
}