]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_input.c
eliminated qbyte type, now uses unsigned char throughout the engine for this purpose
[xonotic/darkplaces.git] / cl_input.c
index 8c2e234335d199fcc636f58e04f480af25d0cf6b..85bfd8b0c08c4f5f3e64e4d4936b727ec3e88a07 100644 (file)
@@ -56,8 +56,6 @@ kbutton_t     in_button3, in_button4, in_button5, in_button6, in_button7, in_button8
 
 int                    in_impulse;
 
-extern cvar_t sys_ticrate;
-
 
 void KeyDown (kbutton_t *b)
 {
@@ -439,6 +437,7 @@ void CL_Move (void)
 
 #include "cl_collision.h"
 
+extern void V_CalcRefdef(void);
 void CL_UpdatePrydonCursor(void)
 {
        vec3_t temp, scale;
@@ -479,47 +478,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 +511,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 +525,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 +630,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 +672,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;
@@ -764,7 +782,7 @@ void CL_SendMove(void)
        int i;
        int bits;
        sizebuf_t buf;
-       qbyte data[128];
+       unsigned char data[128];
 #define MOVEAVERAGING 0
 #if MOVEAVERAGING
        static float forwardmove, sidemove, upmove, total; // accumulation
@@ -795,6 +813,8 @@ void CL_SendMove(void)
        upmove = cl.cmd.upmove;
 #endif
 
+       CL_UpdatePrydonCursor();
+
        buf.maxsize = 128;
        buf.cursize = 0;
        buf.data = data;
@@ -950,8 +970,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)
        {