Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / object / object_vgroup.c
index 9afc3772f9068fc5063d8b96d401512fab7d5996..bf2da2845919e5d029225f90c0c0c55c86bfa387 100644 (file)
@@ -56,9 +56,9 @@
 #include "BKE_context.h"
 #include "BKE_customdata.h"
 #include "BKE_deform.h"
-#include "BKE_depsgraph.h"
 #include "BKE_mesh_mapping.h"
 #include "BKE_editmesh.h"
+#include "BKE_layer.h"
 #include "BKE_modifier.h"
 #include "BKE_report.h"
 #include "BKE_DerivedMesh.h"
@@ -66,6 +66,8 @@
 #include "BKE_object.h"
 #include "BKE_lattice.h"
 
+#include "DEG_depsgraph.h"
+
 #include "DNA_armature_types.h"
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -1259,9 +1261,9 @@ static void dm_deform_clear(DerivedMesh *dm, Object *ob)
 }
 
 /* recalculate the deformation */
-static DerivedMesh *dm_deform_recalc(Scene *scene, Object *ob)
+static DerivedMesh *dm_deform_recalc(EvaluationContext *eval_ctx, Scene *scene, Object *ob)
 {
-       return mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
+       return mesh_get_derived_deform(eval_ctx, scene, ob, CD_MASK_BAREMESH);
 }
 
 /* by changing nonzero weights, try to move a vertex in me->mverts with index 'index' to
@@ -1273,7 +1275,7 @@ static DerivedMesh *dm_deform_recalc(Scene *scene, Object *ob)
  * norm and d are the plane's properties for the equation: ax + by + cz + d = 0
  * coord is a point on the plane
  */
-static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, int index, float norm[3],
+static void moveCloserToDistanceFromPlane(EvaluationContext *eval_ctx, Scene *scene, Object *ob, Mesh *me, int index, float norm[3],
                                           float coord[3], float d, float distToBe, float strength, float cp)
 {
        DerivedMesh *dm;
@@ -1300,7 +1302,7 @@ static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, in
        float originalDistToBe = distToBe;
        do {
                wasChange = false;
-               dm = dm_deform_recalc(scene, ob);
+               dm = dm_deform_recalc(eval_ctx, scene, ob);
                dm->getVert(dm, index, &m);
                copy_v3_v3(oldPos, m.co);
                distToStart = dot_v3v3(norm, oldPos) + d;
@@ -1338,7 +1340,7 @@ static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, in
                                if (dw->weight > 1) {
                                        dw->weight = 1;
                                }
-                               dm = dm_deform_recalc(scene, ob);
+                               dm = dm_deform_recalc(eval_ctx, scene, ob);
                                dm->getVert(dm, index, &m);
                                getVerticalAndHorizontalChange(norm, d, coord, oldPos, distToStart, m.co, changes, dists, i);
                                dw->weight = oldw;
@@ -1448,10 +1450,13 @@ static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, in
 
 /* this is used to try to smooth a surface by only adjusting the nonzero weights of a vertex 
  * but it could be used to raise or lower an existing 'bump.' */
-static void vgroup_fix(Scene *scene, Object *ob, float distToBe, float strength, float cp)
+static void vgroup_fix(const bContext *C, Scene *scene, Object *ob, float distToBe, float strength, float cp)
 {
+       EvaluationContext eval_ctx;
        int i;
 
+       CTX_data_eval_ctx(C, &eval_ctx);
+
        Mesh *me = ob->data;
        MVert *mvert = me->mvert;
        int *verts = NULL;
@@ -1465,7 +1470,7 @@ static void vgroup_fix(Scene *scene, Object *ob, float distToBe, float strength,
                                MVert *p = MEM_callocN(sizeof(MVert) * (count), "deformedPoints");
                                int k;
 
-                               DerivedMesh *dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
+                               DerivedMesh *dm = mesh_get_derived_deform(&eval_ctx, scene, ob, CD_MASK_BAREMESH);
                                k = count;
                                while (k--) {
                                        dm->getVert(dm, verts[k], &m);
@@ -1483,7 +1488,7 @@ static void vgroup_fix(Scene *scene, Object *ob, float distToBe, float strength,
                                        if (mag) { /* zeros fix */
                                                d = -dot_v3v3(norm, coord);
                                                /* dist = (dot_v3v3(norm, m.co) + d); */ /* UNUSED */
-                                               moveCloserToDistanceFromPlane(scene, ob, me, i, norm, coord, d, distToBe, strength, cp);
+                                               moveCloserToDistanceFromPlane(&eval_ctx, scene, ob, me, i, norm, coord, d, distToBe, strength, cp);
                                        }
                                }
 
@@ -2609,7 +2614,7 @@ static int vertex_group_add_exec(bContext *C, wmOperator *UNUSED(op))
        Object *ob = ED_object_context(C);
 
        BKE_object_defgroup_add(ob);
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob->data);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        
@@ -2642,7 +2647,7 @@ static int vertex_group_remove_exec(bContext *C, wmOperator *op)
        else
                vgroup_delete_active(ob);
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob->data);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        
@@ -2677,7 +2682,7 @@ static int vertex_group_assign_exec(bContext *C, wmOperator *UNUSED(op))
        Object *ob = ED_object_context(C);
        
        vgroup_assign_verts(ob, ts->vgroup_weight);
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
        
        return OPERATOR_FINISHED;
@@ -2750,7 +2755,7 @@ static int vertex_group_remove_from_exec(bContext *C, wmOperator *op)
                }
        }
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
 
        return OPERATOR_FINISHED;
@@ -2839,7 +2844,7 @@ static int vertex_group_copy_exec(bContext *C, wmOperator *UNUSED(op))
        Object *ob = ED_object_context(C);
 
        vgroup_duplicate(ob);
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob->data);
 
@@ -2875,7 +2880,7 @@ static int vertex_group_levels_exec(bContext *C, wmOperator *op)
        vgroup_levels_subset(ob, vgroup_validmap, vgroup_tot, subset_count, offset, gain);
        MEM_freeN((void *)vgroup_validmap);
        
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
        
@@ -2909,7 +2914,7 @@ static int vertex_group_normalize_exec(bContext *C, wmOperator *UNUSED(op))
        changed = vgroup_normalize(ob);
 
        if (changed) {
-               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+               DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
                WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
 
@@ -2948,7 +2953,7 @@ static int vertex_group_normalize_all_exec(bContext *C, wmOperator *op)
        MEM_freeN((void *)vgroup_validmap);
 
        if (changed) {
-               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+               DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
                WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
 
@@ -3001,9 +3006,9 @@ static int vertex_group_fix_exec(bContext *C, wmOperator *op)
                BKE_report(op->reports, RPT_ERROR_INVALID_CONTEXT, "This operator does not support an active mirror modifier");
                return OPERATOR_CANCELLED;
        }
-       vgroup_fix(scene, ob, distToBe, strength, cp);
+       vgroup_fix(C, scene, ob, distToBe, strength, cp);
        
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
        
@@ -3075,7 +3080,7 @@ static int vertex_group_invert_exec(bContext *C, wmOperator *op)
        vgroup_invert_subset(ob, vgroup_validmap, vgroup_tot, subset_count, auto_assign, auto_remove);
        MEM_freeN((void *)vgroup_validmap);
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
 
@@ -3117,7 +3122,7 @@ static int vertex_group_smooth_exec(bContext *C, wmOperator *op)
        vgroup_smooth_subset(ob, vgroup_validmap, vgroup_tot, subset_count, fac, repeat, fac_expand);
        MEM_freeN((void *)vgroup_validmap);
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
 
@@ -3159,7 +3164,7 @@ static int vertex_group_clean_exec(bContext *C, wmOperator *op)
        vgroup_clean_subset(ob, vgroup_validmap, vgroup_tot, subset_count, limit, keep_single);
        MEM_freeN((void *)vgroup_validmap);
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
 
@@ -3200,7 +3205,7 @@ static int vertex_group_quantize_exec(bContext *C, wmOperator *op)
        vgroup_quantize_subset(ob, vgroup_validmap, vgroup_tot, subset_count, steps);
        MEM_freeN((void *)vgroup_validmap);
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
 
@@ -3241,7 +3246,7 @@ static int vertex_group_limit_total_exec(bContext *C, wmOperator *op)
        BKE_reportf(op->reports, remove_tot ? RPT_INFO : RPT_WARNING, "%d vertex weights limited", remove_tot);
 
        if (remove_tot) {
-               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+               DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
                WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
 
@@ -3286,7 +3291,7 @@ static int vertex_group_mirror_exec(bContext *C, wmOperator *op)
 
        ED_mesh_report_mirror(op, totmirr, totfail);
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
 
@@ -3319,25 +3324,26 @@ void OBJECT_OT_vertex_group_mirror(wmOperatorType *ot)
 static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *UNUSED(op))
 {
        Scene *scene = CTX_data_scene(C);
-       Object *ob = ED_object_context(C);
-       Base *base;
+       Object *ob_active = ED_object_context(C);
        int retval = OPERATOR_CANCELLED;
 
-       for (base = scene->base.first; base; base = base->next) {
-               if (base->object->type == ob->type) {
-                       if (base->object != ob && base->object->data == ob->data) {
-                               BLI_freelistN(&base->object->defbase);
-                               BLI_duplicatelist(&base->object->defbase, &ob->defbase);
-                               base->object->actdef = ob->actdef;
+       FOREACH_SCENE_OBJECT(scene, ob_iter)
+       {
+               if (ob_iter->type == ob_active->type) {
+                       if (ob_iter != ob_active && ob_iter->data == ob_active->data) {
+                               BLI_freelistN(&ob_iter->defbase);
+                               BLI_duplicatelist(&ob_iter->defbase, &ob_active->defbase);
+                               ob_iter->actdef = ob_active->actdef;
 
-                               DAG_id_tag_update(&base->object->id, OB_RECALC_DATA);
-                               WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, base->object);
-                               WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, base->object->data);
+                               DEG_id_tag_update(&ob_iter->id, OB_RECALC_DATA);
+                               WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob_iter);
+                               WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob_iter->data);
 
                                retval = OPERATOR_FINISHED;
                        }
                }
        }
+       FOREACH_SCENE_OBJECT_END
 
        return retval;
 }
@@ -3367,7 +3373,7 @@ static int vertex_group_copy_to_selected_exec(bContext *C, wmOperator *op)
        {
                if (obact != ob) {
                        if (ED_vgroup_array_copy(ob, obact)) {
-                               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+                               DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                                WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob);
                                changed_tot++;
                        }
@@ -3410,7 +3416,7 @@ static int set_active_group_exec(bContext *C, wmOperator *op)
        BLI_assert(nr + 1 >= 0);
        ob->actdef = nr + 1;
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob);
 
        return OPERATOR_FINISHED;
@@ -3624,7 +3630,7 @@ static int vertex_group_sort_exec(bContext *C, wmOperator *op)
        ret = vgroup_do_remap(ob, name_array, op);
 
        if (ret != OPERATOR_CANCELLED) {
-               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+               DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob);
        }
 
@@ -3674,7 +3680,7 @@ static int vgroup_move_exec(bContext *C, wmOperator *op)
                ret = vgroup_do_remap(ob, name_array, op);
 
                if (ret != OPERATOR_CANCELLED) {
-                       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+                       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                        WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob);
                }
        }
@@ -3803,7 +3809,7 @@ static int vertex_weight_paste_exec(bContext *C, wmOperator *op)
 
        vgroup_copy_active_to_sel_single(ob, def_nr);
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
 
        return OPERATOR_FINISHED;
@@ -3840,7 +3846,7 @@ static int vertex_weight_delete_exec(bContext *C, wmOperator *op)
 
        vgroup_remove_weight(ob, def_nr);
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
 
        return OPERATOR_FINISHED;
@@ -3873,7 +3879,7 @@ static int vertex_weight_set_active_exec(bContext *C, wmOperator *op)
 
        if (wg_index != -1) {
                ob->actdef = wg_index + 1;
-               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+               DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
        }
 
@@ -3910,7 +3916,7 @@ static int vertex_weight_normalize_active_vertex_exec(bContext *C, wmOperator *U
        changed = vgroup_normalize_active_vertex(ob, subset_type);
 
        if (changed) {
-               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+               DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
 
                return OPERATOR_FINISHED;
@@ -3943,7 +3949,7 @@ static int vertex_weight_copy_exec(bContext *C, wmOperator *UNUSED(op))
 
        vgroup_copy_active_to_sel(ob, subset_type);
 
-       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
 
        return OPERATOR_FINISHED;