diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-05-01 15:01:24 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-05-01 15:01:24 +0400 |
commit | 6527f42b6bd1b918c5e7b0c865024c14806ac1ae (patch) | |
tree | 998ee6e8fb73602bb34dce34949754559ee4a5b9 /source/blender/blenlib | |
parent | 3ee136910d1c6b70e7c99ebb40798d1706c13d9e (diff) |
Fix #31193: Normals don't have any Z component
Issue was caused by heavily non-uniform scale applied on object.
Run scale correction on face and vertex normals draw if there's non-uniform scale.
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r-- | source/blender/blenlib/BLI_math_matrix.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_matrix.c | 29 |
2 files changed, 31 insertions, 0 deletions
diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h index 00a751f9da3..1d99fd4fa27 100644 --- a/source/blender/blenlib/BLI_math_matrix.h +++ b/source/blender/blenlib/BLI_math_matrix.h @@ -126,6 +126,8 @@ int is_orthogonal_m4(float mat[4][4]); int is_orthonormal_m3(float mat[3][3]); int is_orthonormal_m4(float mat[4][4]); +int is_uniform_scaled_m3(float mat[3][3]); + void adjoint_m3_m3(float R[3][3], float A[3][3]); void adjoint_m4_m4(float R[4][4], float A[4][4]); diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index bb0b8897b15..b3b58dca1a6 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -866,6 +866,35 @@ int is_orthonormal_m4(float m[][4]) return 0; } +int is_uniform_scaled_m3(float m[][3]) +{ + const float eps = 1e-7; + float t[3][3]; + float l1, l2, l3, l4, l5, l6; + + copy_m3_m3(t, m); + transpose_m3(t); + + l1 = len_squared_v3(m[0]); + l2 = len_squared_v3(m[1]); + l3 = len_squared_v3(m[2]); + + l4 = len_squared_v3(t[0]); + l5 = len_squared_v3(t[1]); + l6 = len_squared_v3(t[2]); + + if (fabsf(l2 - l1) <= eps && + fabsf(l3 - l1) <= eps && + fabsf(l4 - l1) <= eps && + fabsf(l5 - l1) <= eps && + fabsf(l6 - l1) <= eps) + { + return 1; + } + + return 0; +} + void normalize_m3(float mat[][3]) { normalize_v3(mat[0]); |