diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 2ebcb76e3d1f6e78fba69496cef013c5c17974c2..e900d29aa1940be7ada7405b698853d4d62af76e 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -577,6 +577,17 @@ static void autosmooth(Render *UNUSED(re), ObjectRen *obr, float mat[4][4], shor VlakRen *vlr; int a, totvert; + float rot[3][3]; + + /* Note: For normals, we only want rotation, not scaling component. + * Negative scales (aka mirroring) give wrong results, see T44102. */ + if (lnors) { + float mat3[3][3], size[3]; + + copy_m3_m4(mat3, mat); + mat3_to_rot_size(rot, size, mat3); + } + if (obr->totvert == 0) return; @@ -611,9 +622,8 @@ static void autosmooth(Render *UNUSED(re), ObjectRen *obr, float mat[4][4], shor ver = RE_findOrAddVert(obr, a); mul_m4_v3(mat, ver->co); if (lnors) { - mul_mat3_m4_v3(mat, ver->n); + mul_m3_v3(rot, ver->n); negate_v3(ver->n); - normalize_v3(ver->n); } } for (a = 0; a < obr->totvlak; a++) {