diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-02-08 13:27:08 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-02-08 13:36:16 +0300 |
commit | 1ddd03b793f6856a1278f3d8a32baca318896dfe (patch) | |
tree | ecad4466be73aaaa71ad746c4451f79da3ce491a | |
parent | 611712fcc89100c4f0084d0d4c6b9392367c4c64 (diff) |
Fail gracefully when editmode data doesn't exist
Sync changes from 2.8
-rw-r--r-- | source/blender/editors/object/object_bake_api.c | 3 | ||||
-rw-r--r-- | source/blender/editors/object/object_edit.c | 46 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_object_api.c | 5 |
3 files changed, 42 insertions, 12 deletions
diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c index 4825271876c..c78b9b37da1 100644 --- a/source/blender/editors/object/object_bake_api.c +++ b/source/blender/editors/object/object_bake_api.c @@ -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) { diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 9bdd20b0ae8..5b86febfd4b 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -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; diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 1d58a4a6350..836c077aaf3 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -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 */ |