diff options
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifiers_bmesh.c | 8 | ||||
-rw-r--r-- | source/blender/bmesh/bmesh_class.h | 3 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_construct.c | 2 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mesh.c | 14 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mesh.h | 2 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mesh_conv.c | 2 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_mesh_conv.c | 2 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmesh_tools.c | 2 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmesh_utils.c | 11 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.c | 6 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_array.c | 6 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_bevel.c | 10 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_edgesplit.c | 4 | ||||
-rw-r--r-- | source/blender/python/bmesh/bmesh_py_api.c | 2 |
16 files changed, 38 insertions, 42 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 87ba2092437..b8cedfb5708 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -447,12 +447,12 @@ int DM_release(DerivedMesh *dm); */ void DM_to_mesh(DerivedMesh *dm, struct Mesh *me, struct Object *ob); -struct BMEditMesh *DM_to_editbmesh(struct Object *ob, struct DerivedMesh *dm, +struct BMEditMesh *DM_to_editbmesh(struct DerivedMesh *dm, struct BMEditMesh *existing, int do_tesselate); /* conversion to bmesh only */ void DM_to_bmesh_ex(struct DerivedMesh *dm, struct BMesh *bm); -struct BMesh *DM_to_bmesh(struct Object *ob, struct DerivedMesh *dm); +struct BMesh *DM_to_bmesh(struct DerivedMesh *dm); /* utility function to convert a DerivedMesh to a shape key block diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 909a87cfd4b..054cbe0021b 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -546,7 +546,7 @@ BMesh *BKE_mesh_to_bmesh(Mesh *me, Object *ob) { BMesh *bm; - bm = BM_mesh_create(ob, &bm_mesh_allocsize_default); + bm = BM_mesh_create(&bm_mesh_allocsize_default); BMO_op_callf(bm, "mesh_to_bmesh mesh=%p object=%p set_shapekey=%b", me, ob, TRUE); diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c index 8fe8c9cbaed..46bdcc6fdd8 100644 --- a/source/blender/blenkernel/intern/modifiers_bmesh.c +++ b/source/blender/blenkernel/intern/modifiers_bmesh.c @@ -137,7 +137,7 @@ void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm) /* converts a cddm to a BMEditMesh. if existing is non-NULL, the * new geometry will be put in there.*/ -BMEditMesh *DM_to_editbmesh(Object *ob, DerivedMesh *dm, BMEditMesh *existing, int do_tesselate) +BMEditMesh *DM_to_editbmesh(DerivedMesh *dm, BMEditMesh *existing, int do_tesselate) { BMEditMesh *em = existing; BMesh *bm; @@ -146,7 +146,7 @@ BMEditMesh *DM_to_editbmesh(Object *ob, DerivedMesh *dm, BMEditMesh *existing, i bm = em->bm; } else { - bm = BM_mesh_create(ob, &bm_mesh_allocsize_default); + bm = BM_mesh_create(&bm_mesh_allocsize_default); } DM_to_bmesh_ex(dm, bm); @@ -163,11 +163,11 @@ BMEditMesh *DM_to_editbmesh(Object *ob, DerivedMesh *dm, BMEditMesh *existing, i return em; } -BMesh *DM_to_bmesh(Object *ob, DerivedMesh *dm) +BMesh *DM_to_bmesh(DerivedMesh *dm) { BMesh *bm; - bm = BM_mesh_create(ob, &bm_mesh_allocsize_default); + bm = BM_mesh_create(&bm_mesh_allocsize_default); DM_to_bmesh_ex(dm, bm); diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h index 02953f84a22..8d79ba52953 100644 --- a/source/blender/bmesh/bmesh_class.h +++ b/source/blender/bmesh/bmesh_class.h @@ -194,8 +194,7 @@ typedef struct BMesh { BMFace *act_face; ListBase errorstack; - struct Object *ob; /* owner object */ - + void *py_handle; int opflag; /* current operator flag */ diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c index f58c1141561..b27f40777e6 100644 --- a/source/blender/bmesh/intern/bmesh_construct.c +++ b/source/blender/bmesh/intern/bmesh_construct.c @@ -593,7 +593,7 @@ BMesh *BM_mesh_copy(BMesh *bm_old) bm_old->totface}; /* allocate a bmesh */ - bm_new = BM_mesh_create(bm_old->ob, &allocsize); + bm_new = BM_mesh_create(&allocsize); CustomData_copy(&bm_old->vdata, &bm_new->vdata, CD_MASK_BMESH, CD_CALLOC, 0); CustomData_copy(&bm_old->edata, &bm_new->edata, CD_MASK_BMESH, CD_CALLOC, 0); diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index c01e8afd716..04279d30e61 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -71,12 +71,10 @@ static void bm_mempool_init(BMesh *bm, const BMAllocTemplate *allocsize) * * \note ob is needed by multires */ -BMesh *BM_mesh_create(struct Object *ob, BMAllocTemplate *allocsize) +BMesh *BM_mesh_create(BMAllocTemplate *allocsize) { /* allocate the structure */ BMesh *bm = MEM_callocN(sizeof(BMesh), __func__); - - bm->ob = ob; /* allocate the memory pools for the mesh elements */ bm_mempool_init(bm, allocsize); @@ -164,15 +162,10 @@ void BM_mesh_data_free(BMesh *bm) */ void BM_mesh_clear(BMesh *bm) { - Object *ob = bm->ob; - /* free old mesh */ BM_mesh_data_free(bm); memset(bm, 0, sizeof(BMesh)); - - /* re-initialize mesh */ - bm->ob = ob; - + /* allocate the memory pools for the mesh elements */ bm_mempool_init(bm, &bm_mesh_allocsize_default); @@ -344,11 +337,10 @@ static void bm_rationalize_normals(BMesh *bm, int undo) BMO_op_finish(bm, &bmop); } -static void UNUSED_FUNCTION(bm_mdisps_space_set)(BMesh *bm, int from, int to) +static void UNUSED_FUNCTION(bm_mdisps_space_set)(Object *ob, BMesh *bm, int from, int to) { /* switch multires data out of tangent space */ if (CustomData_has_layer(&bm->ldata, CD_MDISPS)) { - Object *ob = bm->ob; BMEditMesh *em = BMEdit_Create(bm, FALSE); DerivedMesh *dm = CDDM_from_BMEditMesh(em, NULL, TRUE, FALSE); MDisps *mdisps; diff --git a/source/blender/bmesh/intern/bmesh_mesh.h b/source/blender/bmesh/intern/bmesh_mesh.h index d045cd8be90..f48cc09af3b 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.h +++ b/source/blender/bmesh/intern/bmesh_mesh.h @@ -29,7 +29,7 @@ struct BMAllocTemplate; -BMesh *BM_mesh_create(struct Object *ob, struct BMAllocTemplate *allocsize); +BMesh *BM_mesh_create(struct BMAllocTemplate *allocsize); void BM_mesh_free(BMesh *bm); void BM_mesh_data_free(BMesh *bm); diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c index 3b7f5182d2d..24cb2bc4d5a 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_conv.c +++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c @@ -582,7 +582,7 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess) int i, j; for (ob = G.main->object.first; ob; ob = ob->id.next) { - if (ob->parent == bm->ob && ELEM(ob->partype, PARVERT1, PARVERT3)) { + if ((ob->parent) && (ob->parent->data == me) && ELEM(ob->partype, PARVERT1, PARVERT3)) { if (vertMap == NULL) { vertMap = bm_to_mesh_vertex_map(bm, ototvert); diff --git a/source/blender/bmesh/operators/bmo_mesh_conv.c b/source/blender/bmesh/operators/bmo_mesh_conv.c index 651093806b6..4578270d571 100644 --- a/source/blender/bmesh/operators/bmo_mesh_conv.c +++ b/source/blender/bmesh/operators/bmo_mesh_conv.c @@ -57,7 +57,7 @@ void bmo_mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) Mesh *me = BMO_slot_ptr_get(op, "mesh"); int set_key = BMO_slot_bool_get(op, "set_shapekey"); - BM_mesh_bm_from_me(bm, me, set_key, ob->shapenr - 1); + BM_mesh_bm_from_me(bm, me, set_key, ob->shapenr); if (me->key && ob->shapenr > me->key->totkey) { ob->shapenr = me->key->totkey - 1; diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c index da08b3354e1..bbfbb16a5bb 100644 --- a/source/blender/editors/mesh/bmesh_tools.c +++ b/source/blender/editors/mesh/bmesh_tools.c @@ -3222,7 +3222,7 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase, wmO if (!em) return OPERATOR_CANCELLED; - bm_new = BM_mesh_create(obedit, &bm_mesh_allocsize_default); + bm_new = BM_mesh_create(&bm_mesh_allocsize_default); CustomData_copy(&em->bm->vdata, &bm_new->vdata, CD_MASK_BMESH, CD_CALLOC, 0); CustomData_copy(&em->bm->edata, &bm_new->edata, CD_MASK_BMESH, CD_CALLOC, 0); CustomData_copy(&em->bm->ldata, &bm_new->ldata, CD_MASK_BMESH, CD_CALLOC, 0); diff --git a/source/blender/editors/mesh/bmesh_utils.c b/source/blender/editors/mesh/bmesh_utils.c index bee4d4283f6..8ca5dce647f 100644 --- a/source/blender/editors/mesh/bmesh_utils.c +++ b/source/blender/editors/mesh/bmesh_utils.c @@ -514,7 +514,7 @@ static void *editbtMesh_to_undoMesh(void *emv, void *obdata) Mesh *obme = obdata; undomesh *um = MEM_callocN(sizeof(undomesh), "undo Mesh"); - BLI_strncpy(um->obname, em->bm->ob->id.name + 2, sizeof(um->obname)); + BLI_strncpy(um->obname, em->ob->id.name + 2, sizeof(um->obname)); /* make sure shape keys work */ um->me.key = obme->key ? copy_key_nolib(obme->key) : NULL; @@ -546,7 +546,7 @@ static void undoMesh_to_editbtMesh(void *umv, void *emv, void *UNUSED(obdata)) BMEdit_Free(em); - bm = BM_mesh_create(ob, &bm_mesh_allocsize_default); + bm = BM_mesh_create(&bm_mesh_allocsize_default); BMO_op_callf(bm, "mesh_to_bmesh mesh=%p object=%p set_shapekey=%b", &um->me, ob, FALSE); em2 = BMEdit_Create(bm, TRUE); @@ -572,6 +572,13 @@ static void free_undo(void *umv) /* and this is all the undo system needs to know */ void undo_push_mesh(bContext *C, const char *name) { + /* em->ob gets out of date and crashes on mesh undo, + * this is an easy way to ensure its OK + * though we could investigate the matter further. */ + Object *obedit = CTX_data_edit_object(C); + BMEditMesh *em = BMEdit_FromObject(obedit); + em->ob = obedit; + undo_editmode_push(C, name, getEditMesh, free_undo, undoMesh_to_editbtMesh, editbtMesh_to_undoMesh, NULL); } diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 666d0a2f7f2..7b98a2f0083 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4552,7 +4552,7 @@ static int createSlideVerts(TransInfo *t) float vec1[3], dis2, mval[2] = {t->mval[0], t->mval[1]}, d; /* search cross edges for visible edge to the mouse cursor, - * then use the shared vertex to calculate screen vector*/ + * then use the shared vertex to calculate screen vector*/ dis2 = -1.0f; for (i=0; i<2; i++) { v = i?e->v1:e->v2; @@ -4590,8 +4590,7 @@ static int createSlideVerts(TransInfo *t) } } } - - em->bm->ob = t->obedit; + bmesh_edit_begin(em->bm, BMO_OP_FLAG_UNTAN_MULTIRES); /*create copies of faces for customdata projection*/ @@ -4779,7 +4778,6 @@ void freeSlideVerts(TransInfo *t) freeSlideTempFaces(sld); - sld->em->bm->ob = t->obedit; bmesh_edit_end(sld->em->bm, BMO_OP_FLAG_UNTAN_MULTIRES); BLI_smallhash_release(&sld->vhash); diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c index 2fbec392b1e..05fcb04d7ea 100644 --- a/source/blender/modifiers/intern/MOD_array.c +++ b/source/blender/modifiers/intern/MOD_array.c @@ -186,11 +186,11 @@ static void bm_merge_dm_transform(BMesh* bm, DerivedMesh *dm, float mat[4][4]) } static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, - Scene *scene, Object *ob, DerivedMesh *dm, - int UNUSED(initFlags)) + Scene *scene, Object *ob, DerivedMesh *dm, + int UNUSED(initFlags)) { DerivedMesh *result; - BMEditMesh *em = DM_to_editbmesh(ob, dm, NULL, FALSE); + BMEditMesh *em = DM_to_editbmesh(dm, NULL, FALSE); BMOperator op, oldop, weldop; int i, j, indexLen; /* offset matrix */ diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c index 3e110909702..112b9398d23 100644 --- a/source/blender/modifiers/intern/MOD_bevel.c +++ b/source/blender/modifiers/intern/MOD_bevel.c @@ -105,10 +105,10 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) * note: this code is very close to MOD_edgesplit.c. * note: if 0'd code from trunk included below. */ -static DerivedMesh *applyModifier(ModifierData *md, struct Object *ob, - DerivedMesh *dm, - int UNUSED(useRenderParams), - int UNUSED(isFinalCalc)) +static DerivedMesh *applyModifier(ModifierData *md, struct Object *UNUSED(ob), + DerivedMesh *dm, + int UNUSED(useRenderParams), + int UNUSED(isFinalCalc)) { DerivedMesh *result; BMesh *bm; @@ -118,7 +118,7 @@ static DerivedMesh *applyModifier(ModifierData *md, struct Object *ob, BevelModifierData *bmd = (BevelModifierData*) md; float threshold = cos((bmd->bevel_angle + 0.00001) * M_PI / 180.0); - em = DM_to_editbmesh(ob, dm, NULL, FALSE); + em = DM_to_editbmesh(dm, NULL, FALSE); bm = em->bm; BM_mesh_normals_update(bm, FALSE); diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c index 481ab805c5a..9fb4821229c 100644 --- a/source/blender/modifiers/intern/MOD_edgesplit.c +++ b/source/blender/modifiers/intern/MOD_edgesplit.c @@ -57,7 +57,7 @@ #define EDGE_MARK 1 -static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Object *ob) +static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Object *UNUSED(ob)) { DerivedMesh *result; BMesh *bm; @@ -66,7 +66,7 @@ static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Obj BMEdge *e; float threshold = cos((emd->split_angle + 0.00001) * M_PI / 180.0); - em = DM_to_editbmesh(ob, dm, NULL, FALSE); + em = DM_to_editbmesh(dm, NULL, FALSE); bm = em->bm; BM_mesh_normals_update(bm, FALSE); diff --git a/source/blender/python/bmesh/bmesh_py_api.c b/source/blender/python/bmesh/bmesh_py_api.c index 1601034542b..d3dcc979015 100644 --- a/source/blender/python/bmesh/bmesh_py_api.c +++ b/source/blender/python/bmesh/bmesh_py_api.c @@ -59,7 +59,7 @@ static PyObject *bpy_bm_new(PyObject *UNUSED(self)) { BMesh *bm; - bm = BM_mesh_create(NULL, &bm_mesh_allocsize_default); + bm = BM_mesh_create(&bm_mesh_allocsize_default); return BPy_BMesh_CreatePyObject(bm, BPY_BMFLAG_NOP); } |