Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-01-23 01:12:18 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-01-23 01:12:18 +0400
commit61a5cc28bef0a7758aba179986cd8393a5425158 (patch)
treedd0bfc5694673b10c608414bfbc84be4ee5cfb83
parenta63efc00cc5fca26510fdb435eb9d699dd293a6d (diff)
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.
-rw-r--r--source/blender/blenkernel/BKE_cdderivedmesh.h3
-rw-r--r--source/blender/blenkernel/BKE_tessmesh.h2
-rw-r--r--source/blender/blenkernel/intern/editderivedmesh.c7
-rw-r--r--source/blender/blenkernel/intern/modifiers_bmesh.c12
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.c2
-rw-r--r--source/blender/editors/mesh/bmeshutils.c4
-rw-r--r--source/blender/modifiers/intern/MOD_array.c5
-rw-r--r--source/blender/modifiers/intern/MOD_bevel.c4
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c6
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);