Fix T57878: 2.8 Opening project in Blender Crashes.
authorBastien Montagne <montagne29@wanadoo.fr>
Thu, 29 Nov 2018 14:48:08 +0000 (15:48 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Thu, 29 Nov 2018 14:49:09 +0000 (15:49 +0100)
Crash was due to some modifier trying to access the editmesh of its
target just after loading, when that editmesh has not yet been
re-created...

source/blender/blenkernel/intern/modifier.c

index 73a9d462687c787aee35ff88a587b104acd6060c..d67a3080819eb8fd7d0d66a18747159fa54ca9f7 100644 (file)
@@ -907,20 +907,22 @@ struct DerivedMesh *modifier_applyModifier_DM_deprecated(
 /**
  * Get evaluated mesh for other evaluated object, which is used as an operand for the modifier,
  * e.g. second operand for boolean modifier.
- * Note thqt modifiers in stack always get fully evaluated COW ID pointers, never original ones. Makes things simpler.
+ * Note that modifiers in stack always get fully evaluated COW ID pointers, never original ones. Makes things simpler.
  */
 Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, bool *r_free_mesh)
 {
-       Mesh *me;
+       Mesh *me = NULL;
 
        if ((ob_eval->type == OB_MESH) && (ob_eval->mode & OB_MODE_EDIT)) {
                /* Note: currently we have no equivalent to derived cagemesh or even final dm in BMEditMesh...
                 * This is TODO in core depsgraph/modifier stack code still. */
                BMEditMesh *em = BKE_editmesh_from_object(ob_eval);
-               me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
-               *r_free_mesh = true;
+               if (em != NULL) {  /* em might not exist yet in some cases, just after loading a .blend file, see T57878. */
+                       me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
+                       *r_free_mesh = true;
+               }
        }
-       else {
+       if (me == NULL) {
                me = ob_eval->runtime.mesh_eval;
                *r_free_mesh = false;
        }