From 09e11ad6ef1187d581b64a9ac6ebbbb6f056f7d9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 30 May 2013 17:36:43 +0000 Subject: modifier stack: lazy initialize normals many modifiers were calculating normals, when those normals were ignored by the next modifier. now flag normals as dirty and recalculate for modifiers that set use `dependsOnNormals()` callback. Quick test on mesh with 12 modifiers (mostly build type), calculated normals 6 times, now it only runs once - so this will give some speedup too. --- source/blender/modifiers/intern/MOD_array.c | 9 +-------- source/blender/modifiers/intern/MOD_bevel.c | 4 ++-- source/blender/modifiers/intern/MOD_boolean_util.c | 2 +- source/blender/modifiers/intern/MOD_edgesplit.c | 2 +- source/blender/modifiers/intern/MOD_explode.c | 2 +- source/blender/modifiers/intern/MOD_mask.c | 2 +- source/blender/modifiers/intern/MOD_mirror.c | 2 +- source/blender/modifiers/intern/MOD_ocean.c | 4 +++- source/blender/modifiers/intern/MOD_particleinstance.c | 2 +- source/blender/modifiers/intern/MOD_remesh.c | 2 +- source/blender/modifiers/intern/MOD_screw.c | 3 +-- source/blender/modifiers/intern/MOD_skin.c | 2 +- source/blender/modifiers/intern/MOD_solidify.c | 2 +- source/blender/modifiers/intern/MOD_triangulate.c | 2 +- source/blender/modifiers/intern/MOD_util.c | 6 ++---- 15 files changed, 19 insertions(+), 27 deletions(-) (limited to 'source/blender/modifiers/intern') diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c index a1fdae5792c..902afd2ed41 100644 --- a/source/blender/modifiers/intern/MOD_array.c +++ b/source/blender/modifiers/intern/MOD_array.c @@ -565,11 +565,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, if ((amd->offset_type & MOD_ARR_OFF_OBJ) && (amd->offset_ob)) { /* Update normals in case offset object has rotation. */ - - /* BMESH_TODO: check if normal recalc needed under any other - * conditions? */ - - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; } BM_mesh_free(bm); @@ -591,9 +587,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, result = arrayModifier_doArray(amd, md->scene, ob, dm, 0); - //if (result != dm) - // CDDM_calc_normals_mapping(result); - return result; } diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c index 7cd10491c89..cbb0e05aa4a 100644 --- a/source/blender/modifiers/intern/MOD_bevel.c +++ b/source/blender/modifiers/intern/MOD_bevel.c @@ -171,7 +171,7 @@ static DerivedMesh *applyModifier(ModifierData *md, struct Object *ob, bm->ftoolflagpool == NULL); /* make sure we never alloc'd these */ BM_mesh_free(bm); - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; return result; } @@ -208,7 +208,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), /* until we allow for dirty normal flag, always calc, * note: calculating on the CDDM is faster then the BMesh equivalent */ - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; return result; } diff --git a/source/blender/modifiers/intern/MOD_boolean_util.c b/source/blender/modifiers/intern/MOD_boolean_util.c index ed5bb1d3f4d..75a05633507 100644 --- a/source/blender/modifiers/intern/MOD_boolean_util.c +++ b/source/blender/modifiers/intern/MOD_boolean_util.c @@ -485,7 +485,7 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh( DM_ensure_tessface(result); #endif - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; return result; } diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c index 94e7475e9b3..0c50d4d3323 100644 --- a/source/blender/modifiers/intern/MOD_edgesplit.c +++ b/source/blender/modifiers/intern/MOD_edgesplit.c @@ -136,7 +136,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der result = edgesplitModifier_do(emd, ob, derivedData); if (result != derivedData) - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; return result; } diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c index f0eb113e46f..c8899bac450 100644 --- a/source/blender/modifiers/intern/MOD_explode.c +++ b/source/blender/modifiers/intern/MOD_explode.c @@ -971,7 +971,7 @@ static DerivedMesh *explodeMesh(ExplodeModifierData *emd, /* finalization */ CDDM_calc_edges_tessface(explode); CDDM_tessfaces_to_faces(explode); - CDDM_calc_normals(explode); + explode->dirty |= DM_DIRTY_NORMALS; if (psmd->psys->lattice) { end_latt_deform(psmd->psys->lattice); diff --git a/source/blender/modifiers/intern/MOD_mask.c b/source/blender/modifiers/intern/MOD_mask.c index 46a590e24e9..0d302fed3e6 100644 --- a/source/blender/modifiers/intern/MOD_mask.c +++ b/source/blender/modifiers/intern/MOD_mask.c @@ -384,7 +384,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, /* why is this needed? - campbell */ /* recalculate normals */ - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; /* free hashes */ BLI_ghash_free(vertHash, NULL, NULL); diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c index b85ca2c1532..2e7b7c7ab7d 100644 --- a/source/blender/modifiers/intern/MOD_mirror.c +++ b/source/blender/modifiers/intern/MOD_mirror.c @@ -330,7 +330,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, result = mirrorModifier__doMirror(mmd, ob, derivedData); if (result != derivedData) - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; return result; } diff --git a/source/blender/modifiers/intern/MOD_ocean.c b/source/blender/modifiers/intern/MOD_ocean.c index 34c89fc6ee3..125d4bc3789 100644 --- a/source/blender/modifiers/intern/MOD_ocean.c +++ b/source/blender/modifiers/intern/MOD_ocean.c @@ -386,6 +386,8 @@ static DerivedMesh *generate_ocean_geometry(OceanModifierData *omd) } } + result->dirty |= DM_DIRTY_NORMALS; + return result; } @@ -543,7 +545,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, result = doOcean(md, ob, derivedData, 0); if (result != derivedData) - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; return result; } diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c index 2c942b38286..b0de27b7292 100644 --- a/source/blender/modifiers/intern/MOD_particleinstance.c +++ b/source/blender/modifiers/intern/MOD_particleinstance.c @@ -391,7 +391,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, if (size) MEM_freeN(size); - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; return result; } diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c index 746cad10a01..c8fdbc535bc 100644 --- a/source/blender/modifiers/intern/MOD_remesh.c +++ b/source/blender/modifiers/intern/MOD_remesh.c @@ -202,7 +202,7 @@ static DerivedMesh *applyModifier(ModifierData *md, } CDDM_calc_edges(result); - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; return result; } diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c index bbafa8c939e..475d294abd6 100644 --- a/source/blender/modifiers/intern/MOD_screw.c +++ b/source/blender/modifiers/intern/MOD_screw.c @@ -897,8 +897,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, #endif if ((ltmd->flag & MOD_SCREW_NORMAL_CALC) == 0) { - /* BMESH_TODO, we only need to get vertex normals here, this is way overkill */ - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; } return result; diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c index ad58aac1746..6c2bd25f0a5 100644 --- a/source/blender/modifiers/intern/MOD_skin.c +++ b/source/blender/modifiers/intern/MOD_skin.c @@ -1805,7 +1805,7 @@ static DerivedMesh *base_skin(DerivedMesh *origdm, BM_mesh_free(bm); CDDM_calc_edges(result); - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; skin_set_orig_indices(result); diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index c54ed26d47e..ef7f0050bb1 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -820,7 +820,7 @@ static DerivedMesh *applyModifier( /* must recalculate normals with vgroups since they can displace unevenly [#26888] */ if (dvert) { - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; } if (numFaces == 0 && numEdges != 0) { diff --git a/source/blender/modifiers/intern/MOD_triangulate.c b/source/blender/modifiers/intern/MOD_triangulate.c index 59973fe77a8..fd0bc218bc4 100644 --- a/source/blender/modifiers/intern/MOD_triangulate.c +++ b/source/blender/modifiers/intern/MOD_triangulate.c @@ -54,7 +54,7 @@ static DerivedMesh *triangulate_dm(DerivedMesh *dm, const int flag) for (i = 0; i < total_edges; i++, me++) me->flag |= ME_EDGEDRAW | ME_EDGERENDER; - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; return result; } diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index 1084023fcf0..c3748ce0265 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -184,11 +184,9 @@ DerivedMesh *get_cddm(Object *ob, struct BMEditMesh *em, DerivedMesh *dm, float else { dm = CDDM_copy(dm); CDDM_apply_vert_coords(dm, vertexCos); + dm->dirty |= DM_DIRTY_NORMALS; } - if (dm) - CDDM_calc_normals(dm); - return dm; } @@ -204,7 +202,7 @@ DerivedMesh *get_dm(Object *ob, struct BMEditMesh *em, DerivedMesh *dm, float (* if (vertexCos) { CDDM_apply_vert_coords(dm, vertexCos); - //CDDM_calc_normals(dm); + dm->dirty |= DM_DIRTY_NORMALS; } if (orco) -- cgit v1.2.3