-
-#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
-void R_LerpAnimation(model_t *mod, int frame1, int frame2, double frame1start, double frame2start, double framelerp, frameblend_t *blend)
-{
- int sub1, sub2, numframes, f, i, data;
- double sublerp, lerp, l;
- animscene_t *scene, *scenes;
-
- data = (int) Mod_Extradata(mod);
- if (!data)
- Host_Error("R_LerpAnimation: model not loaded\n");
- scenes = (animscene_t *) (mod->ofs_scenes + data);
-
- numframes = mod->numframes;
-
- if ((frame1 >= numframes))
- {
- Con_Printf ("R_LerpAnimation: no such frame %d\n", frame1);
- frame1 = 0;
- }
-
- if ((frame2 >= numframes))
- {
- Con_Printf ("R_LerpAnimation: no such frame %d\n", frame2);
- frame2 = 0;
- }
-
- if (frame1 < 0)
- Host_Error ("R_LerpAnimation: frame1 is NULL\n");
-
- // round off very close blend percentages
- if (framelerp < (1.0f / 65536.0f))
- framelerp = 0;
- if (framelerp >= (65535.0f / 65536.0f))
- framelerp = 1;
-
- blend[0].frame = blend[1].frame = blend[2].frame = blend[3].frame = -1;
- blend[0].lerp = blend[1].lerp = blend[2].lerp = blend[3].lerp = 0;
- if (framelerp < 1)
- {
- scene = scenes + frame1;
- lerp = 1 - framelerp;
-
- if (scene->framecount > 1)
- {
- sublerp = scene->framerate * (cl.time - frame1start);
- sub1 = (int) (sublerp);
- sub2 = sub1 + 1;
- sublerp -= sub1;
- if (sublerp < (1.0f / 65536.0f))
- sublerp = 0;
- if (sublerp >= (65535.0f / 65536.0f))
- sublerp = 1;
- if (scene->loop)
- {
- sub1 = (sub1 % scene->framecount) + scene->firstframe;
- sub2 = (sub2 % scene->framecount) + scene->firstframe;
- }
- else
- {
- sub1 = bound(0, sub1, (scene->framecount - 1)) + scene->firstframe;
- sub2 = bound(0, sub2, (scene->framecount - 1)) + scene->firstframe;
- }
- f = sub1;
- l = (1 - sublerp) * lerp;
- if (l > 0)
- {
- for (i = 0;i < 4;i++)
- {
- if (blend[i].frame == f)
- {
- blend[i].lerp += l;
- break;
- }
- if (blend[i].lerp <= 0)
- {
- blend[i].frame = f;
- blend[i].lerp = l;
- break;
- }
- }
- }
- f = sub2;
- l = sublerp * lerp;
- }
- else
- {
- f = scene->firstframe;
- l = lerp;
- }
- if (l > 0)
- {
- for (i = 0;i < 4;i++)
- {
- if (blend[i].frame == f)
- {
- blend[i].lerp += l;
- break;
- }
- if (blend[i].lerp <= 0)
- {
- blend[i].frame = f;
- blend[i].lerp = l;
- break;
- }
- }
- }
- }
- if (framelerp > 0 && frame2 >= 0)
- {
- scene = scenes + frame2;
- lerp = framelerp;
-
- if (scene->framecount > 1)
- {
- sublerp = scene->framerate * (cl.time - frame1start);
- sub1 = (int) (sublerp);
- sub2 = sub1 + 1;
- sublerp -= sub1;
- if (sublerp < (1.0f / 65536.0f))
- sublerp = 0;
- if (sublerp >= (65535.0f / 65536.0f))
- sublerp = 1;
- if (scene->loop)
- {
- sub1 = (sub1 % scene->framecount) + scene->firstframe;
- sub2 = (sub2 % scene->framecount) + scene->firstframe;
- }
- else
- {
- sub1 = bound(0, sub1, (scene->framecount - 1)) + scene->firstframe;
- sub2 = bound(0, sub2, (scene->framecount - 1)) + scene->firstframe;
- }
- f = sub1;
- l = (1 - sublerp) * lerp;
- if (l > 0)
- {
- for (i = 0;i < 4;i++)
- {
- if (blend[i].frame == f)
- {
- blend[i].lerp += l;
- break;
- }
- if (blend[i].lerp <= 0)
- {
- blend[i].frame = f;
- blend[i].lerp = l;
- break;
- }
- }
- }
- f = sub2;
- l = sublerp * lerp;
- }
- else
- {
- f = scene->firstframe;
- l = lerp;
- }
- if (l > 0)
- {
- for (i = 0;i < 4;i++)
- {
- if (blend[i].frame == f)
- {
- blend[i].lerp += l;
- break;
- }
- if (blend[i].lerp <= 0)
- {
- blend[i].frame = f;
- blend[i].lerp = l;
- break;
- }
- }
- }
- }
-}