#include "quakedef.h"
#include "cl_collision.h"
-
-void CL_VM_UpdateDmgGlobals (int dmg_take, int dmg_save, vec3_t dmg_origin);
+#include "image.h"
/*
cvar_t cl_bob2 = {CVAR_SAVE, "cl_bob2","0", "sideways view bobbing amount"};
cvar_t cl_bob2cycle = {CVAR_SAVE, "cl_bob2cycle","0.6", "sideways view bobbing speed"};
cvar_t cl_bob2smooth = {CVAR_SAVE, "cl_bob2smooth","0.05", "how fast the view goes back when you stop touching the ground"};
+cvar_t cl_bobfall = {CVAR_SAVE, "cl_bobfall","0", "how much the view swings down when falling (influenced by the speed you hit the ground with)"};
+cvar_t cl_bobfallcycle = {CVAR_SAVE, "cl_bobfallcycle","3", "speed of the bobfall swing"};
+cvar_t cl_bobfallminspeed = {CVAR_SAVE, "cl_bobfallminspeed","200", "necessary amount of speed for bob-falling to occur"};
cvar_t cl_bobmodel = {CVAR_SAVE, "cl_bobmodel", "1", "enables gun bobbing"};
cvar_t cl_bobmodel_side = {CVAR_SAVE, "cl_bobmodel_side", "0.15", "gun bobbing sideways sway amount"};
cvar_t cl_bobmodel_up = {CVAR_SAVE, "cl_bobmodel_up", "0.06", "gun bobbing upward movement amount"};
cvar_t cl_bobmodel_speed = {CVAR_SAVE, "cl_bobmodel_speed", "7", "gun bobbing speed"};
+cvar_t cl_bob_limit = {CVAR_SAVE, "cl_bob_limit", "7", "limits bobbing to this much distance from view_ofs"};
+cvar_t cl_bob_limit_heightcheck = {CVAR_SAVE, "cl_bob_limit_heightcheck", "0", "check ceiling and floor height against cl_bob_limit and scale down all view bobbing if could result in camera being in solid"};
+cvar_t cl_bob_limit_heightcheck_dontcrosswatersurface = {CVAR_SAVE, "cl_bob_limit_heightcheck_dontcrosswatersurface", "1", "limit cl_bob_limit to not crossing liquid surfaces also"};
+cvar_t cl_bob_velocity_limit = {CVAR_SAVE, "cl_bob_velocity_limit", "400", "limits the xyspeed value in the bobbing code"};
+
cvar_t cl_leanmodel = {CVAR_SAVE, "cl_leanmodel", "0", "enables gun leaning"};
cvar_t cl_leanmodel_side_speed = {CVAR_SAVE, "cl_leanmodel_side_speed", "0.7", "gun leaning sideways speed"};
cvar_t cl_leanmodel_side_limit = {CVAR_SAVE, "cl_leanmodel_side_limit", "35", "gun leaning sideways limit"};
cvar_t cl_leanmodel_side_highpass1 = {CVAR_SAVE, "cl_leanmodel_side_highpass1", "30", "gun leaning sideways pre-highpass in 1/s"};
-cvar_t cl_leanmodel_side_highpass = {CVAR_SAVE, "cl_leanmodel_side_highpass", "5", "gun leaning sideways highpass in 1/s"};
-cvar_t cl_leanmodel_side_lowpass = {CVAR_SAVE, "cl_leanmodel_side_lowpass", "30", "gun leaning sideways lowpass in 1/s"};
+cvar_t cl_leanmodel_side_highpass = {CVAR_SAVE, "cl_leanmodel_side_highpass", "3", "gun leaning sideways highpass in 1/s"};
+cvar_t cl_leanmodel_side_lowpass = {CVAR_SAVE, "cl_leanmodel_side_lowpass", "20", "gun leaning sideways lowpass in 1/s"};
cvar_t cl_leanmodel_up_speed = {CVAR_SAVE, "cl_leanmodel_up_speed", "0.65", "gun leaning upward speed"};
cvar_t cl_leanmodel_up_limit = {CVAR_SAVE, "cl_leanmodel_up_limit", "50", "gun leaning upward limit"};
cvar_t cl_leanmodel_up_highpass1 = {CVAR_SAVE, "cl_leanmodel_up_highpass1", "5", "gun leaning upward pre-highpass in 1/s"};
cvar_t cl_leanmodel_up_highpass = {CVAR_SAVE, "cl_leanmodel_up_highpass", "15", "gun leaning upward highpass in 1/s"};
-cvar_t cl_leanmodel_up_lowpass = {CVAR_SAVE, "cl_leanmodel_up_lowpass", "30", "gun leaning upward lowpass in 1/s"};
+cvar_t cl_leanmodel_up_lowpass = {CVAR_SAVE, "cl_leanmodel_up_lowpass", "20", "gun leaning upward lowpass in 1/s"};
cvar_t cl_followmodel = {CVAR_SAVE, "cl_followmodel", "0", "enables gun following"};
cvar_t cl_followmodel_side_speed = {CVAR_SAVE, "cl_followmodel_side_speed", "0.25", "gun following sideways speed"};
cvar_t cl_followmodel_side_limit = {CVAR_SAVE, "cl_followmodel_side_limit", "6", "gun following sideways limit"};
cvar_t cl_followmodel_side_highpass1 = {CVAR_SAVE, "cl_followmodel_side_highpass1", "30", "gun following sideways pre-highpass in 1/s"};
cvar_t cl_followmodel_side_highpass = {CVAR_SAVE, "cl_followmodel_side_highpass", "5", "gun following sideways highpass in 1/s"};
-cvar_t cl_followmodel_side_lowpass = {CVAR_SAVE, "cl_followmodel_side_lowpass", "30", "gun following sideways lowpass in 1/s"};
+cvar_t cl_followmodel_side_lowpass = {CVAR_SAVE, "cl_followmodel_side_lowpass", "10", "gun following sideways lowpass in 1/s"};
cvar_t cl_followmodel_up_speed = {CVAR_SAVE, "cl_followmodel_up_speed", "0.5", "gun following upward speed"};
cvar_t cl_followmodel_up_limit = {CVAR_SAVE, "cl_followmodel_up_limit", "5", "gun following upward limit"};
cvar_t cl_followmodel_up_highpass1 = {CVAR_SAVE, "cl_followmodel_up_highpass1", "60", "gun following upward pre-highpass in 1/s"};
-cvar_t cl_followmodel_up_highpass = {CVAR_SAVE, "cl_followmodel_up_highpass", "3", "gun following upward highpass in 1/s"};
-cvar_t cl_followmodel_up_lowpass = {CVAR_SAVE, "cl_followmodel_up_lowpass", "30", "gun following upward lowpass in 1/s"};
+cvar_t cl_followmodel_up_highpass = {CVAR_SAVE, "cl_followmodel_up_highpass", "2", "gun following upward highpass in 1/s"};
+cvar_t cl_followmodel_up_lowpass = {CVAR_SAVE, "cl_followmodel_up_lowpass", "10", "gun following upward lowpass in 1/s"};
cvar_t cl_viewmodel_scale = {0, "cl_viewmodel_scale", "1", "changes size of gun model, lower values prevent poking into walls but cause strange artifacts on lighting and especially r_stereo/vid_stereobuffer options where the size of the gun becomes visible"};
cvar_t cl_stairsmoothspeed = {CVAR_SAVE, "cl_stairsmoothspeed", "160", "how fast your view moves upward/downward when running up/down stairs"};
+cvar_t cl_smoothviewheight = {CVAR_SAVE, "cl_smoothviewheight", "0", "time of the averaging to the viewheight value so that it creates a smooth transition. higher values = longer transition, 0 for instant transition."};
+
cvar_t chase_back = {CVAR_SAVE, "chase_back", "48", "chase cam distance from the player"};
cvar_t chase_up = {CVAR_SAVE, "chase_up", "24", "chase cam distance from the player"};
cvar_t chase_active = {CVAR_SAVE, "chase_active", "0", "enables chase cam"};
cvar_t chase_overhead = {CVAR_SAVE, "chase_overhead", "0", "chase cam looks straight down if this is not zero"};
// GAME_GOODVSBAD2
-cvar_t chase_stevie = {0, "chase_stevie", "0", "chase cam view from above (used only by GoodVsBad2)"};
+cvar_t chase_stevie = {0, "chase_stevie", "0", "(GOODVSBAD2 only) chase cam view from above"};
cvar_t v_deathtilt = {0, "v_deathtilt", "1", "whether to use sideways view when dead"};
cvar_t v_deathtiltangle = {0, "v_deathtiltangle", "80", "what roll angle to use when tilting the view while dead"};
// Prophecy camera pitchangle by Alexander "motorsep" Zubov
cvar_t chase_pitchangle = {CVAR_SAVE, "chase_pitchangle", "55", "chase cam pitch angle"};
+cvar_t v_yshearing = {0, "v_yshearing", "0", "be all out of gum (set this to the maximum angle to allow Y shearing for - try values like 75)"};
+
float v_dmg_time, v_dmg_roll, v_dmg_pitch;
Used by view and sv_user
===============
*/
-float V_CalcRoll (vec3_t angles, vec3_t velocity)
+float V_CalcRoll (const vec3_t angles, const vec3_t velocity)
{
vec3_t right;
float sign;
//float side;
float count;
- armor = MSG_ReadByte ();
- blood = MSG_ReadByte ();
- MSG_ReadVector(from, cls.protocol);
+ armor = MSG_ReadByte(&cl_message);
+ blood = MSG_ReadByte(&cl_message);
+ MSG_ReadVector(&cl_message, from, cls.protocol);
// Send the Dmg Globals to CSQC
CL_VM_UpdateDmgGlobals(blood, armor, from);
==============================================================================
*/
-extern matrix4x4_t viewmodelmatrix;
+extern matrix4x4_t viewmodelmatrix_nobob;
+extern matrix4x4_t viewmodelmatrix_withbob;
#include "cl_collision.h"
#include "csprogs.h"
out[2] = highpass_limited(value[2], fracz, limitz, &store[2]);
}
-void V_CalcRefdef (void)
+/*
+ * 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
+ * cl.calcrefdef_prevtime
+ * 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
+ * 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, const vec3_t clvelocity)
{
- entity_t *ent;
float vieworg[3], viewangles[3], smoothtime;
float gunorg[3], gunangles[3];
+ matrix4x4_t tmpmatrix;
+
+ static float viewheightavg;
+ float viewheight;
#if 0
// begin of chase camera bounding box size for proper collisions by Alexander Zubov
vec3_t camboxmins = {-3, -3, -3};
// end of chase camera bounding box size for proper collisions by Alexander Zubov
#endif
trace_t trace;
+
+ // react to clonground state changes (for gun bob)
+ if (clonground)
+ {
+ if (!cl.oldonground)
+ cl.hitgroundtime = cl.movecmd[0].time;
+ cl.lastongroundtime = cl.movecmd[0].time;
+ }
+ cl.oldonground = clonground;
+ cl.calcrefdef_prevtime = max(cl.calcrefdef_prevtime, cl.oldtime);
+
+ VectorClear(gunangles);
VectorClear(gunorg);
- viewmodelmatrix = identitymatrix;
+ viewmodelmatrix_nobob = identitymatrix;
+ viewmodelmatrix_withbob = identitymatrix;
r_refdef.view.matrix = identitymatrix;
- if (cls.state == ca_connected && cls.signon == SIGNONS)
- {
- // ent is the view entity (visible when out of body)
- ent = &cl.entities[cl.viewentity];
- // player can look around, so take the origin from the entity,
- // and the angles from the input system
- Matrix4x4_OriginFromMatrix(&ent->render.matrix, vieworg);
- VectorCopy(cl.viewangles, viewangles);
- // calculate how much time has passed since the last V_CalcRefdef
- smoothtime = bound(0, cl.time - cl.stairsmoothtime, 0.1);
- cl.stairsmoothtime = cl.time;
+ // player can look around, so take the origin from the entity,
+ // and the angles from the input system
+ Matrix4x4_OriginFromMatrix(entrendermatrix, vieworg);
+ VectorCopy(clviewangles, viewangles);
+
+ // calculate how much time has passed since the last V_CalcRefdef
+ smoothtime = bound(0, cl.time - cl.stairsmoothtime, 0.1);
+ cl.stairsmoothtime = cl.time;
- // fade damage flash
- if (v_dmg_time > 0)
- v_dmg_time -= bound(0, smoothtime, 0.1);
+ // fade damage flash
+ 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)
+ Matrix4x4_CreateFromQuakeEntity(&r_refdef.view.matrix, cl.qw_intermission_origin[0], cl.qw_intermission_origin[1], cl.qw_intermission_origin[2], cl.qw_intermission_angles[0], cl.qw_intermission_angles[1], cl.qw_intermission_angles[2], 1);
+ else
{
- // entity is a fixed camera, just copy the matrix
- if (cls.protocol == PROTOCOL_QUAKEWORLD)
- Matrix4x4_CreateFromQuakeEntity(&r_refdef.view.matrix, cl.qw_intermission_origin[0], cl.qw_intermission_origin[1], cl.qw_intermission_origin[2], cl.qw_intermission_angles[0], cl.qw_intermission_angles[1], cl.qw_intermission_angles[2], 1);
- else
- {
- r_refdef.view.matrix = ent->render.matrix;
- Matrix4x4_AdjustOrigin(&r_refdef.view.matrix, 0, 0, cl.stats[STAT_VIEWHEIGHT]);
- }
- viewmodelmatrix = r_refdef.view.matrix;
+ r_refdef.view.matrix = *entrendermatrix;
+ Matrix4x4_AdjustOrigin(&r_refdef.view.matrix, 0, 0, clstatsviewheight);
}
+ if (v_yshearing.value > 0)
+ Matrix4x4_QuakeToDuke3D(&r_refdef.view.matrix, &r_refdef.view.matrix, v_yshearing.value);
+ 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
+ {
+ // smooth stair stepping, but only if clonground and enabled
+ if (!clonground || cl_stairsmoothspeed.value <= 0 || teleported)
+ cl.stairsmoothz = vieworg[2];
else
{
- // smooth stair stepping, but only if onground and enabled
- if (!cl.onground || cl_stairsmoothspeed.value <= 0 || !ent->persistent.trail_allowed) // FIXME use a better way to detect teleport/warp
- cl.stairsmoothz = vieworg[2];
- else
- {
- if (cl.stairsmoothz < vieworg[2])
- vieworg[2] = cl.stairsmoothz = bound(vieworg[2] - 16, cl.stairsmoothz + smoothtime * cl_stairsmoothspeed.value, vieworg[2]);
- else if (cl.stairsmoothz > vieworg[2])
- vieworg[2] = cl.stairsmoothz = bound(vieworg[2], cl.stairsmoothz - smoothtime * cl_stairsmoothspeed.value, vieworg[2] + 16);
- }
+ if (cl.stairsmoothz < vieworg[2])
+ vieworg[2] = cl.stairsmoothz = bound(vieworg[2] - cl.movevars_stepheight, cl.stairsmoothz + smoothtime * cl_stairsmoothspeed.value, vieworg[2]);
+ else if (cl.stairsmoothz > vieworg[2])
+ vieworg[2] = cl.stairsmoothz = bound(vieworg[2], cl.stairsmoothz - smoothtime * cl_stairsmoothspeed.value, vieworg[2] + cl.movevars_stepheight);
+ }
- // apply qw weapon recoil effect (this did not work in QW)
- // TODO: add a cvar to disable this
- viewangles[PITCH] += cl.qw_weaponkick;
+ // apply qw weapon recoil effect (this did not work in QW)
+ // TODO: add a cvar to disable this
+ viewangles[PITCH] += cl.qw_weaponkick;
- // apply the viewofs (even if chasecam is used)
- vieworg[2] += cl.stats[STAT_VIEWHEIGHT];
+ // apply the viewofs (even if chasecam is used)
+ // Samual: Lets add smoothing for this too so that things like crouching are done with a transition.
+ viewheight = bound(0, (cl.time - cl.calcrefdef_prevtime) / max(0.0001, cl_smoothviewheight.value), 1);
+ viewheightavg = viewheightavg * (1 - viewheight) + clstatsviewheight * viewheight;
+ vieworg[2] += viewheightavg;
- if (chase_active.value)
- {
- // observing entity from third person. Added "campitch" by Alexander "motorsep" Zubov
- vec_t camback, camup, dist, campitch, forward[3], chase_dest[3];
+ if (chase_active.value)
+ {
+ // observing entity from third person. Added "campitch" by Alexander "motorsep" Zubov
+ vec_t camback, camup, dist, campitch, forward[3], chase_dest[3];
- camback = chase_back.value;
- camup = chase_up.value;
- campitch = chase_pitchangle.value;
+ camback = chase_back.value;
+ camup = chase_up.value;
+ campitch = chase_pitchangle.value;
- AngleVectors(viewangles, forward, NULL, NULL);
+ AngleVectors(viewangles, forward, NULL, NULL);
- if (chase_overhead.integer)
- {
+ if (chase_overhead.integer)
+ {
#if 1
- vec3_t offset;
- vec3_t bestvieworg;
+ vec3_t offset;
+ vec3_t bestvieworg;
#endif
- vec3_t up;
- viewangles[PITCH] = 0;
- AngleVectors(viewangles, forward, NULL, up);
- // trace a little further so it hits a surface more consistently (to avoid 'snapping' on the edge of the range)
- chase_dest[0] = vieworg[0] - forward[0] * camback + up[0] * camup;
- chase_dest[1] = vieworg[1] - forward[1] * camback + up[1] * camup;
- chase_dest[2] = vieworg[2] - forward[2] * camback + up[2] * camup;
+ vec3_t up;
+ viewangles[PITCH] = 0;
+ AngleVectors(viewangles, forward, NULL, up);
+ // trace a little further so it hits a surface more consistently (to avoid 'snapping' on the edge of the range)
+ chase_dest[0] = vieworg[0] - forward[0] * camback + up[0] * camup;
+ chase_dest[1] = vieworg[1] - forward[1] * camback + up[1] * camup;
+ chase_dest[2] = vieworg[2] - forward[2] * camback + up[2] * camup;
#if 0
#if 1
- //trace = CL_TraceLine(vieworg, eyeboxmins, eyeboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
- trace = CL_TraceLine(vieworg, camboxmins, camboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
+ //trace = CL_TraceLine(vieworg, eyeboxmins, eyeboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, 0, true, false, NULL, false);
+ trace = CL_TraceLine(vieworg, camboxmins, camboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, 0, true, false, NULL, false);
#else
- //trace = CL_TraceBox(vieworg, eyeboxmins, eyeboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
- trace = CL_TraceBox(vieworg, camboxmins, camboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
+ //trace = CL_TraceBox(vieworg, eyeboxmins, eyeboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, 0, true, false, NULL, false);
+ trace = CL_TraceBox(vieworg, camboxmins, camboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, 0, true, false, NULL, false);
#endif
- VectorCopy(trace.endpos, vieworg);
- vieworg[2] -= 8;
+ VectorCopy(trace.endpos, vieworg);
+ vieworg[2] -= 8;
#else
- // trace from first person view location to our chosen third person view location
+ // trace from first person view location to our chosen third person view location
#if 1
- trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
+ trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, 0, MATERIALFLAGMASK_TRANSLUCENT, collision_extendmovelength.value, true, false, NULL, false, true);
#else
- trace = CL_TraceBox(vieworg, camboxmins, camboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
+ trace = CL_TraceBox(vieworg, camboxmins, camboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, 0, MATERIALFLAGMASK_TRANSLUCENT, collision_extendmovelength.value, true, false, NULL, false);
#endif
- VectorCopy(trace.endpos, bestvieworg);
- offset[2] = 0;
- for (offset[0] = -16;offset[0] <= 16;offset[0] += 8)
+ VectorCopy(trace.endpos, bestvieworg);
+ offset[2] = 0;
+ for (offset[0] = -16;offset[0] <= 16;offset[0] += 8)
+ {
+ for (offset[1] = -16;offset[1] <= 16;offset[1] += 8)
{
- for (offset[1] = -16;offset[1] <= 16;offset[1] += 8)
- {
- AngleVectors(viewangles, NULL, NULL, up);
- chase_dest[0] = vieworg[0] - forward[0] * camback + up[0] * camup + offset[0];
- chase_dest[1] = vieworg[1] - forward[1] * camback + up[1] * camup + offset[1];
- chase_dest[2] = vieworg[2] - forward[2] * camback + up[2] * camup + offset[2];
+ AngleVectors(viewangles, NULL, NULL, up);
+ chase_dest[0] = vieworg[0] - forward[0] * camback + up[0] * camup + offset[0];
+ chase_dest[1] = vieworg[1] - forward[1] * camback + up[1] * camup + offset[1];
+ chase_dest[2] = vieworg[2] - forward[2] * camback + up[2] * camup + offset[2];
#if 1
- trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
+ trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, 0, MATERIALFLAGMASK_TRANSLUCENT, collision_extendmovelength.value, true, false, NULL, false, true);
#else
- trace = CL_TraceBox(vieworg, camboxmins, camboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
-#endif
- if (bestvieworg[2] > trace.endpos[2])
- bestvieworg[2] = trace.endpos[2];
- }
- }
- bestvieworg[2] -= 8;
- VectorCopy(bestvieworg, vieworg);
+ trace = CL_TraceBox(vieworg, camboxmins, camboxmaxs, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, 0, MATERIALFLAGMASK_TRANSLUCENT, collision_extendmovelength.value, true, false, NULL, false);
#endif
- viewangles[PITCH] = campitch;
- }
- else
- {
- if (gamemode == GAME_GOODVSBAD2 && chase_stevie.integer)
- {
- // look straight down from high above
- viewangles[PITCH] = 90;
- camback = 2048;
- VectorSet(forward, 0, 0, -1);
+ if (bestvieworg[2] > trace.endpos[2])
+ bestvieworg[2] = trace.endpos[2];
}
-
- // trace a little further so it hits a surface more consistently (to avoid 'snapping' on the edge of the range)
- dist = -camback - 8;
- chase_dest[0] = vieworg[0] + forward[0] * dist;
- chase_dest[1] = vieworg[1] + forward[1] * dist;
- chase_dest[2] = vieworg[2] + forward[2] * dist + camup;
- trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_SKY, true, false, NULL, false);
- VectorMAMAM(1, trace.endpos, 8, forward, 4, trace.plane.normal, vieworg);
}
+ bestvieworg[2] -= 8;
+ VectorCopy(bestvieworg, vieworg);
+#endif
+ viewangles[PITCH] = campitch;
}
else
{
- // first person view from entity
- // angles
- if (cl.stats[STAT_HEALTH] <= 0 && v_deathtilt.integer)
- viewangles[ROLL] = v_deathtiltangle.value;
- VectorAdd(viewangles, cl.punchangle, viewangles);
- viewangles[ROLL] += V_CalcRoll(cl.viewangles, cl.velocity);
- if (v_dmg_time > 0)
+ if (gamemode == GAME_GOODVSBAD2 && chase_stevie.integer)
{
- viewangles[ROLL] += v_dmg_time/v_kicktime.value*v_dmg_roll;
- viewangles[PITCH] += v_dmg_time/v_kicktime.value*v_dmg_pitch;
+ // look straight down from high above
+ viewangles[PITCH] = 90;
+ camback = 2048;
+ VectorSet(forward, 0, 0, -1);
}
- // origin
- VectorAdd(vieworg, cl.punchvector, vieworg);
- if (cl.stats[STAT_HEALTH] > 0)
- {
- double xyspeed, bob;
- float cycle;
- vec_t frametime;
- frametime = cl.realframetime * cl.movevars_timescale;
+ // trace a little further so it hits a surface more consistently (to avoid 'snapping' on the edge of the range)
+ dist = -camback - 8;
+ chase_dest[0] = vieworg[0] + forward[0] * dist;
+ chase_dest[1] = vieworg[1] + forward[1] * dist;
+ chase_dest[2] = vieworg[2] + forward[2] * dist + camup;
+ trace = CL_TraceLine(vieworg, chase_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, 0, MATERIALFLAGMASK_TRANSLUCENT, collision_extendmovelength.value, true, false, NULL, false, true);
+ VectorMAMAM(1, trace.endpos, 8, forward, 4, trace.plane.normal, vieworg);
+ }
+ }
+ else
+ {
+ // first person view from entity
+ // angles
+ if (cldead && v_deathtilt.integer)
+ viewangles[ROLL] = v_deathtiltangle.value;
+ VectorAdd(viewangles, cl.punchangle, viewangles);
+ viewangles[ROLL] += V_CalcRoll(clviewangles, clvelocity);
+ if (v_dmg_time > 0)
+ {
+ viewangles[ROLL] += v_dmg_time/v_kicktime.value*v_dmg_roll;
+ viewangles[PITCH] += v_dmg_time/v_kicktime.value*v_dmg_pitch;
+ }
+ // origin
+ VectorAdd(vieworg, cl.punchvector, vieworg);
+ if (!cldead)
+ {
+ double xyspeed, bob, bobfall;
+ double cycle; // double-precision because cl.time can be a very large number, where float would get stuttery at high time values
+ vec_t frametime;
+
+ frametime = (cl.time - cl.calcrefdef_prevtime) * cl.movevars_timescale;
+ if(cl_followmodel.integer || cl_leanmodel.integer)
+ {
// 1. if we teleported, clear the frametime... the lowpass will recover the previous value then
- if(!ent->persistent.trail_allowed) // FIXME improve this check
+ if(teleported)
{
// try to fix the first highpass; result is NOT
// perfect! TODO find a better fix
VectorSubtract(cl.gunangles_highpass, cl.gunangles_prev, cl.gunangles_highpass);
// 3. calculate the RAW adjustment vectors
- gunorg[0] *= (cl_followmodel.value ? -cl_followmodel_side_speed.value : 0);
- gunorg[1] *= (cl_followmodel.value ? -cl_followmodel_side_speed.value : 0);
- gunorg[2] *= (cl_followmodel.value ? -cl_followmodel_up_speed.value : 0);
+ gunorg[0] *= -cl_followmodel_side_speed.value;
+ gunorg[1] *= -cl_followmodel_side_speed.value;
+ gunorg[2] *= -cl_followmodel_up_speed.value;
- gunangles[PITCH] *= (cl_leanmodel.value ? -cl_leanmodel_up_speed.value : 0);
- gunangles[YAW] *= (cl_leanmodel.value ? -cl_leanmodel_side_speed.value : 0);
+ gunangles[PITCH] *= -cl_leanmodel_up_speed.value;
+ gunangles[YAW] *= -cl_leanmodel_side_speed.value;
gunangles[ROLL] = 0;
// 4. perform highpass/lowpass on the adjustment vectors (turning velocity into acceleration!)
// 5. use the adjusted vectors
VectorAdd(vieworg, gunorg, gunorg);
VectorAdd(viewangles, gunangles, gunangles);
+ }
+ else
+ {
+ // Just initialize gunorg/gunangles.
+ VectorCopy(vieworg, gunorg);
+ VectorCopy(viewangles, gunangles);
+ }
- // bounded XY speed, used by several effects below
- xyspeed = bound (0, sqrt(cl.velocity[0]*cl.velocity[0] + cl.velocity[1]*cl.velocity[1]), 400);
+ // bounded XY speed, used by several effects below
+ xyspeed = bound (0, sqrt(clvelocity[0]*clvelocity[0] + clvelocity[1]*clvelocity[1]), cl_bob_velocity_limit.value);
- // vertical view bobbing code
- if (cl_bob.value && cl_bobcycle.value)
+ // vertical view bobbing code
+ if (cl_bob.value && cl_bobcycle.value)
+ {
+ float bob_limit = cl_bob_limit.value;
+
+ if (cl_bob_limit_heightcheck.integer)
{
- // LordHavoc: this code is *weird*, but not replacable (I think it
- // should be done in QC on the server, but oh well, quake is quake)
- // LordHavoc: figured out bobup: the time at which the sin is at 180
- // degrees (which allows lengthening or squishing the peak or valley)
- cycle = cl.time / cl_bobcycle.value;
- cycle -= (int) cycle;
- if (cycle < cl_bobup.value)
- cycle = sin(M_PI * cycle / cl_bobup.value);
- else
- cycle = sin(M_PI + M_PI * (cycle-cl_bobup.value)/(1.0 - cl_bobup.value));
- // bob is proportional to velocity in the xy plane
- // (don't count Z, or jumping messes it up)
- bob = xyspeed * bound(0, cl_bob.value, 0.05);
- bob = bob*0.3 + bob*0.7*cycle;
- vieworg[2] += bob;
- // we also need to adjust gunorg, or this appears like pushing the gun!
- // In the old code, this was applied to vieworg BEFORE copying to gunorg,
- // but this is not viable with the new followmodel code as that would mean
- // that followmodel would work on the munged-by-bob vieworg and do feedback
- gunorg[2] += bob;
+ // use traces to determine what range the view can bob in, and scale down the bob as needed
+ float trace1fraction;
+ float trace2fraction;
+ vec3_t bob_height_check_dest;
+
+ // these multipliers are expanded a bit (the actual bob sin range is from -0.4 to 1.0) to reduce nearclip issues, especially on water surfaces
+ bob_height_check_dest[0] = vieworg[0];
+ bob_height_check_dest[1] = vieworg[1];
+ bob_height_check_dest[2] = vieworg[2] + cl_bob_limit.value * 1.1f;
+ trace = CL_TraceLine(vieworg, bob_height_check_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY | (cl_bob_limit_heightcheck_dontcrosswatersurface.integer ? SUPERCONTENTS_LIQUIDSMASK : 0), 0, MATERIALFLAGMASK_TRANSLUCENT, collision_extendmovelength.value, true, false, NULL, false, true);
+ trace1fraction = trace.fraction;
+
+ bob_height_check_dest[0] = vieworg[0];
+ bob_height_check_dest[1] = vieworg[1];
+ bob_height_check_dest[2] = vieworg[2] + cl_bob_limit.value * -0.5f;
+ trace = CL_TraceLine(vieworg, bob_height_check_dest, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY | (cl_bob_limit_heightcheck_dontcrosswatersurface.integer ? SUPERCONTENTS_LIQUIDSMASK : 0), 0, MATERIALFLAGMASK_TRANSLUCENT, collision_extendmovelength.value, true, false, NULL, false, true);
+ trace2fraction = trace.fraction;
+
+ bob_limit *= min(trace1fraction, trace2fraction);
}
- // horizontal view bobbing code
- if (cl_bob2.value && cl_bob2cycle.value)
+ // LordHavoc: this code is *weird*, but not replacable (I think it
+ // should be done in QC on the server, but oh well, quake is quake)
+ // LordHavoc: figured out bobup: the time at which the sin is at 180
+ // degrees (which allows lengthening or squishing the peak or valley)
+ cycle = cl.time / cl_bobcycle.value;
+ cycle -= (int) cycle;
+ if (cycle < cl_bobup.value)
+ cycle = sin(M_PI * cycle / cl_bobup.value);
+ else
+ cycle = sin(M_PI + M_PI * (cycle-cl_bobup.value)/(1.0 - cl_bobup.value));
+ // bob is proportional to velocity in the xy plane
+ // (don't count Z, or jumping messes it up)
+ bob = xyspeed * cl_bob.value;
+ bob = bound(0, bob, bob_limit);
+ bob = bob*0.3 + bob*0.7*cycle;
+ vieworg[2] += bob;
+ // we also need to adjust gunorg, or this appears like pushing the gun!
+ // In the old code, this was applied to vieworg BEFORE copying to gunorg,
+ // but this is not viable with the new followmodel code as that would mean
+ // that followmodel would work on the munged-by-bob vieworg and do feedback
+ gunorg[2] += bob;
+ }
+
+ // horizontal view bobbing code
+ if (cl_bob2.value && cl_bob2cycle.value)
+ {
+ vec3_t bob2vel;
+ vec3_t forward, right, up;
+ float side, front;
+
+ cycle = cl.time / cl_bob2cycle.value;
+ cycle -= (int) cycle;
+ if (cycle < 0.5)
+ cycle = cos(M_PI * cycle / 0.5); // cos looks better here with the other view bobbing using sin
+ else
+ cycle = cos(M_PI + M_PI * (cycle-0.5)/0.5);
+ bob = cl_bob2.value * cycle;
+
+ // this value slowly decreases from 1 to 0 when we stop touching the ground.
+ // The cycle is later multiplied with it so the view smooths back to normal
+ if (clonground && !clcmdjump) // also block the effect while the jump button is pressed, to avoid twitches when bunny-hopping
+ cl.bob2_smooth = 1;
+ else
{
- vec3_t bob2vel;
- vec3_t forward, right, up;
- float side, front;
-
- cycle = cl.time / cl_bob2cycle.value;
- cycle -= (int) cycle;
- if (cycle < 0.5)
- cycle = sin(M_PI * cycle / 0.5);
+ if(cl.bob2_smooth > 0)
+ cl.bob2_smooth -= bound(0, cl_bob2smooth.value, 1);
else
- cycle = sin(M_PI + M_PI * (cycle-0.5)/0.5);
- bob = bound(0, cl_bob2.value, 0.05) * cycle;
+ cl.bob2_smooth = 0;
+ }
- // this value slowly decreases from 1 to 0 when we stop touching the ground.
- // The cycle is later multiplied with it so the view smooths back to normal
- if (cl.onground && !cl.cmd.jump) // also block the effect while the jump button is pressed, to avoid twitches when bunny-hopping
- cl.bob2_smooth = 1;
+ // calculate the front and side of the player between the X and Y axes
+ AngleVectors(viewangles, forward, right, up);
+ // now get the speed based on those angles. The bounds should match the same value as xyspeed's
+ side = bound(-cl_bob_velocity_limit.value, DotProduct (clvelocity, right) * cl.bob2_smooth, cl_bob_velocity_limit.value);
+ front = bound(-cl_bob_velocity_limit.value, DotProduct (clvelocity, forward) * cl.bob2_smooth, cl_bob_velocity_limit.value);
+ VectorScale(forward, bob, forward);
+ VectorScale(right, bob, right);
+ // we use side with forward and front with right, so the bobbing goes
+ // to the side when we walk forward and to the front when we strafe
+ VectorMAMAM(side, forward, front, right, 0, up, bob2vel);
+ vieworg[0] += bob2vel[0];
+ vieworg[1] += bob2vel[1];
+ // we also need to adjust gunorg, or this appears like pushing the gun!
+ // In the old code, this was applied to vieworg BEFORE copying to gunorg,
+ // but this is not viable with the new followmodel code as that would mean
+ // that followmodel would work on the munged-by-bob vieworg and do feedback
+ gunorg[0] += bob2vel[0];
+ gunorg[1] += bob2vel[1];
+ }
+
+ // fall bobbing code
+ // causes the view to swing down and back up when touching the ground
+ if (cl_bobfall.value && cl_bobfallcycle.value)
+ {
+ if (!clonground)
+ {
+ cl.bobfall_speed = bound(-400, clvelocity[2], 0) * bound(0, cl_bobfall.value, 0.1);
+ if (clvelocity[2] < -cl_bobfallminspeed.value)
+ cl.bobfall_swing = 1;
else
- {
- if(cl.bob2_smooth > 0)
- cl.bob2_smooth -= bound(0, cl_bob2smooth.value, 1);
- else
- cl.bob2_smooth = 0;
- }
+ cl.bobfall_swing = 0; // TODO really?
+ }
+ else
+ {
+ cl.bobfall_swing = max(0, cl.bobfall_swing - cl_bobfallcycle.value * frametime);
- // calculate the front and side of the player between the X and Y axes
- AngleVectors(viewangles, forward, right, up);
- // now get the speed based on those angles. The bounds should match the same value as xyspeed's
- side = bound(-400, DotProduct (cl.velocity, right) * cl.bob2_smooth, 400);
- front = bound(-400, DotProduct (cl.velocity, forward) * cl.bob2_smooth, 400);
- VectorScale(forward, bob, forward);
- VectorScale(right, bob, right);
- // we use side with forward and front with right, so the bobbing goes
- // to the side when we walk forward and to the front when we strafe
- VectorMAMAM(side, forward, front, right, 0, up, bob2vel);
- vieworg[0] += bob2vel[0];
- vieworg[1] += bob2vel[1];
- // we also need to adjust gunorg, or this appears like pushing the gun!
- // In the old code, this was applied to vieworg BEFORE copying to gunorg,
- // but this is not viable with the new followmodel code as that would mean
- // that followmodel would work on the munged-by-bob vieworg and do feedback
- gunorg[0] += bob2vel[0];
- gunorg[1] += bob2vel[1];
+ bobfall = sin(M_PI * cl.bobfall_swing) * cl.bobfall_speed;
+ vieworg[2] += bobfall;
+ gunorg[2] += bobfall;
}
+ }
- // gun model bobbing code
- if (cl_bob.value && cl_bobmodel.value)
+ // gun model bobbing code
+ if (cl_bobmodel.value)
+ {
+ // calculate for swinging gun model
+ // the gun bobs when running on the ground, but doesn't bob when you're in the air.
+ // Sajt: I tried to smooth out the transitions between bob and no bob, which works
+ // for the most part, but for some reason when you go through a message trigger or
+ // pick up an item or anything like that it will momentarily jolt the gun.
+ vec3_t forward, right, up;
+ float bspeed;
+ float s;
+ float t;
+
+ s = cl.time * cl_bobmodel_speed.value;
+ if (clonground)
{
- // calculate for swinging gun model
- // the gun bobs when running on the ground, but doesn't bob when you're in the air.
- // Sajt: I tried to smooth out the transitions between bob and no bob, which works
- // for the most part, but for some reason when you go through a message trigger or
- // pick up an item or anything like that it will momentarily jolt the gun.
- vec3_t forward, right, up;
- float bspeed;
- float s;
- float t;
-
- s = cl.time * cl_bobmodel_speed.value;
- if (cl.onground)
- {
- if (cl.time - cl.hitgroundtime < 0.2)
- {
- // just hit the ground, speed the bob back up over the next 0.2 seconds
- t = cl.time - cl.hitgroundtime;
- t = bound(0, t, 0.2);
- t *= 5;
- }
- else
- t = 1;
- }
- else
+ if (cl.time - cl.hitgroundtime < 0.2)
{
- // recently left the ground, slow the bob down over the next 0.2 seconds
- t = cl.time - cl.lastongroundtime;
- t = 0.2 - bound(0, t, 0.2);
+ // just hit the ground, speed the bob back up over the next 0.2 seconds
+ t = cl.time - cl.hitgroundtime;
+ t = bound(0, t, 0.2);
t *= 5;
}
-
- bspeed = xyspeed * 0.01f;
- AngleVectors (gunangles, forward, right, up);
- bob = bspeed * cl_bobmodel_side.value * cl_viewmodel_scale.value * sin (s) * t;
- VectorMA (gunorg, bob, right, gunorg);
- bob = bspeed * cl_bobmodel_up.value * cl_viewmodel_scale.value * cos (s * 2) * t;
- VectorMA (gunorg, bob, up, gunorg);
+ else
+ t = 1;
}
+ else
+ {
+ // recently left the ground, slow the bob down over the next 0.2 seconds
+ t = cl.time - cl.lastongroundtime;
+ t = 0.2 - bound(0, t, 0.2);
+ t *= 5;
+ }
+
+ bspeed = xyspeed * 0.01f;
+ AngleVectors (gunangles, forward, right, up);
+ bob = bspeed * cl_bobmodel_side.value * cl_viewmodel_scale.value * sin (s) * t;
+ VectorMA (gunorg, bob, right, gunorg);
+ bob = bspeed * cl_bobmodel_up.value * cl_viewmodel_scale.value * cos (s * 2) * t;
+ VectorMA (gunorg, bob, up, gunorg);
}
}
- // calculate a view matrix for rendering the scene
- if (v_idlescale.value)
- Matrix4x4_CreateFromQuakeEntity(&r_refdef.view.matrix, vieworg[0], vieworg[1], vieworg[2], viewangles[0] + v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value, viewangles[1] + v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value, viewangles[2] + v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value, 1);
- else
- Matrix4x4_CreateFromQuakeEntity(&r_refdef.view.matrix, vieworg[0], vieworg[1], vieworg[2], viewangles[0], viewangles[1], viewangles[2] + v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value, 1);
- // calculate a viewmodel matrix for use in view-attached entities
- Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix, gunorg[0], gunorg[1], gunorg[2], gunangles[0], gunangles[1], gunangles[2], cl_viewmodel_scale.value);
- VectorCopy(vieworg, cl.csqc_origin);
- VectorCopy(viewangles, cl.csqc_angles);
}
+ // calculate a view matrix for rendering the scene
+ if (v_idlescale.value)
+ {
+ viewangles[0] += v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value;
+ viewangles[1] += v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value;
+ viewangles[2] += v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value;
+ }
+ Matrix4x4_CreateFromQuakeEntity(&r_refdef.view.matrix, vieworg[0], vieworg[1], vieworg[2], viewangles[0], viewangles[1], viewangles[2], 1);
+ if (v_yshearing.value > 0)
+ Matrix4x4_QuakeToDuke3D(&r_refdef.view.matrix, &r_refdef.view.matrix, v_yshearing.value);
+
+ // calculate a viewmodel matrix for use in view-attached entities
+ Matrix4x4_Copy(&viewmodelmatrix_nobob, &r_refdef.view.matrix);
+ Matrix4x4_ConcatScale(&viewmodelmatrix_nobob, cl_viewmodel_scale.value);
+
+ Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix_withbob, gunorg[0], gunorg[1], gunorg[2], gunangles[0], gunangles[1], gunangles[2], cl_viewmodel_scale.value);
+ if (v_yshearing.value > 0)
+ Matrix4x4_QuakeToDuke3D(&viewmodelmatrix_withbob, &viewmodelmatrix_withbob, v_yshearing.value);
+
+ VectorCopy(vieworg, cl.csqc_vieworiginfromengine);
+ VectorCopy(viewangles, cl.csqc_viewanglesfromengine);
+
+ Matrix4x4_Invert_Simple(&tmpmatrix, &r_refdef.view.matrix);
+ Matrix4x4_Concat(&cl.csqc_viewmodelmatrixfromengine, &tmpmatrix, &viewmodelmatrix_withbob);
+ }
+
+ cl.calcrefdef_prevtime = cl.time;
+}
+
+void V_CalcRefdef (void)
+{
+ entity_t *ent;
+ qboolean cldead;
+
+ 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];
+
+ 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 != 0, cl.velocity); // FIXME use a better way to detect teleport/warp than trail_allowed
+ }
+ else
+ {
+ viewmodelmatrix_nobob = identitymatrix;
+ viewmodelmatrix_withbob = identitymatrix;
+ cl.csqc_viewmodelmatrixfromengine = identitymatrix;
+ r_refdef.view.matrix = identitymatrix;
+ VectorClear(cl.csqc_vieworiginfromengine);
+ VectorCopy(cl.viewangles, cl.csqc_viewanglesfromengine);
}
}
a2 = 1 / r_refdef.viewblend[3];
VectorScale(r_refdef.viewblend, a2, r_refdef.viewblend);
}
- r_refdef.viewblend[0] = bound(0.0f, r_refdef.viewblend[0] * (1.0f/255.0f), 1.0f);
- r_refdef.viewblend[1] = bound(0.0f, r_refdef.viewblend[1] * (1.0f/255.0f), 1.0f);
- r_refdef.viewblend[2] = bound(0.0f, r_refdef.viewblend[2] * (1.0f/255.0f), 1.0f);
+ r_refdef.viewblend[0] = bound(0.0f, r_refdef.viewblend[0], 255.0f);
+ r_refdef.viewblend[1] = bound(0.0f, r_refdef.viewblend[1], 255.0f);
+ r_refdef.viewblend[2] = bound(0.0f, r_refdef.viewblend[2], 255.0f);
r_refdef.viewblend[3] = bound(0.0f, r_refdef.viewblend[3] * gl_polyblend.value, 1.0f);
+ if (vid.sRGB3D)
+ {
+ r_refdef.viewblend[0] = Image_LinearFloatFromsRGB(r_refdef.viewblend[0]);
+ r_refdef.viewblend[1] = Image_LinearFloatFromsRGB(r_refdef.viewblend[1]);
+ r_refdef.viewblend[2] = Image_LinearFloatFromsRGB(r_refdef.viewblend[2]);
+ }
+ else
+ {
+ r_refdef.viewblend[0] *= (1.0f/256.0f);
+ r_refdef.viewblend[1] *= (1.0f/256.0f);
+ r_refdef.viewblend[2] *= (1.0f/256.0f);
+ }
// Samual: Ugly hack, I know. But it's the best we can do since
// there is no way to detect client states from the engine.
Cvar_RegisterVariable (&cl_bob2);
Cvar_RegisterVariable (&cl_bob2cycle);
Cvar_RegisterVariable (&cl_bob2smooth);
+ Cvar_RegisterVariable (&cl_bobfall);
+ Cvar_RegisterVariable (&cl_bobfallcycle);
+ Cvar_RegisterVariable (&cl_bobfallminspeed);
Cvar_RegisterVariable (&cl_bobmodel);
Cvar_RegisterVariable (&cl_bobmodel_side);
Cvar_RegisterVariable (&cl_bobmodel_up);
Cvar_RegisterVariable (&cl_bobmodel_speed);
+ Cvar_RegisterVariable (&cl_bob_limit);
+ Cvar_RegisterVariable (&cl_bob_limit_heightcheck);
+ Cvar_RegisterVariable (&cl_bob_limit_heightcheck_dontcrosswatersurface);
+ Cvar_RegisterVariable (&cl_bob_velocity_limit);
Cvar_RegisterVariable (&cl_leanmodel);
Cvar_RegisterVariable (&cl_leanmodel_side_speed);
Cvar_RegisterVariable (&v_kickpitch);
Cvar_RegisterVariable (&cl_stairsmoothspeed);
+
+ Cvar_RegisterVariable (&cl_smoothviewheight);
Cvar_RegisterVariable (&chase_back);
Cvar_RegisterVariable (&chase_up);
Cvar_RegisterVariable (&chase_active);
Cvar_RegisterVariable (&chase_overhead);
Cvar_RegisterVariable (&chase_pitchangle);
- if (gamemode == GAME_GOODVSBAD2)
- Cvar_RegisterVariable (&chase_stevie);
+ Cvar_RegisterVariable (&chase_stevie);
Cvar_RegisterVariable (&v_deathtilt);
Cvar_RegisterVariable (&v_deathtiltangle);
+
+ Cvar_RegisterVariable (&v_yshearing);
}