From 80b09064d8227075b6e9c4dfe4b007c6676082f5 Mon Sep 17 00:00:00 2001 From: havoc Date: Thu, 18 Jan 2007 10:44:24 +0000 Subject: [PATCH 1/1] added collision_prefernudgedfraction cvar (defaults to 1), which should improve collision stability in 'wedge corner' cases (such as creases in terrain) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6700 d7cf8633-e32d-0410-b094-e92efae38249 --- collision.c | 9 +++++++++ model_brush.c | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/collision.c b/collision.c index c41a2ff4..20fc8399 100644 --- a/collision.c +++ b/collision.c @@ -12,6 +12,7 @@ cvar_t collision_startnudge = {0, "collision_startnudge", "0", "how much to bias cvar_t collision_endnudge = {0, "collision_endnudge", "0", "how much to bias collision trace end"}; 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)"}; void Collision_Init (void) { @@ -20,6 +21,7 @@ void Collision_Init (void) Cvar_RegisterVariable(&collision_endnudge); Cvar_RegisterVariable(&collision_enternudge); Cvar_RegisterVariable(&collision_leavenudge); + Cvar_RegisterVariable(&collision_prefernudgedfraction); } @@ -682,6 +684,8 @@ void Collision_TraceBrushBrushFloat(trace_t *trace, const colbrushf_t *thisbrush trace->hittexture = hittexture; trace->realfraction = bound(0, enterfrac, 1); trace->fraction = bound(0, enterfrac2, 1); + if (collision_prefernudgedfraction.integer) + trace->realfraction = trace->fraction; VectorCopy(newimpactnormal, trace->plane.normal); } else @@ -797,6 +801,8 @@ void Collision_TraceLineBrushFloat(trace_t *trace, const vec3_t linestart, const trace->hittexture = hittexture; trace->realfraction = bound(0, enterfrac, 1); trace->fraction = bound(0, enterfrac2, 1); + if (collision_prefernudgedfraction.integer) + trace->realfraction = trace->fraction; VectorCopy(newimpactnormal, trace->plane.normal); } else @@ -1263,6 +1269,9 @@ void Collision_TraceLineTriangleFloat(trace_t *trace, const vec3_t linestart, co // (the main fraction remains perfect) trace->fraction = f - collision_impactnudge.value * d; + if (collision_prefernudgedfraction.integer) + trace->realfraction = trace->fraction; + // store the new trace plane (because collisions only happen from // the front this is always simply the triangle normal, never flipped) d = 1.0 / sqrt(faceplanenormallength2); diff --git a/model_brush.c b/model_brush.c index 75398747..8f907bfb 100644 --- a/model_brush.c +++ b/model_brush.c @@ -614,6 +614,7 @@ RecursiveHullCheckTraceInfo_t; #define HULLCHECKSTATE_SOLID 1 #define HULLCHECKSTATE_DONE 2 +extern cvar_t collision_prefernudgedfraction; static int Mod_Q1BSP_RecursiveHullCheck(RecursiveHullCheckTraceInfo_t *t, int num, double p1f, double p2f, double p1[3], double p2[3]) { // status variables, these don't need to be saved on the stack when @@ -768,6 +769,9 @@ loc0: midf = (t1 - DIST_EPSILON) / (t1 - t2); t->trace->fraction = bound(0, midf, 1); + if (collision_prefernudgedfraction.integer) + t->trace->realfraction = t->trace->fraction; + #if COLLISIONPARANOID >= 3 Con_Print("D"); #endif -- 2.39.2