+void R_LerpUpdate(entity_t *ent)
+{
+ int frame;
+ frame = ent->render.frame;
+ if (ent->render.model && ent->render.frame >= ent->render.model->numframes)
+ {
+ Con_Printf("R_LerpUpdate: no such frame%6i in \"%s\"\n", ent->render.frame, ent->render.model->name);
+ frame = 0;
+ }
+
+ if (ent->render.lerp_model != ent->render.model)
+ {
+ // reset all interpolation information
+ ent->render.lerp_model = ent->render.model;
+ ent->render.frame1 = ent->render.frame2 = frame;
+ ent->render.frame1start = ent->render.frame2start = cl.time;
+ ent->render.framelerp = 1;
+ ent->render.lerp_starttime = 0;
+ }
+ else if (ent->render.frame2 != frame)
+ {
+ // transition to new frame
+ ent->render.frame1 = ent->render.frame2;
+ ent->render.frame1start = ent->render.frame2start;
+ ent->render.frame2 = frame;
+ ent->render.frame2start = cl.time;
+ ent->render.framelerp = 0;
+ ent->render.lerp_starttime = cl.time;
+ }
+ else
+ {
+ // lerp_starttime < 0 is used to prevent changing of framelerp
+ if (ent->render.lerp_starttime >= 0)
+ {
+ // update transition
+ ent->render.framelerp = (cl.time - ent->render.lerp_starttime) * 10;
+ ent->render.framelerp = bound(0, ent->render.framelerp, 1);
+ }
+ }
+}
+
+
+void R_PrepareEntities (void)
+{
+ int i;
+ entity_t *ent;
+ vec3_t v;
+ // this updates entities that are supposed to be view relative
+ for (i = 0;i < cl_numvisedicts;i++)
+ {
+ ent = cl_visedicts[i];
+
+ if (ent->render.flags & RENDER_VIEWMODEL)
+ {
+ // remove flag so it will not be repeated incase RelinkEntities is not called again for a while
+ ent->render.flags -= RENDER_VIEWMODEL;
+ // transform origin
+ VectorCopy(ent->render.origin, v);
+ ent->render.origin[0] = v[0] * vpn[0] + v[1] * vright[0] + v[2] * vup[0] + r_origin[0];
+ ent->render.origin[1] = v[0] * vpn[1] + v[1] * vright[1] + v[2] * vup[1] + r_origin[1];
+ ent->render.origin[2] = v[0] * vpn[2] + v[1] * vright[2] + v[2] * vup[2] + r_origin[2];
+ // adjust angles
+ VectorAdd(ent->render.angles, r_refdef.viewangles, ent->render.angles);
+ }
+ }
+}
+
+void R_Entity_Callback(void *data, void *junk)
+{
+ ((entity_t *)data)->render.visframe = r_framecount;
+}
+
+void R_AddModelEntities (void)
+{
+ int i;
+ vec3_t mins, maxs;
+ frameblend_t blend[4];
+
+ if (!r_drawentities.value)
+ return;
+
+ for (i = 0;i < cl_numvisedicts;i++)
+ {
+ currententity = cl_visedicts[i];
+ if (currententity->render.model->type == mod_brush)
+ {
+ modelalpha = currententity->render.alpha;
+ R_DrawBrushModel (currententity);
+ }
+ else if (currententity->render.model->type == mod_alias)
+ {
+ VectorAdd(currententity->render.origin, currententity->render.model->mins, mins);
+ VectorAdd(currententity->render.origin, currententity->render.model->maxs, maxs);
+ if (r_ser.value)
+ R_Clip_AddBox(mins, maxs, R_Entity_Callback, currententity, NULL);
+ else if (R_NotCulledBox(mins, maxs))
+ currententity->render.visframe = r_framecount;
+ }
+ else if (currententity->render.model->type == mod_sprite)
+ {
+ R_LerpUpdate(currententity);
+ if (r_ser.value)
+ {
+ R_LerpAnimation(currententity->render.model, currententity->render.frame1, currententity->render.frame2, currententity->render.frame1start, currententity->render.frame2start, currententity->render.framelerp, blend);
+ R_ClipSprite(currententity, blend);
+ }
+ else
+ {
+ VectorAdd(currententity->render.origin, currententity->render.model->mins, mins);
+ VectorAdd(currententity->render.origin, currententity->render.model->maxs, maxs);
+ if (R_NotCulledBox(mins, maxs))
+ currententity->render.visframe = r_framecount;
+ }
+ }
+ }
+}