]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - collision.c
made darkplaces compile successfully with g++ to test for errors C doesn't care about...
[xonotic/darkplaces.git] / collision.c
index 4dc31a9d2b609b845471f1043531ff2b61ea90c5..be5fd1ba01339775dd3a27b5dadc0c3fcc7e43df 100644 (file)
@@ -322,14 +322,14 @@ colbrushf_t *Collision_NewBrushFromPlanes(mempool_t *mempool, int numoriginalpla
 colbrushf_t *Collision_AllocBrushFloat(mempool_t *mempool, int numpoints, int numplanes, int numtriangles, int supercontents)
 {
        colbrushf_t *brush;
-       brush = Mem_Alloc(mempool, sizeof(colbrushf_t) + sizeof(colpointf_t) * numpoints + sizeof(colplanef_t) * numplanes + sizeof(int[3]) * numtriangles);
+       brush = (colbrushf_t *)Mem_Alloc(mempool, sizeof(colbrushf_t) + sizeof(colpointf_t) * numpoints + sizeof(colplanef_t) * numplanes + sizeof(int[3]) * numtriangles);
        brush->supercontents = supercontents;
        brush->numplanes = numplanes;
        brush->numpoints = numpoints;
        brush->numtriangles = numtriangles;
-       brush->planes = (void *)(brush + 1);
-       brush->points = (void *)(brush->planes + brush->numplanes);
-       brush->elements = (void *)(brush->points + brush->numpoints);
+       brush->planes = (colplanef_t *)(brush + 1);
+       brush->points = (colpointf_t *)(brush->planes + brush->numplanes);
+       brush->elements = (int *)(brush->points + brush->numpoints);
        return brush;
 }
 
@@ -505,11 +505,11 @@ void Collision_CalcPlanesForPolygonBrushFloat(colbrushf_t *brush)
 colbrushf_t *Collision_AllocBrushFromPermanentPolygonFloat(mempool_t *mempool, int numpoints, float *points, int supercontents)
 {
        colbrushf_t *brush;
-       brush = Mem_Alloc(mempool, sizeof(colbrushf_t) + sizeof(colplanef_t) * (numpoints + 2));
+       brush = (colbrushf_t *)Mem_Alloc(mempool, sizeof(colbrushf_t) + sizeof(colplanef_t) * (numpoints + 2));
        brush->supercontents = supercontents;
        brush->numpoints = numpoints;
        brush->numplanes = numpoints + 2;
-       brush->planes = (void *)(brush + 1);
+       brush->planes = (colplanef_t *)(brush + 1);
        brush->points = (colpointf_t *)points;
        Sys_Error("Collision_AllocBrushFromPermanentPolygonFloat: FIXME: this code needs to be updated to generate a mesh...\n");
        return brush;
@@ -522,6 +522,7 @@ void Collision_TraceBrushBrushFloat(trace_t *trace, const colbrushf_t *thisbrush
        float enterfrac, leavefrac, d1, d2, f, imove, newimpactnormal[3], enterfrac2;
        const colplanef_t *startplane, *endplane;
 
+       VectorClear(newimpactnormal);
        enterfrac = -1;
        enterfrac2 = -1;
        leavefrac = 1;
@@ -662,6 +663,7 @@ void Collision_TraceLineBrushFloat(trace_t *trace, const vec3_t linestart, const
        float enterfrac, leavefrac, d1, d2, f, imove, newimpactnormal[3], enterfrac2;
        const colplanef_t *startplane, *endplane;
 
+       VectorClear(newimpactnormal);
        enterfrac = -1;
        enterfrac2 = -1;
        leavefrac = 1;
@@ -1054,7 +1056,10 @@ void Collision_ClipTrace_BrushBox(trace_t *trace, const vec3_t cmins, const vec3
        Collision_TraceBrushBrushFloat(trace, thisbrush_start, thisbrush_end, boxbrush, boxbrush);
 }
 
-// LordHavoc: currently unused and not yet tested
+//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;
+
+// LordHavoc: currently unused, but tested
 // note: this can be used for tracing a moving sphere vs a stationary sphere,
 // by simply adding the moving sphere's radius to the sphereradius parameter,
 // all the results are correct (impactpoint, impactnormal, and fraction)
@@ -1063,35 +1068,26 @@ float Collision_ClipTrace_Line_Sphere(double *linestart, double *lineend, double
        double dir[3], scale, v[3], deviationdist, impactdist, linelength;
        // make sure the impactpoint and impactnormal are valid even if there is
        // no collision
-       impactpoint[0] = lineend[0];
-       impactpoint[1] = lineend[1];
-       impactpoint[2] = lineend[2];
-       impactnormal[0] = 0;
-       impactnormal[1] = 0;
-       impactnormal[2] = 0;
+       VectorCopy(lineend, impactpoint);
+       VectorClear(impactnormal);
        // calculate line direction
-       dir[0] = lineend[0] - linestart[0];
-       dir[1] = lineend[1] - linestart[1];
-       dir[2] = lineend[2] - linestart[2];
+       VectorSubtract(lineend, linestart, dir);
        // normalize direction
-       linelength = sqrt(dir[0] * dir[0] + dir[1] * dir[1] + dir[2] * dir[2]);
+       linelength = VectorLength(dir);
        if (linelength)
        {
                scale = 1.0 / linelength;
-               dir[0] *= scale;
-               dir[1] *= scale;
-               dir[2] *= scale;
+               VectorScale(dir, scale, dir);
        }
        // this dotproduct calculates the distance along the line at which the
        // sphere origin is (nearest point to the sphere origin on the line)
-       impactdist = dir[0] * (sphereorigin[0] - linestart[0]) + dir[1] * (sphereorigin[1] - linestart[1]) + dir[2] * (sphereorigin[2] - linestart[2]);
+       impactdist = DotProduct(sphereorigin, dir) - DotProduct(linestart, dir);
        // calculate point on line at that distance, and subtract the
        // sphereorigin from it, so we have a vector to measure for the distance
        // of the line from the sphereorigin (deviation, how off-center it is)
-       v[0] = linestart[0] + impactdist * dir[0] - sphereorigin[0];
-       v[1] = linestart[1] + impactdist * dir[1] - sphereorigin[1];
-       v[2] = linestart[2] + impactdist * dir[2] - sphereorigin[2];
-       deviationdist = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
+       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)
@@ -1103,22 +1099,11 @@ float Collision_ClipTrace_Line_Sphere(double *linestart, double *lineend, double
        if (impactdist < 0)
                return 1; // miss (linestart is past or inside sphere)
        // calculate new impactpoint
-       impactpoint[0] = linestart[0] + impactdist * dir[0];
-       impactpoint[1] = linestart[1] + impactdist * dir[1];
-       impactpoint[2] = linestart[2] + impactdist * dir[2];
+       VectorMA(linestart, impactdist, dir, impactpoint);
        // calculate impactnormal (surface normal at point of impact)
-       impactnormal[0] = impactpoint[0] - sphereorigin[0];
-       impactnormal[1] = impactpoint[1] - sphereorigin[1];
-       impactnormal[2] = impactpoint[2] - sphereorigin[2];
+       VectorSubtract(impactpoint, sphereorigin, impactnormal);
        // normalize impactnormal
-       scale = impactnormal[0] * impactnormal[0] + impactnormal[1] * impactnormal[1] + impactnormal[2] * impactnormal[2];
-       if (scale)
-       {
-               scale = 1.0 / sqrt(scale);
-               impactnormal[0] *= scale;
-               impactnormal[1] *= scale;
-               impactnormal[2] *= scale;
-       }
+       VectorNormalize(impactnormal);
        // return fraction of movement distance
        return impactdist / linelength;
 }
@@ -1354,9 +1339,9 @@ colbsp_t;
 colbsp_t *Collision_CreateCollisionBSP(mempool_t *mempool)
 {
        colbsp_t *bsp;
-       bsp = Mem_Alloc(mempool, sizeof(colbsp_t));
+       bsp = (colbsp_t *)Mem_Alloc(mempool, sizeof(colbsp_t));
        bsp->mempool = mempool;
-       bsp->nodes = Mem_Alloc(bsp->mempool, sizeof(colbspnode_t));
+       bsp->nodes = (colbspnode_t *)Mem_Alloc(bsp->mempool, sizeof(colbspnode_t));
        return bsp;
 }