diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-05-30 21:36:43 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-05-30 21:36:43 +0400 |
commit | 09e11ad6ef1187d581b64a9ac6ebbbb6f056f7d9 (patch) | |
tree | 7f3100eed9f03496573b80ead9a8f3cf32e75b3b /source/blender/blenkernel/intern/cdderivedmesh.c | |
parent | 1be293629833a43a5ecf3a76c6ed838d183a2683 (diff) |
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.
Diffstat (limited to 'source/blender/blenkernel/intern/cdderivedmesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 743b4a33bc2..80bd71e7b59 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1841,6 +1841,7 @@ DerivedMesh *CDDM_from_curve_displist(Object *ob, ListBase *dispbase) dm = CDDM_new(totvert, totedge, 0, totloop, totpoly); dm->deformedOnly = 1; + dm->dirty |= DM_DIRTY_NORMALS; cddm = (CDDerivedMesh *)dm; @@ -2197,6 +2198,8 @@ void CDDM_apply_vert_coords(DerivedMesh *dm, float (*vertCoords)[3]) for (i = 0; i < dm->numVertData; ++i, ++vert) copy_v3_v3(vert->co, vertCoords[i]); + + cddm->dm.dirty |= DM_DIRTY_NORMALS; } void CDDM_apply_vert_normals(DerivedMesh *dm, short (*vertNormals)[3]) @@ -2211,6 +2214,8 @@ void CDDM_apply_vert_normals(DerivedMesh *dm, short (*vertNormals)[3]) for (i = 0; i < dm->numVertData; ++i, ++vert) copy_v3_v3_short(vert->no, vertNormals[i]); + + cddm->dm.dirty &= ~DM_DIRTY_NORMALS; } void CDDM_calc_normals_mapping_ex(DerivedMesh *dm, const short only_face_normals) @@ -2255,6 +2260,8 @@ void CDDM_calc_normals_mapping_ex(DerivedMesh *dm, const short only_face_normals CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_ASSIGN, face_nors, dm->numTessFaceData); + + cddm->dm.dirty &= ~DM_DIRTY_NORMALS; } @@ -2285,6 +2292,8 @@ void CDDM_calc_normals(DerivedMesh *dm) BKE_mesh_calc_normals_poly(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm), dm->numLoopData, dm->numPolyData, poly_nors); + + cddm->dm.dirty &= ~DM_DIRTY_NORMALS; } void CDDM_calc_normals_tessface(DerivedMesh *dm) @@ -2305,6 +2314,8 @@ void CDDM_calc_normals_tessface(DerivedMesh *dm) BKE_mesh_calc_normals_tessface(cddm->mvert, dm->numVertData, cddm->mface, dm->numTessFaceData, face_nors); + + cddm->dm.dirty &= ~DM_DIRTY_NORMALS; } #if 1 |