]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - collision.c
added LINK_TO_ZLIB define checks, to allow direct linking
[xonotic/darkplaces.git] / collision.c
index e5b07548788bbd28ab5c1f0ca275c766accb1d65..f17c9bfdf7d5449ed3d848535cd69c4a8bb519a1 100644 (file)
@@ -15,6 +15,9 @@ cvar_t collision_endnudge = {0, "collision_endnudge", "0", "how much to bias col
 cvar_t collision_enternudge = {0, "collision_enternudge", "0", "how much to bias collision entry fraction"};
 cvar_t collision_leavenudge = {0, "collision_leavenudge", "0", "how much to bias collision exit fraction"};
 cvar_t collision_prefernudgedfraction = {0, "collision_prefernudgedfraction", "1", "whether to sort collision events by nudged fraction (1) or real fraction (0)"};
+#ifdef COLLISION_STUPID_TRACE_ENDPOS_IN_SOLID_WORKAROUND
+cvar_t collision_endposnudge = {0, "collision_endposnudge", "0", "workaround to fix trace_endpos sometimes being returned where it would be inside solid by making that collision hit (recommended: values like 1)"};
+#endif
 
 void Collision_Init (void)
 {
@@ -24,6 +27,9 @@ void Collision_Init (void)
        Cvar_RegisterVariable(&collision_enternudge);
        Cvar_RegisterVariable(&collision_leavenudge);
        Cvar_RegisterVariable(&collision_prefernudgedfraction);
+#ifdef COLLISION_STUPID_TRACE_ENDPOS_IN_SOLID_WORKAROUND
+       Cvar_RegisterVariable(&collision_endposnudge);
+#endif
 }
 
 
@@ -711,12 +717,16 @@ void Collision_TraceBrushBrushFloat(trace_t *trace, const colbrushf_t *trace_sta
                //Con_Printf("%c%i: startdist = %f, enddist = %f, startdist / (startdist - enddist) = %f\n", nplane2 != nplane ? 'b' : 'a', nplane2, startdist, enddist, startdist / (startdist - enddist));
 
                // aside from collisions, this is also used for error correction
-               if (startdist < 0 && (startdepth < startdist || startdepth == 1))
+               if (startdist < collision_impactnudge.value && nplane < numplanes1 && (startdepth < startdist || startdepth == 1))
                {
                        startdepth = startdist;
                        VectorCopy(startplane, startdepthnormal);
                }
 
+               if (startdist >= -collision_impactnudge.value && enddist >= startdist)
+                       return;
+               if (startdist <= 0 && enddist <= 0)
+                       continue;
                if (startdist > enddist)
                {
                        // moving into brush
@@ -874,12 +884,16 @@ void Collision_TraceLineBrushFloat(trace_t *trace, const vec3_t linestart, const
                //Con_Printf("%c%i: startdist = %f, enddist = %f, startdist / (startdist - enddist) = %f\n", nplane2 != nplane ? 'b' : 'a', nplane2, startdist, enddist, startdist / (startdist - enddist));
 
                // aside from collisions, this is also used for error correction
-               if (startdist < 0 && (startdepth < startdist || startdepth == 1))
+               if (startdist < collision_impactnudge.value && (startdepth < startdist || startdepth == 1))
                {
                        startdepth = startdist;
                        VectorCopy(startplane, startdepthnormal);
                }
 
+               if (startdist >= -collision_impactnudge.value && enddist >= startdist)
+                       return;
+               if (startdist <= 0 && enddist <= 0)
+                       continue;
                if (startdist > enddist)
                {
                        // moving into brush