diff options
-rw-r--r-- | source/blender/blenlib/BLI_math_matrix.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_matrix.c | 35 | ||||
-rw-r--r-- | source/blender/python/mathutils/mathutils_Matrix.c | 22 |
3 files changed, 54 insertions, 5 deletions
diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h index de4bd203eb6..00a751f9da3 100644 --- a/source/blender/blenlib/BLI_math_matrix.h +++ b/source/blender/blenlib/BLI_math_matrix.h @@ -123,6 +123,8 @@ void orthogonalize_m4(float R[4][4], int axis); int is_orthogonal_m3(float mat[3][3]); int is_orthogonal_m4(float mat[4][4]); +int is_orthonormal_m3(float mat[3][3]); +int is_orthonormal_m4(float mat[4][4]); 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 e61a8ef041a..76b986d7346 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -816,9 +816,6 @@ int is_orthogonal_m3(float m[][3]) if (fabsf(dot_v3v3(m[i], m[j])) > 1.5f * FLT_EPSILON) return 0; } - - if (fabsf(dot_v3v3(m[i], m[i]) - 1) > 1.5f * FLT_EPSILON) - return 0; } return 1; @@ -834,13 +831,41 @@ int is_orthogonal_m4(float m[][4]) return 0; } - if (fabsf(dot_vn_vn(m[i], m[i], 4) - 1) > 1.5f * FLT_EPSILON) - return 0; } return 1; } +int is_orthonormal_m3(float m[][3]) +{ + if (is_orthogonal_m3(m)) { + int i; + + for (i = 0; i < 3; i++) + if (fabsf(dot_v3v3(m[i], m[i]) - 1) > 1.5f * FLT_EPSILON) + return 0; + + return 1; + } + + return 0; +} + +int is_orthonormal_m4(float m[][4]) +{ + if (is_orthogonal_m4(m)) { + int i; + + for (i = 0; i < 4; i++) + if (fabsf(dot_vn_vn(m[i], m[i], 4) - 1) > 1.5f * FLT_EPSILON) + return 0; + + return 1; + } + + return 0; +} + void normalize_m3(float mat[][3]) { normalize_v3(mat[0]); diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c index 4079d69b87d..f5f54356680 100644 --- a/source/blender/python/mathutils/mathutils_Matrix.c +++ b/source/blender/python/mathutils/mathutils_Matrix.c @@ -2230,6 +2230,27 @@ static PyObject *Matrix_is_orthogonal_get(MatrixObject *self, void *UNUSED(closu } } +PyDoc_STRVAR(Matrix_is_orthonormal_doc, +"True if this matrix is orthonormal, 3x3 and 4x4 only, (read-only).\n\n:type: bool" +); +static PyObject *Matrix_is_orthonormal_get(MatrixObject *self, void *UNUSED(closure)) +{ + if (BaseMath_ReadCallback(self) == -1) + return NULL; + + /*must be 3-4 cols, 3-4 rows, square matrix*/ + if (self->num_row == 4 && self->num_col == 4) + return PyBool_FromLong(is_orthonormal_m4((float (*)[4])self->matrix)); + else if (self->num_row == 3 && self->num_col == 3) + return PyBool_FromLong(is_orthonormal_m3((float (*)[3])self->matrix)); + else { + PyErr_SetString(PyExc_AttributeError, + "Matrix.is_orthonormal: " + "inappropriate matrix size - expects 3x3 or 4x4 matrix"); + return NULL; + } +} + /*****************************************************************************/ /* Python attributes get/set structure: */ /*****************************************************************************/ @@ -2240,6 +2261,7 @@ static PyGetSetDef Matrix_getseters[] = { {(char *)"col", (getter)Matrix_col_get, (setter)NULL, Matrix_col_doc, NULL}, {(char *)"is_negative", (getter)Matrix_is_negative_get, (setter)NULL, Matrix_is_negative_doc, NULL}, {(char *)"is_orthogonal", (getter)Matrix_is_orthogonal_get, (setter)NULL, Matrix_is_orthogonal_doc, NULL}, + {(char *)"is_orthonormal", (getter)Matrix_is_orthonormal_get, (setter)NULL, Matrix_is_orthonormal_doc, NULL}, {(char *)"is_wrapped", (getter)BaseMathObject_is_wrapped_get, (setter)NULL, BaseMathObject_is_wrapped_doc, NULL}, {(char *)"owner", (getter)BaseMathObject_owner_get, (setter)NULL, BaseMathObject_owner_doc, NULL}, {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ |