Commit: 9ed522db735b1d798a5d68c6bf547e8123d33a4b
Author: Alexander Gavrilov
Date:   Sat Dec 1 19:06:44 2018 +0300
Branches: blender2.8
https://developer.blender.org/rB9ed522db735b1d798a5d68c6bf547e8123d33a4b

Fix more cases of evaluated mesh being built for non-COW objects.

===================================================================

M       source/blender/blenkernel/intern/DerivedMesh.c
M       source/blender/blenkernel/intern/mesh_convert.c
M       source/blender/blenkernel/intern/paint.c
M       source/blender/editors/armature/armature_skinning.c
M       source/blender/editors/mesh/meshtools.c
M       source/blender/editors/object/object_data_transfer.c
M       source/blender/editors/object/object_modifier.c
M       source/blender/editors/physics/particle_edit.c
M       source/blender/editors/sculpt_paint/paint_vertex_proj.c
M       source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
M       source/blender/editors/space_view3d/view3d_iterators.c

===================================================================

diff --git a/source/blender/blenkernel/intern/DerivedMesh.c 
b/source/blender/blenkernel/intern/DerivedMesh.c
index 55898381fde..b2586d513d6 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -2004,6 +2004,10 @@ static void mesh_build_data(
 {
        BLI_assert(ob->type == OB_MESH);
 
+       /* Evaluated meshes aren't supposed to be created on original 
instances. If you do,
+        * they aren't cleaned up properly on mode switch, causing crashes, e.g 
T58150. */
+       BLI_assert(ob->id.tag & LIB_TAG_COPIED_ON_WRITE);
+
        BKE_object_free_derived_caches(ob);
        BKE_object_sculpt_modifiers_changed(ob);
 
@@ -2153,9 +2157,6 @@ DerivedMesh *mesh_get_derived_final(
 Mesh *mesh_get_eval_final(
         struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask 
dataMask)
 {
-       /* Evaluation meshes on original instances aren't cleaned up properly, 
causing crashes. */
-       BLI_assert(ob->id.tag & LIB_TAG_COPIED_ON_WRITE);
-
        /* if there's no evaluated mesh or the last data mask used doesn't 
include
         * the data we need, rebuild the derived mesh
         */
@@ -2205,9 +2206,9 @@ Mesh *mesh_get_eval_deform(struct Depsgraph *depsgraph, 
Scene *scene, Object *ob
 
        if (!ob->runtime.mesh_deform_eval ||
            ((dataMask & ob->lastDataMask) != dataMask) ||
-           (need_mapping != ob->lastNeedMapping))
+           (need_mapping && !ob->lastNeedMapping))
        {
-               mesh_build_data(depsgraph, scene, ob, dataMask, false, 
need_mapping);
+               mesh_build_data(depsgraph, scene, ob, dataMask | 
ob->lastDataMask, false, need_mapping || ob->lastNeedMapping);
        }
 
        return ob->runtime.mesh_deform_eval;
diff --git a/source/blender/blenkernel/intern/mesh_convert.c 
b/source/blender/blenkernel/intern/mesh_convert.c
index eed02dae824..de131b9be47 100644
--- a/source/blender/blenkernel/intern/mesh_convert.c
+++ b/source/blender/blenkernel/intern/mesh_convert.c
@@ -815,10 +815,12 @@ void BKE_mesh_to_curve_nurblist(const Mesh *me, ListBase 
*nurblist, const int ed
        }
 }
 
-void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object 
*ob)
+void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene 
*UNUSED(scene), Object *ob)
 {
        /* make new mesh data from the original copy */
-       Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_MESH);
+       Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+       Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
+       Mesh *me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, 
CD_MASK_MESH);
        ListBase nurblist = {NULL, NULL};
 
        BKE_mesh_to_curve_nurblist(me_eval, &nurblist, 0);
diff --git a/source/blender/blenkernel/intern/paint.c 
b/source/blender/blenkernel/intern/paint.c
index 8b44bbfa15f..0311d7f41be 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -1408,7 +1408,7 @@ PBVH *BKE_sculpt_object_pbvh_ensure(Depsgraph *depsgraph, 
Object *ob)
                }
                else if (ob->type == OB_MESH) {
                        Mesh *me_eval_deform = mesh_get_eval_deform(
-                               depsgraph, DEG_get_evaluated_scene(depsgraph), 
ob, CD_MASK_BAREMESH);
+                               depsgraph, DEG_get_evaluated_scene(depsgraph), 
object_eval, CD_MASK_BAREMESH);
                        pbvh = build_pbvh_from_regular_mesh(ob, me_eval_deform);
                }
        }
diff --git a/source/blender/editors/armature/armature_skinning.c 
b/source/blender/editors/armature/armature_skinning.c
index c68c2720b0b..06385ab0cee 100644
--- a/source/blender/editors/armature/armature_skinning.c
+++ b/source/blender/editors/armature/armature_skinning.c
@@ -53,6 +53,7 @@
 #include "BKE_subsurf.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
 
 #include "ED_armature.h"
 #include "ED_mesh.h"
@@ -249,7 +250,7 @@ static void envelope_bone_weighting(
 }
 
 static void add_verts_to_dgroups(
-        ReportList *reports, Depsgraph *depsgraph, Scene *scene, Object *ob, 
Object *par,
+        ReportList *reports, Depsgraph *depsgraph, Scene *UNUSED(scene), 
Object *ob, Object *par,
         int heat, const bool mirror)
 {
        /* This functions implements the automatic computation of vertex group
@@ -375,7 +376,9 @@ static void add_verts_to_dgroups(
 
        if (wpmode) {
                /* if in weight paint mode, use final verts from evaluated mesh 
*/
-               Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, 
CD_MASK_BAREMESH);
+               Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+               Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
+               Mesh *me_eval = mesh_get_eval_final(depsgraph, scene_eval, 
ob_eval, CD_MASK_BAREMESH);
 
                BKE_mesh_foreach_mapped_vert_coords_get(me_eval, verts, 
mesh->totvert);
                vertsfilled = 1;
diff --git a/source/blender/editors/mesh/meshtools.c 
b/source/blender/editors/mesh/meshtools.c
index 1ba49537afd..0450b1d1ca7 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -664,7 +664,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;
diff --git a/source/blender/editors/object/object_data_transfer.c 
b/source/blender/editors/object/object_data_transfer.c
index 7b65d4c4f47..3533e4fe55c 100644
--- a/source/blender/editors/object/object_data_transfer.c
+++ b/source/blender/editors/object/object_data_transfer.c
@@ -47,6 +47,7 @@
 #include "BKE_report.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -133,13 +134,15 @@ static const EnumPropertyItem *dt_layers_select_src_itemf(
        }
        else if (data_type == DT_TYPE_UV) {
                Object *ob_src = CTX_data_active_object(C);
-               Scene *scene = CTX_data_scene(C);
 
                if (ob_src) {
                        Mesh *me_eval;
                        int num_data, i;
 
-                       me_eval = mesh_get_eval_final(depsgraph, scene, ob_src, 
CD_MASK_BAREMESH | CD_MLOOPUV);
+                       Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+                       Object *ob_src_eval = 
DEG_get_evaluated_object(depsgraph, ob_src);
+
+                       me_eval = mesh_get_eval_final(depsgraph, scene_eval, 
ob_src_eval, CD_MASK_BAREMESH | CD_MLOOPUV);
                        num_data = CustomData_number_of_layers(&me_eval->ldata, 
CD_MLOOPUV);
 
                        RNA_enum_item_add_separator(&item, &totitem);
@@ -153,13 +156,15 @@ static const EnumPropertyItem *dt_layers_select_src_itemf(
        }
        else if (data_type == DT_TYPE_VCOL) {
                Object *ob_src = CTX_data_active_object(C);
-               Scene *scene = CTX_data_scene(C);
 
                if (ob_src) {
                        Mesh *me_eval;
                        int num_data, i;
 
-                       me_eval = mesh_get_eval_final(depsgraph, scene, ob_src, 
CD_MASK_BAREMESH | CD_MLOOPCOL);
+                       Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+                       Object *ob_src_eval = 
DEG_get_evaluated_object(depsgraph, ob_src);
+
+                       me_eval = mesh_get_eval_final(depsgraph, scene_eval, 
ob_src_eval, CD_MASK_BAREMESH | CD_MLOOPCOL);
                        num_data = CustomData_number_of_layers(&me_eval->ldata, 
CD_MLOOPCOL);
 
                        RNA_enum_item_add_separator(&item, &totitem);
@@ -338,9 +343,9 @@ static bool data_transfer_exec_is_object_valid(
 
 static int data_transfer_exec(bContext *C, wmOperator *op)
 {
-       Scene *scene = CTX_data_scene(C);
        Object *ob_src = ED_object_active_context(C);
        Depsgraph *depsgraph = CTX_data_depsgraph(C);
+       Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
 
        ListBase ctx_objects;
        CollectionPointerLink *ctx_ob_dst;
@@ -404,12 +409,15 @@ static int data_transfer_exec(bContext *C, wmOperator *op)
                }
 
                if (data_transfer_exec_is_object_valid(op, ob_src, ob_dst, 
reverse_transfer)) {
+                       Object *ob_src_eval = 
DEG_get_evaluated_object(depsgraph, ob_src);
+
                        if (space_transform) {
-                               BLI_SPACE_TRANSFORM_SETUP(space_transform, 
ob_dst, ob_src);
+                               Object *ob_dst_eval = 
DEG_get_evaluated_object(depsgraph, ob_dst);
+                               BLI_SPACE_TRANSFORM_SETUP(space_transform, 
ob_dst_eval, ob_src_eval);
                        }
 
                        if (BKE_object_data_transfer_mesh(
-                               depsgraph, scene, ob_src, ob_dst, data_type, 
use_create,
+                               depsgraph, scene_eval, ob_src_eval, ob_dst, 
data_type, use_create,
                                map_vert_mode, map_edge_mode, map_loop_mode, 
map_poly_mode,
                                space_transform, use_auto_transform,
                                max_distance, ray_radius, islands_precision,
@@ -605,9 +613,9 @@ static bool datalayout_transfer_poll(bContext *C)
 
 static int datalayout_transfer_exec(bContext *C, wmOperator *op)
 {
-       Scene *scene = CTX_data_scene(C);
        Object *ob_act = ED_object_active_context(C);
        Depsgraph *depsgraph = CTX_data_depsgraph(C);
+       Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
        DataTransferModifierData *dtmd;
 
        dtmd = (DataTransferModifierData *)edit_modifier_property_get(op, 
ob_act, eModifierType_DataTransfer);
@@ -624,7 +632,9 @@ static int datalayout_transfer_exec(bContext *C, wmOperator 
*op)
                        return OPERATOR_CANCELLED;
                }
 
-               BKE_object_data_transfer_layout(depsgraph, scene, ob_src, 
ob_dst, dtmd->data_types, use_delete,
+               Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, 
ob_src);
+
+               BKE_object_data_transfer_layout(depsgraph, scene_eval, 
ob_src_eval, ob_dst, dtmd->data_types, use_delete,
                                                dtmd->layers_select_src, 
dtmd->layers_select_dst);
 
                DEG_id_tag_update(&ob_dst->id, OB_RECALC_DATA);
@@ -649,12 +659,14 @@ static int datalayout_transfer_exec(bContext *C, 
wmOperator *op)
                        layers_select_dst[fromto_idx] = layers_dst;
                }
 
+               Object *ob_src_eval = DEG_get_evaluated_object(depsgraph, 
ob_src);
+
                data_transfer_exec_preprocess_objects(C, op, ob_src, 
&ctx_objects, false);
 
                for (ctx_ob_dst = ctx_objects.first; ctx_ob_dst; ctx_ob_dst = 
ctx_ob_dst->next) {
                        Object *ob_dst = ctx_ob_dst->ptr.data;
                        if (data_transfer_exec_is_object_valid(op, ob_src, 
ob_dst, false)) {
-                               BKE_object_data_transfer_layout(depsgraph, 
scene, ob_src, ob_dst, data_type, use_delete,
+                               BKE_object_data_transfer_layout(depsgraph, 
scene_eval, ob_src_eval, ob_dst, data_type, use_delete,
                                                                
layers_select_src, lay

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to