From: Simon McVittie <smcv@debian.org>
Date: Sun, 1 Aug 2010 11:26:51 +0100
Subject: [PATCH] Clip cl_mouseAccelOffset at 0.001 to avoid division by zero
Origin: vendor, Debian
Bug: http://bugzilla.icculus.org/show_bug.cgi?id=4691
Forwarded: yes
---
code/client/cl_input.c | 16 ++++++++++++----
1 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/code/client/cl_input.c b/code/client/cl_input.c
index a42030d..5549448 100644
--- a/code/client/cl_input.c
+++ b/code/client/cl_input.c
@@ -477,8 +477,16 @@ void CL_MouseMove(usercmd_t *cmd)
}
else
{
+# define CL_MOUSEACCELOFFSET_MIN 1.0e-3f
float rate[2];
float power[2];
+ float offset = cl_mouseAccelOffset->value;
+
+ // clip at a small positive number to avoid division
+ // by zero (or indeed going backwards!)
+ if (offset < CL_MOUSEACCELOFFSET_MIN) {
+ offset = CL_MOUSEACCELOFFSET_MIN;
+ }
// sensitivity remains pretty much unchanged at low speeds
// cl_mouseAccel is a power value to how the acceleration is shaped
@@ -487,11 +495,11 @@ void CL_MouseMove(usercmd_t *cmd)
rate[0] = fabs(mx) / (float) frame_msec;
rate[1] = fabs(my) / (float) frame_msec;
- power[0] = powf(rate[0] / cl_mouseAccelOffset->value, cl_mouseAccel->value);
- power[1] = powf(rate[1] / cl_mouseAccelOffset->value, cl_mouseAccel->value);
+ power[0] = powf(rate[0] / offset, cl_mouseAccel->value);
+ power[1] = powf(rate[1] / offset, cl_mouseAccel->value);
- mx = cl_sensitivity->value * (mx + ((mx < 0) ? -power[0] : power[0]) * cl_mouseAccelOffset->value);
- my = cl_sensitivity->value * (my + ((my < 0) ? -power[1] : power[1]) * cl_mouseAccelOffset->value);
+ mx = cl_sensitivity->value * (mx + ((mx < 0) ? -power[0] : power[0]) * offset);
+ my = cl_sensitivity->value * (my + ((my < 0) ? -power[1] : power[1]) * offset);
if(cl_showMouseRate->integer)
Com_Printf("ratex: %f, ratey: %f, powx: %f, powy: %f\n", rate[0], rate[1], power[0], power[1]);
--