Merge branch 'blender2.7'
[blender.git] / source / blender / editors / mesh / meshtools.c
index c9ce8ed54fca3a4ead65035c20e97f892bf9e937..05c0fddfda000c631f2d96f09a051d4f9363f5a3 100644 (file)
@@ -66,6 +66,7 @@
 
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph_query.h"
 
 #include "ED_mesh.h"
 #include "ED_object.h"
@@ -150,7 +151,8 @@ static void join_mesh_single(
                                        /* check if this mesh has such a shapekey */
                                        KeyBlock *okb = me->key ? BKE_keyblock_find_name(me->key, kb->name) : NULL;
                                        if (okb) {
-                                               /* copy this mesh's shapekey to the destination shapekey (need to transform first) */
+                                               /* copy this mesh's shapekey to the destination shapekey
+                                                * (need to transform first) */
                                                float (*ocos)[3] = okb->data;
                                                for (a = 0; a < me->totvert; a++, cos++, ocos++) {
                                                        copy_v3_v3(*cos, *ocos);
@@ -399,7 +401,8 @@ int join_mesh_exec(bContext *C, wmOperator *op)
 
 
                        if (me->totvert) {
-                               /* Add this object's materials to the base one's if they don't exist already (but only if limits not exceeded yet) */
+                               /* Add this object's materials to the base one's if they don't exist already
+                                * (but only if limits not exceeded yet) */
                                if (totcol < MAXMAT) {
                                        for (a = 1; a <= ob_iter->totcol; a++) {
                                                ma = give_current_material(ob_iter, a);
@@ -422,7 +425,8 @@ int join_mesh_exec(bContext *C, wmOperator *op)
                                        }
                                }
 
-                               /* if this mesh has shapekeys, check if destination mesh already has matching entries too */
+                               /* if this mesh has shapekeys,
+                                * check if destination mesh already has matching entries too */
                                if (me->key && key) {
                                        /* for remapping KeyBlock.relative */
                                        int      *index_map = MEM_mallocN(sizeof(int)        * me->key->totkey, __func__);
@@ -453,7 +457,8 @@ int join_mesh_exec(bContext *C, wmOperator *op)
 
                                        /* remap relative index values */
                                        for (kb = me->key->block.first, i = 0; kb; kb = kb->next, i++) {
-                                               if (LIKELY(kb->relative < me->key->totkey)) {  /* sanity check, should always be true */
+                                               /* sanity check, should always be true */
+                                               if (LIKELY(kb->relative < me->key->totkey)) {
                                                        kb_map[i]->relative = index_map[kb->relative];
                                                }
                                        }
@@ -487,8 +492,10 @@ int join_mesh_exec(bContext *C, wmOperator *op)
        /* inverse transform for all selected meshes in this object */
        invert_m4_m4(imat, ob->obmat);
 
-       /* Add back active mesh first. This allows to keep things similar as they were, as much as possible (i.e. data from
-        * active mesh will remain first ones in new result of the merge, in same order for CD layers, etc. See also T50084.
+       /* Add back active mesh first.
+        * This allows to keep things similar as they were, as much as possible
+        * (i.e. data from active mesh will remain first ones in new result of the merge,
+        * in same order for CD layers, etc). See also T50084.
         */
        join_mesh_single(
                    depsgraph, bmain, scene,
@@ -579,7 +586,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
        /* free temp copy of destination shapekeys (if applicable) */
        if (nkey) {
                /* We can assume nobody is using that ID currently. */
-               BKE_libblock_free_ex(bmain, nkey, false, false);
+               BKE_id_free_ex(bmain, nkey, LIB_ID_FREE_NO_MAIN | LIB_ID_FREE_NO_UI_USER | LIB_ID_FREE_NO_USER_REFCOUNT, false);
        }
 
        /* ensure newly inserted keys are time sorted */
@@ -592,9 +599,9 @@ int join_mesh_exec(bContext *C, wmOperator *op)
 
        DEG_relations_tag_update(bmain);   /* removed objects, need to rebuild dag */
 
-       DEG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
 
-       DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
+       DEG_id_tag_update(&scene->id, ID_RECALC_SELECT);
        WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene);
 
        return OPERATOR_FINISHED;
@@ -663,7 +670,10 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
                        selme = (Mesh *)ob_iter->data;
 
                        if (selme->totvert == me->totvert) {
-                               me_deformed = mesh_get_eval_deform(depsgraph, scene, ob_iter, CD_MASK_BAREMESH);
+                               Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+                               Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob_iter);
+
+                               me_deformed = mesh_get_eval_deform(depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH);
 
                                if (!me_deformed) {
                                        continue;
@@ -677,7 +687,7 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
        }
        CTX_DATA_END;
 
-       DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
+       DEG_id_tag_update(&scene->id, ID_RECALC_SELECT);
        WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene);
 
        return OPERATOR_FINISHED;
@@ -1080,11 +1090,12 @@ bool ED_mesh_pick_face_vert(bContext *C, Object *ob, const int mval[2], unsigned
        BLI_assert(me && GS(me->id.name) == ID_ME);
 
        if (ED_mesh_pick_face(C, ob, mval, &poly_index, size)) {
-               Scene *scene = CTX_data_scene(C);
+               Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+               Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
                struct ARegion *ar = CTX_wm_region(C);
 
                /* derived mesh to find deformed locations */
-               Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH | CD_MASK_ORIGINDEX);
+               Mesh *me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH | CD_MASK_ORIGINDEX);
 
                int v_idx_best = ORIGINDEX_NONE;
 
@@ -1209,8 +1220,11 @@ bool ED_mesh_pick_vert(bContext *C, Object *ob, const int mval[2], unsigned int
                (*index)--;
        }
        else {
+               Scene *scene_eval = DEG_get_evaluated_scene(vc.depsgraph);
+               Object *ob_eval = DEG_get_evaluated_object(vc.depsgraph, ob);
+
                /* derived mesh to find deformed locations */
-               Mesh *me_eval = mesh_get_eval_final(vc.depsgraph, vc.scene, ob, CD_MASK_BAREMESH);
+               Mesh *me_eval = mesh_get_eval_final(vc.depsgraph, scene_eval, ob_eval, CD_MASK_BAREMESH);
                ARegion *ar = vc.ar;
                RegionView3D *rv3d = ar->regiondata;