diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-07-23 02:59:47 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-07-23 02:59:47 +0400 |
commit | b7bf20d9504127ec7c3d52bc8a1448d4a2bdc3bf (patch) | |
tree | a38041dec1c240652d0e22991489ab1255d35fd4 /source/blender/blenkernel/intern/editderivedmesh.c | |
parent | 33e52d0df4d2d9dfd248144e2aac08af4c1bbeff (diff) |
optimization: only calculate the normals for passing into derivedMesh foreachMappedVert/foreachMappedFaceCenter when needed,
this means in editmode with wire draw, face and vertex normals don't have to be calculated at all.
in most cases the normals are not used so add a flag that makes calculating them only for functions that need them.
also fix face normal calculation for CDDM, was using quad calculation for ngons too.
Diffstat (limited to 'source/blender/blenkernel/intern/editderivedmesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/editderivedmesh.c | 74 |
1 files changed, 55 insertions, 19 deletions
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index b853d2b87a2..c9fc5f15d8b 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -86,7 +86,6 @@ static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm); static void emDM_ensureVertNormals(EditDerivedBMesh *bmdm) { - if (bmdm->vertexCos && (bmdm->vertexNos == NULL)) { BMesh *bm = bmdm->em->bm; @@ -196,9 +195,11 @@ static void emDM_recalcTessellation(DerivedMesh *UNUSED(dm)) /* do nothing */ } -static void emDM_foreachMappedVert(DerivedMesh *dm, - void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]), - void *userData) +static void emDM_foreachMappedVert( + DerivedMesh *dm, + void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]), + void *userData, + DMForeachFlag flag) { EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; BMesh *bm = bmdm->em->bm; @@ -207,14 +208,26 @@ static void emDM_foreachMappedVert(DerivedMesh *dm, int i; if (bmdm->vertexCos) { - emDM_ensureVertNormals(bmdm); + const float (*vertexCos)[3] = bmdm->vertexCos; + const float (*vertexNos)[3]; + + if (flag & DM_FOREACH_USE_NORMAL) { + emDM_ensureVertNormals(bmdm); + vertexNos = bmdm->vertexNos; + } + else { + vertexNos = NULL; + } + BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - func(userData, i, bmdm->vertexCos[i], bmdm->vertexNos[i], NULL); + const float *no = (flag & DM_FOREACH_USE_NORMAL) ? vertexNos[i] : NULL; + func(userData, i, vertexCos[i], no, NULL); } } else { BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - func(userData, i, eve->co, eve->no, NULL); + const float *no = (flag & DM_FOREACH_USE_NORMAL) ? eve->no : NULL; + func(userData, i, eve->co, no, NULL); } } } @@ -359,9 +372,11 @@ static void emDM_drawUVEdges(DerivedMesh *dm) glEnd(); } -static void emDM_foreachMappedFaceCenter(DerivedMesh *dm, - void (*func)(void *userData, int index, const float co[3], const float no[3]), - void *userData) +static void emDM_foreachMappedFaceCenter( + DerivedMesh *dm, + void (*func)(void *userData, int index, const float co[3], const float no[3]), + void *userData, + DMForeachFlag flag) { EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; BMesh *bm = bmdm->em->bm; @@ -371,13 +386,28 @@ static void emDM_foreachMappedFaceCenter(DerivedMesh *dm, BMIter iter; int i; - emDM_ensurePolyNormals(bmdm); emDM_ensurePolyCenters(bmdm); - polyNos = bmdm->polyNos; /* maybe NULL */ polyCos = bmdm->polyCos; /* always set */ - BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) { - func(userData, i, polyCos[i], polyNos ? polyNos[i] : efa->no); + if (flag & DM_FOREACH_USE_NORMAL) { + emDM_ensurePolyNormals(bmdm); + polyNos = bmdm->polyNos; /* maybe NULL */ + } + else { + polyNos = NULL; + } + + if (polyNos) { + BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) { + const float *no = polyNos[i]; + func(userData, i, polyCos[i], no); + } + } + else { + BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) { + const float *no = (flag & DM_FOREACH_USE_NORMAL) ? efa->no : NULL; + func(userData, i, polyCos[i], no); + } } } @@ -433,10 +463,16 @@ static void emDM_drawMappedFaces(DerivedMesh *dm, const float (*vertexNos)[3]; const float (*polyNos)[3]; - emDM_ensureVertNormals(bmdm); - emDM_ensurePolyNormals(bmdm); - vertexNos = bmdm->vertexNos; - polyNos = bmdm->polyNos; + if (skip_normals) { + vertexNos = NULL; + polyNos = NULL; + } + else { + emDM_ensureVertNormals(bmdm); + emDM_ensurePolyNormals(bmdm); + vertexNos = bmdm->vertexNos; + polyNos = bmdm->polyNos; + } BM_mesh_elem_index_ensure(bm, BM_VERT | BM_FACE); @@ -2186,7 +2222,7 @@ float (*BKE_editmesh_vertexCos_get(BMEditMesh *em, Scene *scene, int *r_numVerts data.cos_cage = cos_cage; data.visit_bitmap = visit_bitmap; - cage->foreachMappedVert(cage, cage_mapped_verts_callback, &data); + cage->foreachMappedVert(cage, cage_mapped_verts_callback, &data, DM_FOREACH_NOP); MEM_freeN(visit_bitmap); |