diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2014-02-12 23:48:09 +0400 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2014-02-12 23:48:09 +0400 |
commit | 70905a6e02a05b650acfb894265b3a2d201f193b (patch) | |
tree | 3dc7ae6303823cabc6364c059939f7fc0406f6f8 /source/blender/blenkernel/intern/editderivedmesh.c | |
parent | f9a60ecacd9754f6673e2dc9775d6bb1cb89033e (diff) |
Fix Editderivedmeshes vertices normals computation.
Those derived meshes (used in Edit mode) were using simple sum of neighbor poly normals to get vertex normals,
while everywhere else in Blender we use weighted sum of such poly normals.
Patch: D311
Reviewed and enhanced by Campbell, thanks!
Diffstat (limited to 'source/blender/blenkernel/intern/editderivedmesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/editderivedmesh.c | 25 |
1 files changed, 3 insertions, 22 deletions
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index 308838c3b8f..0b89e6c0960 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -92,35 +92,16 @@ static void emDM_ensureVertNormals(EditDerivedBMesh *bmdm) const float (*vertexCos)[3], (*polyNos)[3]; float (*vertexNos)[3]; - BMFace *efa; - BMVert *eve; - BMIter fiter; - BMIter viter; - int i; - - vertexCos = bmdm->vertexCos; - vertexNos = MEM_callocN(sizeof(*vertexNos) * bm->totvert, __func__); - /* calculate vertex normals from poly normals */ emDM_ensurePolyNormals(bmdm); BM_mesh_elem_index_ensure(bm, BM_FACE); - vertexCos = bmdm->vertexCos; polyNos = bmdm->polyNos; + vertexCos = bmdm->vertexCos; + vertexNos = MEM_callocN(sizeof(*vertexNos) * bm->totvert, __func__); - BM_ITER_MESH_INDEX (eve, &viter, bm, BM_VERTS_OF_MESH, i) { - float *no = vertexNos[i]; - BM_ITER_ELEM (efa, &fiter, eve, BM_FACES_OF_VERT) { - add_v3_v3(no, polyNos[BM_elem_index_get(efa)]); - } - - /* following Mesh convention; we use vertex coordinate itself - * for normal in this case */ - if (UNLIKELY(normalize_v3(no) == 0.0f)) { - normalize_v3_v3(no, vertexCos[i]); - } - } + BM_verts_calc_normal_vcos(bm, polyNos, vertexCos, vertexNos); bmdm->vertexNos = (const float (*)[3])vertexNos; } |