X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=matrixlib.c;h=550a511837d6981c196204e21f8d6618334bcea8;hb=67358fada6d064661ce7d3ac08a139a4a0f2072f;hp=5d4279bf99fa406567729bcaa3919584e5e07dfe;hpb=86a799933460c0c03cad9a7d3b7a7e5f7624af6b;p=xonotic%2Fdarkplaces.git diff --git a/matrixlib.c b/matrixlib.c index 5d4279bf..550a5118 100644 --- a/matrixlib.c +++ b/matrixlib.c @@ -1,6 +1,16 @@ -#include "matrixlib.h" #include +#include "matrixlib.h" + +const matrix4x4_t identitymatrix = +{ + { + {1, 0, 0, 0}, + {0, 1, 0, 0}, + {0, 0, 1, 0}, + {0, 0, 0, 1} + } +}; void Matrix4x4_Copy (matrix4x4_t *out, const matrix4x4_t *in) { @@ -265,31 +275,100 @@ void Matrix4x4_CreateFromQuakeEntity(matrix4x4_t *out, float x, float y, float z { double angle, sr, sp, sy, cr, cp, cy; - angle = yaw * (M_PI*2 / 360); - sy = sin(angle); - cy = cos(angle); - angle = pitch * (M_PI*2 / 360); - sp = sin(angle); - cp = cos(angle); - angle = roll * (M_PI*2 / 360); - sr = sin(angle); - cr = cos(angle); - out->m[0][0] = (float)((cp*cy) * scale); - out->m[0][1] = (float)((sr*sp*cy+cr*-sy) * scale); - out->m[0][2] = (float)((cr*sp*cy+-sr*-sy) * scale); - out->m[0][3] = x; - out->m[1][0] = (float)((cp*sy) * scale); - out->m[1][1] = (float)((sr*sp*sy+cr*cy) * scale); - out->m[1][2] = (float)((cr*sp*sy+-sr*cy) * scale); - out->m[1][3] = y; - out->m[2][0] = (float)((-sp) * scale); - out->m[2][1] = (float)((sr*cp) * scale); - out->m[2][2] = (float)((cr*cp) * scale); - out->m[2][3] = z; - out->m[3][0] = 0; - out->m[3][1] = 0; - out->m[3][2] = 0; - out->m[3][3] = 1; + if (roll) + { + angle = yaw * (M_PI*2 / 360); + sy = sin(angle); + cy = cos(angle); + angle = pitch * (M_PI*2 / 360); + sp = sin(angle); + cp = cos(angle); + angle = roll * (M_PI*2 / 360); + sr = sin(angle); + cr = cos(angle); + out->m[0][0] = (float)((cp*cy) * scale); + out->m[0][1] = (float)((sr*sp*cy+cr*-sy) * scale); + out->m[0][2] = (float)((cr*sp*cy+-sr*-sy) * scale); + out->m[0][3] = x; + out->m[1][0] = (float)((cp*sy) * scale); + out->m[1][1] = (float)((sr*sp*sy+cr*cy) * scale); + out->m[1][2] = (float)((cr*sp*sy+-sr*cy) * scale); + out->m[1][3] = y; + out->m[2][0] = (float)((-sp) * scale); + out->m[2][1] = (float)((sr*cp) * scale); + out->m[2][2] = (float)((cr*cp) * scale); + out->m[2][3] = z; + out->m[3][0] = 0; + out->m[3][1] = 0; + out->m[3][2] = 0; + out->m[3][3] = 1; + } + else if (pitch) + { + angle = yaw * (M_PI*2 / 360); + sy = sin(angle); + cy = cos(angle); + angle = pitch * (M_PI*2 / 360); + sp = sin(angle); + cp = cos(angle); + out->m[0][0] = (float)((cp*cy) * scale); + out->m[0][1] = (float)((-sy) * scale); + out->m[0][2] = (float)((sp*cy) * scale); + out->m[0][3] = x; + out->m[1][0] = (float)((cp*sy) * scale); + out->m[1][1] = (float)((cy) * scale); + out->m[1][2] = (float)((sp*sy) * scale); + out->m[1][3] = y; + out->m[2][0] = (float)((-sp) * scale); + out->m[2][1] = 0; + out->m[2][2] = (float)((cp) * scale); + out->m[2][3] = z; + out->m[3][0] = 0; + out->m[3][1] = 0; + out->m[3][2] = 0; + out->m[3][3] = 1; + } + else if (yaw) + { + angle = yaw * (M_PI*2 / 360); + sy = sin(angle); + cy = cos(angle); + out->m[0][0] = (float)((cy) * scale); + out->m[0][1] = (float)((-sy) * scale); + out->m[0][2] = 0; + out->m[0][3] = x; + out->m[1][0] = (float)((sy) * scale); + out->m[1][1] = (float)((cy) * scale); + out->m[1][2] = 0; + out->m[1][3] = y; + out->m[2][0] = 0; + out->m[2][1] = 0; + out->m[2][2] = scale; + out->m[2][3] = z; + out->m[3][0] = 0; + out->m[3][1] = 0; + out->m[3][2] = 0; + out->m[3][3] = 1; + } + else + { + out->m[0][0] = scale; + out->m[0][1] = 0; + out->m[0][2] = 0; + out->m[0][3] = x; + out->m[1][0] = 0; + out->m[1][1] = scale; + out->m[1][2] = 0; + out->m[1][3] = y; + out->m[2][0] = 0; + out->m[2][1] = 0; + out->m[2][2] = scale; + out->m[2][3] = z; + out->m[3][0] = 0; + out->m[3][1] = 0; + out->m[3][2] = 0; + out->m[3][3] = 1; + } } void Matrix4x4_ToVectors(const matrix4x4_t *in, float vx[3], float vy[3], float vz[3], float t[3]) @@ -421,3 +500,16 @@ void Matrix4x4_ConcatScale3 (matrix4x4_t *out, float x, float y, float z) Matrix4x4_Concat(out, &base, &temp); } +void Matrix4x4_OriginFromMatrix (const matrix4x4_t *in, float *out) +{ + out[0] = in->m[0][3]; + out[1] = in->m[1][3]; + out[2] = in->m[2][3]; +} + +float Matrix4x4_ScaleFromMatrix (const matrix4x4_t *in) +{ + // we only support uniform scaling, so assume the first row is enough + return (float)sqrt(in->m[0][0] * in->m[0][0] + in->m[0][1] * in->m[0][1] + in->m[0][2] * in->m[0][2]); +} +