X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=collision.c;h=7ed1291eaf18c06a3ecce7840bd6c11529c0716c;hb=c0be34ed05267d2145bbbdb05c9ed67a06b4f5ac;hp=404feb6823ea6b088d7a413faf8c8f611df025e1;hpb=4e9a99de5786d5d87a148427e288c9ddfe24ee7c;p=xonotic%2Fdarkplaces.git diff --git a/collision.c b/collision.c index 404feb68..7ed1291e 100644 --- a/collision.c +++ b/collision.c @@ -33,8 +33,6 @@ static int RecursiveHullCheck (RecursiveHullCheckTraceInfo_t *t, int num, double int ret; mplane_t *plane; double t1, t2; - //double frac; - //double mid[3]; // variables that need to be stored on the stack when recursing dclipnode_t *node; @@ -170,6 +168,7 @@ loc0: // used if start and end are the same static void RecursiveHullCheckPoint (RecursiveHullCheckTraceInfo_t *t, int num) { + // If you can read this, you understand BSP trees while (num >= 0) num = t->hull->clipnodes[num].children[((t->hull->planes[t->hull->clipnodes[num].planenum].type < 3) ? (t->start[t->hull->planes[t->hull->clipnodes[num].planenum].type]) : (DotProduct(t->hull->planes[t->hull->clipnodes[num].planenum].normal, t->start))) < t->hull->planes[t->hull->clipnodes[num].planenum].dist]; @@ -377,10 +376,11 @@ void Collision_ClipTrace (trace_t *trace, const void *cent, const model_t *cmode VectorCopy(endd, rhc.end); VectorCopy(rhc.end, rhc.trace->endpos); VectorSubtract(rhc.end, rhc.start, rhc.dist); - if (DotProduct(rhc.dist, rhc.dist) > 0.00001) + if (rhc.dist[0] || rhc.dist[1] || rhc.dist[2]) RecursiveHullCheck (&rhc, rhc.hull->firstclipnode, 0, 1, rhc.start, rhc.end); else RecursiveHullCheckPoint (&rhc, rhc.hull->firstclipnode); + if (rhc.trace->fraction < 0 || rhc.trace->fraction > 1) Con_Printf("fraction out of bounds %f %s:%d\n", rhc.trace->fraction, __LINE__, __FILE__); // if we hit, unrotate endpos and normal, and store the entity we hit if (rhc.trace->fraction != 1) @@ -401,12 +401,12 @@ void Collision_ClipTrace (trace_t *trace, const void *cent, const model_t *cmode rhc.trace->plane.normal[1] = DotProduct (tempd, left); rhc.trace->plane.normal[2] = DotProduct (tempd, up); } - // fix offset - VectorAdd (rhc.trace->endpos, offset, rhc.trace->endpos); rhc.trace->ent = (void *) cent; } else if (rhc.trace->allsolid || rhc.trace->startsolid) rhc.trace->ent = (void *) cent; + // fix offset + VectorAdd (rhc.trace->endpos, offset, rhc.trace->endpos); } else { @@ -415,14 +415,15 @@ void Collision_ClipTrace (trace_t *trace, const void *cent, const model_t *cmode rhc.hull = HullForBBoxEntity (corigin, cmins, cmaxs, mins, maxs, offset); // trace a line through the generated clipping hull - VectorCopy(start, rhc.start); - VectorCopy(end, rhc.end); + VectorSubtract(start, offset, rhc.start); + VectorSubtract(end, offset, rhc.end); VectorCopy(rhc.end, rhc.trace->endpos); VectorSubtract(rhc.end, rhc.start, rhc.dist); - if (DotProduct(rhc.dist, rhc.dist) > 0.00001) + if (rhc.dist[0] || rhc.dist[1] || rhc.dist[2]) RecursiveHullCheck (&rhc, rhc.hull->firstclipnode, 0, 1, rhc.start, rhc.end); else RecursiveHullCheckPoint (&rhc, rhc.hull->firstclipnode); + if (rhc.trace->fraction < 0 || rhc.trace->fraction > 1) Con_Printf("fraction out of bounds %f %s:%d\n", rhc.trace->fraction, __LINE__, __FILE__); // if we hit, store the entity we hit if (rhc.trace->fraction != 1) @@ -435,3 +436,4 @@ void Collision_ClipTrace (trace_t *trace, const void *cent, const model_t *cmode rhc.trace->ent = (void *) cent; } } +