mirror of https://github.com/bjornbytes/lovr.git
Improve mat4:unpack;
- Orientation is correct when the matrix is scaled - Orientation calculation is more efficient
This commit is contained in:
parent
eb83962fc6
commit
0c642a6790
|
@ -1436,12 +1436,10 @@ static int l_lovrMat4Unpack(lua_State* L) {
|
||||||
}
|
}
|
||||||
return 16;
|
return 16;
|
||||||
} else {
|
} else {
|
||||||
float angle, ax, ay, az;
|
float position[4], scale[4], angle, ax, ay, az;
|
||||||
float position[4], orientation[4], scale[4];
|
|
||||||
mat4_getPosition(m, position);
|
mat4_getPosition(m, position);
|
||||||
mat4_getScale(m, scale);
|
mat4_getScale(m, scale);
|
||||||
mat4_getOrientation(m, orientation);
|
mat4_getAngleAxis(m, &angle, &ax, &ay, &az);
|
||||||
quat_getAngleAxis(orientation, &angle, &ax, &ay, &az); // TODO mat4_getAngleAxis (see math.lua)
|
|
||||||
lua_pushnumber(L, position[0]);
|
lua_pushnumber(L, position[0]);
|
||||||
lua_pushnumber(L, position[1]);
|
lua_pushnumber(L, position[1]);
|
||||||
lua_pushnumber(L, position[2]);
|
lua_pushnumber(L, position[2]);
|
||||||
|
|
|
@ -558,6 +558,22 @@ MAF void mat4_getOrientation(mat4 m, quat orientation) {
|
||||||
quat_fromMat4(orientation, m);
|
quat_fromMat4(orientation, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MAF void mat4_getAngleAxis(mat4 m, float* angle, float* ax, float* ay, float* az) {
|
||||||
|
float sx = vec3_length(m + 0);
|
||||||
|
float sy = vec3_length(m + 4);
|
||||||
|
float sz = vec3_length(m + 8);
|
||||||
|
float diagonal[4] = { m[0], m[5], m[10] };
|
||||||
|
float axis[4] = { m[6] - m[9], m[8] - m[2], m[1] - m[4] };
|
||||||
|
diagonal[0] /= sx;
|
||||||
|
diagonal[1] /= sy;
|
||||||
|
diagonal[2] /= sz;
|
||||||
|
vec3_normalize(axis);
|
||||||
|
*angle = acosf((diagonal[0] + diagonal[1] + diagonal[2] - 1.f) / 2.f);
|
||||||
|
*ax = axis[0];
|
||||||
|
*ay = axis[1];
|
||||||
|
*az = axis[2];
|
||||||
|
}
|
||||||
|
|
||||||
MAF void mat4_getScale(mat4 m, vec3 scale) {
|
MAF void mat4_getScale(mat4 m, vec3 scale) {
|
||||||
vec3_set(scale, vec3_length(m + 0), vec3_length(m + 4), vec3_length(m + 8));
|
vec3_set(scale, vec3_length(m + 0), vec3_length(m + 4), vec3_length(m + 8));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue