mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-31 13:10:34 +00:00
Support static iqm models.
Segging on a model with no animations is not nice :P
This commit is contained in:
parent
6ace105e31
commit
e2db2dcb63
1 changed files with 34 additions and 17 deletions
|
@ -53,6 +53,8 @@ R_IQMGetLerpedFrames (entity_t *ent, iqm_t *iqm)
|
||||||
float time, fullinterval;
|
float time, fullinterval;
|
||||||
iqmanim *anim;
|
iqmanim *anim;
|
||||||
|
|
||||||
|
if (!iqm->num_anims)
|
||||||
|
return R_EntityBlend (ent, 0, 1.0 / 25.0);
|
||||||
if (frame >= iqm->num_anims || frame < 0) {
|
if (frame >= iqm->num_anims || frame < 0) {
|
||||||
Sys_MaskPrintf (SYS_DEV, "R_IQMGetLerpedFrames: no such frame %d\n",
|
Sys_MaskPrintf (SYS_DEV, "R_IQMGetLerpedFrames: no such frame %d\n",
|
||||||
frame);
|
frame);
|
||||||
|
@ -63,7 +65,7 @@ R_IQMGetLerpedFrames (entity_t *ent, iqm_t *iqm)
|
||||||
time = vr_data.realtime + currententity->syncbase;
|
time = vr_data.realtime + currententity->syncbase;
|
||||||
time -= ((int) (time / fullinterval)) * fullinterval;
|
time -= ((int) (time / fullinterval)) * fullinterval;
|
||||||
frame = (int) (time * anim->framerate) + anim->first_frame;
|
frame = (int) (time * anim->framerate) + anim->first_frame;
|
||||||
return R_EntityBlend (ent, frame, anim->framerate);
|
return R_EntityBlend (ent, frame, 1.0 / anim->framerate);
|
||||||
}
|
}
|
||||||
|
|
||||||
iqmframe_t *
|
iqmframe_t *
|
||||||
|
@ -74,25 +76,40 @@ R_IQMBlendFrames (const iqm_t *iqm, int frame1, int frame2, float blend,
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
frame = Hunk_TempAlloc (iqm->num_joints * sizeof (iqmframe_t) + extra);
|
frame = Hunk_TempAlloc (iqm->num_joints * sizeof (iqmframe_t) + extra);
|
||||||
|
if (iqm->num_frames) {
|
||||||
#if 0
|
#if 0
|
||||||
for (i = 0; i < iqm->num_joints; i++) {
|
for (i = 0; i < iqm->num_joints; i++) {
|
||||||
iqmframe_t *f1 = &iqm->frames[frame1][i];
|
iqmframe_t *f1 = &iqm->frames[frame1][i];
|
||||||
iqmframe_t *f2 = &iqm->frames[frame2][i];
|
iqmframe_t *f2 = &iqm->frames[frame2][i];
|
||||||
DualQuatBlend (f1->rt, f2->rt, blend, frame[i].rt);
|
DualQuatBlend (f1->rt, f2->rt, blend, frame[i].rt);
|
||||||
QuatBlend (f1->shear, f2->shear, blend, frame[i].shear);
|
QuatBlend (f1->shear, f2->shear, blend, frame[i].shear);
|
||||||
QuatBlend (f1->scale, f2->scale, blend, frame[i].scale);
|
QuatBlend (f1->scale, f2->scale, blend, frame[i].scale);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
for (i = 0; i < iqm->num_joints; i++) {
|
for (i = 0; i < iqm->num_joints; i++) {
|
||||||
iqmframe_t *f1 = &iqm->frames[frame1][i];
|
iqmframe_t *f1 = &iqm->frames[frame1][i];
|
||||||
iqmframe_t *f2 = &iqm->frames[frame2][i];
|
iqmframe_t *f2 = &iqm->frames[frame2][i];
|
||||||
iqmjoint *j = &iqm->joints[i];
|
iqmjoint *j = &iqm->joints[i];
|
||||||
Mat4Blend ((float *) f1, (float *) f2, blend, (float*)&frame[i]);
|
Mat4Blend ((float *) f1, (float *) f2, blend, (float*)&frame[i]);
|
||||||
if (j->parent >= 0)
|
if (j->parent >= 0)
|
||||||
Mat4Mult ((float*)&frame[j->parent],
|
Mat4Mult ((float*)&frame[j->parent],
|
||||||
(float*)&frame[i], (float*)&frame[i]);
|
(float*)&frame[i], (float*)&frame[i]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
} else {
|
||||||
|
#if 0
|
||||||
|
for (i = 0; i < iqm->num_joints; i++) {
|
||||||
|
QuatSet (1, 0, 0, 0, frame[i].rt.q0.q);
|
||||||
|
QuatSet (0, 0, 0, 0, frame[i].rt.qe.q);
|
||||||
|
QuatSet (0, 0, 0, 0, frame[i].shear);
|
||||||
|
QuatSet (1, 1, 1, 0, frame[i].scale);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
for (i = 0; i < iqm->num_joints; i++) {
|
||||||
|
Mat4Identity ((float*)&frame[i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue