From 61a5cc28bef0a7758aba179986cd8393a5425158 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 22 Jan 2012 21:12:18 +0000 Subject: disable re-tesselation for modifiers that use bmesh, array/bevel/edge split - were tesselating 2 times and didnt need to. also comment array modifier from flushing selection flags. --- source/blender/blenkernel/BKE_cdderivedmesh.h | 3 ++- source/blender/blenkernel/BKE_tessmesh.h | 2 +- source/blender/blenkernel/intern/editderivedmesh.c | 7 ++++--- source/blender/blenkernel/intern/modifiers_bmesh.c | 12 +++++++++--- source/blender/bmesh/intern/bmesh_mesh.c | 2 +- source/blender/editors/mesh/bmeshutils.c | 4 ++-- source/blender/modifiers/intern/MOD_array.c | 5 ++--- source/blender/modifiers/intern/MOD_bevel.c | 4 ++-- source/blender/modifiers/intern/MOD_edgesplit.c | 6 +++--- 9 files changed, 26 insertions(+), 19 deletions(-) diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h index ce9e8dcf92a..db9f8e0527f 100644 --- a/source/blender/blenkernel/BKE_cdderivedmesh.h +++ b/source/blender/blenkernel/BKE_cdderivedmesh.h @@ -69,7 +69,8 @@ struct DerivedMesh *CDDM_from_curve(struct Object *ob); /* useful for OrcoDM creation for curves with constructive modifiers */ DerivedMesh *CDDM_from_curve_customDB(struct Object *ob, struct ListBase *dispbase); -struct BMEditMesh *CDDM_To_BMesh(struct Object *ob, struct DerivedMesh *dm, struct BMEditMesh *existing); +struct BMEditMesh *CDDM_To_BMesh(struct Object *ob, struct DerivedMesh *dm, + struct BMEditMesh *existing, int do_tesselate); /* Copies the given DerivedMesh with verts, faces & edges stored as diff --git a/source/blender/blenkernel/BKE_tessmesh.h b/source/blender/blenkernel/BKE_tessmesh.h index bed62a0a5f4..67afb86fde1 100644 --- a/source/blender/blenkernel/BKE_tessmesh.h +++ b/source/blender/blenkernel/BKE_tessmesh.h @@ -67,7 +67,7 @@ typedef struct BMEditMesh { #define BMESH_EM_UNDO_RECALC_TESSFACE_WORKAROUND void BMEdit_RecalcTesselation(BMEditMesh *tm); -BMEditMesh *BMEdit_Create(BMesh *bm); +BMEditMesh *BMEdit_Create(BMesh *bm, int do_tesselate); BMEditMesh *BMEdit_Copy(BMEditMesh *tm); void BMEdit_Free(BMEditMesh *em); void BMEdit_UpdateLinkedCustomData(BMEditMesh *em); diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index 89339b2df06..5029ff73f03 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -70,13 +70,14 @@ extern GLubyte stipple_quarttone[128]; /* glutil.c, bad level data */ -BMEditMesh *BMEdit_Create(BMesh *bm) +BMEditMesh *BMEdit_Create(BMesh *bm, int do_tesselate) { BMEditMesh *tm = MEM_callocN(sizeof(BMEditMesh), __func__); tm->bm = bm; - - BMEdit_RecalcTesselation(tm); + if (do_tesselate) { + BMEdit_RecalcTesselation(tm); + } return tm; } diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c index cf6d7b87fe3..3d1349f09ed 100644 --- a/source/blender/blenkernel/intern/modifiers_bmesh.c +++ b/source/blender/blenkernel/intern/modifiers_bmesh.c @@ -103,7 +103,7 @@ /*converts a cddm to a BMEditMesh. if existing is non-NULL, the new geometry will be put in there.*/ -BMEditMesh *CDDM_To_BMesh(Object *ob, DerivedMesh *dm, BMEditMesh *existing) +BMEditMesh *CDDM_To_BMesh(Object *ob, DerivedMesh *dm, BMEditMesh *existing, int do_tesselate) { int allocsize[4] = {512, 512, 2048, 512}; BMesh *bm, bmold; /*bmold is for storing old customdata layout*/ @@ -205,8 +205,14 @@ BMEditMesh *CDDM_To_BMesh(Object *ob, DerivedMesh *dm, BMEditMesh *existing) BLI_array_free(verts); BLI_array_free(edges); - if (!em) em = BMEdit_Create(bm); - else BMEdit_RecalcTesselation(em); + if (!em) { + em = BMEdit_Create(bm, do_tesselate); + } + else { + if (do_tesselate) { + BMEdit_RecalcTesselation(em); + } + } return em; } diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index b1cc30478c0..77e3bef4a40 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -374,7 +374,7 @@ static void bmesh_set_mdisps_space(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); + BMEditMesh *em = BMEdit_Create(bm, FALSE); DerivedMesh *dm = CDDM_from_BMEditMesh(em, NULL, TRUE, FALSE); MDisps *mdisps; BMFace *f; diff --git a/source/blender/editors/mesh/bmeshutils.c b/source/blender/editors/mesh/bmeshutils.c index 1d3851b2650..ba4cf08030e 100644 --- a/source/blender/editors/mesh/bmeshutils.c +++ b/source/blender/editors/mesh/bmeshutils.c @@ -310,7 +310,7 @@ void EDBM_MakeEditBMesh(ToolSettings *ts, Scene *UNUSED(scene), Object *ob) MEM_freeN(me->edit_btmesh); } - me->edit_btmesh = BMEdit_Create(bm); + me->edit_btmesh = BMEdit_Create(bm, TRUE); me->edit_btmesh->selectmode= me->edit_btmesh->bm->selectmode= ts->selectmode; me->edit_btmesh->me = me; me->edit_btmesh->ob = ob; @@ -589,7 +589,7 @@ static void undoMesh_to_editbtMesh(void *umv, void *emv, void *UNUSED(obdata)) bm = BM_Make_Mesh(ob, allocsize); BMO_CallOpf(bm, "mesh_to_bmesh mesh=%p object=%p set_shapekey=%i", me, ob, 0); - em2 = BMEdit_Create(bm); + em2 = BMEdit_Create(bm, TRUE); *em = *em2; em->selectmode = me->selectmode; diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c index 55f2b745937..06f65e06703 100644 --- a/source/blender/modifiers/intern/MOD_array.c +++ b/source/blender/modifiers/intern/MOD_array.c @@ -208,7 +208,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, int UNUSED(initFlags)) { DerivedMesh *cddm = dm; //copying shouldn't be necassary here, as all modifiers return CDDM's - BMEditMesh *em = CDDM_To_BMesh(ob, cddm, NULL); + BMEditMesh *em = CDDM_To_BMesh(ob, cddm, NULL, FALSE); BMOperator op, oldop, weldop; int i, j, indexLen; /* offset matrix */ @@ -385,10 +385,9 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, BMO_Finish_Op(em->bm, &weldop); /* Bump the stack level back down to match the adjustment up above */ - bmesh_end_edit(em->bm, 0); BMO_pop(em->bm); - BMEdit_RecalcTesselation(em); + BLI_assert(em->looptris == NULL); cddm = CDDM_from_BMEditMesh(em, NULL, FALSE, FALSE); BMEdit_Free(em); diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c index dc2a3588884..75136e444e6 100644 --- a/source/blender/modifiers/intern/MOD_bevel.c +++ b/source/blender/modifiers/intern/MOD_bevel.c @@ -123,7 +123,7 @@ static DerivedMesh *applyModifier(ModifierData *md, struct Object *ob, cddm = CDDM_copy(dm, 0); } else cddm = dm; - em = CDDM_To_BMesh(ob, dm, NULL); + em = CDDM_To_BMesh(ob, dm, NULL, FALSE); bm = em->bm; BM_Compute_Normals(bm); @@ -152,13 +152,13 @@ static DerivedMesh *applyModifier(ModifierData *md, struct Object *ob, BMO_CallOpf(bm, "bevel geom=%fe percent=%f use_even=%i use_dist=%i", EDGE_MARK, bmd->value, (bmd->flags & BME_BEVEL_EVEN)!=0, (bmd->flags & BME_BEVEL_DIST)!=0); BMO_pop(bm); - BMEdit_RecalcTesselation(em); if (cddm != dm) { cddm->needsFree = 1; cddm->release(cddm); } + BLI_assert(em->looptris == NULL); cddm = CDDM_from_BMEditMesh(em, NULL, TRUE, FALSE); BMEdit_Free(em); MEM_freeN(em); diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c index 809a35fa4f2..b44eeb1b816 100644 --- a/source/blender/modifiers/intern/MOD_edgesplit.c +++ b/source/blender/modifiers/intern/MOD_edgesplit.c @@ -71,7 +71,7 @@ static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Obj cddm = CDDM_copy(dm, 0); } else cddm = dm; - em = CDDM_To_BMesh(ob, dm, NULL); + em = CDDM_To_BMesh(ob, dm, NULL, FALSE); bm = em->bm; BM_Compute_Normals(bm); @@ -101,13 +101,13 @@ static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Obj BMO_CallOpf(bm, "edgesplit edges=%fe", EDGE_MARK); BMO_pop(bm); - BMEdit_RecalcTesselation(em); if (cddm != dm) { cddm->needsFree = 1; cddm->release(cddm); } - + + BLI_assert(em->looptris == NULL); cddm = CDDM_from_BMEditMesh(em, NULL, TRUE, FALSE); BMEdit_Free(em); MEM_freeN(em); -- cgit v1.2.3