diff --git a/include/cglm-affine.h b/include/cglm-affine.h index 0c6b51c..a52a0c9 100644 --- a/include/cglm-affine.h +++ b/include/cglm-affine.h @@ -295,6 +295,23 @@ glm_decompose_scalev(mat4 m, vec3 s) { s[2] = glm_vec_norm(m[2]); } +/*! + * @brief returns true if matrix is uniform scaled. This is helpful for + * creating normal matrix. + * + * @param m[in] m + * + * @return boolean + */ +CGLM_INLINE +bool +glm_uniscaled(mat4 m) { + vec3 s; + glm_decompose_scalev(m, s); + + return glm_vec_eq_all(s); +} + /*! * @brief decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz] * diff --git a/include/cglm-vec-ext.h b/include/cglm-vec-ext.h index 7fecfbb..19b115f 100644 --- a/include/cglm-vec-ext.h +++ b/include/cglm-vec-ext.h @@ -73,10 +73,22 @@ glm_vec_eq(vec3 v, float val) { return v[0] == val && v[0] == v[1] && v[0] == v[2]; } +CGLM_INLINE +bool +glm_vec_eq_all(vec3 v) { + return v[0] == v[1] && v[0] == v[2]; +} + CGLM_INLINE bool glm_vec4_eq(vec4 v, float val) { return v[0] == val && v[0] == v[1] && v[0] == v[2] && v[0] == v[3]; } +CGLM_INLINE +bool +glm_vec4_eq_all(vec4 v) { + return v[0] == v[1] && v[0] == v[2] && v[0] == v[3]; +} + #endif /* cglm_vec_ext_h */