X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=view.c;h=ae3c45f2aba532d3b2db2566fde9b6587ce1a6e6;hb=5f31c863165197cd0ad4817d9db91d03133a6c55;hp=5eddbe637856bd74ee2eca45eafca7e5d7a6a8d5;hpb=e4b3858e7aca0ead91be1d8f675db084d025abad;p=xonotic%2Fdarkplaces.git diff --git a/view.c b/view.c index 5eddbe63..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,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) @@ -312,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, NULL); + AngleVectors (ent->render.angles, forward, right, NULL); side = DotProduct (from, right); v_dmg_roll = count*side*v_kickroll.value; @@ -513,7 +508,7 @@ void V_UpdateBlends (void) V_CalcPowerupCshift (); new = false; - + for (i=0 ; i 180) a -= 360; return a; @@ -597,7 +592,7 @@ void CalcGunAngle (void) if (oldyaw - move > yaw) yaw = oldyaw - move; } - + if (pitch > oldpitch) { if (oldpitch + move < pitch) @@ -615,12 +610,12 @@ void CalcGunAngle (void) cl.viewent.angles[YAW] = r_refdef.viewangles[YAW] + yaw; cl.viewent.angles[PITCH] = - (r_refdef.viewangles[PITCH] + pitch); */ - cl.viewent.angles[YAW] = r_refdef.viewangles[YAW]; - cl.viewent.angles[PITCH] = -r_refdef.viewangles[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; } /* @@ -634,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; } /* @@ -677,7 +672,7 @@ 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) @@ -712,9 +707,9 @@ 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; // always idle in intermission old = v_idlescale.value; @@ -729,7 +724,6 @@ V_CalcRefdef ================== */ -extern qboolean intimerefresh; void V_CalcRefdef (void) { entity_t *ent, *view; @@ -737,7 +731,7 @@ void V_CalcRefdef (void) vec3_t forward; vec3_t angles; float bob; - static float oldz = 0; +// static float oldz = 0; V_DriftPitch (); @@ -745,103 +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, NULL, NULL); + // 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); - view->model = cl.model_precache[cl.stats[STAT_WEAPON]]; - view->frame = cl.stats[STAT_WEAPONFRAME]; - view->colormap = -1; // no special coloring + V_BoundOffsets (); -// set up the refresh position - if (!intimerefresh) - if (v_punch.value) - { - VectorAdd (r_refdef.viewangles, cl.punchangle, r_refdef.viewangles); - } + // set up gun position + VectorCopy (cl.viewangles, view->render.angles); -// 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]; + CalcGunAngle (); -// LordHavoc: origin view kick - VectorAdd(r_refdef.vieworg, cl.punchvector, r_refdef.vieworg); + VectorCopy (ent->render.origin, view->render.origin); + view->render.origin[2] += cl.viewheight; - if (chase_active.value) - Chase_Update (); + 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) + { + 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); + } + } } /* @@ -858,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 (); } @@ -895,8 +886,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);