out[2] = highpass_limited(value[2], fracz, limitz, &store[2]);
}
-void V_CalcRefdefUsing (const matrix4x4_t *entrendermatrix, const vec3_t clviewangles, qboolean teleported, qboolean clonground, qboolean clcmdjump, float clstatsviewheight)
+/*
+ * State:
+ * cl.bob2_smooth
+ * cl.bobfall_speed
+ * cl.bobfall_swing
+ * cl.gunangles_adjustment_highpass
+ * cl.gunangles_adjustment_lowpass
+ * cl.gunangles_highpass
+ * cl.gunangles_prev
+ * cl.gunorg_adjustment_highpass
+ * cl.gunorg_adjustment_lowpass
+ * cl.gunorg_highpass
+ * cl.gunorg_prev
+ * cl.hitgroundtime
+ * cl.lastongroundtime
+ * cl.oldongrounbd
+ * cl.stairsmoothtime
+ * cl.stairsmoothz
+ * Extra input:
+ * cl.movecmd[0].time
+ * cl.movevars_stepheight
+ * cl.movevars_timescale
+ * cl.oldtime
+ * cl.punchangle
+ * cl.punchvector
+ * cl.qw_intermission_angles
+ * cl.qw_intermission_origin
+ * cl.qw_weaponkick
+ * cls.protocol
+ * cl.time
+ * cl.velocity (TODO should these be parameters?)
+ * cl.viewangles (TODO should these be parameters?)
+ * Output:
+ * cl.csqc_viewanglesfromengine
+ * cl.csqc_viewmodelmatrixfromengine
+ * cl.csqc_vieworiginfromengine
+ * r_refdef.view.matrix
+ * viewmodelmatrix_nobob
+ * viewmodelmatrix_withbob
+ */
+void V_CalcRefdefUsing (const matrix4x4_t *entrendermatrix, const vec3_t clviewangles, qboolean teleported, qboolean clonground, qboolean clcmdjump, float clstatsviewheight, qboolean cldead, qboolean clintermission)
{
float vieworg[3], viewangles[3], smoothtime;
float gunorg[3], gunangles[3];
if (v_dmg_time > 0)
v_dmg_time -= bound(0, smoothtime, 0.1);
- if (cl.intermission)
+ if (clintermission)
{
// entity is a fixed camera, just copy the matrix
if (cls.protocol == PROTOCOL_QUAKEWORLD)
else
{
r_refdef.view.matrix = *entrendermatrix;
- Matrix4x4_AdjustOrigin(&r_refdef.view.matrix, 0, 0, cl.stats[STAT_VIEWHEIGHT]);
+ Matrix4x4_AdjustOrigin(&r_refdef.view.matrix, 0, 0, clstatsviewheight);
}
Matrix4x4_Copy(&viewmodelmatrix_nobob, &r_refdef.view.matrix);
Matrix4x4_ConcatScale(&viewmodelmatrix_nobob, cl_viewmodel_scale.value);
Matrix4x4_Copy(&viewmodelmatrix_withbob, &viewmodelmatrix_nobob);
+
+ VectorCopy(vieworg, cl.csqc_vieworiginfromengine);
+ VectorCopy(viewangles, cl.csqc_viewanglesfromengine);
+
+ Matrix4x4_Invert_Simple(&tmpmatrix, &r_refdef.view.matrix);
+ Matrix4x4_CreateScale(&cl.csqc_viewmodelmatrixfromengine, cl_viewmodel_scale.value);
}
else
{
{
// first person view from entity
// angles
- if (cl.stats[STAT_HEALTH] <= 0 && v_deathtilt.integer)
+ if (cldead && v_deathtilt.integer)
viewangles[ROLL] = v_deathtiltangle.value;
VectorAdd(viewangles, cl.punchangle, viewangles);
viewangles[ROLL] += V_CalcRoll(cl.viewangles, cl.velocity);
}
// origin
VectorAdd(vieworg, cl.punchvector, vieworg);
- if (cl.stats[STAT_HEALTH] > 0)
+ if (!cldead)
{
double xyspeed, bob, bobfall;
float cycle;
vec_t frametime;
- //frametime = cl.realframetime * cl.movevars_timescale;
frametime = (cl.time - cl.oldtime) * cl.movevars_timescale;
// 1. if we teleported, clear the frametime... the lowpass will recover the previous value then
void V_CalcRefdef (void)
{
entity_t *ent;
+ qboolean cldead;
- if (cls.state == ca_connected && cls.signon == SIGNONS && !cl.csqc_server2csqcentitynumber[cl.playerentity])
+ if (cls.state == ca_connected && cls.signon == SIGNONS && !cl.csqc_server2csqcentitynumber[cl.viewentity])
{
// ent is the view entity (visible when out of body)
ent = &cl.entities[cl.viewentity];
- V_CalcRefdefUsing(&ent->render.matrix, cl.viewangles, !ent->persistent.trail_allowed, cl.onground, cl.cmd.jump, cl.stats[STAT_VIEWHEIGHT]); // FIXME use a better way to detect teleport/warp than trail_allowed
+ cldead = (cl.stats[STAT_HEALTH] <= 0 && cl.stats[STAT_HEALTH] != -666 && cl.stats[STAT_HEALTH] != -2342);
+ V_CalcRefdefUsing(&ent->render.matrix, cl.viewangles, !ent->persistent.trail_allowed, cl.onground, cl.cmd.jump, cl.stats[STAT_VIEWHEIGHT], cldead, cl.intermission); // FIXME use a better way to detect teleport/warp than trail_allowed
}
else
{