X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=d30c6a759f368321862876df7e02dfc8873ede85;hb=f219f9b10acc57d83de1f9256a47e1b5423ea084;hp=37b4a11266038598b04dbebfde5636274619cd20;hpb=6e35898f26d4755cde2bb8182c02de57e50dd028;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index 37b4a112..d30c6a75 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -204,90 +204,15 @@ static qboolean dinput_acquired; static unsigned int mstate_di; #endif -// 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 - -// joystick axes state -typedef struct -{ - float oldmove; - float move; - float mdelta; - double keytime; -}joy_axiscache_t; -static joy_axiscache_t joy_axescache[JOY_MAX_AXES]; - -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 = {CVAR_SAVE, "joystick","0", "enables joysticks"}; -static cvar_t joy_name = {0, "joyname", "joystick", "name of joystick to use (informational only, used only by joyadvanced 1 mode)"}; -static cvar_t joy_advanced = {0, "joyadvanced", "0", "use more than 2 axis joysticks (configuring this is very technical)"}; -static cvar_t joy_advaxisx = {0, "joyadvaxisx", "0", "axis mapping for joyadvanced 1 mode"}; -static cvar_t joy_advaxisy = {0, "joyadvaxisy", "0", "axis mapping for joyadvanced 1 mode"}; -static cvar_t joy_advaxisz = {0, "joyadvaxisz", "0", "axis mapping for joyadvanced 1 mode"}; -static cvar_t joy_advaxisr = {0, "joyadvaxisr", "0", "axis mapping for joyadvanced 1 mode"}; -static cvar_t joy_advaxisu = {0, "joyadvaxisu", "0", "axis mapping for joyadvanced 1 mode"}; -static cvar_t joy_advaxisv = {0, "joyadvaxisv", "0", "axis mapping for joyadvanced 1 mode"}; -static cvar_t joy_forwardthreshold = {0, "joyforwardthreshold", "0.15", "minimum joystick movement necessary to move forward"}; -static cvar_t joy_sidethreshold = {0, "joysidethreshold", "0.15", "minimum joystick movement necessary to move sideways (strafing)"}; -static cvar_t joy_pitchthreshold = {0, "joypitchthreshold", "0.15", "minimum joystick movement necessary to look up/down"}; -static cvar_t joy_yawthreshold = {0, "joyyawthreshold", "0.15", "minimum joystick movement necessary to turn left/right"}; -static cvar_t joy_forwardsensitivity = {0, "joyforwardsensitivity", "-1.0", "how fast the joystick moves forward"}; -static cvar_t joy_sidesensitivity = {0, "joysidesensitivity", "-1.0", "how fast the joystick moves sideways (strafing)"}; -static cvar_t joy_pitchsensitivity = {0, "joypitchsensitivity", "1.0", "how fast the joystick looks up/down"}; -static cvar_t joy_yawsensitivity = {0, "joyyawsensitivity", "-1.0", "how fast the joystick turns left/right"}; -static cvar_t joy_wwhack1 = {0, "joywwhack1", "0.0", "special hack for wingman warrior"}; -static cvar_t joy_wwhack2 = {0, "joywwhack2", "0.0", "special hack for wingman warrior"}; -static cvar_t joy_axiskeyevents = {CVAR_SAVE, "joy_axiskeyevents", "0", "generate uparrow/leftarrow etc. keyevents for joystick axes, use if your joystick driver is not generating them"}; -static cvar_t joy_axiskeyevents_deadzone = {CVAR_SAVE, "joy_axiskeyevents_deadzone", "0.5", "deadzone value for axes"}; - static cvar_t vid_forcerefreshrate = {0, "vid_forcerefreshrate", "0", "try to set the given vid_refreshrate even if Windows doesn't list it as valid video mode"}; -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; - #ifdef SUPPORTDIRECTX static LPDIRECTINPUT g_pdi; static LPDIRECTINPUTDEVICE g_pMouse; static HINSTANCE hInstDI; #endif -static JOYINFOEX ji; - // forward-referenced functions -static void IN_StartupJoystick (void); -static void Joy_AdvancedUpdate_f (void); -static void IN_JoyMove (void); static void IN_StartupMouse (void); @@ -313,6 +238,7 @@ void VID_Finish (void) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: if (vid_usingvsync != vid_usevsync) { @@ -608,7 +534,6 @@ static keynum_t buttonremap[16] = }; /* main window procedure */ -static qboolean IN_JoystickBlockDoubledKeyEvents(int keycode); LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LONG lRet = 1; @@ -653,7 +578,7 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) else if( charlength == 2 ) { asciichar[0] = asciichar[1]; } - if (!IN_JoystickBlockDoubledKeyEvents(vkey)) + if (!VID_JoyBlockEmulatedKeys(vkey)) Key_Event (vkey, asciichar[0], down); break; @@ -1389,7 +1314,6 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) vid_initialized = true; IN_StartupMouse (); - IN_StartupJoystick (); if (qwglSwapIntervalEXT) { @@ -1604,6 +1528,8 @@ qboolean VID_InitModeDX(viddef_mode_t *mode, int version) vid.texarrayunits = bound(8, vid.texarrayunits, MAX_TEXTUREUNITS); Con_DPrintf("Using D3D9.0 rendering path - %i texture matrix, %i texture images, %i texcoords, shadowmapping supported%s\n", vid.texunits, vid.teximageunits, vid.texarrayunits, vid.maxdrawbuffers > 1 ? ", MRT detected (allows prepass deferred lighting)" : ""); vid.renderpath = RENDERPATH_D3D9; + vid.sRGBcapable2D = false; + vid.sRGBcapable3D = true; vid.useinterleavedarrays = true; Cvar_SetQuick(&gl_info_vendor, gl_vendor); @@ -1633,7 +1559,6 @@ qboolean VID_InitModeDX(viddef_mode_t *mode, int version) vid_initialized = true; IN_StartupMouse (); - IN_StartupJoystick (); return true; } @@ -1915,7 +1840,6 @@ qboolean VID_InitModeSOFT(viddef_mode_t *mode) vid_initialized = true; IN_StartupMouse (); - IN_StartupJoystick (); return true; } @@ -1945,6 +1869,7 @@ void VID_Shutdown (void) if(vid_initialized == false) return; + VID_EnableJoystick(false); VID_SetMouse(false, false, false); VID_RestoreSystemGamma(); @@ -2084,6 +2009,28 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso } } +void VID_BuildJoyState(vid_joystate_t *joystate) +{ + VID_Shared_BuildJoyState_Begin(joystate); + VID_Shared_BuildJoyState_Finish(joystate); +} + +void VID_EnableJoystick(qboolean enable) +{ + int index = joy_enable.integer > 0 ? joy_index.integer : -1; + qboolean success = false; + int sharedcount = 0; + sharedcount = VID_Shared_SetJoystick(index); + if (index >= 0 && index < sharedcount) + success = true; + + // update cvar containing count of XInput joysticks + if (joy_detected.integer != sharedcount) + Cvar_SetValueQuick(&joy_detected, sharedcount); + + if (joy_active.integer != (success ? 1 : 0)) + Cvar_SetValueQuick(&joy_active, success ? 1 : 0); +} #ifdef SUPPORTDIRECTX /* @@ -2195,7 +2142,7 @@ static void IN_StartupMouse (void) mouseinitialized = true; #ifdef SUPPORTDIRECTX -// COMMANDLINEOPTION: Windows Input: -dinput enables DirectInput for mouse/joystick input +// COMMANDLINEOPTION: Windows Input: -dinput enables DirectInput for mouse input if (COM_CheckParm ("-dinput")) dinput = IN_InitDInput (); @@ -2305,580 +2252,19 @@ IN_Move */ void IN_Move (void) { + vid_joystate_t joystate; if (vid_activewindow && !vid_reallyhidden) - { IN_MouseMove (); - IN_JoyMove (); - } + VID_EnableJoystick(true); + VID_BuildJoyState(&joystate); + VID_ApplyJoyState(&joystate); } -/* -=============== -IN_StartupJoystick -=============== -*/ -static void IN_StartupJoystick (void) -{ - int numdevs; - JOYCAPS jc; - MMRESULT mmr; - mmr = 0; - - // assume no joystick - joy_avail = false; - - // abort startup if user requests no joystick -// COMMANDLINEOPTION: Windows Input: -nojoy disables joystick support, may be a small speed increase - if (COM_CheckParm ("-nojoy")) - return; - - // verify joystick driver is present - if ((numdevs = joyGetNumDevs ()) == 0) - { - Con_Print("\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= JOY_MAX_AXES) - return 0; // no such axis on this joystick - - // get the floating point zero-centered, potentially-inverted data for the current axis - fAxisValue = (float) *pdwRawValue[axis]; - - // move centerpoint to zero - fAxisValue -= 32768.0; - - if (joy_wwhack2.integer != 0.0) - { - if (dwAxisMap[axis] == 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; - - // deadzone around center - if (fabs(fAxisValue) < deadzone) - return 0; - - // apply sensitivity - return fAxisValue * sensitivity; -} - -/* -=========== - IN_JoystickKeyeventForAxis -=========== -*/ - -static void IN_JoystickKeyeventForAxis(int axis, int key_pos, int key_neg) -{ - double joytime; - - if (axis < 0 || axis >= JOY_MAX_AXES) - return; // no such axis on this joystick - - joytime = Sys_DoubleTime(); - // no key event, continuous keydown event - if (joy_axescache[axis].move == joy_axescache[axis].oldmove) - { - if (joy_axescache[axis].move != 0 && joytime > joy_axescache[axis].keytime) - { - //Con_Printf("joy %s %i %f\n", Key_KeynumToString((joy_axescache[axis].move > 0) ? key_pos : key_neg), 1, cl.time); - Key_Event((joy_axescache[axis].move > 0) ? key_pos : key_neg, 0, 1); - joy_axescache[axis].keytime = joytime + 0.5 / 20; - } - return; - } - // generate key up event - if (joy_axescache[axis].oldmove) - { - //Con_Printf("joy %s %i %f\n", Key_KeynumToString((joy_axescache[axis].oldmove > 0) ? key_pos : key_neg), 1, cl.time); - Key_Event((joy_axescache[axis].oldmove > 0) ? key_pos : key_neg, 0, 0); - } - // generate key down event - if (joy_axescache[axis].move) - { - //Con_Printf("joy %s %i %f\n", Key_KeynumToString((joy_axescache[axis].move > 0) ? key_pos : key_neg), 1, cl.time); - Key_Event((joy_axescache[axis].move > 0) ? key_pos : key_neg, 0, 1); - joy_axescache[axis].keytime = joytime + 0.5; - } -} - -/* -=========== - IN_JoystickBlockDoubledKeyEvents -=========== -*/ - -static qboolean IN_ReadJoystick (void); -static qboolean IN_JoystickBlockDoubledKeyEvents(int keycode) -{ - int axis; - - if (!joy_axiskeyevents.integer) - return false; - - // block keyevent if it's going to be provided by joystick keyevent system - if (joy_avail) - { - // collect the joystick data, if possible - if (IN_ReadJoystick() != true) - return false; - axis = IN_JoystickGetAxisNum(AxisForward); - if (keycode == K_UPARROW || keycode == K_DOWNARROW) - if (IN_JoystickGetAxis(axis, 1, joy_axiskeyevents_deadzone.value) || joy_axescache[axis].move || joy_axescache[axis].oldmove) - return true; - axis = IN_JoystickGetAxisNum(AxisSide); - if (keycode == K_RIGHTARROW || keycode == K_LEFTARROW) - if (IN_JoystickGetAxis(axis, 1, joy_axiskeyevents_deadzone.value) || joy_axescache[axis].move || joy_axescache[axis].oldmove) - return true; - } - - return false; -} - -/* -=========== - IN_JoyMove -=========== -*/ -static void IN_JoyMove (void) -{ - float speed, aspeed; - float fAxisValue; - int i, mouselook = (in_mlook.state & 1) || freelook.integer, AxisForwardIndex = -1, AxisSideIndex = -1; - - // 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; - } - - if (joy_avail) - { - int i, key_index; - DWORD buttonstate, povstate; - - // 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 < (int) joy_numbuttons ; i++) - { - if ( (buttonstate & (1<