Fail gracefully when editmode data doesn't exist
Sync changes from 2.8
This commit is contained in:
@@ -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) {
|
||||
|
@@ -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;
|
||||
|
@@ -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 */
|
||||
|
||||
|
Reference in New Issue
Block a user