#include "quakedef.h" // LordHavoc: quite tempting to break apart this function to reuse the // duplicated code, but I suspect it is better for performance // this way // LordHavoc: later note: made FRAMEBLENDINSERT macro void R_LerpAnimation(entity_render_t *r) { int sub2, numframes, f, i, k; int isfirstframegroup = true; int nolerp; double sublerp, lerp, d; animscene_t *scene; framegroupblend_t *g; frameblend_t *blend; dp_model_t *model = r->model; memset(r->frameblend, 0, sizeof(r->frameblend)); if (!model || !model->surfmesh.isanimated) { r->frameblend[0].lerp = 1; return; } blend = r->frameblend; nolerp = (model->type == mod_sprite) ? !r_lerpsprites.integer : !r_lerpmodels.integer; numframes = model->numframes; for (k = 0, g = r->framegroupblend;k < MAX_FRAMEGROUPBLENDS;k++, g++) { if ((unsigned int)g->frame >= (unsigned int)numframes) { Con_DPrintf("CL_LerpAnimation: no such frame %d\n", g->frame); g->frame = 0; } f = g->frame; d = lerp = g->lerp; if (lerp <= 0) continue; if (nolerp) { if (isfirstframegroup) { d = lerp = 1; isfirstframegroup = false; } else continue; } if (model->animscenes) { scene = model->animscenes + f; f = scene->firstframe; if (scene->framecount > 1) { // this code path is only used on .zym models and torches sublerp = scene->framerate * (cl.time - g->start); f = (int) floor(sublerp); sublerp -= f; sub2 = f + 1; if (sublerp < (1.0 / 65536.0f)) sublerp = 0; if (sublerp > (65535.0f / 65536.0f)) sublerp = 1; if (nolerp) sublerp = 0; if (scene->loop) { f = (f % scene->framecount); sub2 = (sub2 % scene->framecount); } f = bound(0, f, (scene->framecount - 1)) + scene->firstframe; sub2 = bound(0, sub2, (scene->framecount - 1)) + scene->firstframe; d = sublerp * lerp; // two framelerps produced from one animation if (d > 0) { for (i = 0;i < MAX_FRAMEBLENDS;i++) { if (blend[i].lerp <= 0 || blend[i].subframe == sub2) { blend[i].subframe = sub2; blend[i].lerp += d; break; } } } d = (1 - sublerp) * lerp; } } if (d > 0) { for (i = 0;i < MAX_FRAMEBLENDS;i++) { if (blend[i].lerp <= 0 || blend[i].subframe == f) { blend[i].subframe = f; blend[i].lerp += d; break; } } } } }