X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=cl_input.c;h=3c8a514082b54c47c96be1f0ad30d020cf372b0a;hb=fcc0982125e36f516858c4ae3a8b6a2f0587604d;hp=8c2e234335d199fcc636f58e04f480af25d0cf6b;hpb=0d35c85d6d6372d8f95b9073f29f2e1255623ba3;p=xonotic%2Fdarkplaces.git diff --git a/cl_input.c b/cl_input.c index 8c2e2343..3c8a5140 100644 --- a/cl_input.c +++ b/cl_input.c @@ -439,6 +439,7 @@ void CL_Move (void) #include "cl_collision.h" +extern void V_CalcRefdef(void); void CL_UpdatePrydonCursor(void) { vec3_t temp, scale; @@ -479,47 +480,22 @@ void CL_UpdatePrydonCursor(void) // trace distance VectorScale(scale, 1000000, scale); - // FIXME: use something other than renderer variables here - // (but they need to match) - VectorCopy(r_vieworigin, cl.cmd.cursor_start); + // calculate current view matrix + V_CalcRefdef(); + VectorClear(temp); + Matrix4x4_Transform(&r_refdef.viewentitymatrix, temp, cl.cmd.cursor_start); VectorSet(temp, cl.cmd.cursor_screen[2] * scale[2], cl.cmd.cursor_screen[0] * scale[0], cl.cmd.cursor_screen[1] * scale[1]); - Matrix4x4_Transform(&r_view_matrix, temp, cl.cmd.cursor_end); + Matrix4x4_Transform(&r_refdef.viewentitymatrix, temp, cl.cmd.cursor_end); + // trace from view origin to the cursor cl.cmd.cursor_fraction = CL_SelectTraceLine(cl.cmd.cursor_start, cl.cmd.cursor_end, cl.cmd.cursor_impact, cl.cmd.cursor_normal, &cl.cmd.cursor_entitynumber, (chase_active.integer || cl.intermission) ? &cl_entities[cl.playerentity].render : NULL); // makes sparks where cursor is //CL_SparkShower(cl.cmd.cursor_impact, cl.cmd.cursor_normal, 5, 0); } -void CL_ClientMovement(qboolean buttonjump, qboolean buttoncrouch) +void CL_ClientMovement_Input(qboolean buttonjump, qboolean buttoncrouch) { int i; int n; - int bump; - int contents; - int crouch; - int onground; - double edgefriction; - double frametime; - double t; - vec_t wishspeed; - vec_t addspeed; - vec_t accelspeed; - vec_t f; - vec_t *playermins; - vec_t *playermaxs; - vec3_t currentorigin; - vec3_t currentvelocity; - vec3_t forward; - vec3_t right; - vec3_t up; - vec3_t wishvel; - vec3_t wishdir; - vec3_t neworigin; - vec3_t currentorigin2; - vec3_t neworigin2; - vec3_t yawangles; - trace_t trace; - trace_t trace2; - trace_t trace3; // remove stale queue items n = cl.movement_numqueue; cl.movement_numqueue = 0; @@ -537,7 +513,7 @@ void CL_ClientMovement(qboolean buttonjump, qboolean buttoncrouch) cl.movement_queue[cl.movement_numqueue++] = cl.movement_queue[i]; } // add to input queue if there is room - if (cl_movement.integer && cl.movement_numqueue < sizeof(cl.movement_queue)/sizeof(cl.movement_queue[0]) && cl.mtime[0] > cl.mtime[1]) + if (cl_movement.integer && cl.movement_numqueue < (int)(sizeof(cl.movement_queue)/sizeof(cl.movement_queue[0])) && cl.mtime[0] > cl.mtime[1]) { // add to input queue cl.movement_queue[cl.movement_numqueue].sequence = cl.movesequence; @@ -551,26 +527,66 @@ void CL_ClientMovement(qboolean buttonjump, qboolean buttoncrouch) cl.movement_queue[cl.movement_numqueue].crouch = buttoncrouch; cl.movement_numqueue++; } + cl.movement = cl_movement.integer && cl.stats[STAT_HEALTH] > 0 && !cls.demoplayback && !cl.intermission; + // clear queue if client movement is disabled + if (!cl.movement) + cl.movement_numqueue = 0; + cl.movement_replay = true; +} + +void CL_ClientMovement_Replay(void) +{ + int i; + int bump; + int contents; + int crouch; + int onground; + double edgefriction; + double frametime; + double t; + vec_t wishspeed; + vec_t addspeed; + vec_t accelspeed; + vec_t f; + vec_t *playermins; + vec_t *playermaxs; + vec3_t currentorigin; + vec3_t currentvelocity; + vec3_t forward; + vec3_t right; + vec3_t up; + vec3_t wishvel; + vec3_t wishdir; + vec3_t neworigin; + vec3_t currentorigin2; + vec3_t neworigin2; + vec3_t yawangles; + trace_t trace; + trace_t trace2; + trace_t trace3; + if (!cl.movement_replay) + return; + cl.movement_replay = false; + // fetch current starting values VectorCopy(cl_entities[cl.playerentity].state_current.origin, currentorigin); VectorCopy(cl.mvelocity[0], currentvelocity); - // check if onground - VectorSet(currentorigin2, currentorigin[0], currentorigin[1], currentorigin[2] + 1); - VectorSet(neworigin2, currentorigin[0], currentorigin[1], currentorigin[2] - 1); - trace = CL_TraceBox(currentorigin2, cl_playercrouchmins, cl_playercrouchmaxs, neworigin2, true, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_PLAYERCLIP, true); - onground = trace.fraction < 1 && trace.plane.normal[2] > 0.7; // FIXME: try minor nudges in various directions if startsolid to find a // safe place to start the walk (due to network compression in some // protocols this starts in solid) //currentorigin[2] += (1.0 / 32.0); // slight nudge to get out of the floor crouch = false; // this will be updated on first move + + // check if onground + VectorSet(currentorigin2, currentorigin[0], currentorigin[1], currentorigin[2] + 1); + VectorSet(neworigin2, currentorigin[0], currentorigin[1], currentorigin[2] - 1); + trace = CL_TraceBox(currentorigin2, cl_playercrouchmins, cl_playercrouchmaxs, neworigin2, true, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_PLAYERCLIP, true); + onground = trace.fraction < 1 && trace.plane.normal[2] > 0.7; //Con_Printf("%f: ", cl.mtime[0]); - // replay input queue, and remove any stale queue items + + // replay the input queue to predict current location // note: this relies on the fact there's always one queue item at the end - // abort if client movement is disabled - cl.movement = /*cl_movement.integer && */cl.stats[STAT_HEALTH] > 0 && !cls.demoplayback; - if (!cl.movement) - cl.movement_numqueue = 0; + for (i = 0;i < cl.movement_numqueue;i++) { client_movementqueue_t *q = cl.movement_queue + bound(0, i, cl.movement_numqueue - 1); @@ -616,6 +632,8 @@ void CL_ClientMovement(qboolean buttonjump, qboolean buttoncrouch) wishspeed = VectorLength(wishvel); if (wishspeed) VectorScale(wishvel, 1 / wishspeed, wishdir); + else + VectorSet( wishdir, 0.0, 0.0, 0.0 ); wishspeed = min(wishspeed, cl_movement_maxspeed.value); if (crouch) wishspeed *= 0.5; @@ -656,6 +674,8 @@ void CL_ClientMovement(qboolean buttonjump, qboolean buttoncrouch) wishspeed = VectorLength(wishvel); if (wishspeed) VectorScale(wishvel, 1 / wishspeed, wishdir); + else + VectorSet( wishdir, 0.0, 0.0, 0.0 ); wishspeed = min(wishspeed, cl_movement_maxspeed.value); if (crouch) wishspeed *= 0.5; @@ -795,6 +815,8 @@ void CL_SendMove(void) upmove = cl.cmd.upmove; #endif + CL_UpdatePrydonCursor(); + buf.maxsize = 128; buf.cursize = 0; buf.data = data; @@ -950,8 +972,8 @@ void CL_SendMove(void) if (!buf.cursize) return; - // FIXME: bits & 64 is +button5, Nexuiz specific - CL_ClientMovement((bits & 2) != 0, (bits & 64) != 0); + // FIXME: bits & 16 is +button5, Nexuiz specific + CL_ClientMovement_Input((bits & 2) != 0, (bits & 16) != 0); if (NetConn_SendUnreliableMessage(cls.netcon, &buf) == -1) {