// in_win.c -- windows 95 mouse and joystick code
// 02/21/97 JCB Added extended DirectInput code to support external controllers.
-#include <dinput.h>
#include "quakedef.h"
#include "winquake.h"
//#include "dosisms.h"
+#include <dinput.h>
+
#define DINPUT_BUFFERSIZE 16
#define iDirectInputCreate(a,b,c,d) pDirectInputCreate(a,b,c,d)
LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter);
// mouse variables
-cvar_t m_filter = {"m_filter","0"};
+cvar_t m_filter = {CVAR_SAVE, "m_filter","0"};
int mouse_buttons;
int mouse_oldbuttonstate;
// 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.
-cvar_t in_joystick = {"joystick","0", true};
-cvar_t joy_name = {"joyname", "joystick"};
-cvar_t joy_advanced = {"joyadvanced", "0"};
-cvar_t joy_advaxisx = {"joyadvaxisx", "0"};
-cvar_t joy_advaxisy = {"joyadvaxisy", "0"};
-cvar_t joy_advaxisz = {"joyadvaxisz", "0"};
-cvar_t joy_advaxisr = {"joyadvaxisr", "0"};
-cvar_t joy_advaxisu = {"joyadvaxisu", "0"};
-cvar_t joy_advaxisv = {"joyadvaxisv", "0"};
-cvar_t joy_forwardthreshold = {"joyforwardthreshold", "0.15"};
-cvar_t joy_sidethreshold = {"joysidethreshold", "0.15"};
-cvar_t joy_pitchthreshold = {"joypitchthreshold", "0.15"};
-cvar_t joy_yawthreshold = {"joyyawthreshold", "0.15"};
-cvar_t joy_forwardsensitivity = {"joyforwardsensitivity", "-1.0"};
-cvar_t joy_sidesensitivity = {"joysidesensitivity", "-1.0"};
-cvar_t joy_pitchsensitivity = {"joypitchsensitivity", "1.0"};
-cvar_t joy_yawsensitivity = {"joyyawsensitivity", "-1.0"};
-cvar_t joy_wwhack1 = {"joywwhack1", "0.0"};
-cvar_t joy_wwhack2 = {"joywwhack2", "0.0"};
+cvar_t in_joystick = {CVAR_SAVE, "joystick","0"};
+cvar_t joy_name = {0, "joyname", "joystick"};
+cvar_t joy_advanced = {0, "joyadvanced", "0"};
+cvar_t joy_advaxisx = {0, "joyadvaxisx", "0"};
+cvar_t joy_advaxisy = {0, "joyadvaxisy", "0"};
+cvar_t joy_advaxisz = {0, "joyadvaxisz", "0"};
+cvar_t joy_advaxisr = {0, "joyadvaxisr", "0"};
+cvar_t joy_advaxisu = {0, "joyadvaxisu", "0"};
+cvar_t joy_advaxisv = {0, "joyadvaxisv", "0"};
+cvar_t joy_forwardthreshold = {0, "joyforwardthreshold", "0.15"};
+cvar_t joy_sidethreshold = {0, "joysidethreshold", "0.15"};
+cvar_t joy_pitchthreshold = {0, "joypitchthreshold", "0.15"};
+cvar_t joy_yawthreshold = {0, "joyyawthreshold", "0.15"};
+cvar_t joy_forwardsensitivity = {0, "joyforwardsensitivity", "-1.0"};
+cvar_t joy_sidesensitivity = {0, "joysidesensitivity", "-1.0"};
+cvar_t joy_pitchsensitivity = {0, "joypitchsensitivity", "1.0"};
+cvar_t joy_yawsensitivity = {0, "joyyawsensitivity", "-1.0"};
+cvar_t joy_wwhack1 = {0, "joywwhack1", "0.0"};
+cvar_t joy_wwhack2 = {0, "joywwhack2", "0.0"};
qboolean joy_avail, joy_advancedinit, joy_haspov;
DWORD joy_oldbuttonstate, joy_oldpovstate;
void IN_JoyMove (usercmd_t *cmd);
-/*
-===========
-Force_CenterView_f
-===========
-*/
-void Force_CenterView_f (void)
-{
- cl.viewangles[PITCH] = 0;
-}
-
-
/*
===========
IN_UpdateClipCursor
*/
void IN_ShowMouse (void)
{
-
if (!mouseshowtoggle)
{
ShowCursor (true);
*/
void IN_HideMouse (void)
{
-
if (mouseshowtoggle)
{
ShowCursor (false);
SetCursorPos (window_center_x, window_center_y);
SetCapture (mainwindow);
ClipCursor (&window_rect);
+
}
mouseactive = true;
}
-/*
-===========
-IN_SetQuakeMouseState
-===========
-*/
-void IN_SetQuakeMouseState (void)
-{
- if (mouseactivatetoggle)
- IN_ActivateMouse ();
-}
-
-
/*
===========
IN_DeactivateMouse
}
-/*
-===========
-IN_RestoreOriginalMouseState
-===========
-*/
-void IN_RestoreOriginalMouseState (void)
-{
- if (mouseactivatetoggle)
- {
- IN_DeactivateMouse ();
- mouseactivatetoggle = true;
- }
-
-// try to redraw the cursor so it gets reinitialized, because sometimes it
-// has garbage after the mode switch
- ShowCursor (true);
- ShowCursor (false);
-}
-
-
/*
===========
IN_InitDInput
Cvar_RegisterVariable (&joy_wwhack1);
Cvar_RegisterVariable (&joy_wwhack2);
- Cmd_AddCommand ("force_centerview", Force_CenterView_f);
Cmd_AddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f);
uiWheelMessage = RegisterWindowMessage ( "MSWHEEL_ROLLMSG" );
*/
void IN_Shutdown (void)
{
-
+// usingmouse = false;
IN_DeactivateMouse ();
IN_ShowMouse ();
*/
void IN_MouseMove (usercmd_t *cmd)
{
- int mx, my;
- int i;
+ int i, mx, my, mouselook = (in_mlook.state & 1) || freelook.integer;
DIDEVICEOBJECTDATA od;
DWORD dwElements;
HRESULT hr;
if (!mouseactive)
+ {
+ GetCursorPos (¤t_pos);
+ ui_mouseupdate(current_pos.x - window_x, current_pos.y - window_y);
return;
+ }
if (dinput)
{
else
mstate_di &= ~(1<<1);
break;
-
+
case DIMOFS_BUTTON2:
if (od.dwData & 0x80)
mstate_di |= (1<<2);
{
Key_Event (K_MOUSE1 + i, false);
}
- }
-
+ }
+
mouse_oldbuttonstate = mstate_di;
}
else
//if (mx || my)
// Con_DPrintf("mx=%d, my=%d\n", mx, my);
- if (m_filter.value)
+ if (m_filter.integer)
{
mouse_x = (mx + old_mouse_x) * 0.5;
mouse_y = (my + old_mouse_y) * 0.5;
old_mouse_x = mx;
old_mouse_y = my;
- mouse_x *= sensitivity.value;
- mouse_y *= sensitivity.value;
+ // LordHavoc: viewzoom affects mouse sensitivity for sniping
+ mouse_x *= sensitivity.value * cl.viewzoom;
+ mouse_y *= sensitivity.value * cl.viewzoom;
// add mouse X/Y movement to cmd
- if ( (in_strafe.state & 1) || (lookstrafe.value && (in_mlook.state & 1) ))
+ if ( (in_strafe.state & 1) || (lookstrafe.integer && mouselook))
cmd->sidemove += m_side.value * mouse_x;
else
cl.viewangles[YAW] -= m_yaw.value * mouse_x;
- if (in_mlook.state & 1)
+ if (mouselook)
V_StopPitchDrift ();
// LordHavoc: changed limits on pitch from -70 to 80, to -90 to 90
- if ( (in_mlook.state & 1) && !(in_strafe.state & 1))
- {
+ if (mouselook && !(in_strafe.state & 1))
cl.viewangles[PITCH] += m_pitch.value * mouse_y;
- if (cl.viewangles[PITCH] > 90)
- cl.viewangles[PITCH] = 90;
- if (cl.viewangles[PITCH] < -90)
- cl.viewangles[PITCH] = -90;
- }
else
{
if ((in_strafe.state & 1) && noclip_anglehack)
*/
void IN_Move (usercmd_t *cmd)
{
-
if (ActiveApp && !Minimized)
{
IN_MouseMove (cmd);
IN_JoyMove (cmd);
}
+
+ cl.viewangles[PITCH] = bound (in_pitch_min.value, cl.viewangles[PITCH], in_pitch_max.value);
}
pdwRawValue[i] = RawValuePointer(i);
}
- if( joy_advanced.value == 0.0)
+ if( joy_advanced.integer == 0)
{
// default joystick initialization
// 2 axes only with joystick control
// 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.value != 0.0)
+ if (joy_wwhack1.integer != 0.0)
{
ji.dwUpos += 100;
}
{
float speed, aspeed;
float fAxisValue, fTemp;
- int i;
+ int i, mouselook = (in_mlook.state & 1) || freelook.integer;
// complete initialization if first time in
// this is needed as cvars are not available at initialization time
}
// verify joystick is available and that the user wants to use it
- if (!joy_avail || !in_joystick.value)
+ if (!joy_avail || !in_joystick.integer)
{
return;
}
-
+
// collect the joystick data, if possible
if (IN_ReadJoystick () != true)
{
speed = cl_movespeedkey.value;
else
speed = 1;
- aspeed = speed * host_realframetime;
+ // LordHavoc: viewzoom affects sensitivity for sniping
+ aspeed = speed * host_realframetime * cl.viewzoom;
// loop through the axes
for (i = 0; i < JOY_MAX_AXES; i++)
// move centerpoint to zero
fAxisValue -= 32768.0;
- if (joy_wwhack2.value != 0.0)
+ if (joy_wwhack2.integer != 0.0)
{
if (dwAxisMap[i] == AxisTurn)
{
switch (dwAxisMap[i])
{
case AxisForward:
- if ((joy_advanced.value == 0.0) && (in_mlook.state & 1))
+ if ((joy_advanced.integer == 0) && mouselook)
{
// user wants forward control to become look control
if (fabs(fAxisValue) > joy_pitchthreshold.value)
break;
case AxisTurn:
- if ((in_strafe.state & 1) || (lookstrafe.value && (in_mlook.state & 1)))
+ if ((in_strafe.state & 1) || (lookstrafe.integer && mouselook))
{
// user wants turn control to become side control
if (fabs(fAxisValue) > joy_sidethreshold.value)
break;
case AxisLook:
- if (in_mlook.state & 1)
+ if (mouselook)
{
if (fabs(fAxisValue) > joy_pitchthreshold.value)
{
// 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.value == 0.0)
+ if(lookspring.integer == 0)
V_StopPitchDrift();
}
}