X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=view.c;h=ae3c45f2aba532d3b2db2566fde9b6587ce1a6e6;hb=5f31c863165197cd0ad4817d9db91d03133a6c55;hp=f2daebbd8dc2e6f7ff8106681907bc789b0e5ee3;hpb=5456462a532e65b437db3c539828ce23ea4d9497;p=xonotic%2Fdarkplaces.git diff --git a/view.c b/view.c index f2daebbd..ae3c45f2 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. @@ -30,35 +30,37 @@ when crossing a water boudnary. */ -cvar_t cl_rollspeed = {"cl_rollspeed", "200"}; -cvar_t cl_rollangle = {"cl_rollangle", "2.0"}; +cvar_t cl_rollspeed = {0, "cl_rollspeed", "200"}; +cvar_t cl_rollangle = {0, "cl_rollangle", "2.0"}; -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 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 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_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_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_punch = {0, "v_punch", "1"}; -cvar_t v_idlescale = {"v_idlescale", "0", 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 crosshair = {"crosshair", "0", true}; -cvar_t cl_crossx = {"cl_crossx", "0", false}; -cvar_t cl_crossy = {"cl_crossy", "0", false}; +cvar_t v_idlescale = {0, "v_idlescale", "0"}; -cvar_t gl_cshiftpercent = {"gl_cshiftpercent", "100", false}; +cvar_t crosshair = {CVAR_SAVE, "crosshair", "0"}; -float v_dmg_time, v_dmg_roll, v_dmg_pitch; +//cvar_t gl_cshiftpercent = {0, "gl_cshiftpercent", "100"}; +cvar_t gl_polyblend = {CVAR_SAVE, "gl_polyblend", "1"}; + +cvar_t v_centermove = {0, "v_centermove", "0.15"}; +cvar_t v_centerspeed = {0, "v_centerspeed","500"}; -extern int in_forward, in_forward2, in_back; +float v_dmg_time, v_dmg_roll, v_dmg_pitch; /* @@ -68,15 +70,14 @@ 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); @@ -89,9 +90,9 @@ float V_CalcRoll (vec3_t angles, vec3_t velocity) side = side * value / cl_rollspeed.value; else side = value; - + return side*sign; - + } @@ -131,10 +132,6 @@ float V_CalcBob (void) //============================================================================= -cvar_t v_centermove = {"v_centermove", "0.15", false}; -cvar_t v_centerspeed = {"v_centerspeed","500"}; - - void V_StartPitchDrift (void) { #if 1 @@ -168,7 +165,7 @@ 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) @@ -188,7 +185,7 @@ 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) { @@ -205,10 +202,10 @@ void V_DriftPitch (void) return; } - move = host_frametime * cl.pitchvel; - cl.pitchvel += host_frametime * v_centerspeed.value; + move = cl.frametime * cl.pitchvel; + cl.pitchvel += cl.frametime * v_centerspeed.value; -//Con_Printf ("move: %f (%f)\n", move, host_frametime); +//Con_Printf ("move: %f (%f)\n", move, cl.frametime); if (delta > 0) { @@ -237,7 +234,7 @@ void V_DriftPitch (void) /* ============================================================================== - PALETTE FLASHES + SCREEN FLASHES ============================================================================== */ @@ -261,7 +258,7 @@ void V_ParseDamage (void) int armor, blood; vec3_t from; int i; - vec3_t forward, right, up; + vec3_t forward, right; entity_t *ent; float side; float count; @@ -275,31 +272,34 @@ 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) - cl.cshifts[CSHIFT_DAMAGE].percent = 0; - if (cl.cshifts[CSHIFT_DAMAGE].percent > 150) - cl.cshifts[CSHIFT_DAMAGE].percent = 150; - - if (armor > blood) - { - cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 200; - cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 100; - cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 100; - } - else if (armor) - { - cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 220; - cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 50; - cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 50; - } - else + if (gl_polyblend.value) { - cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 255; - cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 0; - cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 0; + cl.cshifts[CSHIFT_DAMAGE].percent += 3*count; + if (cl.cshifts[CSHIFT_DAMAGE].percent < 0) + cl.cshifts[CSHIFT_DAMAGE].percent = 0; + if (cl.cshifts[CSHIFT_DAMAGE].percent > 150) + cl.cshifts[CSHIFT_DAMAGE].percent = 150; + + if (armor > blood) + { + cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 200; + cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 100; + cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 100; + } + else if (armor) + { + cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 220; + cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 50; + cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 50; + } + else + { + cl.cshifts[CSHIFT_DAMAGE].destcolor[0] = 255; + cl.cshifts[CSHIFT_DAMAGE].destcolor[1] = 0; + cl.cshifts[CSHIFT_DAMAGE].destcolor[2] = 0; + } } // @@ -307,10 +307,10 @@ void V_ParseDamage (void) // ent = &cl_entities[cl.viewentity]; - VectorSubtract (from, ent->origin, from); + VectorSubtract (from, ent->render.origin, from); VectorNormalize (from); - AngleVectors (ent->angles, forward, right, up); + AngleVectors (ent->render.angles, forward, right, NULL); side = DotProduct (from, right); v_dmg_roll = count*side*v_kickroll.value; @@ -345,10 +345,13 @@ When you run over an item, the server sends this command */ void V_BonusFlash_f (void) { - cl.cshifts[CSHIFT_BONUS].destcolor[0] = 215; - cl.cshifts[CSHIFT_BONUS].destcolor[1] = 186; - cl.cshifts[CSHIFT_BONUS].destcolor[2] = 69; - cl.cshifts[CSHIFT_BONUS].percent = 50; + if (gl_polyblend.value) + { + cl.cshifts[CSHIFT_BONUS].destcolor[0] = 215; + cl.cshifts[CSHIFT_BONUS].destcolor[1] = 186; + cl.cshifts[CSHIFT_BONUS].destcolor[2] = 69; + cl.cshifts[CSHIFT_BONUS].percent = 50; + } } /* @@ -362,6 +365,11 @@ void V_SetContentsColor (int contents) { cshift_t* c; c = &cl.cshifts[CSHIFT_CONTENTS]; // just to shorten the code below + if (!gl_polyblend.value) + { + c->percent = 0; + return; + } switch (contents) { case CONTENTS_EMPTY: @@ -402,6 +410,11 @@ V_CalcPowerupCshift */ void V_CalcPowerupCshift (void) { + if (!gl_polyblend.value) + { + cl.cshifts[CSHIFT_POWERUP].percent = 0; + return; + } if (cl.items & IT_QUAD) { cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 0; @@ -450,11 +463,12 @@ void V_CalcBlend (void) b = 0; a = 0; - if (gl_cshiftpercent.value) - { +// if (gl_cshiftpercent.value) +// { for (j=0 ; j 180) a -= 360; return a; @@ -549,6 +563,7 @@ CalcGunAngle */ void CalcGunAngle (void) { + /* float yaw, pitch, move; static float oldyaw = 0; static float oldpitch = 0; @@ -566,7 +581,7 @@ void CalcGunAngle (void) pitch = 10; if (pitch < -10) pitch = -10; - move = host_frametime*20; + move = cl.frametime*20; if (yaw > oldyaw) { if (oldyaw + move < yaw) @@ -577,7 +592,7 @@ void CalcGunAngle (void) if (oldyaw - move > yaw) yaw = oldyaw - move; } - + if (pitch > oldpitch) { if (oldpitch + move < pitch) @@ -594,10 +609,13 @@ void CalcGunAngle (void) cl.viewent.angles[YAW] = r_refdef.viewangles[YAW] + yaw; cl.viewent.angles[PITCH] = - (r_refdef.viewangles[PITCH] + pitch); + */ + cl.viewent.render.angles[YAW] = r_refdef.viewangles[YAW]; + cl.viewent.render.angles[PITCH] = -r_refdef.viewangles[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; + cl.viewent.render.angles[ROLL] -= v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value; + cl.viewent.render.angles[PITCH] -= v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value; + cl.viewent.render.angles[YAW] -= v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value; } /* @@ -611,21 +629,21 @@ void V_BoundOffsets (void) ent = &cl_entities[cl.viewentity]; -// absolutely bound refresh reletive to entity clipping hull +// absolutely bound refresh relative 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; + if (r_refdef.vieworg[0] < ent->render.origin[0] - 14) + r_refdef.vieworg[0] = ent->render.origin[0] - 14; + else if (r_refdef.vieworg[0] > ent->render.origin[0] + 14) + r_refdef.vieworg[0] = ent->render.origin[0] + 14; + if (r_refdef.vieworg[1] < ent->render.origin[1] - 14) + r_refdef.vieworg[1] = ent->render.origin[1] - 14; + else if (r_refdef.vieworg[1] > ent->render.origin[1] + 14) + r_refdef.vieworg[1] = ent->render.origin[1] + 14; + if (r_refdef.vieworg[2] < ent->render.origin[2] - 22) + r_refdef.vieworg[2] = ent->render.origin[2] - 22; + else if (r_refdef.vieworg[2] > ent->render.origin[2] + 30) + r_refdef.vieworg[2] = ent->render.origin[2] + 30; } /* @@ -654,14 +672,14 @@ void V_CalcViewRoll (void) { float side; - side = V_CalcRoll (cl_entities[cl.viewentity].angles, cl.velocity); + side = V_CalcRoll (cl_entities[cl.viewentity].render.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; + v_dmg_time -= cl.frametime; } if (cl.stats[STAT_HEALTH] <= 0) @@ -689,11 +707,11 @@ void V_CalcIntermissionRefdef (void) // 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; + VectorCopy (ent->render.origin, r_refdef.vieworg); + VectorCopy (ent->render.angles, r_refdef.viewangles); + view->render.model = NULL; -// allways idle in intermission +// always idle in intermission old = v_idlescale.value; v_idlescale.value = 1; V_AddIdle (); @@ -706,15 +724,14 @@ V_CalcRefdef ================== */ -extern qboolean intimerefresh; void V_CalcRefdef (void) { entity_t *ent, *view; int i; - vec3_t forward, right, up; + vec3_t forward; vec3_t angles; float bob; - static float oldz = 0; +// static float oldz = 0; V_DriftPitch (); @@ -722,114 +739,105 @@ void V_CalcRefdef (void) 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 - if (!chase_active.value) // LordHavoc: get rid of angle problems in chase_active mode - { - 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; - - if (!intimerefresh) + + if (chase_active.value) { + VectorCopy (ent->render.origin, r_refdef.vieworg); VectorCopy (cl.viewangles, r_refdef.viewangles); + Chase_Update (); + V_AddIdle (); } - V_CalcViewRoll (); - V_AddIdle (); + else + { + // transform the view offset by the model's matrix to get the offset from model origin for the view + // if (!chase_active.value) // LordHavoc: get rid of angle problems in chase_active mode + // { + // ent->render.angles[YAW] = cl.viewangles[YAW]; // the model should face the view dir + // ent->render.angles[PITCH] = -cl.viewangles[PITCH]; // the model should face the view dir + // } -// offsets - angles[PITCH] = -ent->angles[PITCH]; // because entity pitches are - // actually backward - angles[YAW] = ent->angles[YAW]; - angles[ROLL] = ent->angles[ROLL]; + bob = V_CalcBob (); - AngleVectors (angles, forward, right, up); + // refresh position + VectorCopy (ent->render.origin, r_refdef.vieworg); + r_refdef.vieworg[2] += cl.viewheight + bob; - V_BoundOffsets (); - -// set up gun position - VectorCopy (cl.viewangles, view->angles); - - CalcGunAngle (); + // LordHavoc: the protocol has changed... so this is an obsolete approach + // 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 (ent->origin, view->origin); - view->origin[2] += cl.viewheight; + if (!intimerefresh) + VectorCopy (cl.viewangles, r_refdef.viewangles); + V_CalcViewRoll (); + V_AddIdle (); - 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; + // offsets + angles[PITCH] = -ent->render.angles[PITCH]; // because entity pitches are actually backward + angles[YAW] = ent->render.angles[YAW]; + angles[ROLL] = ent->render.angles[ROLL]; -// fudge position around to keep amount of weapon visible -// roughly equal with different FOV + AngleVectors (angles, forward, NULL, NULL); -#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; -*/ + V_BoundOffsets (); + + // set up gun position + VectorCopy (cl.viewangles, view->render.angles); - view->model = cl.model_precache[cl.stats[STAT_WEAPON]]; - view->frame = cl.stats[STAT_WEAPONFRAME]; - view->colormap = 0; //vid.colormap; + CalcGunAngle (); -// set up the refresh position - if (!intimerefresh) + VectorCopy (ent->render.origin, view->render.origin); + view->render.origin[2] += cl.viewheight; + + for (i=0 ; i<3 ; i++) + { + view->render.origin[i] += forward[i]*bob*0.4; + // view->render.origin[i] += right[i]*bob*0.4; + // view->render.origin[i] += up[i]*bob*0.8; + } + view->render.origin[2] += bob; + + view->render.model = cl.model_precache[cl.stats[STAT_WEAPON]]; + view->render.frame = cl.stats[STAT_WEAPONFRAME]; + view->render.colormap = -1; // no special coloring + + // set up the refresh position + + // LordHavoc: this never looked all that good to begin with... + /* + // smooth out stair step ups + if (cl.onground && ent->render.origin[2] - oldz > 0) { - VectorAdd (r_refdef.viewangles, cl.punchangle, r_refdef.viewangles); + float steptime; + + steptime = cl.time - cl.oldtime; + if (steptime < 0) + //FIXME I_Error ("steptime < 0"); + steptime = 0; + + oldz += steptime * 80; + if (oldz > ent->render.origin[2]) + oldz = ent->render.origin[2]; + if (ent->render.origin[2] - oldz > 12) + oldz = ent->render.origin[2] - 12; + r_refdef.vieworg[2] += oldz - ent->render.origin[2]; + view->render.origin[2] += oldz - ent->render.origin[2]; } + else + oldz = ent->render.origin[2]; + */ -// 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 (); + // LordHavoc: origin view kick added + if (!intimerefresh && v_punch.value) + { + VectorAdd(r_refdef.viewangles, cl.punchangle, r_refdef.viewangles); + VectorAdd(r_refdef.vieworg, cl.punchvector, r_refdef.vieworg); + } + } } /* @@ -846,14 +854,9 @@ void V_RenderView (void) return; if (cl.intermission) - { // intermission / finale rendering V_CalcIntermissionRefdef (); - } else - { - if (!cl.paused /* && (sv.maxclients > 1 || key_dest == key_game) */ ) - V_CalcRefdef (); - } + V_CalcRefdef (); R_RenderView (); } @@ -883,9 +886,8 @@ 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 (&gl_cshiftpercent); + Cvar_RegisterVariable (&gl_polyblend); Cvar_RegisterVariable (&cl_rollspeed); Cvar_RegisterVariable (&cl_rollangle); @@ -896,6 +898,8 @@ void V_Init (void) Cvar_RegisterVariable (&v_kicktime); Cvar_RegisterVariable (&v_kickroll); Cvar_RegisterVariable (&v_kickpitch); + + Cvar_RegisterVariable (&v_punch); }