X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=view.c;h=dfcba088a3cde3e24de45d60adf9123e2af8c167;hb=fef5ffefbcd0ecc4e5840e2f9d30139ecc131fa2;hp=73acc74efdb06f04cc2e5647136ad61ed7b482c6;hpb=00141603df070f44751efaf4afbf9c8cfc7e2e74;p=xonotic%2Fdarkplaces.git diff --git a/view.c b/view.c index 73acc74e..dfcba088 100644 --- a/view.c +++ b/view.c @@ -155,7 +155,7 @@ void V_DriftPitch (void) if ( fabs(cl.cmd.forwardmove) < cl_forwardspeed.value) cl.driftmove = 0; else - cl.driftmove += cl.frametime; + cl.driftmove += cl.realframetime; if ( cl.driftmove > v_centermove.value) { @@ -172,8 +172,8 @@ void V_DriftPitch (void) return; } - move = cl.frametime * cl.pitchvel; - cl.pitchvel += cl.frametime * v_centerspeed.value; + move = cl.realframetime * cl.pitchvel; + cl.pitchvel += cl.realframetime * v_centerspeed.value; if (delta > 0) { @@ -276,10 +276,10 @@ V_cshift_f */ static void V_cshift_f (void) { - 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)); + v_cshift.destcolor[0] = atof(Cmd_Argv(1)); + v_cshift.destcolor[1] = atof(Cmd_Argv(2)); + v_cshift.destcolor[2] = atof(Cmd_Argv(3)); + v_cshift.percent = atof(Cmd_Argv(4)); } @@ -327,30 +327,44 @@ void V_CalcRefdef (void) return; VectorClear(gunorg); viewmodelmatrix = identitymatrix; - r_refdef.viewentitymatrix = identitymatrix; + r_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); + // interpolate the angles if playing a demo or spectating someone + if (cls.demoplayback || cl.fixangle[0]) + { + int i; + float frac = bound(0, (cl.time - cl.mtime[1]) / (cl.mtime[0] - cl.mtime[1]), 1); + for (i = 0;i < 3;i++) + { + float d = cl.mviewangles[0][i] - cl.mviewangles[1][i]; + if (d > 180) + d -= 360; + else if (d < -180) + d += 360; + viewangles[i] = cl.mviewangles[1][i] + frac * d; + } + } if (cl.intermission) { // entity is a fixed camera, just copy the matrix if (cls.protocol == PROTOCOL_QUAKEWORLD) - Matrix4x4_CreateFromQuakeEntity(&r_refdef.viewentitymatrix, 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); + Matrix4x4_CreateFromQuakeEntity(&r_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.viewentitymatrix = ent->render.matrix; - r_refdef.viewentitymatrix.m[2][3] += cl.stats[STAT_VIEWHEIGHT]; + r_view.matrix = ent->render.matrix; + r_view.matrix.m[2][3] += cl.stats[STAT_VIEWHEIGHT]; } - viewmodelmatrix = r_refdef.viewentitymatrix; + viewmodelmatrix = r_view.matrix; } else { - // 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); - // apply qw weapon recoil effect (this did not work in QW) // TODO: add a cvar to disable this viewangles[PITCH] += cl.qw_weaponkick; @@ -421,7 +435,7 @@ void V_CalcRefdef (void) { viewangles[ROLL] += v_dmg_time/v_kicktime.value*v_dmg_roll; viewangles[PITCH] += v_dmg_time/v_kicktime.value*v_dmg_pitch; - v_dmg_time -= cl.frametime; + v_dmg_time -= cl.realframetime; } // origin VectorAdd(vieworg, cl.punchvector, vieworg); @@ -497,9 +511,9 @@ void V_CalcRefdef (void) } // calculate a view matrix for rendering the scene if (v_idlescale.value) - Matrix4x4_CreateFromQuakeEntity(&r_refdef.viewentitymatrix, 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); + Matrix4x4_CreateFromQuakeEntity(&r_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.viewentitymatrix, 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); + Matrix4x4_CreateFromQuakeEntity(&r_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], viewangles[0], viewangles[1], viewangles[2], 0.3); VectorCopy(vieworg, csqc_origin); @@ -535,7 +549,7 @@ void V_CalcViewBlend(void) // set contents color int supercontents; vec3_t vieworigin; - Matrix4x4_OriginFromMatrix(&r_refdef.viewentitymatrix, vieworigin); + Matrix4x4_OriginFromMatrix(&r_view.matrix, vieworigin); supercontents = CL_PointSuperContents(vieworigin); if (supercontents & SUPERCONTENTS_LIQUIDSMASK) { @@ -559,7 +573,7 @@ void V_CalcViewBlend(void) cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 80; cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 50; } - cl.cshifts[CSHIFT_CONTENTS].percent = 150 >> 1; + cl.cshifts[CSHIFT_CONTENTS].percent = 150 * 0.5; } else {