From bcfa8702ed44aef96d00c6bfc1946f85efc7120e Mon Sep 17 00:00:00 2001 From: Dabb Date: Sat, 30 Dec 2000 10:56:03 +0000 Subject: [PATCH] Moved JOYSTICK code to joy_win.c - still needs some cleaning but works. --- source/in_win.c | 534 ++---------------------------------------------- 1 file changed, 14 insertions(+), 520 deletions(-) diff --git a/source/in_win.c b/source/in_win.c index bebec01..c2c846b 100644 --- a/source/in_win.c +++ b/source/in_win.c @@ -1,7 +1,7 @@ /* in_win.c - windows 95 mouse and joystick code + windows 95 mouse stuff Copyright (C) 1996-1997 Id Software, Inc. @@ -75,70 +75,11 @@ static qboolean mouseshowtoggle = 1; static qboolean dinput_acquired; static unsigned int mstate_di; -// joystick defines and variables -// where should defines be moved? - -#define JOY_ABSOLUTE_AXIS 0x00000000 // control like a joystick -#define JOY_RELATIVE_AXIS 0x00000010 // control like a mouse, spinner, - // trackball -#define JOY_MAX_AXES 6 // X, Y, Z, R, U, V -#define JOY_AXIS_X 0 -#define JOY_AXIS_Y 1 -#define JOY_AXIS_Z 2 -#define JOY_AXIS_R 3 -#define JOY_AXIS_U 4 -#define JOY_AXIS_V 5 - -enum _ControlList { - AxisNada = 0, AxisForward, AxisLook, AxisSide, AxisTurn -}; - -static DWORD dwAxisFlags[JOY_MAX_AXES] = { - JOY_RETURNX, JOY_RETURNY, JOY_RETURNZ, JOY_RETURNR, JOY_RETURNU, JOY_RETURNV -}; - -static DWORD dwAxisMap[JOY_MAX_AXES]; -static DWORD dwControlMap[JOY_MAX_AXES]; -static PDWORD pdwRawValue[JOY_MAX_AXES]; - -// none of these cvars are saved over a session -// this means that advanced controller configuration needs to be executed -// each time. this avoids any problems with getting back to a default usage -// or when changing from one controller to another. this way at least something -// works. -static cvar_t *in_joystick; -static cvar_t *joy_name; -static cvar_t *joy_advanced; -static cvar_t *joy_advaxisx; -static cvar_t *joy_advaxisy; -static cvar_t *joy_advaxisz; -static cvar_t *joy_advaxisr; -static cvar_t *joy_advaxisu; -static cvar_t *joy_advaxisv; -static cvar_t *joy_forwardthreshold; -static cvar_t *joy_sidethreshold; -static cvar_t *joy_pitchthreshold; -static cvar_t *joy_yawthreshold; -static cvar_t *joy_forwardsensitivity; -static cvar_t *joy_sidesensitivity; -static cvar_t *joy_pitchsensitivity; -static cvar_t *joy_yawsensitivity; -static cvar_t *joy_wwhack1; -static cvar_t *joy_wwhack2; - -static qboolean joy_avail, joy_advancedinit, joy_haspov; -static DWORD joy_oldbuttonstate, joy_oldpovstate; -static int joy_id; -static DWORD joy_flags; -static DWORD joy_numbuttons; - // misc locals static LPDIRECTINPUT g_pdi; static LPDIRECTINPUTDEVICE g_pMouse; -static JOYINFOEX ji; - static HINSTANCE hInstDI; static qboolean dinput; @@ -179,10 +120,12 @@ static DIDATAFORMAT df = { rgodf, // and here they are }; -// forward-referenced functions, locals -static void IN_StartupJoystick (void); -static void Joy_AdvancedUpdate_f (void); -static void IN_JoyMove (usercmd_t *cmd); +// forward-referenced functions, joy + +extern void JOY_Init_Cvars(void); +extern void JOY_Init (void); +extern void JOY_AdvancedUpdate_f (void); +extern void JOY_Move (usercmd_t *cmd); /* =========== @@ -492,12 +435,13 @@ void IN_Init (void) { Cmd_AddCommand ("force_centerview", Force_CenterView_f); - Cmd_AddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f); uiWheelMessage = RegisterWindowMessage ("MSWHEEL_ROLLMSG"); + IN_StartupMouse (); - IN_StartupJoystick (); + + JOY_Init (); } void @@ -506,33 +450,7 @@ IN_Init_Cvars (void) // mouse variables m_filter = Cvar_Get ("m_filter", "0", CVAR_NONE, "None"); - // joystick variables - in_joystick = Cvar_Get ("joystick", "0", CVAR_ARCHIVE, "None"); - joy_name = Cvar_Get ("joyname", "joystick", CVAR_NONE, "None"); - joy_advanced = Cvar_Get ("joyadvanced", "0", CVAR_NONE, "None"); - joy_advaxisx = Cvar_Get ("joyadvaxisx", "0", CVAR_NONE, "None"); - joy_advaxisy = Cvar_Get ("joyadvaxisy", "0", CVAR_NONE, "None"); - joy_advaxisz = Cvar_Get ("joyadvaxisz", "0", CVAR_NONE, "None"); - joy_advaxisr = Cvar_Get ("joyadvaxisr", "0", CVAR_NONE, "None"); - joy_advaxisu = Cvar_Get ("joyadvaxisu", "0", CVAR_NONE, "None"); - joy_advaxisv = Cvar_Get ("joyadvaxisv", "0", CVAR_NONE, "None"); - joy_forwardthreshold = - Cvar_Get ("joyforwardthreshold", "0.15", CVAR_NONE, "None"); - joy_sidethreshold = - Cvar_Get ("joysidethreshold", "0.15", CVAR_NONE, "None"); - joy_pitchthreshold = - Cvar_Get ("joypitchthreshold", "0.15", CVAR_NONE, "None"); - joy_yawthreshold = Cvar_Get ("joyyawthreshold", "0.15", CVAR_NONE, "None"); - joy_forwardsensitivity = - Cvar_Get ("joyforwardsensitivity", "-1.0", CVAR_NONE, "None"); - joy_sidesensitivity = - Cvar_Get ("joysidesensitivity", "-1.0", CVAR_NONE, "None"); - joy_pitchsensitivity = - Cvar_Get ("joypitchsensitivity", "1.0", CVAR_NONE, "None"); - joy_yawsensitivity = - Cvar_Get ("joyyawsensitivity", "-1.0", CVAR_NONE, "None"); - joy_wwhack1 = Cvar_Get ("joywwhack1", "0.0", CVAR_NONE, "None"); - joy_wwhack2 = Cvar_Get ("joywwhack2", "0.0", CVAR_NONE, "None"); + JOY_Init_Cvars(); } /* @@ -732,7 +650,7 @@ IN_Move (usercmd_t *cmd) if (ActiveApp && !Minimized) { IN_MouseMove (cmd); - IN_JoyMove (cmd); + JOY_Move (cmd); } } @@ -748,6 +666,8 @@ IN_Accumulate (void) // int mx, my; // HDC hdc; +// if (dinput) return; // If using dinput we don't probably need this + if (mouseactive) { GetCursorPos (¤t_pos); @@ -776,429 +696,3 @@ IN_ClearStates (void) } } - -/* -=============== -IN_StartupJoystick -=============== -*/ -static void -IN_StartupJoystick (void) -{ - int /* i, */ numdevs; - JOYCAPS jc; - MMRESULT mmr = !JOYERR_NOERROR; - - // assume no joystick - joy_avail = false; - - // abort startup if user requests no joystick - if (COM_CheckParm ("-nojoy")) - return; - - // verify joystick driver is present - if ((numdevs = joyGetNumDevs ()) == 0) { - Con_Printf ("\njoystick not found -- driver not present\n\n"); - return; - } - // cycle through the joystick ids for the first valid one - for (joy_id = 0; joy_id < numdevs; joy_id++) { - memset (&ji, 0, sizeof (ji)); - ji.dwSize = sizeof (ji); - ji.dwFlags = JOY_RETURNCENTERED; - - if ((mmr = joyGetPosEx (joy_id, &ji)) == JOYERR_NOERROR) - break; - } - - // abort startup if we didn't find a valid joystick - if (mmr != JOYERR_NOERROR) { - Con_Printf ("\njoystick not found -- no valid joysticks (%x)\n\n", mmr); - return; - } - // get the capabilities of the selected joystick - // abort startup if command fails - memset (&jc, 0, sizeof (jc)); - if ((mmr = joyGetDevCaps (joy_id, &jc, sizeof (jc))) != JOYERR_NOERROR) { - Con_Printf - ("\njoystick not found -- invalid joystick capabilities (%x)\n\n", - mmr); - return; - } - // save the joystick's number of buttons and POV status - joy_numbuttons = jc.wNumButtons; - joy_haspov = jc.wCaps & JOYCAPS_HASPOV; - - // old button and POV states default to no buttons pressed - joy_oldbuttonstate = joy_oldpovstate = 0; - - // mark the joystick as available and advanced initialization not - // completed - // this is needed as cvars are not available during initialization - - joy_avail = true; - joy_advancedinit = false; - - Con_Printf ("\njoystick detected\n\n"); -} - - -/* -=========== -RawValuePointer -=========== -*/ -static PDWORD -RawValuePointer (int axis) -{ - switch (axis) { - case JOY_AXIS_X: - return &ji.dwXpos; - case JOY_AXIS_Y: - return &ji.dwYpos; - case JOY_AXIS_Z: - return &ji.dwZpos; - case JOY_AXIS_R: - return &ji.dwRpos; - case JOY_AXIS_U: - return &ji.dwUpos; - case JOY_AXIS_V: - return &ji.dwVpos; - } - return NULL; -} - -/* -=========== -Joy_AdvancedUpdate_f -=========== -*/ -static void -Joy_AdvancedUpdate_f (void) -{ - - // called once by IN_ReadJoystick and by user whenever an update is - // needed - // cvars are now available - int i; - DWORD dwTemp; - - // initialize all the maps - for (i = 0; i < JOY_MAX_AXES; i++) { - dwAxisMap[i] = AxisNada; - dwControlMap[i] = JOY_ABSOLUTE_AXIS; - pdwRawValue[i] = RawValuePointer (i); - } - - if (joy_advanced->int_val) { - // default joystick initialization - // 2 axes only with joystick control - dwAxisMap[JOY_AXIS_X] = AxisTurn; - // dwControlMap[JOY_AXIS_X] = JOY_ABSOLUTE_AXIS; - dwAxisMap[JOY_AXIS_Y] = AxisForward; - // dwControlMap[JOY_AXIS_Y] = JOY_ABSOLUTE_AXIS; - } else { - if (strcmp (joy_name->string, "joystick") != 0) { - // notify user of advanced controller - Con_Printf ("\n%s configured\n\n", joy_name->string); - } - // advanced initialization here - // data supplied by user via joy_axisn cvars - dwTemp = joy_advaxisx->int_val; - dwAxisMap[JOY_AXIS_X] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_X] = dwTemp & JOY_RELATIVE_AXIS; - dwTemp = joy_advaxisy->int_val; - dwAxisMap[JOY_AXIS_Y] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_Y] = dwTemp & JOY_RELATIVE_AXIS; - dwTemp = joy_advaxisz->int_val; - dwAxisMap[JOY_AXIS_Z] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_Z] = dwTemp & JOY_RELATIVE_AXIS; - dwTemp = joy_advaxisr->int_val; - dwAxisMap[JOY_AXIS_R] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_R] = dwTemp & JOY_RELATIVE_AXIS; - dwTemp = joy_advaxisu->int_val; - dwAxisMap[JOY_AXIS_U] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_U] = dwTemp & JOY_RELATIVE_AXIS; - dwTemp = joy_advaxisv->int_val; - dwAxisMap[JOY_AXIS_V] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_V] = dwTemp & JOY_RELATIVE_AXIS; - } - - // compute the axes to collect from DirectInput - joy_flags = JOY_RETURNCENTERED | JOY_RETURNBUTTONS | JOY_RETURNPOV; - for (i = 0; i < JOY_MAX_AXES; i++) { - if (dwAxisMap[i] != AxisNada) { - joy_flags |= dwAxisFlags[i]; - } - } -} - - -/* -=========== -IN_Commands -=========== -*/ -void -IN_Commands (void) -{ - int i, key_index; - DWORD buttonstate, povstate; - - if (!joy_avail) { - return; - } - - // loop through the joystick buttons - // key a joystick event or auxillary event for higher number buttons for - // each state change - buttonstate = ji.dwButtons; - for (i = 0; i < joy_numbuttons; i++) { - if ((buttonstate & (1 << i)) && !(joy_oldbuttonstate & (1 << i))) { - key_index = (i < 4) ? K_JOY1 : K_AUX1; - Key_Event (key_index + i, -1, true); - } - - if (!(buttonstate & (1 << i)) && (joy_oldbuttonstate & (1 << i))) { - key_index = (i < 4) ? K_JOY1 : K_AUX1; - Key_Event (key_index + i, -1, false); - } - } - joy_oldbuttonstate = buttonstate; - - if (joy_haspov) { - // convert POV information into 4 bits of state information - // this avoids any potential problems related to moving from one - // direction to another without going through the center position - povstate = 0; - if (ji.dwPOV != JOY_POVCENTERED) { - if (ji.dwPOV == JOY_POVFORWARD) - povstate |= 0x01; - if (ji.dwPOV == JOY_POVRIGHT) - povstate |= 0x02; - if (ji.dwPOV == JOY_POVBACKWARD) - povstate |= 0x04; - if (ji.dwPOV == JOY_POVLEFT) - povstate |= 0x08; - } - // determine which bits have changed and key an auxillary event for - // each change - for (i = 0; i < 4; i++) { - if ((povstate & (1 << i)) && !(joy_oldpovstate & (1 << i))) { - Key_Event (K_AUX29 + i, -1, true); - } - - if (!(povstate & (1 << i)) && (joy_oldpovstate & (1 << i))) { - Key_Event (K_AUX29 + i, -1, false); - } - } - joy_oldpovstate = povstate; - } -} - - -/* -=============== -IN_ReadJoystick -=============== -*/ -static qboolean -IN_ReadJoystick (void) -{ - - memset (&ji, 0, sizeof (ji)); - ji.dwSize = sizeof (ji); - ji.dwFlags = joy_flags; - - if (joyGetPosEx (joy_id, &ji) == JOYERR_NOERROR) { - // this is a hack -- there is a bug in the Logitech WingMan Warrior - // DirectInput Driver - // rather than having 32768 be the zero point, they have the zero - // point at 32668 - // go figure -- anyway, now we get the full resolution out of the - // device - if (joy_wwhack1->int_val) { - ji.dwUpos += 100; - } - return true; - } else { - // read error occurred - // turning off the joystick seems too harsh for 1 read error, - // but what should be done? - // Con_Printf ("IN_ReadJoystick: no response\n"); - // joy_avail = false; - return false; - } -} - - -/* -=========== -IN_JoyMove -=========== -*/ -static void -IN_JoyMove (usercmd_t *cmd) -{ - float speed, aspeed; - float fAxisValue, fTemp; - int i; - - // complete initialization if first time in - // this is needed as cvars are not available at initialization time - if (joy_advancedinit != true) { - Joy_AdvancedUpdate_f (); - joy_advancedinit = true; - } - // verify joystick is available and that the user wants to use it - if (!joy_avail || !in_joystick->int_val) { - return; - } - // collect the joystick data, if possible - if (IN_ReadJoystick () != true) { - return; - } - - if (in_speed.state & 1) - speed = cl_movespeedkey->value; - else - speed = 1; - aspeed = speed * host_frametime; - - // loop through the axes - for (i = 0; i < JOY_MAX_AXES; i++) { - // get the floating point zero-centered, potentially-inverted data - // for the current axis - fAxisValue = (float) *pdwRawValue[i]; - // move centerpoint to zero - fAxisValue -= 32768.0; - - if (joy_wwhack2->int_val) { - if (dwAxisMap[i] == AxisTurn) { - // this is a special formula for the Logitech WingMan Warrior - // y=ax^b; where a = 300 and b = 1.3 - // also x values are in increments of 800 (so this is - // factored out) - // then bounds check result to level out excessively high - // spin rates - fTemp = 300.0 * pow (abs (fAxisValue) / 800.0, 1.3); - if (fTemp > 14000.0) - fTemp = 14000.0; - // restore direction information - fAxisValue = (fAxisValue > 0.0) ? fTemp : -fTemp; - } - } - // convert range from -32768..32767 to -1..1 - fAxisValue /= 32768.0; - - switch (dwAxisMap[i]) { - case AxisForward: - if (!joy_advanced->int_val && freelook) { - // user wants forward control to become look control - if (fabs (fAxisValue) > joy_pitchthreshold->value) { - // if mouse invert is on, invert the joystick pitch - // value - // only absolute control support here (joy_advanced - // is false) - if (m_pitch->value < 0.0) { - cl.viewangles[PITCH] -= - (fAxisValue * joy_pitchsensitivity->value) * - aspeed * cl_pitchspeed->value; - } else { - cl.viewangles[PITCH] += - (fAxisValue * joy_pitchsensitivity->value) * - aspeed * cl_pitchspeed->value; - } - V_StopPitchDrift (); - } else { - // no pitch movement - // disable pitch return-to-center unless requested by - // user - // *** this code can be removed when the lookspring - // bug is fixed - // *** the bug always has the lookspring feature on - if (!lookspring->int_val) - V_StopPitchDrift (); - } - } else { - // user wants forward control to be forward control - if (fabs (fAxisValue) > joy_forwardthreshold->value) { - cmd->forwardmove += - (fAxisValue * joy_forwardsensitivity->value) * - speed * cl_forwardspeed->value; - } - } - break; - - case AxisSide: - if (fabs (fAxisValue) > joy_sidethreshold->value) { - cmd->sidemove += - (fAxisValue * joy_sidesensitivity->value) * speed * - cl_sidespeed->value; - } - break; - - case AxisTurn: - if ((in_strafe.state & 1) || (lookstrafe->int_val && freelook)) { - // user wants turn control to become side control - if (fabs (fAxisValue) > joy_sidethreshold->value) { - cmd->sidemove -= - (fAxisValue * joy_sidesensitivity->value) * speed * - cl_sidespeed->value; - } - } else { - // user wants turn control to be turn control - if (fabs (fAxisValue) > joy_yawthreshold->value) { - if (dwControlMap[i] == JOY_ABSOLUTE_AXIS) { - cl.viewangles[YAW] += - (fAxisValue * joy_yawsensitivity->value) * - aspeed * cl_yawspeed->value; - } else { - cl.viewangles[YAW] += - (fAxisValue * joy_yawsensitivity->value) * - speed * 180.0; - } - - } - } - break; - - case AxisLook: - if (freelook) { - if (fabs (fAxisValue) > joy_pitchthreshold->value) { - // pitch movement detected and pitch movement desired - // by user - if (dwControlMap[i] == JOY_ABSOLUTE_AXIS) { - cl.viewangles[PITCH] += - (fAxisValue * joy_pitchsensitivity->value) * - aspeed * cl_pitchspeed->value; - } else { - cl.viewangles[PITCH] += - (fAxisValue * joy_pitchsensitivity->value) * - speed * 180.0; - } - V_StopPitchDrift (); - } else { - // no pitch movement - // disable pitch return-to-center unless requested by - // user - // *** this code can be removed when the lookspring - // bug is fixed - // *** the bug always has the lookspring feature on - if (!lookspring->int_val) - V_StopPitchDrift (); - } - } - break; - - default: - break; - } - } - - // bounds check pitch - if (cl.viewangles[PITCH] > 80.0) - cl.viewangles[PITCH] = 80.0; - if (cl.viewangles[PITCH] < -70.0) - cl.viewangles[PITCH] = -70.0; -}