diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-05-08 18:58:38 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-05-08 18:58:38 +0400 |
commit | 6f20ef6d870464a66ffa108b85c9ace405235f43 (patch) | |
tree | f0e712f275338e8b8aab1b6fefe46c2d5e90bc24 /source/blender/blenkernel/intern/mesh.c | |
parent | d7bc2c7f0639d808095d600b534a879daec7b8d7 (diff) |
optimize ngon angle calculation in solidify modifier (was doing prev/next vector subtract and normalize for every vertex). now store the previous normalized vector for re-use.
also add BKE_mesh_poly_calc_angles() which is mostly a reference for now.
Diffstat (limited to 'source/blender/blenkernel/intern/mesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index ecf6fd8e5de..3ccd09257e6 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -3103,3 +3103,51 @@ void BKE_mesh_tessface_clear(Mesh *mesh) { mesh_tessface_clear_intern(mesh, TRUE); } + +#if 0 /* slow version of the function below */ +void BKE_mesh_poly_calc_angles(MVert *mvert, MLoop *mloop, + MPoly *mp, float angles[]) +{ + MLoop *ml; + + int j; + for (j = 0, ml = mloop + mp->loopstart; j < mp->totloop; j++, ml++) { + MLoop *ml_prev = ME_POLY_LOOP_PREV(mloop, mp, j); + MLoop *ml_next = ME_POLY_LOOP_NEXT(mloop, mp, j); + + float e1[3], e2[3]; + + sub_v3_v3v3(e1, mvert[ml_next->v].co, mvert[ml->v].co); + sub_v3_v3v3(e2, mvert[ml_prev->v].co, mvert[ml->v].co); + + angles[j] = (float)M_PI - angle_v3v3(e1, e2); + } +} + +#else /* equivalent the function above but avoid multiple subtractions + normalize */ + +void BKE_mesh_poly_calc_angles(MVert *mvert, MLoop *mloop, + MPoly *mp, float angles[]) +{ + MLoop *ml = mloop + mp->loopstart; + float nor_prev[3]; + float nor_next[3]; + + int i_this = mp->totloop - 1; + int i_next = 0; + + sub_v3_v3v3(nor_prev, mvert[ml[i_this - 1].v].co, mvert[ml[i_this].v].co); + normalize_v3(nor_prev); + + while (i_next < mp->totloop) { + sub_v3_v3v3(nor_next, mvert[ml[i_this].v].co, mvert[ml[i_next].v].co); + normalize_v3(nor_next); + angles[i_this] = angle_normalized_v3v3(nor_prev, nor_next); + + /* step */ + copy_v3_v3(nor_prev, nor_next); + i_this = i_next; + i_next++; + } +} +#endif |