mirror of
https://github.com/recp/cglm.git
synced 2025-10-04 09:08:53 +00:00
decompose scaling sign
This commit is contained in:
@@ -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]);
|
||||||
|
@@ -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];
|
||||||
|
Reference in New Issue
Block a user