X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=view.c;h=5a8e7af55913760ca2c637bc2d48c3b9a6e11027;hp=355a8e6e1c61a9f6702d213b02154336d10c0e40;hb=1e4a164d8f889ef98d916c14df672405622a7e25;hpb=d7035ef4229a2462ad59a67160494593fbd8f2e0 diff --git a/view.c b/view.c index 355a8e6e..5a8e7af5 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,38 +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_punch = {"v_punch", "1", false}; +cvar_t v_punch = {0, "v_punch", "1"}; -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_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_idlescale = {"v_idlescale", "0", false}; +cvar_t v_idlescale = {0, "v_idlescale", "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 crosshair = {CVAR_SAVE, "crosshair", "0"}; -//cvar_t gl_cshiftpercent = {"gl_cshiftpercent", "100", false}; -cvar_t gl_polyblend = {"gl_polyblend", "1", true}; +//cvar_t gl_cshiftpercent = {0, "gl_cshiftpercent", "100"}; +cvar_t gl_polyblend = {CVAR_SAVE, "gl_polyblend", "1"}; -float v_dmg_time, v_dmg_roll, v_dmg_pitch; +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; /* @@ -91,9 +90,9 @@ float V_CalcRoll (vec3_t angles, vec3_t velocity) side = side * value / cl_rollspeed.value; else side = value; - + return side*sign; - + } @@ -133,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 @@ -170,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) @@ -513,7 +508,7 @@ void V_UpdateBlends (void) V_CalcPowerupCshift (); new = false; - + for (i=0 ; i 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 = cl.frametime*20; - if (yaw > oldyaw) - { - if (oldyaw + move < yaw) - yaw = oldyaw + move; - } - 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.render.angles[YAW] = r_refdef.viewangles[YAW]; cl.viewent.render.angles[PITCH] = -r_refdef.viewangles[PITCH]; @@ -729,7 +677,6 @@ V_CalcRefdef ================== */ -extern qboolean intimerefresh; void V_CalcRefdef (void) { entity_t *ent, *view; @@ -737,7 +684,7 @@ void V_CalcRefdef (void) vec3_t forward; vec3_t angles; float bob; - static float oldz = 0; +// static float oldz = 0; V_DriftPitch (); @@ -745,100 +692,110 @@ 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 + + if (chase_active.value) { - 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 + VectorCopy (ent->render.origin, r_refdef.vieworg); + VectorCopy (cl.viewangles, r_refdef.viewangles); + Chase_Update (); + V_AddIdle (); } - - - bob = V_CalcBob (); - -// refresh position - VectorCopy (ent->render.origin, r_refdef.vieworg); - r_refdef.vieworg[2] += cl.viewheight + bob; + 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 + // } - // 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; + bob = V_CalcBob (); - if (!intimerefresh) - VectorCopy (cl.viewangles, r_refdef.viewangles); - V_CalcViewRoll (); - V_AddIdle (); + // refresh position + VectorCopy (ent->render.origin, r_refdef.vieworg); + r_refdef.vieworg[2] += cl.viewheight + 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]; + // 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; - AngleVectors (angles, forward, NULL, NULL); + if (!intimerefresh) + VectorCopy (cl.viewangles, r_refdef.viewangles); + V_CalcViewRoll (); + V_AddIdle (); - V_BoundOffsets (); - -// set up gun position - VectorCopy (cl.viewangles, view->render.angles); - - CalcGunAngle (); + // 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]; - VectorCopy (ent->render.origin, view->render.origin); - view->render.origin[2] += cl.viewheight; + AngleVectors (angles, forward, NULL, NULL); - for (i=0 ; i<3 ; i++) - { - view->render.origin[i] += forward[i]*bob*0.4; -// view->origin[i] += right[i]*bob*0.4; -// view->origin[i] += up[i]*bob*0.8; - } - view->render.origin[2] += bob; + V_BoundOffsets (); -// fudge position around to keep amount of weapon visible -// roughly equal with different FOV + // set up gun position + VectorCopy (ent->render.origin, view->render.origin); + view->render.origin[2] += cl.viewheight; + VectorCopy (cl.viewangles, view->render.angles); - view->render.model = cl.model_precache[cl.stats[STAT_WEAPON]]; - view->render.frame = cl.stats[STAT_WEAPONFRAME]; - view->render.colormap = -1; // no special coloring + CalcGunAngle (); -// set up the refresh position - if (!intimerefresh) - if (v_punch.value) - { - VectorAdd (r_refdef.viewangles, cl.punchangle, r_refdef.viewangles); - } + 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; -// smooth out stair step ups -if (cl.onground && ent->render.origin[2] - oldz > 0) -{ - float steptime; - - steptime = cl.time - cl.oldtime; - if (steptime < 0) -//FIXME I_Error ("steptime < 0"); - steptime = 0; + // FIXME: this setup code is somewhat evil (CL_LerpUpdate should be private) + CL_LerpUpdate(view, cl.stats[STAT_WEAPONFRAME], cl.stats[STAT_WEAPON]); - 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]; + view->render.model = cl.model_precache[cl.stats[STAT_WEAPON]]; + view->render.frame = cl.stats[STAT_WEAPONFRAME]; + view->render.colormap = -1; // no special coloring + view->render.alpha = ent->render.alpha; // LordHavoc: if the player is transparent, so is the gun + view->render.effects = ent->render.effects; + view->render.scale = 1; -// LordHavoc: origin view kick - VectorAdd(r_refdef.vieworg, cl.punchvector, r_refdef.vieworg); + // set up the refresh position - if (chase_active.value) - Chase_Update (); + // LordHavoc: this never looked all that good to begin with... + /* + // smooth out stair step ups + if (cl.onground && ent->render.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->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]; + */ + + // 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); + } + } } /* @@ -851,7 +808,7 @@ the entity origin, so any view position inside that will be valid */ void V_RenderView (void) { - if (con_forcedup) + if (scr_con_current >= vid.conheight) return; if (cl.intermission) @@ -887,8 +844,6 @@ 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_polyblend);