From 7cda91a87978ae48b11e127567fd0b7cf6e4d352 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sat, 12 May 2012 19:14:07 +0900 Subject: [PATCH] Temporarily disable dual quaternions. The animation data isn't getting loaded or used properly (not sure yet). This helps ensure it's not something I've done wrong with dual quats. --- libs/models/iqm/model_iqm.c | 6 +++++- libs/video/renderer/glsl/glsl_iqm.c | 6 +++++- libs/video/renderer/glsl/iqm.vert | 6 ++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libs/models/iqm/model_iqm.c b/libs/models/iqm/model_iqm.c index 53174aacb..492b812dd 100644 --- a/libs/models/iqm/model_iqm.c +++ b/libs/models/iqm/model_iqm.c @@ -461,10 +461,12 @@ load_iqm_anims (model_t *mod, const iqmheader *hdr, byte *buffer) Mat4Init (rotation, scale, translation, mat); if (p->parent >= 0) Mat4Mult (iqm->baseframe[p->parent], mat, mat); +#if 0 Mat4Mult (mat, iqm->inverse_baseframe[j], mat); // convert the matrix to dual quaternion + shear + scale Mat4Decompose (mat, frame->rt.q0.q, frame->shear, frame->scale, frame->rt.qe.sv.v); + frame->rt.qe.sv.s = 0; // apply the inverse of scale and shear to translation so // everything works out properly in the shader. // Normally v' = T*Sc*Sh*R*v, but with the dual quaternion, we get @@ -473,9 +475,11 @@ load_iqm_anims (model_t *mod, const iqmheader *hdr, byte *buffer) VectorUnshear (frame->shear, frame->rt.qe.sv.v, frame->rt.qe.sv.v); // Dual quaternions need 1/2 translation. VectorScale (frame->rt.qe.sv.v, 0.5, frame->rt.qe.sv.v); - frame->rt.qe.sv.s = 0; // and tranlation * rotation QuatMult (frame->rt.qe.q, frame->rt.q0.q, frame->rt.qe.q); +#else + Mat4Mult (mat, iqm->inverse_baseframe[j], (float *)frame); +#endif } } return true; diff --git a/libs/video/renderer/glsl/glsl_iqm.c b/libs/video/renderer/glsl/glsl_iqm.c index db6de02df..ebff66895 100644 --- a/libs/video/renderer/glsl/glsl_iqm.c +++ b/libs/video/renderer/glsl/glsl_iqm.c @@ -211,7 +211,7 @@ glsl_R_DrawIQM (void) Mat4Mult (iqm_vp, ent->transform, mvp_mat); blend = R_IQMGetLerpedFrames (ent, iqm); - +#if 0 frame = Hunk_TempAlloc (iqm->num_joints * sizeof (iqmframe_t)); for (i = 0; i < iqm->num_joints; i++) { iqmframe_t *f1 = &iqm->frames[ent->pose1][i]; @@ -220,6 +220,10 @@ glsl_R_DrawIQM (void) QuatBlend (f1->shear, f2->shear, blend, frame[i].shear); QuatBlend (f1->scale, f2->scale, blend, frame[i].scale); } +#else + blend = blend; + frame = iqm->frames[ent->pose1]; +#endif for (i = 0; i < MAX_IQM_LIGHTS; i++) { quat_t val; diff --git a/libs/video/renderer/glsl/iqm.vert b/libs/video/renderer/glsl/iqm.vert index ad2291ec7..753247cda 100644 --- a/libs/video/renderer/glsl/iqm.vert +++ b/libs/video/renderer/glsl/iqm.vert @@ -45,6 +45,7 @@ main (void) m += bonemats[int (vbones.y)] * vweights.y; m += bonemats[int (vbones.z)] * vweights.z; m += bonemats[int (vbones.w)] * vweights.w; +#if 0 q0 = m[0].yzwx; //swizzle for conversion betwen QF and GL qe = m[1].yzwx; //swizzle for conversion betwen QF and GL sh = m[2].xyz; @@ -65,6 +66,11 @@ main (void) // rotate tangent (won't bother with shear or scale: not super accurate, // but probably good enough) t = qmult (q0, vtangent.xyz); +#else + v = (m * vec4 (vposition, 1.0)).xyz; + n = (m * vec4 (vnormal, 1.0)).xyz; + t = (m * vec4 (vtangent.xyz, 1.0)).xyz; +#endif position = v * 8.0; normal = norm_mat * n; tangent = norm_mat * t;