From 7fd67392ebd5061ea1bc695ebd7feabe4755eaac Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 5 Jan 2012 12:40:09 +0000 Subject: [PATCH] added a function to ensure derived mesh has tessface's, in preparation for removal of tessface recalculation after each modifier runs. --- source/blender/blenkernel/BKE_DerivedMesh.h | 2 ++ .../blender/blenkernel/intern/DerivedMesh.c | 20 +++++++++++++++++++ source/blender/modifiers/intern/MOD_boolean.c | 4 ++++ .../blender/modifiers/intern/MOD_decimate.c | 2 ++ source/blender/modifiers/intern/MOD_explode.c | 2 ++ .../modifiers/intern/MOD_particleinstance.c | 2 ++ source/blender/modifiers/intern/MOD_remesh.c | 2 ++ .../blender/modifiers/intern/MOD_solidify.c | 1 + 8 files changed, 35 insertions(+) diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 139119ee873..2f80f674d84 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -517,6 +517,8 @@ void DM_free_poly_data(struct DerivedMesh *dm, int index, int count); /*sets up mpolys for a DM based on face iterators in source*/ void DM_DupPolys(DerivedMesh *source, DerivedMesh *target); +void DM_ensure_tessface(DerivedMesh *dm); + /* interpolates vertex data from the vertices indexed by src_indices in the * source mesh using the given weights and stores the result in the vertex * indexed by dest_index in the dest mesh diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 89988b02258..fcdad3f4c5e 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -352,6 +352,26 @@ void DM_DupPolys(DerivedMesh *source, DerivedMesh *target) } } +/* note: until all modifiers can take MPoly's as input, + * use this at the start of modifiers */ +void DM_ensure_tessface(DerivedMesh *dm) +{ + const int numTessFaces = dm->getNumTessFaces(dm); + const int numPolys = dm->getNumPolys(dm); + + if ( (numTessFaces == 0) && (numPolys != 0)) { + dm->recalcTesselation(dm); + + if (dm->getNumTessFaces(dm)) { + printf("warning %s: could not create tessfaces from %d polygons, dm->type=%d\n", + __func__, numPolys, dm->type); + } + else { + printf("info %s: polys -> ngons calculated\n", __func__); + } + } +} + void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob) { /* dm might depend on me, so we need to do everything with a local copy */ diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c index 9670f661d75..ef8d71928d3 100644 --- a/source/blender/modifiers/intern/MOD_boolean.c +++ b/source/blender/modifiers/intern/MOD_boolean.c @@ -137,6 +137,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, result = get_quick_derivedMesh(derivedData, dm, bmd->operation); if(result == NULL) { + + DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */ + DM_ensure_tessface(derivedData); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */ + result = NewBooleanDerivedMesh(dm, bmd->object, derivedData, ob, 1 + bmd->operation); } diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c index d14edd6d428..b481391b8e3 100644 --- a/source/blender/modifiers/intern/MOD_decimate.c +++ b/source/blender/modifiers/intern/MOD_decimate.c @@ -81,6 +81,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), int totvert, totface; int a, numTris; + DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */ + mvert = dm->getVertArray(dm); mface = dm->getTessFaceArray(dm); totvert = dm->getNumVerts(dm); diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c index 793824c4136..e6e3ef2a0aa 100644 --- a/source/blender/modifiers/intern/MOD_explode.c +++ b/source/blender/modifiers/intern/MOD_explode.c @@ -983,6 +983,8 @@ static DerivedMesh * applyModifier(ModifierData *md, Object *ob, ExplodeModifierData *emd= (ExplodeModifierData*) md; ParticleSystemModifierData *psmd=findPrecedingParticlesystem(ob,md); + DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */ + if(psmd){ ParticleSystem * psys=psmd->psys; diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c index 06bc53b77ee..3f8f44bdfd9 100644 --- a/source/blender/modifiers/intern/MOD_particleinstance.c +++ b/source/blender/modifiers/intern/MOD_particleinstance.c @@ -122,6 +122,8 @@ static DerivedMesh * applyModifier(ModifierData *md, Object *ob, float max_co=0.0, min_co=0.0, temp_co[3], cross[3]; float *size=NULL; + DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */ + trackneg=((ob->trackflag>2)?1:0); if(pimd->ob==ob){ diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c index 8e7c13f16e6..26e7f8fdbb1 100644 --- a/source/blender/modifiers/intern/MOD_remesh.c +++ b/source/blender/modifiers/intern/MOD_remesh.c @@ -151,6 +151,8 @@ static DerivedMesh *applyModifier(ModifierData *md, DualConFlags flags = 0; DualConMode mode = 0; + DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */ + rmd = (RemeshModifierData*)md; init_dualcon_mesh(&input, dm); diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index 9be38d64cd9..02fb2f81476 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -725,6 +725,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, /* must recalculate normals with vgroups since they can displace unevenly [#26888] */ if(dvert) { + /* BMESH_TODO, we only need to get vertex normals here, this is way overkill */ CDDM_calc_normals(result); } else {