X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=view.c;h=7b1ca6ddb1acb46da513add316c8d54e2e46ca72;hb=e3659f7d732ee4b564af752529bc6f0c3b489e8d;hp=b47112d6fa3eb69f09c683bea9c75cee066d06a2;hpb=755b0a1844bce8f240289af3870137c5e467a143;p=xonotic%2Fdarkplaces.git diff --git a/view.c b/view.c index b47112d6..7b1ca6dd 100644 --- a/view.c +++ b/view.c @@ -214,7 +214,7 @@ void V_ParseDamage (void) armor = MSG_ReadByte (); blood = MSG_ReadByte (); - MSG_ReadVector(from); + MSG_ReadVector(from, cl.protocol); count = blood*0.5 + armor*0.5; if (count < 10) @@ -248,7 +248,7 @@ void V_ParseDamage (void) } // calculate view angle kicks - if (cl.viewentity >= 0 && cl.viewentity < MAX_EDICTS && cl_entities[cl.viewentity].state_current.active) + if (cl_entities[cl.viewentity].state_current.active) { ent = &cl_entities[cl.viewentity]; Matrix4x4_Transform(&ent->render.inversematrix, from, localfrom); @@ -308,12 +308,12 @@ V_CalcRefdef ================== */ -extern float timerefreshangle; void V_CalcRefdef (void) { static float oldz; entity_t *ent; float vieworg[3], viewangles[3]; + trace_t trace; Matrix4x4_CreateIdentity(&viewmodelmatrix); Matrix4x4_CreateIdentity(&r_refdef.viewentitymatrix); if (cls.state == ca_connected && cls.signon == SIGNONS) @@ -325,6 +325,8 @@ void V_CalcRefdef (void) // entity is a fixed camera, just copy the matrix Matrix4x4_Copy(&r_refdef.viewentitymatrix, &ent->render.matrix); Matrix4x4_Copy(&viewmodelmatrix, &ent->render.matrix); + r_refdef.viewentitymatrix.m[2][3] += cl.stats[STAT_VIEWHEIGHT]; + viewmodelmatrix.m[2][3] += cl.stats[STAT_VIEWHEIGHT]; } else { @@ -334,18 +336,24 @@ void V_CalcRefdef (void) VectorCopy(cl.viewangles, viewangles); // stair smoothing + //Con_Printf("cl.onground %i oldz %f newz %f\n", cl.onground, oldz, vieworg[2]); if (cl.onground && oldz < vieworg[2]) { oldz += (cl.time - cl.oldtime) * cl_stairsmoothspeed.value; oldz = vieworg[2] = bound(vieworg[2] - 16, oldz, vieworg[2]); } + else if (cl.onground && oldz > vieworg[2]) + { + oldz -= (cl.time - cl.oldtime) * cl_stairsmoothspeed.value; + oldz = vieworg[2] = bound(vieworg[2], oldz, vieworg[2] + 16); + } else oldz = vieworg[2]; if (chase_active.value) { // observing entity from third person - vec_t camback, camup, dist, forward[3], stop[3], chase_dest[3], normal[3]; + vec_t camback, camup, dist, forward[3], chase_dest[3]; camback = bound(0, chase_back.value, 128); if (chase_back.value != camback) @@ -370,10 +378,8 @@ void V_CalcRefdef (void) chase_dest[0] = vieworg[0] + forward[0] * dist; chase_dest[1] = vieworg[1] + forward[1] * dist; chase_dest[2] = vieworg[2] + forward[2] * dist + camup; - CL_TraceLine(vieworg, chase_dest, stop, normal, true, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY); - vieworg[0] = stop[0] + forward[0] * 8 + normal[0] * 4; - vieworg[1] = stop[1] + forward[1] * 8 + normal[1] * 4; - vieworg[2] = stop[2] + forward[2] * 8 + normal[2] * 4; + trace = CL_TraceBox(vieworg, vec3_origin, vec3_origin, chase_dest, true, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, false); + VectorMAMAM(1, trace.endpos, 8, forward, 4, trace.plane.normal, vieworg); } else { @@ -382,7 +388,7 @@ void V_CalcRefdef (void) if (cl.stats[STAT_HEALTH] <= 0 && gamemode != GAME_FNIGGIUM) viewangles[ROLL] = 80; // dead view angle VectorAdd(viewangles, cl.punchangle, viewangles); - viewangles[ROLL] += V_CalcRoll(cl.viewangles, cl.velocity); + viewangles[ROLL] += V_CalcRoll(cl.viewangles, cl.movement_velocity); if (v_dmg_time > 0) { viewangles[ROLL] += v_dmg_time/v_kicktime.value*v_dmg_roll; @@ -391,7 +397,7 @@ void V_CalcRefdef (void) } // origin VectorAdd(vieworg, cl.punchvector, vieworg); - vieworg[2] += cl.viewheight; + vieworg[2] += cl.stats[STAT_VIEWHEIGHT]; if (cl.stats[STAT_HEALTH] > 0 && cl_bob.value && cl_bobcycle.value) { double bob, cycle; @@ -407,7 +413,7 @@ void V_CalcRefdef (void) 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 = sqrt(cl.movement_velocity[0]*cl.movement_velocity[0] + cl.movement_velocity[1]*cl.movement_velocity[1]) * cl_bob.value; bob = bob*0.3 + bob*0.7*cycle; vieworg[2] += bound(-7, bob, 4); } @@ -443,61 +449,71 @@ void V_CalcViewBlend(void) r_refdef.viewblend[1] = 0; r_refdef.viewblend[2] = 0; r_refdef.viewblend[3] = 0; + r_refdef.fovscale_x = cl.viewzoom; + r_refdef.fovscale_y = cl.viewzoom; if (cls.state == ca_connected && cls.signon == SIGNONS && gl_polyblend.value > 0) { // set contents color - switch (CL_PointQ1Contents(r_vieworigin)) + int supercontents; + vec3_t vieworigin; + Matrix4x4_OriginFromMatrix(&r_refdef.viewentitymatrix, vieworigin); + supercontents = CL_PointSuperContents(vieworigin); + if (supercontents & SUPERCONTENTS_LIQUIDSMASK) + { + r_refdef.fovscale_x *= 1 - (((sin(cl.time * 4.7) + 1) * 0.015) * r_waterwarp.value); + r_refdef.fovscale_y *= 1 - (((sin(cl.time * 3.0) + 1) * 0.015) * r_waterwarp.value); + if (supercontents & SUPERCONTENTS_LAVA) + { + cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 255; + cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 80; + cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 0; + } + else if (supercontents & SUPERCONTENTS_SLIME) + { + cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 0; + cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 25; + cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 5; + } + else + { + 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 = 150 >> 1; + } + else { - case CONTENTS_EMPTY: - case CONTENTS_SOLID: cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 0; cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 0; cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 0; cl.cshifts[CSHIFT_CONTENTS].percent = 0; - break; - case CONTENTS_LAVA: - cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 255; - cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 80; - cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 0; - cl.cshifts[CSHIFT_CONTENTS].percent = 150 >> 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 (gamemode != GAME_TRANSFUSION) { - if (cl.items & IT_QUAD) + if (cl.stats[STAT_ITEMS] & IT_QUAD) { 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) + else if (cl.stats[STAT_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) + else if (cl.stats[STAT_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) + else if (cl.stats[STAT_ITEMS] & IT_INVULNERABILITY) { cl.cshifts[CSHIFT_POWERUP].destcolor[0] = 255; cl.cshifts[CSHIFT_POWERUP].destcolor[1] = 255;