X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=view.c;h=775a02c438b19b05b2054b8a72f7a5b8e0cf9089;hb=2fa6c1c686a631ca835285d9f01eddf0dd58de85;hp=1780fef8820ab832967d0546fd19336109ff9172;hpb=8dcce44300385b12c46d494c06aadcfa35a8bc14;p=xonotic%2Fdarkplaces.git diff --git a/view.c b/view.c index 1780fef8..775a02c4 100644 --- a/view.c +++ b/view.c @@ -8,7 +8,7 @@ of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // view.c -- player eye positioning #include "quakedef.h" +#include "cl_collision.h" /* @@ -30,40 +31,33 @@ when crossing a water boudnary. */ -cvar_t scr_ofsx = {"scr_ofsx","0", false}; -cvar_t scr_ofsy = {"scr_ofsy","0", false}; -cvar_t scr_ofsz = {"scr_ofsz","0", false}; +cvar_t cl_rollspeed = {0, "cl_rollspeed", "200"}; +cvar_t cl_rollangle = {0, "cl_rollangle", "2.0"}; -cvar_t cl_rollspeed = {"cl_rollspeed", "200"}; -cvar_t cl_rollangle = {"cl_rollangle", "2.0"}; +cvar_t cl_bob = {0, "cl_bob","0.02"}; +cvar_t cl_bobcycle = {0, "cl_bobcycle","0.6"}; +cvar_t cl_bobup = {0, "cl_bobup","0.5"}; -cvar_t cl_bob = {"cl_bob","0.02", false}; -cvar_t cl_bobcycle = {"cl_bobcycle","0.6", false}; -cvar_t cl_bobup = {"cl_bobup","0.5", false}; +cvar_t v_kicktime = {0, "v_kicktime", "0.5"}; +cvar_t v_kickroll = {0, "v_kickroll", "0.6"}; +cvar_t v_kickpitch = {0, "v_kickpitch", "0.6"}; -cvar_t v_kicktime = {"v_kicktime", "0.5", false}; -cvar_t v_kickroll = {"v_kickroll", "0.6", false}; -cvar_t v_kickpitch = {"v_kickpitch", "0.6", false}; +cvar_t v_iyaw_cycle = {0, "v_iyaw_cycle", "2"}; +cvar_t v_iroll_cycle = {0, "v_iroll_cycle", "0.5"}; +cvar_t v_ipitch_cycle = {0, "v_ipitch_cycle", "1"}; +cvar_t v_iyaw_level = {0, "v_iyaw_level", "0.3"}; +cvar_t v_iroll_level = {0, "v_iroll_level", "0.1"}; +cvar_t v_ipitch_level = {0, "v_ipitch_level", "0.3"}; -cvar_t v_iyaw_cycle = {"v_iyaw_cycle", "2", false}; -cvar_t v_iroll_cycle = {"v_iroll_cycle", "0.5", false}; -cvar_t v_ipitch_cycle = {"v_ipitch_cycle", "1", false}; -cvar_t v_iyaw_level = {"v_iyaw_level", "0.3", false}; -cvar_t v_iroll_level = {"v_iroll_level", "0.1", false}; -cvar_t v_ipitch_level = {"v_ipitch_level", "0.3", false}; +cvar_t v_idlescale = {0, "v_idlescale", "0"}; -cvar_t v_idlescale = {"v_idlescale", "0", false}; +cvar_t crosshair = {CVAR_SAVE, "crosshair", "0"}; -cvar_t crosshair = {"crosshair", "0", true}; -cvar_t cl_crossx = {"cl_crossx", "0", false}; -cvar_t cl_crossy = {"cl_crossy", "0", false}; - -cvar_t gl_cshiftpercent = {"gl_cshiftpercent", "100", false}; +cvar_t v_centermove = {0, "v_centermove", "0.15"}; +cvar_t v_centerspeed = {0, "v_centerspeed","500"}; float v_dmg_time, v_dmg_roll, v_dmg_pitch; -extern int in_forward, in_forward2, in_back; - /* =============== @@ -72,81 +66,34 @@ V_CalcRoll Used by view and sv_user =============== */ -vec3_t forward, right, up; - float V_CalcRoll (vec3_t angles, vec3_t velocity) { + vec3_t right; float sign; float side; float value; - - AngleVectors (angles, forward, right, up); + + AngleVectors (angles, NULL, right, NULL); side = DotProduct (velocity, right); sign = side < 0 ? -1 : 1; side = fabs(side); - + value = cl_rollangle.value; -// if (cl.inwater) -// value *= 6; if (side < cl_rollspeed.value) side = side * value / cl_rollspeed.value; else side = value; - - return side*sign; - -} + return side*sign; -/* -=============== -V_CalcBob - -=============== -*/ -float V_CalcBob (void) -{ - float bob; - float cycle; - - cycle = cl.time - (int)(cl.time/cl_bobcycle.value)*cl_bobcycle.value; - cycle /= cl_bobcycle.value; - if (cycle < cl_bobup.value) - cycle = M_PI * cycle / cl_bobup.value; - else - cycle = 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 = sqrt(cl.velocity[0]*cl.velocity[0] + cl.velocity[1]*cl.velocity[1]) * cl_bob.value; -//Con_Printf ("speed: %5.1f\n", Length(cl.velocity)); - bob = bob*0.3 + bob*0.7*sin(cycle); - if (bob > 4) - bob = 4; - else if (bob < -7) - bob = -7; - return bob; - } - -//============================================================================= - - -cvar_t v_centermove = {"v_centermove", "0.15", false}; -cvar_t v_centerspeed = {"v_centerspeed","500"}; - - void V_StartPitchDrift (void) { -#if 1 if (cl.laststop == cl.time) - { return; // something else is keeping it from drifting - } -#endif + if (cl.nodrift || !cl.pitchvel) { cl.pitchvel = v_centerspeed.value; @@ -172,10 +119,10 @@ If the user is adjusting pitch manually, either with lookup/lookdown, mlook and mouse, or klook and keyboard, pitch drifting is constantly stopped. Drifting is enabled when the center view key is hit, mlook is released and -lookspring is non 0, or when +lookspring is non 0, or when =============== */ -void V_DriftPitch (void) +static void V_DriftPitch (void) { float delta, move; @@ -192,15 +139,15 @@ void V_DriftPitch (void) if ( fabs(cl.cmd.forwardmove) < cl_forwardspeed.value) cl.driftmove = 0; else - cl.driftmove += host_frametime; - + cl.driftmove += cl.frametime; + if ( cl.driftmove > v_centermove.value) { V_StartPitchDrift (); } return; } - + delta = cl.idealpitch - cl.viewangles[PITCH]; if (!delta) @@ -209,10 +156,8 @@ void V_DriftPitch (void) return; } - move = host_frametime * cl.pitchvel; - cl.pitchvel += host_frametime * v_centerspeed.value; - -//Con_Printf ("move: %f (%f)\n", move, host_frametime); + move = cl.frametime * cl.pitchvel; + cl.pitchvel += cl.frametime * v_centerspeed.value; if (delta > 0) { @@ -235,25 +180,14 @@ void V_DriftPitch (void) } +/* +============================================================================== + SCREEN FLASHES +============================================================================== +*/ -/* -============================================================================== - - PALETTE FLASHES - -============================================================================== -*/ - - -cshift_t cshift_empty = { {130,80,50}, 0 }; -cshift_t cshift_water = { {130,80,50}, 128 }; -cshift_t cshift_slime = { {0,25,5}, 150 }; -cshift_t cshift_lava = { {255,80,0}, 150 }; - -byte ramps[3][256]; -float v_blend[4]; // rgba 0.0 - 1.0 /* =============== @@ -262,14 +196,14 @@ V_ParseDamage */ void V_ParseDamage (void) { - int armor, blood; - vec3_t from; - int i; - vec3_t forward, right, up; - entity_t *ent; - float side; - float count; - + int i, armor, blood; + vec3_t from; + //vec3_t forward, right; + vec3_t localfrom; + entity_t *ent; + //float side; + float count; + armor = MSG_ReadByte (); blood = MSG_ReadByte (); for (i=0 ; i<3 ; i++) @@ -279,7 +213,7 @@ void V_ParseDamage (void) if (count < 10) count = 10; - cl.faceanimtime = cl.time + 0.2; // but sbar face into pain frame + cl.faceanimtime = cl.time + 0.2; // put sbar face into pain frame cl.cshifts[CSHIFT_DAMAGE].percent += 3*count; if (cl.cshifts[CSHIFT_DAMAGE].percent < 0) @@ -287,7 +221,7 @@ void V_ParseDamage (void) if (cl.cshifts[CSHIFT_DAMAGE].percent > 150) cl.cshifts[CSHIFT_DAMAGE].percent = 150; - if (armor > blood) + if (armor > blood) { cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 200; cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 100; @@ -306,37 +240,31 @@ void V_ParseDamage (void) cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 0; } -// -// calculate view angle kicks -// - ent = &cl_entities[cl.viewentity]; - - VectorSubtract (from, ent->origin, from); - VectorNormalize (from); - - AngleVectors (ent->angles, forward, right, up); - - side = DotProduct (from, right); - v_dmg_roll = count*side*v_kickroll.value; - - side = DotProduct (from, forward); - v_dmg_pitch = count*side*v_kickpitch.value; - - v_dmg_time = v_kicktime.value; + // calculate view angle kicks + if (cl.viewentity >= 0 && cl.viewentity < MAX_EDICTS && cl_entities[cl.viewentity].state_current.active) + { + ent = &cl_entities[cl.viewentity]; + Matrix4x4_Transform(&ent->render.inversematrix, from, localfrom); + VectorNormalize(localfrom); + v_dmg_pitch = count * localfrom[0] * v_kickpitch.value; + v_dmg_roll = count * localfrom[1] * v_kickroll.value; + v_dmg_time = v_kicktime.value; + } } +static cshift_t v_cshift; /* ================== V_cshift_f ================== */ -void V_cshift_f (void) +static void V_cshift_f (void) { - cshift_empty.destcolor[0] = atoi(Cmd_Argv(1)); - cshift_empty.destcolor[1] = atoi(Cmd_Argv(2)); - cshift_empty.destcolor[2] = atoi(Cmd_Argv(3)); - cshift_empty.percent = atoi(Cmd_Argv(4)); + v_cshift.destcolor[0] = atoi(Cmd_Argv(1)); + v_cshift.destcolor[1] = atoi(Cmd_Argv(2)); + v_cshift.destcolor[2] = atoi(Cmd_Argv(3)); + v_cshift.percent = atoi(Cmd_Argv(4)); } @@ -347,7 +275,7 @@ V_BonusFlash_f When you run over an item, the server sends this command ================== */ -void V_BonusFlash_f (void) +static void V_BonusFlash_f (void) { cl.cshifts[CSHIFT_BONUS].destcolor[0] = 215; cl.cshifts[CSHIFT_BONUS].destcolor[1] = 186; @@ -356,111 +284,190 @@ void V_BonusFlash_f (void) } /* -============= -V_SetContentsColor +============================================================================== -Underwater, lava, etc each has a color shift -============= + VIEW RENDERING + +============================================================================== */ -void V_SetContentsColor (int contents) -{ - cshift_t* c; - c = &cl.cshifts[CSHIFT_CONTENTS]; // just to shorten the code below - switch (contents) - { - case CONTENTS_EMPTY: - case CONTENTS_SOLID: - //cl.cshifts[CSHIFT_CONTENTS] = cshift_empty; - c->destcolor[0] = cshift_empty.destcolor[0]; - c->destcolor[1] = cshift_empty.destcolor[1]; - c->destcolor[2] = cshift_empty.destcolor[2]; - c->percent = cshift_empty.percent; - break; - case CONTENTS_LAVA: - //cl.cshifts[CSHIFT_CONTENTS] = cshift_lava; - c->destcolor[0] = cshift_lava.destcolor[0]; - c->destcolor[1] = cshift_lava.destcolor[1]; - c->destcolor[2] = cshift_lava.destcolor[2]; - c->percent = cshift_lava.percent; - break; - case CONTENTS_SLIME: - //cl.cshifts[CSHIFT_CONTENTS] = cshift_slime; - c->destcolor[0] = cshift_slime.destcolor[0]; - c->destcolor[1] = cshift_slime.destcolor[1]; - c->destcolor[2] = cshift_slime.destcolor[2]; - c->percent = cshift_slime.percent; - break; - default: - //cl.cshifts[CSHIFT_CONTENTS] = cshift_water; - c->destcolor[0] = cshift_water.destcolor[0]; - c->destcolor[1] = cshift_water.destcolor[1]; - c->destcolor[2] = cshift_water.destcolor[2]; - c->percent = cshift_water.percent; - } -} + +#define MAXVIEWMODELS 32 +extern int numviewmodels; +extern entity_t *viewmodels[MAXVIEWMODELS]; /* -============= -V_CalcPowerupCshift -============= +================== +V_CalcRefdef + +================== */ -void V_CalcPowerupCshift (void) +void V_CalcRefdef (void) { - if (cl.items & IT_QUAD) + float r, g, b, a, a2; + int j; + entity_t *ent; + if (cls.state == ca_connected && cls.signon == SIGNONS) { - cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 0; - cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 0; - cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 255; - cl.cshifts[CSHIFT_POWERUP].percent = 30; - } - else if (cl.items & IT_SUIT) - { - cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 0; - cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 255; - cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 0; - cl.cshifts[CSHIFT_POWERUP].percent = 20; - } - else if (cl.items & IT_INVISIBILITY) - { - cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 100; - cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 100; - cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 100; - cl.cshifts[CSHIFT_POWERUP].percent = 100; - } - else if (cl.items & IT_INVULNERABILITY) - { - cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 255; - cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 255; - cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 0; - cl.cshifts[CSHIFT_POWERUP].percent = 30; - } - else - cl.cshifts[CSHIFT_POWERUP].percent = 0; -} + // ent is the player model (visible when out of body) + ent = &cl_entities[cl.viewentity]; + V_DriftPitch(); + if (cl.intermission) + { + // entity is a fixed camera + VectorCopy(ent->render.origin, r_refdef.vieworg); + VectorCopy(ent->render.angles, r_refdef.viewangles); + } + else if (chase_active.value) + { + // observing entity from third person + VectorCopy(ent->render.origin, r_refdef.vieworg); + VectorCopy(cl.viewangles, r_refdef.viewangles); + Chase_Update(); + } + else + { + // first person view from entity + VectorCopy(ent->render.origin, r_refdef.vieworg); + VectorCopy(cl.viewangles, r_refdef.viewangles); + // angles + if (cl.stats[STAT_HEALTH] <= 0) + r_refdef.viewangles[ROLL] = 80; // dead view angle + VectorAdd(r_refdef.viewangles, cl.punchangle, r_refdef.viewangles); + r_refdef.viewangles[ROLL] += V_CalcRoll(cl.viewangles, cl.velocity); + if (v_dmg_time > 0) + { + r_refdef.viewangles[ROLL] += v_dmg_time/v_kicktime.value*v_dmg_roll; + r_refdef.viewangles[PITCH] += v_dmg_time/v_kicktime.value*v_dmg_pitch; + v_dmg_time -= cl.frametime; + } + if (v_idlescale.value) + { + r_refdef.viewangles[ROLL] += v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value; + r_refdef.viewangles[PITCH] += v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value; + r_refdef.viewangles[YAW] += v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value; + } + // origin + VectorAdd(r_refdef.vieworg, cl.punchvector, r_refdef.vieworg); + r_refdef.vieworg[2] += cl.viewheight; + if (cl_bob.value && cl_bobcycle.value) + { + double bob, cycle; + // 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 = sqrt(cl.velocity[0]*cl.velocity[0] + cl.velocity[1]*cl.velocity[1]) * cl_bob.value; + bob = bob*0.3 + bob*0.7*cycle; + r_refdef.vieworg[2] += bound(-7, bob, 4); + } + // link the delayed viewmodel entities + if (numviewmodels > 0 && r_drawviewmodel.integer && !chase_active.integer && !envmap && r_drawentities.integer && !(cl.items & IT_INVISIBILITY) && cl.stats[STAT_HEALTH] > 0) + { + int i; + entity_t *ent; + matrix4x4_t matrix, matrix2; + Matrix4x4_CreateFromQuakeEntity(&matrix, r_refdef.vieworg[0], r_refdef.vieworg[1], r_refdef.vieworg[2], r_refdef.viewangles[0] + v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value, r_refdef.viewangles[1] - v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value, r_refdef.viewangles[2] - v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value, 0.3); + for (i = 0;i < numviewmodels && r_refdef.numentities < r_refdef.maxentities;i++) + { + ent = viewmodels[i]; + r_refdef.entities[r_refdef.numentities++] = &ent->render; + matrix2 = ent->render.matrix; + Matrix4x4_Concat(&ent->render.matrix, &matrix, &matrix2); + Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix); + CL_BoundingBoxForEntity(&ent->render); + } + } + } -/* -============= -V_CalcBlend -============= -*/ -// LordHavoc: fixed V_CalcBlend -void V_CalcBlend (void) -{ - float r, g, b, a, a2; - int j; + // drop the damage value + cl.cshifts[CSHIFT_DAMAGE].percent -= (cl.time - cl.oldtime)*150; + if (cl.cshifts[CSHIFT_DAMAGE].percent <= 0) + cl.cshifts[CSHIFT_DAMAGE].percent = 0; - r = 0; - g = 0; - b = 0; - a = 0; + // drop the bonus value + cl.cshifts[CSHIFT_BONUS].percent -= (cl.time - cl.oldtime)*100; + if (cl.cshifts[CSHIFT_BONUS].percent <= 0) + cl.cshifts[CSHIFT_BONUS].percent = 0; - if (gl_cshiftpercent.value) - { - for (j=0 ; j> 1; + break; + case CONTENTS_SLIME: + cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 0; + cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 25; + cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 5; + cl.cshifts[CSHIFT_CONTENTS].percent = 150 >> 1; + break; + default: + cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 130; + cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 80; + cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 50; + cl.cshifts[CSHIFT_CONTENTS].percent = 128 >> 1; + } + + if (cl.items & IT_QUAD) { - a2 = ((cl.cshifts[j].percent * gl_cshiftpercent.value) / 100.0) / 255.0; + cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 0; + cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 0; + cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 255; + cl.cshifts[CSHIFT_POWERUP].percent = 30; + } + else if (cl.items & IT_SUIT) + { + cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 0; + cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 255; + cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 0; + cl.cshifts[CSHIFT_POWERUP].percent = 20; + } + else if (cl.items & IT_INVISIBILITY) + { + cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 100; + cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 100; + cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 100; + cl.cshifts[CSHIFT_POWERUP].percent = 100; + } + else if (cl.items & IT_INVULNERABILITY) + { + cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 255; + cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 255; + cl.cshifts[CSHIFT_POWERUP].destcolor[2] = 0; + cl.cshifts[CSHIFT_POWERUP].percent = 30; + } + else + cl.cshifts[CSHIFT_POWERUP].percent = 0; + + // LordHavoc: fixed V_CalcBlend + r = 0; + g = 0; + b = 0; + a = 0; + + for (j=0 ; j 1) a2 = 1; @@ -477,397 +484,23 @@ void V_CalcBlend (void) g *= a2; b *= a2; } - } - - v_blend[0] = bound(0, r * (1.0/255.0), 1); - v_blend[1] = bound(0, g * (1.0/255.0), 1); - v_blend[2] = bound(0, b * (1.0/255.0), 1); - v_blend[3] = bound(0, a , 1); -} -/* -============= -V_UpdatePalette -============= -*/ -void V_UpdatePalette (void) -{ - int i, j; - qboolean new; - - V_CalcPowerupCshift (); - - new = false; - - for (i=0 ; i 180) - a -= 360; - return a; -} - -/* -================== -CalcGunAngle -================== -*/ -void CalcGunAngle (void) -{ - float yaw, pitch, move; - static float oldyaw = 0; - static float oldpitch = 0; - - yaw = r_refdef.viewangles[YAW]; - pitch = -r_refdef.viewangles[PITCH]; - - yaw = angledelta(yaw - r_refdef.viewangles[YAW]) * 0.4; - if (yaw > 10) - yaw = 10; - if (yaw < -10) - yaw = -10; - pitch = angledelta(-pitch - r_refdef.viewangles[PITCH]) * 0.4; - if (pitch > 10) - pitch = 10; - if (pitch < -10) - pitch = -10; - move = host_frametime*20; - if (yaw > oldyaw) - { - if (oldyaw + move < yaw) - yaw = oldyaw + move; + r_refdef.viewblend[0] = bound(0, r * (1.0/255.0), 1); + r_refdef.viewblend[1] = bound(0, g * (1.0/255.0), 1); + r_refdef.viewblend[2] = bound(0, b * (1.0/255.0), 1); + r_refdef.viewblend[3] = bound(0, a , 1); } else { - if (oldyaw - move > yaw) - yaw = oldyaw - move; - } - - if (pitch > oldpitch) - { - if (oldpitch + move < pitch) - pitch = oldpitch + move; - } - else - { - if (oldpitch - move > pitch) - pitch = oldpitch - move; - } - - oldyaw = yaw; - oldpitch = pitch; - - cl.viewent.angles[YAW] = r_refdef.viewangles[YAW] + yaw; - cl.viewent.angles[PITCH] = - (r_refdef.viewangles[PITCH] + pitch); - - cl.viewent.angles[ROLL] -= v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value; - cl.viewent.angles[PITCH] -= v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value; - cl.viewent.angles[YAW] -= v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value; -} - -/* -============== -V_BoundOffsets -============== -*/ -void V_BoundOffsets (void) -{ - entity_t *ent; - - ent = &cl_entities[cl.viewentity]; - -// absolutely bound refresh reletive to entity clipping hull -// so the view can never be inside a solid wall - - if (r_refdef.vieworg[0] < ent->origin[0] - 14) - r_refdef.vieworg[0] = ent->origin[0] - 14; - else if (r_refdef.vieworg[0] > ent->origin[0] + 14) - r_refdef.vieworg[0] = ent->origin[0] + 14; - if (r_refdef.vieworg[1] < ent->origin[1] - 14) - r_refdef.vieworg[1] = ent->origin[1] - 14; - else if (r_refdef.vieworg[1] > ent->origin[1] + 14) - r_refdef.vieworg[1] = ent->origin[1] + 14; - if (r_refdef.vieworg[2] < ent->origin[2] - 22) - r_refdef.vieworg[2] = ent->origin[2] - 22; - else if (r_refdef.vieworg[2] > ent->origin[2] + 30) - r_refdef.vieworg[2] = ent->origin[2] + 30; -} - -/* -============== -V_AddIdle - -Idle swaying -============== -*/ -void V_AddIdle (void) -{ - r_refdef.viewangles[ROLL] += v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value; - r_refdef.viewangles[PITCH] += v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value; - r_refdef.viewangles[YAW] += v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value; -} - - -/* -============== -V_CalcViewRoll - -Roll is induced by movement and damage -============== -*/ -void V_CalcViewRoll (void) -{ - float side; - - side = V_CalcRoll (cl_entities[cl.viewentity].angles, cl.velocity); - r_refdef.viewangles[ROLL] += side; - - if (v_dmg_time > 0) - { - r_refdef.viewangles[ROLL] += v_dmg_time/v_kicktime.value*v_dmg_roll; - r_refdef.viewangles[PITCH] += v_dmg_time/v_kicktime.value*v_dmg_pitch; - v_dmg_time -= host_frametime; - } - - if (cl.stats[STAT_HEALTH] <= 0) - { - r_refdef.viewangles[ROLL] = 80; // dead view angle - return; - } - -} - - -/* -================== -V_CalcIntermissionRefdef - -================== -*/ -void V_CalcIntermissionRefdef (void) -{ - entity_t *ent, *view; - float old; - -// ent is the player model (visible when out of body) - ent = &cl_entities[cl.viewentity]; -// view is the weapon model (only visible from inside body) - view = &cl.viewent; - - VectorCopy (ent->origin, r_refdef.vieworg); - VectorCopy (ent->angles, r_refdef.viewangles); - view->model = NULL; - -// allways idle in intermission - old = v_idlescale.value; - v_idlescale.value = 1; - V_AddIdle (); - v_idlescale.value = old; -} - -/* -================== -V_CalcRefdef - -================== -*/ -void V_CalcRefdef (void) -{ - entity_t *ent, *view; - int i; - vec3_t forward, right, up; - vec3_t angles; - float bob; - static float oldz = 0; - - V_DriftPitch (); - -// ent is the player model (visible when out of body) - ent = &cl_entities[cl.viewentity]; -// view is the weapon model (only visible from inside body) - view = &cl.viewent; - - -// transform the view offset by the model's matrix to get the offset from -// model origin for the view - ent->angles[YAW] = cl.viewangles[YAW]; // the model should face the view dir - ent->angles[PITCH] = -cl.viewangles[PITCH]; // the model should face the view dir - - - bob = V_CalcBob (); - -// refresh position - VectorCopy (ent->origin, r_refdef.vieworg); - r_refdef.vieworg[2] += cl.viewheight + bob; - -// never let it sit exactly on a node line, because a water plane can -// dissapear when viewed with the eye exactly on it. -// the server protocol only specifies to 1/16 pixel, so add 1/32 in each axis - r_refdef.vieworg[0] += 1.0/32; - r_refdef.vieworg[1] += 1.0/32; - r_refdef.vieworg[2] += 1.0/32; - - VectorCopy (cl.viewangles, r_refdef.viewangles); - V_CalcViewRoll (); - V_AddIdle (); - -// offsets - angles[PITCH] = -ent->angles[PITCH]; // because entity pitches are - // actually backward - angles[YAW] = ent->angles[YAW]; - angles[ROLL] = ent->angles[ROLL]; - - AngleVectors (angles, forward, right, up); - - for (i=0 ; i<3 ; i++) - r_refdef.vieworg[i] += scr_ofsx.value*forward[i] - + scr_ofsy.value*right[i] - + scr_ofsz.value*up[i]; - - - V_BoundOffsets (); - -// set up gun position - VectorCopy (cl.viewangles, view->angles); - - CalcGunAngle (); - - VectorCopy (ent->origin, view->origin); - view->origin[2] += cl.viewheight; - - for (i=0 ; i<3 ; i++) - { - view->origin[i] += forward[i]*bob*0.4; -// view->origin[i] += right[i]*bob*0.4; -// view->origin[i] += up[i]*bob*0.8; - } - view->origin[2] += bob; - -// fudge position around to keep amount of weapon visible -// roughly equal with different FOV - -#if 0 - if (cl.model_precache[cl.stats[STAT_WEAPON]] && strcmp (cl.model_precache[cl.stats[STAT_WEAPON]]->name, "progs/v_shot2.mdl")) -#endif -// LordHavoc: everyone hates the gun moving around -/* - if (scr_viewsize.value == 110) - view->origin[2] += 1; - else if (scr_viewsize.value == 100) - view->origin[2] += 2; - else if (scr_viewsize.value == 90) - view->origin[2] += 1; - else if (scr_viewsize.value == 80) - view->origin[2] += 0.5; -*/ - - view->model = cl.model_precache[cl.stats[STAT_WEAPON]]; - view->frame = cl.stats[STAT_WEAPONFRAME]; - view->colormap = vid.colormap; - -// set up the refresh position - VectorAdd (r_refdef.viewangles, cl.punchangle, r_refdef.viewangles); - -// smooth out stair step ups -if (cl.onground && ent->origin[2] - oldz > 0) -{ - float steptime; - - steptime = cl.time - cl.oldtime; - if (steptime < 0) -//FIXME I_Error ("steptime < 0"); - steptime = 0; - - oldz += steptime * 80; - if (oldz > ent->origin[2]) - oldz = ent->origin[2]; - if (ent->origin[2] - oldz > 12) - oldz = ent->origin[2] - 12; - r_refdef.vieworg[2] += oldz - ent->origin[2]; - view->origin[2] += oldz - ent->origin[2]; -} -else - oldz = ent->origin[2]; - - if (chase_active.value) - Chase_Update (); -} - -/* -================== -V_RenderView - -The player's clipping box goes from (-16 -16 -24) to (16 16 32) from -the entity origin, so any view position inside that will be valid -================== -*/ -extern vrect_t scr_vrect; - -void V_RenderView (void) -{ - if (con_forcedup) - return; - -// don't allow cheats in multiplayer - if (cl.maxclients > 1) - { - Cvar_Set ("scr_ofsx", "0"); - Cvar_Set ("scr_ofsy", "0"); - Cvar_Set ("scr_ofsz", "0"); - } - - if (cl.intermission) - { // intermission / finale rendering - V_CalcIntermissionRefdef (); - } - else - { - if (!cl.paused /* && (sv.maxclients > 1 || key_dest == key_game) */ ) - V_CalcRefdef (); + cl.cshifts[CSHIFT_DAMAGE].percent = 0; + cl.cshifts[CSHIFT_BONUS].percent = 0; + cl.cshifts[CSHIFT_CONTENTS].percent = 0; + cl.cshifts[CSHIFT_POWERUP].percent = 0; + r_refdef.viewblend[0] = 0; + r_refdef.viewblend[1] = 0; + r_refdef.viewblend[2] = 0; + r_refdef.viewblend[3] = 0; } - - R_PushDlights (); - - R_RenderView (); } //============================================================================ @@ -879,7 +512,7 @@ V_Init */ void V_Init (void) { - Cmd_AddCommand ("v_cshift", V_cshift_f); + Cmd_AddCommand ("v_cshift", V_cshift_f); Cmd_AddCommand ("bf", V_BonusFlash_f); Cmd_AddCommand ("centerview", V_StartPitchDrift); @@ -895,13 +528,7 @@ void V_Init (void) Cvar_RegisterVariable (&v_idlescale); Cvar_RegisterVariable (&crosshair); - Cvar_RegisterVariable (&cl_crossx); - Cvar_RegisterVariable (&cl_crossy); - Cvar_RegisterVariable (&gl_cshiftpercent); - Cvar_RegisterVariable (&scr_ofsx); - Cvar_RegisterVariable (&scr_ofsy); - Cvar_RegisterVariable (&scr_ofsz); Cvar_RegisterVariable (&cl_rollspeed); Cvar_RegisterVariable (&cl_rollangle); Cvar_RegisterVariable (&cl_bob); @@ -910,7 +537,6 @@ void V_Init (void) Cvar_RegisterVariable (&v_kicktime); Cvar_RegisterVariable (&v_kickroll); - Cvar_RegisterVariable (&v_kickpitch); + Cvar_RegisterVariable (&v_kickpitch); } -