void PM_StepSlideMove (void) { vec3_t start_o, start_v; vec3_t down_o, down_v; trace_t trace; float down_dist, up_dist; vec3_t up, down; VectorCopy (pml.origin, start_o); VectorCopy (pml.velocity, start_v); PM_StepSlideMove_ (); VectorCopy (pml.origin, down_o); VectorCopy (pml.velocity, down_v); VectorCopy (start_o, up); up[2] += STEPSIZE; trace = pm->trace (up, pm->mins, pm->maxs, up); if (trace.allsolid) return; /* can't step up */ /* try sliding above */ VectorCopy (up, pml.origin); VectorCopy (start_v, pml.velocity); PM_StepSlideMove_ (); /* push down the final amount */ VectorCopy (pml.origin, down); down[2] -= STEPSIZE; trace = pm->trace (pml.origin, pm->mins, pm->maxs, down); if (!trace.allsolid) { VectorCopy (trace.endpos, pml.origin); } VectorCopy(pml.origin, up); /* decide which one went farther */ down_dist = (down_o[0] - start_o[0])*(down_o[0] - start_o[0]) + (down_o[1] - start_o[1])*(down_o[1] - start_o[1]); up_dist = (up[0] - start_o[0])*(up[0] - start_o[0]) + (up[1] - start_o[1])*(up[1] - start_o[1]); if (down_dist > up_dist || trace.plane.normal[2] < MIN_STEP_NORMAL) { VectorCopy (down_o, pml.origin); VectorCopy (down_v, pml.velocity); return; } pml.velocity[2] = down_v[2]; }
/* ================== PM_StepSlideMove ================== */ static void PM_StepSlideMove (void) { vec3_t start_o, start_v; vec3_t down_o, down_v; trace_t trace; float down_dist, up_dist; vec3_t up, down; VectorCopy (pml.origin, start_o); VectorCopy (pml.velocity, start_v); PM_StepSlideMove_ (); VectorCopy (pml.origin, down_o); VectorCopy (pml.velocity, down_v); VectorCopy (start_o, up); up[2] += STEPSIZE; trace = pm->trace (up, pm->mins, pm->maxs, up); if (trace.allsolid) return; // can't step up // try sliding above VectorCopy (up, pml.origin); VectorCopy (start_v, pml.velocity); PM_StepSlideMove_ (); // push down the final amount VectorCopy (pml.origin, down); down[2] -= STEPSIZE; trace = pm->trace (pml.origin, pm->mins, pm->maxs, down); if (!trace.allsolid) { VectorCopy (trace.endpos, pml.origin); } VectorCopy(pml.origin, up); // decide which one went farther down_dist = (down_o[0] - start_o[0])*(down_o[0] - start_o[0]) + (down_o[1] - start_o[1])*(down_o[1] - start_o[1]); up_dist = (up[0] - start_o[0])*(up[0] - start_o[0]) + (up[1] - start_o[1])*(up[1] - start_o[1]); if (down_dist > up_dist || trace.plane.normal[2] < MIN_STEP_NORMAL) { VectorCopy (down_o, pml.origin); VectorCopy (down_v, pml.velocity); return; } //!! Special case // if we were walking along a plane, then we need to copy the Z over pml.velocity[2] = down_v[2]; }