Fail gracefully when editmode data doesn't exist
authorCampbell Barton <ideasman42@gmail.com>
Thu, 8 Feb 2018 10:27:08 +0000 (21:27 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 8 Feb 2018 10:36:16 +0000 (21:36 +1100)
Sync changes from 2.8

source/blender/editors/object/object_bake_api.c
source/blender/editors/object/object_edit.c
source/blender/makesrna/intern/rna_object_api.c

index 4825271876c5014cf42eec08e726cd601667964f..c78b9b37da101816ee3360a9470d5f72d0acb7b0 100644 (file)
@@ -621,8 +621,7 @@ static size_t initialize_internal_images(BakeImages *bake_images, ReportList *re
 /* create new mesh with edit mode changes and modifiers applied */
 static Mesh *bake_mesh_new_from_object(Main *bmain, Scene *scene, Object *ob)
 {
-       if (ob->mode & OB_MODE_EDIT)
-               ED_object_editmode_load(ob);
+       ED_object_editmode_load(ob);
 
        Mesh *me = BKE_mesh_new_from_object(bmain, scene, ob, 1, 2, 0, 0);
        if (me->flag & ME_AUTOSMOOTH) {
index 9bdd20b0ae8639ab468842c08a233e137969bc23..5b86febfd4be2ae275ddfaebafa63fbd5a1ce13f 100644 (file)
@@ -58,6 +58,7 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_vfont_types.h"
 #include "DNA_mesh_types.h"
+#include "DNA_lattice_types.h"
 
 #include "IMB_imbuf_types.h"
 
@@ -353,6 +354,9 @@ static bool ED_object_editmode_load_ex(Main *bmain, Object *obedit, const bool f
 
        if (obedit->type == OB_MESH) {
                Mesh *me = obedit->data;
+               if (me->edit_btmesh == NULL) {
+                       return false;
+               }
 
                if (me->edit_btmesh->bm->totvert > MESH_MAX_VERTS) {
                        error("Too many vertices");
@@ -366,15 +370,21 @@ static bool ED_object_editmode_load_ex(Main *bmain, Object *obedit, const bool f
                        MEM_freeN(me->edit_btmesh);
                        me->edit_btmesh = NULL;
                }
-               if (obedit->restore_mode & OB_MODE_WEIGHT_PAINT) {
+               /* will be recalculated as needed. */
+               {
                        ED_mesh_mirror_spatial_table(NULL, NULL, NULL, NULL, 'e');
                        ED_mesh_mirror_topo_table(NULL, NULL, 'e');
                }
        }
        else if (obedit->type == OB_ARMATURE) {
+               const bArmature *arm = obedit->data;
+               if (arm->edbo == NULL) {
+                       return false;
+               }
                ED_armature_from_edit(obedit->data);
-               if (freedata)
+               if (freedata) {
                        ED_armature_edit_free(obedit->data);
+               }
                /* TODO(sergey): Pose channels might have been changed, so need
                 * to inform dependency graph about this. But is it really the
                 * best place to do this?
@@ -382,20 +392,44 @@ static bool ED_object_editmode_load_ex(Main *bmain, Object *obedit, const bool f
                DAG_relations_tag_update(bmain);
        }
        else if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
+               const Curve *cu = obedit->data;
+               if (cu->editnurb == NULL) {
+                       return false;
+               }
                ED_curve_editnurb_load(obedit);
-               if (freedata) ED_curve_editnurb_free(obedit);
+               if (freedata) {
+                       ED_curve_editnurb_free(obedit);
+               }
        }
        else if (obedit->type == OB_FONT) {
+               const Curve *cu = obedit->data;
+               if (cu->editfont == NULL) {
+                       return false;
+               }
                ED_curve_editfont_load(obedit);
-               if (freedata) ED_curve_editfont_free(obedit);
+               if (freedata) {
+                       ED_curve_editfont_free(obedit);
+               }
        }
        else if (obedit->type == OB_LATTICE) {
+               const Lattice *lt = obedit->data;
+               if (lt->editlatt == NULL) {
+                       return false;
+               }
                ED_lattice_editlatt_load(obedit);
-               if (freedata) ED_lattice_editlatt_free(obedit);
+               if (freedata) {
+                       ED_lattice_editlatt_free(obedit);
+               }
        }
        else if (obedit->type == OB_MBALL) {
+               const MetaBall *mb = obedit->data;
+               if (mb->editelems == NULL) {
+                       return false;
+               }
                ED_mball_editmball_load(obedit);
-               if (freedata) ED_mball_editmball_free(obedit);
+               if (freedata) {
+                       ED_mball_editmball_free(obedit);
+               }
        }
 
        return true;
index 1d58a4a635062e5b3f8c556fdf39a02b83ca6021..836c077aaf37332bcc9212ea480cbd2369e80a6f 100644 (file)
@@ -476,10 +476,7 @@ void rna_Object_dm_info(struct Object *ob, int type, char *result)
 
 static int rna_Object_update_from_editmode(Object *ob)
 {
-       if (ob->mode & OB_MODE_EDIT) {
-               return ED_object_editmode_load(ob);
-       }
-       return false;
+       return ED_object_editmode_load(ob);
 }
 #else /* RNA_RUNTIME */