]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - collision.c
fix image loading sRGB conversion
[xonotic/darkplaces.git] / collision.c
index 9f4a416eb2e363e67d68171dba9ad917e1aea2c6..e0cc37dd817c1644a0dbac94750ed75ab328fcf2 100644 (file)
@@ -1666,23 +1666,20 @@ void Collision_TransformBrush(const matrix4x4_t *matrix, colbrushf_t *brush)
        }
 }
 
-typedef struct collision_cachedtrace_s
+typedef struct collision_cachedtrace_parameters_s
 {
-       int next;
-       int sequence;
        dp_model_t *model;
-//     const frameblend_t *frameblend;
-//     const skeleton_t *skeleton;
-       vec3_t bodymins;
-       vec3_t bodymaxs;
-       int bodysupercontents;
-       matrix4x4_t matrix;
-       matrix4x4_t inversematrix;
-       vec3_t start;
-       vec3_t mins;
-       vec3_t maxs;
        vec3_t end;
+       vec3_t start;
        int hitsupercontentsmask;
+       matrix4x4_t matrix;
+}
+collision_cachedtrace_parameters_t;
+
+typedef struct collision_cachedtrace_s
+{
+       qboolean valid;
+       collision_cachedtrace_parameters_t p;
        trace_t result;
 }
 collision_cachedtrace_t;
@@ -1693,7 +1690,13 @@ static int collision_cachedtrace_firstfree;
 static int collision_cachedtrace_lastused;
 static int collision_cachedtrace_max;
 static int collision_cachedtrace_sequence;
+static int collision_cachedtrace_hashsize;
 static int *collision_cachedtrace_hash;
+static unsigned int *collision_cachedtrace_arrayfullhashindex;
+static unsigned int *collision_cachedtrace_arrayhashindex;
+static unsigned int *collision_cachedtrace_arraynext;
+static unsigned char *collision_cachedtrace_arrayused;
+static qboolean collision_cachedtrace_rebuildhash;
 
 void Collision_Cache_Reset(qboolean resetlimits)
 {
@@ -1701,13 +1704,27 @@ void Collision_Cache_Reset(qboolean resetlimits)
                Mem_Free(collision_cachedtrace_hash);
        if (collision_cachedtrace_array)
                Mem_Free(collision_cachedtrace_array);
+       if (collision_cachedtrace_arrayfullhashindex)
+               Mem_Free(collision_cachedtrace_arrayfullhashindex);
+       if (collision_cachedtrace_arrayhashindex)
+               Mem_Free(collision_cachedtrace_arrayhashindex);
+       if (collision_cachedtrace_arraynext)
+               Mem_Free(collision_cachedtrace_arraynext);
+       if (collision_cachedtrace_arrayused)
+               Mem_Free(collision_cachedtrace_arrayused);
        if (resetlimits || !collision_cachedtrace_max)
-               collision_cachedtrace_max = 1024;
+               collision_cachedtrace_max = collision_cache.integer ? 128 : 1;
        collision_cachedtrace_firstfree = 1;
        collision_cachedtrace_lastused = 0;
-       collision_cachedtrace_array = Mem_Alloc(collision_cachedtrace_mempool, collision_cachedtrace_max * sizeof(collision_cachedtrace_t));
-       collision_cachedtrace_hash = Mem_Alloc(collision_cachedtrace_mempool, collision_cachedtrace_max * sizeof(int));
+       collision_cachedtrace_hashsize = collision_cachedtrace_max;
+       collision_cachedtrace_array = (collision_cachedtrace_t *)Mem_Alloc(collision_cachedtrace_mempool, collision_cachedtrace_max * sizeof(collision_cachedtrace_t));
+       collision_cachedtrace_hash = (int *)Mem_Alloc(collision_cachedtrace_mempool, collision_cachedtrace_hashsize * sizeof(int));
+       collision_cachedtrace_arrayfullhashindex = (unsigned int *)Mem_Alloc(collision_cachedtrace_mempool, collision_cachedtrace_max * sizeof(unsigned int));
+       collision_cachedtrace_arrayhashindex = (unsigned int *)Mem_Alloc(collision_cachedtrace_mempool, collision_cachedtrace_max * sizeof(unsigned int));
+       collision_cachedtrace_arraynext = (unsigned int *)Mem_Alloc(collision_cachedtrace_mempool, collision_cachedtrace_max * sizeof(unsigned int));
+       collision_cachedtrace_arrayused = (unsigned char *)Mem_Alloc(collision_cachedtrace_mempool, collision_cachedtrace_max * sizeof(unsigned char));
        collision_cachedtrace_sequence = 1;
+       collision_cachedtrace_rebuildhash = false;
 }
 
 void Collision_Cache_Init(mempool_t *mempool)
@@ -1716,123 +1733,210 @@ void Collision_Cache_Init(mempool_t *mempool)
        Collision_Cache_Reset(true);
 }
 
-void Collision_Cache_NewFrame(void)
+void Collision_Cache_RebuildHash(void)
 {
-       int hashindex;
        int index;
-       int *p;
-       // unlink all stale traces
-       for (hashindex = 0;hashindex < collision_cachedtrace_max;hashindex++)
+       int range = collision_cachedtrace_lastused + 1;
+       int sequence = collision_cachedtrace_sequence;
+       int firstfree = collision_cachedtrace_max;
+       int lastused = 0;
+       int *hash = collision_cachedtrace_hash;
+       unsigned int hashindex;
+       unsigned int *arrayhashindex = collision_cachedtrace_arrayhashindex;
+       unsigned int *arraynext = collision_cachedtrace_arraynext;
+       collision_cachedtrace_rebuildhash = false;
+       memset(collision_cachedtrace_hash, 0, collision_cachedtrace_hashsize * sizeof(int));
+       for (index = 1;index < range;index++)
        {
-               if (!collision_cachedtrace_hash[hashindex])
-                       continue;
-               p = &collision_cachedtrace_hash[hashindex];
-               while ((index = *p))
+               if (collision_cachedtrace_arrayused[index] == sequence)
                {
-                       if (collision_cachedtrace_array[index].sequence != collision_cachedtrace_sequence)
-                       {
-                               if (collision_cachedtrace_firstfree > index)
-                                       collision_cachedtrace_firstfree = index;
-                               *p = collision_cachedtrace_array[index].next;
-                               collision_cachedtrace_array[index].sequence = 0;
-                               //memset(&collision_cachedtrace_array[index], 0, sizeof(collision_cachedtrace_array[index]));
-                       }
-                       else
-                               p = &collision_cachedtrace_array[index].next;
+                       hashindex = arrayhashindex[index];
+                       arraynext[index] = hash[hashindex];
+                       hash[hashindex] = index;
+                       lastused = index;
+               }
+               else
+               {
+                       if (firstfree > index)
+                               firstfree = index;
+                       collision_cachedtrace_arrayused[index] = 0;
                }
        }
-       // shrink used range if possible
-       index = collision_cachedtrace_lastused;
-       while (index && collision_cachedtrace_array[index].sequence == 0)
-               index--;
-       collision_cachedtrace_lastused = index;
-       // increment sequence
-       collision_cachedtrace_sequence++;
-       // do not allow sequence to wrap to 0
-       if (collision_cachedtrace_sequence >= 1<<30)
+       collision_cachedtrace_firstfree = firstfree;
+       collision_cachedtrace_lastused = lastused;
+}
+
+void Collision_Cache_NewFrame(void)
+{
+       if (collision_cache.integer)
+       {
+               if (collision_cachedtrace_max < 128)
+                       Collision_Cache_Reset(true);
+       }
+       else
+       {
+               if (collision_cachedtrace_max > 1)
+                       Collision_Cache_Reset(true);
+       }
+       // rebuild hash if sequence would overflow byte, otherwise increment
+       if (collision_cachedtrace_sequence == 255)
+       {
+               Collision_Cache_RebuildHash();
                collision_cachedtrace_sequence = 1;
+       }
+       else
+       {
+               collision_cachedtrace_rebuildhash = true;
+               collision_cachedtrace_sequence++;
+       }
 }
 
-static collision_cachedtrace_t *Collision_Cache_Lookup(dp_model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, const matrix4x4_t *matrix, const matrix4x4_t *inversematrix, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int hitsupercontentsmask)
+static unsigned int Collision_Cache_HashIndexForArray(unsigned int *array, unsigned int size)
+{
+       unsigned int i;
+       unsigned int hashindex = 0;
+       // this is a super-cheesy checksum, designed only for speed
+       for (i = 0;i < size;i++)
+               hashindex += array[i] * (1 + i);
+       return hashindex;
+}
+
+static collision_cachedtrace_t *Collision_Cache_Lookup(dp_model_t *model, const matrix4x4_t *matrix, const matrix4x4_t *inversematrix, const vec3_t start, const vec3_t end, int hitsupercontentsmask)
 {
        int hashindex = 0;
+       unsigned int fullhashindex;
        int index = 0;
+       int range;
+       int sequence = collision_cachedtrace_sequence;
+       int *hash = collision_cachedtrace_hash;
+       unsigned int *arrayfullhashindex = collision_cachedtrace_arrayfullhashindex;
+       unsigned int *arraynext = collision_cachedtrace_arraynext;
        collision_cachedtrace_t *cached = collision_cachedtrace_array + index;
+       collision_cachedtrace_parameters_t params;
        // all non-cached traces use the same index
-       if ((frameblend && frameblend[0].lerp != 1) || (skeleton && skeleton->relativetransforms))
-               r_refdef.stats.collisioncache_animated++;
-       else if (!collision_cache.integer)
+       if (!collision_cache.integer)
                r_refdef.stats.collisioncache_traced++;
        else
        {
                // cached trace lookup
-               hashindex = (int)(((size_t)model + (size_t) + (size_t)(VectorLength2(bodymins) + VectorLength2(bodymaxs) + start[0] + start[1] + start[2] + end[0] + end[1] + end[2]) + bodysupercontents + hitsupercontentsmask) % collision_cachedtrace_max);
-               for (index = collision_cachedtrace_hash[hashindex];index;index = cached->next)
+               memset(&params, 0, sizeof(params));
+               params.model = model;
+               VectorCopy(start, params.start);
+               VectorCopy(end,   params.end);
+               params.hitsupercontentsmask = hitsupercontentsmask;
+               params.matrix = *matrix;
+               fullhashindex = Collision_Cache_HashIndexForArray((unsigned int *)&params, sizeof(params) / sizeof(unsigned int));
+               hashindex = (int)(fullhashindex % (unsigned int)collision_cachedtrace_hashsize);
+               for (index = hash[hashindex];index;index = arraynext[index])
                {
+                       if (arrayfullhashindex[index] != fullhashindex)
+                               continue;
                        cached = collision_cachedtrace_array + index;
-                       if (cached->model == model
-                        && VectorCompare(cached->bodymins, bodymins)
-                        && VectorCompare(cached->bodymaxs, bodymaxs)
-                        && cached->bodysupercontents == bodysupercontents
-                        && VectorCompare(cached->start, start)
-                        && VectorCompare(cached->mins, mins)
-                        && VectorCompare(cached->maxs, maxs)
-                        && VectorCompare(cached->end, end)
-                        && cached->hitsupercontentsmask == hitsupercontentsmask
-                        && !memcmp(&cached->matrix, matrix, sizeof(*matrix)))
-                       {
-                               r_refdef.stats.collisioncache_cached++;
-                               return cached; // found a match
-                       }
+                       //if (memcmp(&cached->p, &params, sizeof(params)))
+                       if (cached->p.model != params.model
+                        || cached->p.end[0] != params.end[0]
+                        || cached->p.end[1] != params.end[1]
+                        || cached->p.end[2] != params.end[2]
+                        || cached->p.start[0] != params.start[0]
+                        || cached->p.start[1] != params.start[1]
+                        || cached->p.start[2] != params.start[2]
+                        || cached->p.hitsupercontentsmask != params.hitsupercontentsmask
+                        || cached->p.matrix.m[0][0] != params.matrix.m[0][0]
+                        || cached->p.matrix.m[0][1] != params.matrix.m[0][1]
+                        || cached->p.matrix.m[0][2] != params.matrix.m[0][2]
+                        || cached->p.matrix.m[0][3] != params.matrix.m[0][3]
+                        || cached->p.matrix.m[1][0] != params.matrix.m[1][0]
+                        || cached->p.matrix.m[1][1] != params.matrix.m[1][1]
+                        || cached->p.matrix.m[1][2] != params.matrix.m[1][2]
+                        || cached->p.matrix.m[1][3] != params.matrix.m[1][3]
+                        || cached->p.matrix.m[2][0] != params.matrix.m[2][0]
+                        || cached->p.matrix.m[2][1] != params.matrix.m[2][1]
+                        || cached->p.matrix.m[2][2] != params.matrix.m[2][2]
+                        || cached->p.matrix.m[2][3] != params.matrix.m[2][3]
+                        || cached->p.matrix.m[3][0] != params.matrix.m[3][0]
+                        || cached->p.matrix.m[3][1] != params.matrix.m[3][1]
+                        || cached->p.matrix.m[3][2] != params.matrix.m[3][2]
+                        || cached->p.matrix.m[3][3] != params.matrix.m[3][3]
+                       )
+                               continue;
+                       // found a matching trace in the cache
+                       r_refdef.stats.collisioncache_cached++;
+                       cached->valid = true;
+                       collision_cachedtrace_arrayused[index] = collision_cachedtrace_sequence;
+                       return cached;
                }
                r_refdef.stats.collisioncache_traced++;
                // find an unused cache entry
-               for (index = collision_cachedtrace_firstfree;index <= collision_cachedtrace_lastused;index++)
-                       if (!collision_cachedtrace_array[index].sequence)
+               for (index = collision_cachedtrace_firstfree, range = collision_cachedtrace_max;index < range;index++)
+                       if (collision_cachedtrace_arrayused[index] == 0)
                                break;
-               collision_cachedtrace_firstfree = index;
-               if (index > collision_cachedtrace_lastused)
+               if (index == range)
                {
-                       // see if we need to reset the cache for growth
-                       if (collision_cachedtrace_max <= index)
+                       // all claimed, but probably some are stale...
+                       for (index = 1, range = collision_cachedtrace_max;index < range;index++)
+                               if (collision_cachedtrace_arrayused[index] != sequence)
+                                       break;
+                       if (index < range)
                        {
+                               // found a stale one, rebuild the hash
+                               Collision_Cache_RebuildHash();
+                       }
+                       else
+                       {
+                               // we need to grow the cache
                                collision_cachedtrace_max *= 2;
                                Collision_Cache_Reset(false);
-                               collision_cachedtrace_firstfree = index = 1;
+                               index = 1;
                        }
-                       collision_cachedtrace_lastused = index;
                }
                // link the new cache entry into the hash bucket
+               collision_cachedtrace_firstfree = index + 1;
+               if (collision_cachedtrace_lastused < index)
+                       collision_cachedtrace_lastused = index;
                cached = collision_cachedtrace_array + index;
-               cached->next = collision_cachedtrace_hash[hashindex];
+               collision_cachedtrace_arraynext[index] = collision_cachedtrace_hash[hashindex];
                collision_cachedtrace_hash[hashindex] = index;
-               cached->model = model;
-               VectorCopy(bodymins, cached->bodymins);
-               VectorCopy(bodymaxs, cached->bodymaxs);
-               cached->bodysupercontents = bodysupercontents;
-               VectorCopy(start, cached->start);
-               VectorCopy(mins,  cached->mins);
-               VectorCopy(maxs,  cached->maxs);
-               VectorCopy(end,   cached->end);
-               cached->hitsupercontentsmask = hitsupercontentsmask;
-               cached->matrix = *matrix;
-               cached->inversematrix = *inversematrix;
+               collision_cachedtrace_arrayhashindex[index] = hashindex;
+               cached->valid = false;
+               cached->p = params;
+               collision_cachedtrace_arrayfullhashindex[index] = fullhashindex;
+               collision_cachedtrace_arrayused[index] = collision_cachedtrace_sequence;
        }
-       cached->sequence = 0;
        return cached;
 }
 
-void Collision_ClipToGenericEntity(trace_t *trace, dp_model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int hitsupercontentsmask)
+void Collision_Cache_ClipLineToGenericEntitySurfaces(trace_t *trace, dp_model_t *model, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t start, const vec3_t end, int hitsupercontentsmask)
 {
-       float starttransformed[3], endtransformed[3];
-       collision_cachedtrace_t *cached = Collision_Cache_Lookup(model, frameblend, skeleton, bodymins, bodymaxs, bodysupercontents, matrix, inversematrix, start, mins, maxs, end, hitsupercontentsmask);
-       if (cached->sequence)
+       collision_cachedtrace_t *cached = Collision_Cache_Lookup(model, matrix, inversematrix, start, end, hitsupercontentsmask);
+       if (cached->valid)
        {
-               cached->sequence = collision_cachedtrace_sequence;
                *trace = cached->result;
                return;
        }
 
+       Collision_ClipLineToGenericEntity(trace, model, NULL, NULL, vec3_origin, vec3_origin, 0, matrix, inversematrix, start, end, hitsupercontentsmask, true);
+
+       cached->result = *trace;
+}
+
+void Collision_Cache_ClipLineToWorldSurfaces(trace_t *trace, dp_model_t *model, const vec3_t start, const vec3_t end, int hitsupercontents)
+{
+       collision_cachedtrace_t *cached = Collision_Cache_Lookup(model, &identitymatrix, &identitymatrix, start, end, hitsupercontents);
+       if (cached->valid)
+       {
+               *trace = cached->result;
+               return;
+       }
+
+       Collision_ClipLineToWorld(trace, model, start, end, hitsupercontents, true);
+
+       cached->result = *trace;
+}
+
+void Collision_ClipToGenericEntity(trace_t *trace, dp_model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int hitsupercontentsmask)
+{
+       float starttransformed[3], endtransformed[3];
+
        memset(trace, 0, sizeof(*trace));
        trace->fraction = trace->realfraction = 1;
 
@@ -1872,21 +1976,10 @@ void Collision_ClipToGenericEntity(trace_t *trace, dp_model_t *model, const fram
        // transform plane
        // NOTE: this relies on plane.dist being directly after plane.normal
        Matrix4x4_TransformPositivePlane(matrix, trace->plane.normal[0], trace->plane.normal[1], trace->plane.normal[2], trace->plane.dist, trace->plane.normal);
-
-       cached->sequence = collision_cachedtrace_sequence;
-       cached->result = *trace;
 }
 
 void Collision_ClipToWorld(trace_t *trace, dp_model_t *model, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int hitsupercontents)
 {
-       collision_cachedtrace_t *cached = Collision_Cache_Lookup(model, NULL, NULL, vec3_origin, vec3_origin, 0, &identitymatrix, &identitymatrix, start, mins, maxs, end, hitsupercontents);
-       if (cached->sequence)
-       {
-               cached->sequence = collision_cachedtrace_sequence;
-               *trace = cached->result;
-               return;
-       }
-
        memset(trace, 0, sizeof(*trace));
        trace->fraction = trace->realfraction = 1;
        // ->TraceBox: TraceBrush not needed here, as worldmodel is never rotated
@@ -1895,22 +1988,11 @@ void Collision_ClipToWorld(trace_t *trace, dp_model_t *model, const vec3_t start
        trace->fraction = bound(0, trace->fraction, 1);
        trace->realfraction = bound(0, trace->realfraction, 1);
        VectorLerp(start, trace->fraction, end, trace->endpos);
-
-       cached->sequence = collision_cachedtrace_sequence;
-       cached->result = *trace;
 }
 
 void Collision_ClipLineToGenericEntity(trace_t *trace, dp_model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t start, const vec3_t end, int hitsupercontentsmask, qboolean hitsurfaces)
 {
        float starttransformed[3], endtransformed[3];
-       collision_cachedtrace_t *cached = Collision_Cache_Lookup(model, frameblend, skeleton, bodymins, bodymaxs, bodysupercontents, matrix, inversematrix, start, vec3_origin, vec3_origin, end, hitsupercontentsmask);
-       if (cached->sequence)
-       {
-               cached->sequence = collision_cachedtrace_sequence;
-               *trace = cached->result;
-               return;
-       }
-
        memset(trace, 0, sizeof(*trace));
        trace->fraction = trace->realfraction = 1;
 
@@ -1933,21 +2015,10 @@ void Collision_ClipLineToGenericEntity(trace_t *trace, dp_model_t *model, const
        // transform plane
        // NOTE: this relies on plane.dist being directly after plane.normal
        Matrix4x4_TransformPositivePlane(matrix, trace->plane.normal[0], trace->plane.normal[1], trace->plane.normal[2], trace->plane.dist, trace->plane.normal);
-
-       cached->sequence = collision_cachedtrace_sequence;
-       cached->result = *trace;
 }
 
 void Collision_ClipLineToWorld(trace_t *trace, dp_model_t *model, const vec3_t start, const vec3_t end, int hitsupercontents, qboolean hitsurfaces)
 {
-       collision_cachedtrace_t *cached = Collision_Cache_Lookup(model, NULL, NULL, vec3_origin, vec3_origin, 0, &identitymatrix, &identitymatrix, start, vec3_origin, vec3_origin, end, hitsupercontents);
-       if (cached->sequence)
-       {
-               cached->sequence = collision_cachedtrace_sequence;
-               *trace = cached->result;
-               return;
-       }
-
        memset(trace, 0, sizeof(*trace));
        trace->fraction = trace->realfraction = 1;
        if (model && model->TraceLineAgainstSurfaces && hitsurfaces)
@@ -1957,22 +2028,11 @@ void Collision_ClipLineToWorld(trace_t *trace, dp_model_t *model, const vec3_t s
        trace->fraction = bound(0, trace->fraction, 1);
        trace->realfraction = bound(0, trace->realfraction, 1);
        VectorLerp(start, trace->fraction, end, trace->endpos);
-
-       cached->sequence = collision_cachedtrace_sequence;
-       cached->result = *trace;
 }
 
 void Collision_ClipPointToGenericEntity(trace_t *trace, dp_model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t start, int hitsupercontentsmask)
 {
        float starttransformed[3];
-       collision_cachedtrace_t *cached = Collision_Cache_Lookup(model, frameblend, skeleton, bodymins, bodymaxs, bodysupercontents, matrix, inversematrix, start, vec3_origin, vec3_origin, start, hitsupercontentsmask);
-       if (cached->sequence)
-       {
-               cached->sequence = collision_cachedtrace_sequence;
-               *trace = cached->result;
-               return;
-       }
-
        memset(trace, 0, sizeof(*trace));
        trace->fraction = trace->realfraction = 1;
 
@@ -1990,29 +2050,15 @@ void Collision_ClipPointToGenericEntity(trace_t *trace, dp_model_t *model, const
        // transform plane
        // NOTE: this relies on plane.dist being directly after plane.normal
        Matrix4x4_TransformPositivePlane(matrix, trace->plane.normal[0], trace->plane.normal[1], trace->plane.normal[2], trace->plane.dist, trace->plane.normal);
-
-       cached->sequence = collision_cachedtrace_sequence;
-       cached->result = *trace;
 }
 
 void Collision_ClipPointToWorld(trace_t *trace, dp_model_t *model, const vec3_t start, int hitsupercontents)
 {
-       collision_cachedtrace_t *cached = Collision_Cache_Lookup(model, NULL, NULL, vec3_origin, vec3_origin, 0, &identitymatrix, &identitymatrix, start, vec3_origin, vec3_origin, start, hitsupercontents);
-       if (cached->sequence)
-       {
-               cached->sequence = collision_cachedtrace_sequence;
-               *trace = cached->result;
-               return;
-       }
-
        memset(trace, 0, sizeof(*trace));
        trace->fraction = trace->realfraction = 1;
        if (model && model->TracePoint)
                model->TracePoint(model, NULL, NULL, trace, start, hitsupercontents);
        VectorCopy(start, trace->endpos);
-
-       cached->sequence = collision_cachedtrace_sequence;
-       cached->result = *trace;
 }
 
 void Collision_CombineTraces(trace_t *cliptrace, const trace_t *trace, void *touch, qboolean isbmodel)