Index: code/client/cl_input.c =================================================================== --- code/client/cl_input.c (revision 1774) +++ code/client/cl_input.c (working copy) @@ -415,19 +415,11 @@ anglespeed = 0.001 * cls.frametime; } - if ( !in_strafe.active ) { - cl.viewangles[YAW] += anglespeed * cl_yawspeed->value * cl.joystickAxis[AXIS_SIDE]; - } else { - cmd->rightmove = ClampChar( cmd->rightmove + cl.joystickAxis[AXIS_SIDE] ); - } + cmd->rightmove = ClampChar( cmd->rightmove + cl.joystickAxis[AXIS_SIDE] / 128); + cmd->forwardmove = ClampChar( cmd->forwardmove - cl.joystickAxis[AXIS_FORWARD] / 128); - if ( in_mlooking ) { - cl.viewangles[PITCH] += anglespeed * cl_pitchspeed->value * cl.joystickAxis[AXIS_FORWARD]; - } else { - cmd->forwardmove = ClampChar( cmd->forwardmove + cl.joystickAxis[AXIS_FORWARD] ); - } - - cmd->upmove = ClampChar( cmd->upmove + cl.joystickAxis[AXIS_UP] ); + cl.viewangles[YAW] -= anglespeed * cl_yawspeed->value * cl.joystickAxis[AXIS_YAW] / 32767; + cl.viewangles[PITCH] += anglespeed * cl_pitchspeed->value * cl.joystickAxis[AXIS_PITCH] / 32767; } /* Index: code/qcommon/qcommon.h =================================================================== --- code/qcommon/qcommon.h (revision 1774) +++ code/qcommon/qcommon.h (working copy) @@ -1018,9 +1018,9 @@ AXIS_SIDE, AXIS_FORWARD, AXIS_UP, + AXIS_PITCH, + AXIS_YAW, AXIS_ROLL, - AXIS_YAW, - AXIS_PITCH, MAX_JOYSTICK_AXIS } joystickAxis_t; Index: code/sdl/sdl_input.c =================================================================== --- code/sdl/sdl_input.c (revision 1774) +++ code/sdl/sdl_input.c (working copy) @@ -69,6 +69,7 @@ static cvar_t *in_joystickDebug = NULL; static cvar_t *in_joystickThreshold = NULL; static cvar_t *in_joystickNo = NULL; +static cvar_t *in_joystick360 = NULL; static int vidRestartTime = 0; @@ -563,6 +564,7 @@ { qboolean buttons[16]; // !!! FIXME: these might be too many. unsigned int oldaxes; + int oldaaxes[16]; unsigned int oldhats; } stick_state; @@ -608,6 +610,8 @@ if( in_joystickNo->integer < 0 || in_joystickNo->integer >= total ) Cvar_Set( "in_joystickNo", "0" ); + in_joystick360 = Cvar_Get( "in_joystick360", "0", CVAR_ARCHIVE ); + stick = SDL_JoystickOpen( in_joystickNo->integer ); if (stick == NULL) { @@ -620,7 +624,8 @@ Com_DPrintf( "Axes: %d\n", SDL_JoystickNumAxes(stick) ); Com_DPrintf( "Hats: %d\n", SDL_JoystickNumHats(stick) ); Com_DPrintf( "Buttons: %d\n", SDL_JoystickNumButtons(stick) ); - Com_DPrintf( "Balls: %d\n", SDL_JoystickNumBalls(stick) ); + Com_DPrintf( "Balls: %d\n", SDL_JoystickNumBalls(stick) ); + Com_DPrintf( "Type: %s\n", in_joystick360->integer ? "360" : "Non-360" ); SDL_JoystickEventState(SDL_QUERY); } @@ -801,12 +806,29 @@ for (i = 0; i < total; i++) { Sint16 axis = SDL_JoystickGetAxis(stick, i); - float f = ( (float) axis ) / 32767.0f; - if( f < -in_joystickThreshold->value ) { - axes |= ( 1 << ( i * 2 ) ); - } else if( f > in_joystickThreshold->value ) { - axes |= ( 1 << ( ( i * 2 ) + 1 ) ); + + // AXIS_UP corresponds to the triggers on a 360 controller + if (i == AXIS_UP || !in_joystick360->integer) + { + float f = ( (float) axis ) / 32767.0f; + if( f < -in_joystickThreshold->value ) { + axes |= ( 1 << ( i * 2 ) ); + } else if( f > in_joystickThreshold->value ) { + axes |= ( 1 << ( ( i * 2 ) + 1 ) ); + } } + else + { + float f = ( (float) abs(axis) ) / 32767.0f; + + if( f < in_joystickThreshold->value ) axis = 0; + + if ( axis != stick_state.oldaaxes[i] ) + { + Com_QueueEvent( 0, SE_JOYSTICK_AXIS, i, axis, 0, NULL ); + stick_state.oldaaxes[i] = axis; + } + } } }