[quake3-commits] r1725 - in trunk: . code/client

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Nov 2 11:17:10 EST 2009


Author: thilo
Date: 2009-11-02 11:17:10 -0500 (Mon, 02 Nov 2009)
New Revision: 1725

Modified:
   trunk/README
   trunk/code/client/cl_input.c
   trunk/code/client/cl_main.c
   trunk/code/client/client.h
Log:
Added TTimo's QuakeLive-style mouse acceleration, thanks Gabriel Schnoering and TTimo for the patch. (#3693)


Modified: trunk/README
===================================================================
--- trunk/README	2009-11-01 19:58:27 UTC (rev 1724)
+++ trunk/README	2009-11-02 16:17:10 UTC (rev 1725)
@@ -107,6 +107,9 @@
   cl_cURLLib                        - filename of cURL library to load
   cl_consoleKeys                    - space delimited list of key names or
                                       characters that toggle the console
+  cl_mouseAccelStyle                - Set to 1 for QuakeLive mouse acceleration
+                                      behaviour, 0 for standard q3
+  cl_mouseAccelOffset               - Tuning the acceleration curve, see below
 
   s_useOpenAL                       - use the OpenAL sound backend if available
   s_alPrecache                      - cache OpenAL sounds before use
@@ -126,26 +129,28 @@
   s_alDriver                        - which OpenAL library to use
   s_alDevice                        - which OpenAL device to use
   s_alAvailableDevices              - list of available OpenAL devices
-
   s_sdlBits                         - SDL bit resolution
   s_sdlSpeed                        - SDL sample rate
   s_sdlChannels                     - SDL number of channels
   s_sdlDevSamps                     - SDL DMA buffer size override
   s_sdlMixSamps                     - SDL mix buffer size override
+  s_backend                         - read only, indicates the current sound
+                                      backend
+  s_muteWhenMinimized               - mute sound when minimized
 
   com_ansiColor                     - enable use of ANSI escape codes in the tty
   com_altivec                       - enable use of altivec on PowerPC systems
   com_standalone                    - Run in standalone mode
   com_maxfpsUnfocused               - Maximum frames per second when unfocused
   com_maxfpsMinimized               - Maximum frames per second when minimized
-  s_backend                         - read only, indicates the current sound
-                                      backend
-  s_muteWhenMinimized               - mute sound when minimized
+
   in_joystickNo                     - select which joystick to use
   in_keyboardDebug                  - print keyboard debug info
-  r_ext_texture_filter_anisotropic  - anisotropic texture filtering
+
   sv_dlURL                          - the base of the HTTP or FTP site that
                                       holds custom pk3 files for your server
+  sv_banFile                        - Name of the file that is used for storing
+                                      the server bans.
 
   net_ip6                           - IPv6 address to bind to
   net_port6                         - port to bind to using the ipv6 address
@@ -160,6 +165,7 @@
   net_mcastiface                    - outgoing interface to use for scan
 
   r_allowResize                     - make window resizable (SDL only)
+  r_ext_texture_filter_anisotropic  - anisotropic texture filtering
   r_zProj                           - distance of observer camera to projection
                                       plane in quake3 standard units
   r_greyscale                       - render black and white images
@@ -186,8 +192,6 @@
                                       intend to use this.
   r_sdlDriver                       - read only, indicates the SDL driver
                                       backend being used
-  sv_banFile                        - Name of the file that is used for storing
-                                      the server bans.
 
 New commands
   video [filename]        - start video capture (use with demo command)
@@ -225,6 +229,51 @@
   data, nor is it something that we like to spend much time maintaining or
   supporting.
 
+QuakeLive mouse acceleration (patch and this text written by TTimo from id)
+  I've been using an experimental mouse acceleration code for a while, and
+  decided to make it available to everyone. Don't be too worried if you don't
+  understand the explanations below, this is mostly intended for advanced
+  players:
+  To enable it, set cl_mouseAccelStyle 1 (0 is the default/legacy behavior)
+
+  New style is controlled with 3 cvars:
+
+  sensitivity
+  cl_mouseAccel
+  cl_mouseAccelOffset
+
+  The old code (cl_mouseAccelStyle 0) can be difficult to calibrate because if
+  you have a base sensitivity setup, as soon as you set a non zero acceleration
+  your base sensitivity at low speeds will change as well. The other problem
+  with style 0 is that you are stuck on a square (power of two) acceleration
+  curve.
+
+  The new code tries to solve both problems:
+
+  Once you setup your sensitivity to feel comfortable and accurate enough for
+  low mouse deltas with no acceleration (cl_mouseAccel 0), you can start
+  increasing cl_mouseAccel and tweaking cl_mouseAccelOffset to get the
+  amplification you want for high deltas with little effect on low mouse deltas.
+
+  cl_mouseAccel is a power value. Should be >= 1, 2 will be the same power curve
+  as style 0. The higher the value, the faster the amplification grows with the
+  mouse delta.
+
+  cl_mouseAccelOffset sets how much base mouse delta will be doubled by
+  acceleration. The closer to zero you bring it, the more acceleration will
+  happen at low speeds. This is also very useful if you are changing to a new
+  mouse with higher dpi, if you go from 500 to 1000 dpi, you can divide your
+  cl_mouseAccelOffset by two to keep the same overall 'feel' (you will likely
+  gain in precision when you do that, but that is not related to mouse
+  acceleration).
+
+  Mouse acceleration is tricky to configure, and when you do you'll have to
+  re-learn your aiming. But you will find that it's very much forth it in the
+  long run.
+
+  If you try the new acceleration code and start using it, I'd be very
+  interested by your feedback.
+
 64bit mods
   If you wish to compile external mods as shared libraries on a 64bit platform,
   and the mod source is derived from the id Q3 SDK, you will need to modify the

Modified: trunk/code/client/cl_input.c
===================================================================
--- trunk/code/client/cl_input.c	2009-11-01 19:58:27 UTC (rev 1724)
+++ trunk/code/client/cl_input.c	2009-11-02 16:17:10 UTC (rev 1725)
@@ -435,52 +435,88 @@
 CL_MouseMove
 =================
 */
-void CL_MouseMove( usercmd_t *cmd ) {
-	float	mx, my;
-	float	accelSensitivity;
-	float	rate;
 
+void CL_MouseMove(usercmd_t *cmd)
+{
+	float mx, my;
+
 	// allow mouse smoothing
-	if ( m_filter->integer ) {
-		mx = ( cl.mouseDx[0] + cl.mouseDx[1] ) * 0.5;
-		my = ( cl.mouseDy[0] + cl.mouseDy[1] ) * 0.5;
-	} else {
+	if (m_filter->integer)
+	{
+		mx = (cl.mouseDx[0] + cl.mouseDx[1]) * 0.5f;
+		my = (cl.mouseDy[0] + cl.mouseDy[1]) * 0.5f;
+	}
+	else
+	{
 		mx = cl.mouseDx[cl.mouseIndex];
 		my = cl.mouseDy[cl.mouseIndex];
 	}
+	
 	cl.mouseIndex ^= 1;
 	cl.mouseDx[cl.mouseIndex] = 0;
 	cl.mouseDy[cl.mouseIndex] = 0;
 
-	rate = sqrt( mx * mx + my * my ) / (float)frame_msec;
-	accelSensitivity = cl_sensitivity->value + rate * cl_mouseAccel->value;
+	if (mx == 0.0f && my == 0.0f)
+		return;
+	
+	if (cl_mouseAccel->value != 0.0f)
+	{
+		if(cl_mouseAccelStyle->integer == 0)
+		{
+			float accelSensitivity;
+			float rate;
+			
+			rate = sqrt(mx * mx + my * my) / (float) frame_msec;
 
-	// scale by FOV
-	accelSensitivity *= cl.cgameSensitivity;
+			accelSensitivity = cl_sensitivity->value + rate * cl_mouseAccel->value;
+			mx *= accelSensitivity;
+			my *= accelSensitivity;
+			
+			if(cl_showMouseRate->integer)
+				Com_Printf("rate: %f, accelSensitivity: %f\n", rate, accelSensitivity);
+		}
+		else
+		{
+			float rate[2];
+			float power[2];
 
-	if ( rate && cl_showMouseRate->integer ) {
-		Com_Printf( "%f : %f\n", rate, accelSensitivity );
-	}
+			// sensitivity remains pretty much unchanged at low speeds
+			// cl_mouseAccel is a power value to how the acceleration is shaped
+			// cl_mouseAccelOffset is the rate for which the acceleration will have doubled the non accelerated amplification
+			// NOTE: decouple the config cvars for independent acceleration setup along X and Y?
 
-	mx *= accelSensitivity;
-	my *= accelSensitivity;
+			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);
 
-	if (!mx && !my) {
-		return;
+			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);
+
+			if(cl_showMouseRate->integer)
+				Com_Printf("ratex: %f, ratey: %f, powx: %f, powy: %f\n", rate[0], rate[1], power[0], power[1]);
+		}
 	}
+	else
+	{
+		mx *= cl_sensitivity->value;
+		my *= cl_sensitivity->value;
+	}
 
+	// ingame FOV
+	mx *= cl.cgameSensitivity;
+	my *= cl.cgameSensitivity;
+
 	// add mouse X/Y movement to cmd
-	if ( in_strafe.active ) {
-		cmd->rightmove = ClampChar( cmd->rightmove + m_side->value * mx );
-	} else {
+	if(in_strafe.active)
+		cmd->rightmove = ClampChar(cmd->rightmove + m_side->value * mx);
+	else
 		cl.viewangles[YAW] -= m_yaw->value * mx;
-	}
 
-	if ( (in_mlooking || cl_freelook->integer) && !in_strafe.active ) {
+	if ((in_mlooking || cl_freelook->integer) && !in_strafe.active)
 		cl.viewangles[PITCH] += m_pitch->value * my;
-	} else {
-		cmd->forwardmove = ClampChar( cmd->forwardmove - m_forward->value * my );
-	}
+	else
+		cmd->forwardmove = ClampChar(cmd->forwardmove - m_forward->value * my);
 }
 
 

Modified: trunk/code/client/cl_main.c
===================================================================
--- trunk/code/client/cl_main.c	2009-11-01 19:58:27 UTC (rev 1724)
+++ trunk/code/client/cl_main.c	2009-11-02 16:17:10 UTC (rev 1725)
@@ -73,6 +73,8 @@
 cvar_t	*cl_sensitivity;
 
 cvar_t	*cl_mouseAccel;
+cvar_t	*cl_mouseAccelOffset;
+cvar_t	*cl_mouseAccelStyle;
 cvar_t	*cl_showMouseRate;
 
 cvar_t	*m_pitch;
@@ -3101,6 +3103,13 @@
 	cl_mouseAccel = Cvar_Get ("cl_mouseAccel", "0", CVAR_ARCHIVE);
 	cl_freelook = Cvar_Get( "cl_freelook", "1", CVAR_ARCHIVE );
 
+	// 0: legacy mouse acceleration
+	// 1: new implementation
+	cl_mouseAccelStyle = Cvar_Get( "cl_mouseAccelStyle", "0", CVAR_ARCHIVE );
+	// offset for the power function (for style 1, ignored otherwise)
+	// this should be set to the max rate value
+	cl_mouseAccelOffset = Cvar_Get( "cl_mouseAccelOffset", "5", CVAR_ARCHIVE );
+
 	cl_showMouseRate = Cvar_Get ("cl_showmouserate", "0", 0);
 
 	cl_allowDownload = Cvar_Get ("cl_allowDownload", "0", CVAR_ARCHIVE);

Modified: trunk/code/client/client.h
===================================================================
--- trunk/code/client/client.h	2009-11-01 19:58:27 UTC (rev 1724)
+++ trunk/code/client/client.h	2009-11-02 16:17:10 UTC (rev 1725)
@@ -379,6 +379,8 @@
 extern	cvar_t	*cl_freelook;
 
 extern	cvar_t	*cl_mouseAccel;
+extern	cvar_t	*cl_mouseAccelOffset;
+extern	cvar_t	*cl_mouseAccelStyle;
 extern	cvar_t	*cl_showMouseRate;
 
 extern	cvar_t	*m_pitch;



More information about the quake3-commits mailing list