X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=collision.c;h=f0251fb64a6966675e66cb73f40a1b4d50a508d3;hb=55362d4d9e0a2acc1285497ec91c5b389a5c8894;hp=e0cc37dd817c1644a0dbac94750ed75ab328fcf2;hpb=ab9e8a37699390a5dc199e4def9cdbaaa59d82cf;p=xonotic%2Fdarkplaces.git diff --git a/collision.c b/collision.c index e0cc37dd..f0251fb6 100644 --- a/collision.c +++ b/collision.c @@ -53,7 +53,7 @@ void Collision_Init (void) -void Collision_PrintBrushAsQHull(colbrushf_t *brush, const char *name) +static void Collision_PrintBrushAsQHull(colbrushf_t *brush, const char *name) { int i; Con_Printf("3 %s\n%i\n", name, brush->numpoints); @@ -65,7 +65,7 @@ void Collision_PrintBrushAsQHull(colbrushf_t *brush, const char *name) Con_Printf("%f %f %f %f\n", brush->planes[i].normal[0], brush->planes[i].normal[1], brush->planes[i].normal[2], brush->planes[i].dist); } -void Collision_ValidateBrush(colbrushf_t *brush) +static void Collision_ValidateBrush(colbrushf_t *brush) { int j, k, pointsoffplanes, pointonplanes, pointswithinsufficientplanes, printbrush; float d; @@ -124,7 +124,7 @@ void Collision_ValidateBrush(colbrushf_t *brush) Collision_PrintBrushAsQHull(brush, "unnamed"); } -float nearestplanedist_float(const float *normal, const colpointf_t *points, int numpoints) +static float nearestplanedist_float(const float *normal, const colpointf_t *points, int numpoints) { float dist, bestdist; if (!numpoints) @@ -140,7 +140,7 @@ float nearestplanedist_float(const float *normal, const colpointf_t *points, int return bestdist; } -float furthestplanedist_float(const float *normal, const colpointf_t *points, int numpoints) +static float furthestplanedist_float(const float *normal, const colpointf_t *points, int numpoints) { float dist, bestdist; if (!numpoints) @@ -156,7 +156,7 @@ float furthestplanedist_float(const float *normal, const colpointf_t *points, in return bestdist; } -void Collision_CalcEdgeDirsForPolygonBrushFloat(colbrushf_t *brush) +static void Collision_CalcEdgeDirsForPolygonBrushFloat(colbrushf_t *brush) { int i, j; for (i = 0, j = brush->numpoints - 1;i < brush->numpoints;j = i, i++) @@ -1032,7 +1032,7 @@ void Collision_TracePointBrushFloat(trace_t *trace, const vec3_t point, const co } } -void Collision_SnapCopyPoints(int numpoints, const colpointf_t *in, colpointf_t *out, float fractionprecision, float invfractionprecision) +static void Collision_SnapCopyPoints(int numpoints, const colpointf_t *in, colpointf_t *out, float fractionprecision, float invfractionprecision) { int i; for (i = 0;i < numpoints;i++) @@ -1247,28 +1247,6 @@ void Collision_BrushForBox(colboxbrushf_t *boxbrush, const vec3_t mins, const ve //Collision_ValidateBrush(&boxbrush->brush); } -void Collision_ClipTrace_BrushBox(trace_t *trace, const vec3_t cmins, const vec3_t cmaxs, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int hitsupercontentsmask, int supercontents, int q3surfaceflags, texture_t *texture) -{ - colboxbrushf_t boxbrush, thisbrush_start, thisbrush_end; - vec3_t startmins, startmaxs, endmins, endmaxs; - - // create brushes for the collision - VectorAdd(start, mins, startmins); - VectorAdd(start, maxs, startmaxs); - VectorAdd(end, mins, endmins); - VectorAdd(end, maxs, endmaxs); - Collision_BrushForBox(&boxbrush, cmins, cmaxs, supercontents, q3surfaceflags, texture); - Collision_BrushForBox(&thisbrush_start, startmins, startmaxs, 0, 0, NULL); - Collision_BrushForBox(&thisbrush_end, endmins, endmaxs, 0, 0, NULL); - - memset(trace, 0, sizeof(trace_t)); - trace->hitsupercontentsmask = hitsupercontentsmask; - trace->fraction = 1; - trace->realfraction = 1; - trace->allsolid = true; - Collision_TraceBrushBrushFloat(trace, &thisbrush_start.brush, &thisbrush_end.brush, &boxbrush.brush, &boxbrush.brush); -} - //pseudocode for detecting line/sphere overlap without calculating an impact point //linesphereorigin = sphereorigin - linestart;linediff = lineend - linestart;linespherefrac = DotProduct(linesphereorigin, linediff) / DotProduct(linediff, linediff);return VectorLength2(linesphereorigin - bound(0, linespherefrac, 1) * linediff) >= sphereradius*sphereradius; @@ -1278,7 +1256,7 @@ void Collision_ClipTrace_BrushBox(trace_t *trace, const vec3_t cmins, const vec3 // all the results are correct (impactpoint, impactnormal, and fraction) float Collision_ClipTrace_Line_Sphere(double *linestart, double *lineend, double *sphereorigin, double sphereradius, double *impactpoint, double *impactnormal) { - double dir[3], scale, v[3], deviationdist, impactdist, linelength; + double dir[3], scale, v[3], deviationdist2, impactdist, linelength; // make sure the impactpoint and impactnormal are valid even if there is // no collision VectorCopy(lineend, impactpoint); @@ -1300,13 +1278,12 @@ float Collision_ClipTrace_Line_Sphere(double *linestart, double *lineend, double // of the line from the sphereorigin (deviation, how off-center it is) VectorMA(linestart, impactdist, dir, v); VectorSubtract(v, sphereorigin, v); - deviationdist = VectorLength2(v); - // if outside the radius, it's a miss for sure - // (we do this comparison using squared radius to avoid a sqrt) - if (deviationdist > sphereradius*sphereradius) + deviationdist2 = sphereradius * sphereradius - VectorLength2(v); + // if squared offset length is outside the squared sphere radius, miss + if (deviationdist2 < 0) return 1; // miss (off to the side) // nudge back to find the correct impact distance - impactdist -= sphereradius - deviationdist/sphereradius; + impactdist -= sqrt(deviationdist2); if (impactdist >= linelength) return 1; // miss (not close enough) if (impactdist < 0) @@ -1538,55 +1515,6 @@ void Collision_TraceLineTriangleFloat(trace_t *trace, const vec3_t linestart, co #endif } -typedef struct colbspnode_s -{ - mplane_t plane; - struct colbspnode_s *children[2]; - // the node is reallocated or split if max is reached - int numcolbrushf; - int maxcolbrushf; - colbrushf_t **colbrushflist; - //int numcolbrushd; - //int maxcolbrushd; - //colbrushd_t **colbrushdlist; -} -colbspnode_t; - -typedef struct colbsp_s -{ - mempool_t *mempool; - colbspnode_t *nodes; -} -colbsp_t; - -colbsp_t *Collision_CreateCollisionBSP(mempool_t *mempool) -{ - colbsp_t *bsp; - bsp = (colbsp_t *)Mem_Alloc(mempool, sizeof(colbsp_t)); - bsp->mempool = mempool; - bsp->nodes = (colbspnode_t *)Mem_Alloc(bsp->mempool, sizeof(colbspnode_t)); - return bsp; -} - -void Collision_FreeCollisionBSPNode(colbspnode_t *node) -{ - if (node->children[0]) - Collision_FreeCollisionBSPNode(node->children[0]); - if (node->children[1]) - Collision_FreeCollisionBSPNode(node->children[1]); - while (--node->numcolbrushf) - Mem_Free(node->colbrushflist[node->numcolbrushf]); - //while (--node->numcolbrushd) - // Mem_Free(node->colbrushdlist[node->numcolbrushd]); - Mem_Free(node); -} - -void Collision_FreeCollisionBSP(colbsp_t *bsp) -{ - Collision_FreeCollisionBSPNode(bsp->nodes); - Mem_Free(bsp); -} - void Collision_BoundingBoxOfBrushTraceSegment(const colbrushf_t *start, const colbrushf_t *end, vec3_t mins, vec3_t maxs, float startfrac, float endfrac) { int i; @@ -1615,7 +1543,7 @@ void Collision_BoundingBoxOfBrushTraceSegment(const colbrushf_t *start, const co //=========================================== -void Collision_TranslateBrush(const vec3_t shift, colbrushf_t *brush) +static void Collision_TranslateBrush(const vec3_t shift, colbrushf_t *brush) { int i; // now we can transform the data @@ -1631,7 +1559,7 @@ void Collision_TranslateBrush(const vec3_t shift, colbrushf_t *brush) VectorAdd(brush->maxs, shift, brush->maxs); } -void Collision_TransformBrush(const matrix4x4_t *matrix, colbrushf_t *brush) +static void Collision_TransformBrush(const matrix4x4_t *matrix, colbrushf_t *brush) { int i; vec3_t v; @@ -1733,7 +1661,7 @@ void Collision_Cache_Init(mempool_t *mempool) Collision_Cache_Reset(true); } -void Collision_Cache_RebuildHash(void) +static void Collision_Cache_RebuildHash(void) { int index; int range = collision_cachedtrace_lastused + 1;