Annotation of quake2/client/cl_pred.c, revision 1.1.1.2

1.1       root        1: 
                      2: #include "client.h"
                      3: 
                      4: 
                      5: /*
                      6: ===================
                      7: CL_CheckPredictionError
                      8: ===================
                      9: */
                     10: void CL_CheckPredictionError (void)
                     11: {
                     12:        int             frame;
                     13:        int             delta[3];
                     14:        int             i;
                     15:        int             len;
                     16: 
                     17:        if (!cl_predict->value || (cl.frame.playerstate.pmove.pm_flags & PMF_NO_PREDICTION))
                     18:                return;
                     19: 
                     20:        // calculate the last usercmd_t we sent that the server has processed
                     21:        frame = cls.netchan.incoming_acknowledged;
                     22:        frame &= (CMD_BACKUP-1);
                     23: 
                     24:        // compare what the server returned with what we had predicted it to be
                     25:        VectorSubtract (cl.frame.playerstate.pmove.origin, cl.predicted_origins[frame], delta);
                     26: 
                     27:        // save the prediction error for interpolation
                     28:        len = abs(delta[0]) + abs(delta[1]) + abs(delta[2]);
                     29:        if (len > 640)  // 80 world units
                     30:        {       // a teleport or something
                     31:                VectorClear (cl.prediction_error);
                     32:        }
                     33:        else
                     34:        {
                     35:                if (cl_showmiss->value && (delta[0] || delta[1] || delta[2]) )
                     36:                        Com_Printf ("prediction miss on %i: %i\n", cl.frame.serverframe, 
                     37:                        delta[0] + delta[1] + delta[2]);
                     38: 
                     39:                VectorCopy (cl.frame.playerstate.pmove.origin, cl.predicted_origins[frame]);
                     40: 
                     41:                // save for error itnerpolation
                     42:                for (i=0 ; i<3 ; i++)
                     43:                        cl.prediction_error[i] = delta[i]*0.125;
                     44:        }
                     45: }
                     46: 
                     47: 
                     48: /*
                     49: ====================
                     50: CL_ClipMoveToEntities
                     51: 
                     52: ====================
                     53: */
                     54: void CL_ClipMoveToEntities ( vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, trace_t *tr )
                     55: {
                     56:        int                     i, x, zd, zu;
                     57:        trace_t         trace;
                     58:        int                     headnode;
                     59:        float           *angles;
                     60:        entity_state_t  *ent;
                     61:        int                     num;
                     62:        cmodel_t                *cmodel;
                     63:        vec3_t          bmins, bmaxs;
                     64: 
                     65:        for (i=0 ; i<cl.frame.num_entities ; i++)
                     66:        {
                     67:                num = (cl.frame.parse_entities + i)&(MAX_PARSE_ENTITIES-1);
                     68:                ent = &cl_parse_entities[num];
                     69: 
                     70:                if (!ent->solid)
                     71:                        continue;
                     72: 
                     73:                if (ent->number == cl.playernum+1)
                     74:                        continue;
                     75: 
                     76:                if (ent->solid == 31)
                     77:                {       // special value for bmodel
                     78:                        cmodel = cl.model_clip[ent->modelindex];
                     79:                        if (!cmodel)
                     80:                                continue;
                     81:                        headnode = cmodel->headnode;
                     82:                        angles = ent->angles;
                     83:                }
                     84:                else
                     85:                {       // encoded bbox
                     86:                        x = 8*(ent->solid & 31);
                     87:                        zd = 8*((ent->solid>>5) & 31);
                     88:                        zu = 8*((ent->solid>>10) & 63) - 32;
                     89: 
                     90:                        bmins[0] = bmins[1] = -x;
                     91:                        bmaxs[0] = bmaxs[1] = x;
                     92:                        bmins[2] = -zd;
                     93:                        bmaxs[2] = zu;
                     94: 
                     95:                        headnode = CM_HeadnodeForBox (bmins, bmaxs);
                     96:                        angles = vec3_origin;   // boxes don't rotate
                     97:                }
                     98: 
                     99:                if (tr->allsolid)
                    100:                        return;
                    101: 
                    102:                trace = CM_TransformedBoxTrace (start, end,
                    103:                        mins, maxs, headnode,  MASK_PLAYERSOLID,
                    104:                        ent->origin, angles);
                    105: 
                    106:                if (trace.allsolid || trace.startsolid ||
                    107:                trace.fraction < tr->fraction)
                    108:                {
                    109:                        trace.ent = (struct edict_s *)ent;
                    110:                        if (tr->startsolid)
                    111:                        {
                    112:                                *tr = trace;
                    113:                                tr->startsolid = true;
                    114:                        }
                    115:                        else
                    116:                                *tr = trace;
                    117:                }
                    118:                else if (trace.startsolid)
                    119:                        tr->startsolid = true;
                    120:        }
                    121: }
                    122: 
                    123: 
                    124: /*
                    125: ================
                    126: CL_PMTrace
                    127: ================
                    128: */
                    129: trace_t                CL_PMTrace (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end)
                    130: {
                    131:        trace_t t;
                    132: 
                    133:        // check against world
                    134:        t = CM_BoxTrace (start, end, mins, maxs, 0, MASK_PLAYERSOLID);
                    135:        if (t.fraction < 1.0)
                    136:                t.ent = (struct edict_s *)1;
                    137: 
                    138:        // check all other solid models
                    139:        CL_ClipMoveToEntities (start, mins, maxs, end, &t);
                    140: 
                    141:        return t;
                    142: }
                    143: 
                    144: int            CL_PMpointcontents (vec3_t point)
                    145: {
                    146:        int                     i;
                    147:        entity_state_t  *ent;
                    148:        int                     num;
                    149:        cmodel_t                *cmodel;
                    150:        int                     contents;
                    151: 
                    152:        contents = CM_PointContents (point, 0);
                    153: 
                    154:        for (i=0 ; i<cl.frame.num_entities ; i++)
                    155:        {
                    156:                num = (cl.frame.parse_entities + i)&(MAX_PARSE_ENTITIES-1);
                    157:                ent = &cl_parse_entities[num];
                    158: 
                    159:                if (ent->solid != 31) // special value for bmodel
                    160:                        continue;
                    161: 
                    162:                cmodel = cl.model_clip[ent->modelindex];
                    163:                if (!cmodel)
                    164:                        continue;
                    165: 
                    166:                contents |= CM_TransformedPointContents (point, cmodel->headnode, ent->origin, ent->angles);
                    167:        }
                    168: 
                    169:        return contents;
                    170: }
                    171: 
                    172: 
                    173: /*
                    174: =================
                    175: CL_PredictMovement
                    176: 
                    177: Sets cl.predicted_origin and cl.predicted_angles
                    178: =================
                    179: */
                    180: void CL_PredictMovement (void)
                    181: {
                    182:        int                     ack, current;
                    183:        int                     frame;
                    184:        int                     oldframe;
                    185:        usercmd_t       *cmd;
                    186:        pmove_t         pm;
                    187:        int                     i;
                    188:        int                     step;
                    189:        int                     oldz;
                    190: 
                    191:        if (cls.state != ca_active)
                    192:                return;
                    193: 
                    194:        if (cl_paused->value)
                    195:                return;
                    196: 
                    197:        if (!cl_predict->value || (cl.frame.playerstate.pmove.pm_flags & PMF_NO_PREDICTION))
                    198:        {       // just set angles
                    199:                for (i=0 ; i<3 ; i++)
                    200:                {
                    201:                        cl.predicted_angles[i] = cl.viewangles[i] + SHORT2ANGLE(cl.frame.playerstate.pmove.delta_angles[i]);
                    202:                }
                    203:                return;
                    204:        }
                    205: 
                    206:        ack = cls.netchan.incoming_acknowledged;
                    207:        current = cls.netchan.outgoing_sequence;
                    208: 
                    209:        // if we are too far out of date, just freeze
                    210:        if (current - ack >= CMD_BACKUP)
                    211:        {
                    212:                if (cl_showmiss->value)
                    213:                        Com_Printf ("exceeded CMD_BACKUP\n");
                    214:                return; 
                    215:        }
                    216: 
                    217:        // copy current state to pmove
                    218:        memset (&pm, 0, sizeof(pm));
                    219:        pm.trace = CL_PMTrace;
                    220:        pm.pointcontents = CL_PMpointcontents;
                    221: 
1.1.1.2 ! root      222:        pm_airaccelerate = atof(cl.configstrings[CS_AIRACCEL]);
        !           223: 
1.1       root      224:        pm.s = cl.frame.playerstate.pmove;
                    225: 
                    226: //     SCR_DebugGraph (current - ack - 1, 0);
                    227: 
                    228:        frame = 0;
                    229: 
                    230:        // run frames
                    231:        while (++ack < current)
                    232:        {
                    233:                frame = ack & (CMD_BACKUP-1);
                    234:                cmd = &cl.cmds[frame];
                    235: 
                    236:                pm.cmd = *cmd;
                    237:                Pmove (&pm);
                    238: 
                    239:                // save for debug checking
                    240:                VectorCopy (pm.s.origin, cl.predicted_origins[frame]);
                    241:        }
                    242: 
                    243:        oldframe = (ack-2) & (CMD_BACKUP-1);
                    244:        oldz = cl.predicted_origins[oldframe][2];
                    245:        step = pm.s.origin[2] - oldz;
                    246:        if (step > 63 && step < 160 && (pm.s.pm_flags & PMF_ON_GROUND) )
                    247:        {
                    248:                cl.predicted_step = step * 0.125;
                    249:                cl.predicted_step_time = cls.realtime - cls.frametime * 500;
                    250:        }
                    251: 
                    252: 
                    253:        // copy results out for rendering
                    254:        cl.predicted_origin[0] = pm.s.origin[0]*0.125;
                    255:        cl.predicted_origin[1] = pm.s.origin[1]*0.125;
                    256:        cl.predicted_origin[2] = pm.s.origin[2]*0.125;
                    257: 
                    258:        VectorCopy (pm.viewangles, cl.predicted_angles);
                    259: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.