decompose scaling sign

This commit is contained in:
Recep Aslantas
2016-10-26 14:36:53 +03:00
parent f2beb49bf7
commit a410b880b4
2 changed files with 20 additions and 9 deletions

View File

@@ -11,6 +11,7 @@
#include "cglm-common.h" #include "cglm-common.h"
#include "cglm-vec.h" #include "cglm-vec.h"
#include "cglm-affine-mat.h" #include "cglm-affine-mat.h"
#include "cglm-util.h"
CGLM_INLINE CGLM_INLINE
void void
@@ -310,10 +311,17 @@ glm_decompose_trans(mat4 m, mat4 t) {
* *
* @param[in] m affine transform * @param[in] m affine transform
* @param[out] s scale vector (Sx, Sy, Sz) * @param[out] s scale vector (Sx, Sy, Sz)
* @param[out] signs scale vector signs
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_decompose_scalev(mat4 m, vec3 s) { glm_decompose_scalev(mat4 m, vec3 s, ivec3 signs) {
signs[0] = signs[1] = signs[2] = 1;
signs[0] = copysignf(signs[0], m[0][0] * m[0][1] * m[0][2]);
signs[1] = copysignf(signs[1], m[1][0] * m[1][1] * m[1][2]);
signs[2] = copysignf(signs[2], m[2][0] * m[2][1] * m[2][2]);
s[0] = glm_vec_norm(m[0]); s[0] = glm_vec_norm(m[0]);
s[1] = glm_vec_norm(m[1]); s[1] = glm_vec_norm(m[1]);
s[2] = glm_vec_norm(m[2]); s[2] = glm_vec_norm(m[2]);
@@ -330,8 +338,9 @@ void
glm_decompose_scale(mat4 m, mat4 s) { glm_decompose_scale(mat4 m, mat4 s) {
mat4 tmp = GLM_MAT4_IDENTITY_INIT; mat4 tmp = GLM_MAT4_IDENTITY_INIT;
vec3 sv; vec3 sv;
ivec3 svs;
glm_decompose_scalev(m, sv); glm_decompose_scalev(m, sv, svs);
tmp[0][0] = sv[0]; tmp[0][0] = sv[0];
tmp[1][1] = sv[1]; tmp[1][1] = sv[1];
@@ -351,8 +360,9 @@ void
glm_decompose_rotation(mat4 m, mat4 r) { glm_decompose_rotation(mat4 m, mat4 r) {
vec3 sv; vec3 sv;
vec4 t = {0, 0, 0, 1}; vec4 t = {0, 0, 0, 1};
ivec3 svs;
glm_decompose_scalev(m, sv); glm_decompose_scalev(m, sv, svs);
glm_mat4_dup(m, r); glm_mat4_dup(m, r);
glm_vec4_dup(t, r[3]); glm_vec4_dup(t, r[3]);

View File

@@ -15,6 +15,7 @@
#endif #endif
typedef float vec3[3]; typedef float vec3[3];
typedef int ivec3[3];
typedef CGLM_ALIGN(16) float vec4[4]; typedef CGLM_ALIGN(16) float vec4[4];
typedef vec3 mat3[3]; typedef vec3 mat3[3];