4 * @param anim x = startframe, y = numframes, z = framerate
6 void anim_set(entity e, vector anim, bool looping, bool override, bool restart)
8 if (!anim) return; // no animation was given to us! We can't use this.
10 if (anim.x == e.animstate_startframe)
12 if (anim.y == e.animstate_numframes)
14 if (anim.z == e.animstate_framerate)
17 if (anim.y == 1) // ZYM animation
18 BITXOR_ASSIGN(e.effects, EF_RESTARTANIM_BIT);
22 e.animstate_startframe = anim.x;
23 e.animstate_numframes = anim.y;
24 e.animstate_framerate = anim.z;
25 e.animstate_starttime = time - 0.1 * frametime; // shift it a little bit into the past to prevent float inaccuracy hiccups
26 e.animstate_endtime = e.animstate_starttime + e.animstate_numframes / e.animstate_framerate;
27 e.animstate_looping = looping;
28 e.animstate_override = override;
29 e.frame = e.animstate_startframe;
34 * Update e.frame based on its animstate relative to time
36 void anim_update(entity e)
38 if (time >= e.animstate_endtime)
40 if (e.animstate_looping)
42 e.animstate_starttime = e.animstate_endtime;
43 e.animstate_endtime = e.animstate_starttime + e.animstate_numframes / e.animstate_framerate;
45 e.animstate_override = false;
47 float frameofs = bound(0, (time - e.animstate_starttime) * e.animstate_framerate, e.animstate_numframes - 1);
48 e.frame = e.animstate_startframe + frameofs;