Mouse improvements

This commit is contained in:
SwitchKaze 2021-03-25 21:14:59 -05:00
parent 3faa98cf4a
commit eb2dc9e99b
10 changed files with 153 additions and 30 deletions

View file

@ -176,8 +176,10 @@ void D_ProcessEvents(void)
boolean eaten;
// Reset possibly stale mouse info
G_SetMouseData(0, 0, 1);
G_SetMouseData(0, 0, 2);
G_SetMouseDeltas(0, 0, 1);
G_SetMouseDeltas(0, 0, 2);
mouse.buttons &= ~(MB_SCROLLUP|MB_SCROLLDOWN);
mouse2.buttons &= ~(MB_SCROLLUP|MB_SCROLLDOWN);
for (; eventtail != eventhead; eventtail = (eventtail+1) & (MAXEVENTS-1))
{
@ -185,6 +187,41 @@ void D_ProcessEvents(void)
ev = &events[eventtail];
// Set mouse buttons early in case event is eaten later
if (ev->type == ev_keydown || ev->type == ev_keyup)
{
// Mouse buttons
if ((UINT32)(ev->data1 - KEY_MOUSE1) < MOUSEBUTTONS)
{
if (ev->type == ev_keydown)
mouse.buttons |= 1 << (ev->data1 - KEY_MOUSE1);
else
mouse.buttons &= ~(1 << (ev->data1 - KEY_MOUSE1));
}
else if ((UINT32)(ev->data1 - KEY_2MOUSE1) < MOUSEBUTTONS)
{
if (ev->type == ev_keydown)
mouse2.buttons |= 1 << (ev->data1 - KEY_2MOUSE1);
else
mouse2.buttons &= ~(1 << (ev->data1 - KEY_2MOUSE1));
}
// Scroll (has no keyup event)
else switch (ev->data1) {
case KEY_MOUSEWHEELUP:
mouse.buttons |= MB_SCROLLUP;
break;
case KEY_MOUSEWHEELDOWN:
mouse.buttons |= MB_SCROLLDOWN;
break;
case KEY_2MOUSEWHEELUP:
mouse2.buttons |= MB_SCROLLUP;
break;
case KEY_2MOUSEWHEELDOWN:
mouse2.buttons |= MB_SCROLLDOWN;
break;
}
}
// Screenshots over everything so that they can be taken anywhere.
if (M_ScreenshotResponder(ev))
continue; // ate the event
@ -242,9 +279,9 @@ void D_ProcessEvents(void)
}
if (mouse.rdx || mouse.rdy)
G_SetMouseData(mouse.rdx, mouse.rdy, 1);
G_SetMouseDeltas(mouse.rdx, mouse.rdy, 1);
if (mouse2.rdx || mouse2.rdy)
G_SetMouseData(mouse2.rdx, mouse2.rdy, 2);
G_SetMouseDeltas(mouse2.rdx, mouse2.rdy, 2);
}
//

View file

@ -23,6 +23,7 @@
#include "i_sound.h" // musictype_t (for lua)
#include "g_state.h" // gamestate_t (for lua)
#include "g_game.h" // Joystick axes (for lua)
#include "i_joy.h"
#include "g_input.h" // Game controls (for lua)
#include "deh_tables.h"
@ -5468,6 +5469,7 @@ struct int_const_s const INT_CONST[] = {
{"JA_SPIN",JA_SPIN},
{"JA_FIRE",JA_FIRE},
{"JA_FIRENORMAL",JA_FIRENORMAL},
{"JOYAXISRANGE",JOYAXISRANGE},
// Game controls
{"gc_null",gc_null},
@ -5514,6 +5516,18 @@ struct int_const_s const INT_CONST[] = {
{"gc_custom3",gc_custom3},
{"num_gamecontrols",num_gamecontrols},
// Mouse buttons
{"MB_BUTTON1",MB_BUTTON1},
{"MB_BUTTON2",MB_BUTTON2},
{"MB_BUTTON3",MB_BUTTON3},
{"MB_BUTTON4",MB_BUTTON4},
{"MB_BUTTON5",MB_BUTTON5},
{"MB_BUTTON6",MB_BUTTON6},
{"MB_BUTTON7",MB_BUTTON7},
{"MB_BUTTON8",MB_BUTTON8},
{"MB_SCROLLUP",MB_SCROLLUP},
{"MB_SCROLLDOWN",MB_SCROLLDOWN},
{NULL,0}
};

View file

@ -1078,7 +1078,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
angle_t drawangleoffset = (player->powers[pw_carry] == CR_ROLLOUT) ? ANGLE_180 : 0;
INT32 chasecam, chasefreelook, alwaysfreelook, usejoystick, invertmouse, turnmultiplier, mousemove;
controlstyle_e controlstyle = G_ControlStyle(ssplayer);
mouse_t *m = &mouse;
INT32 mdx, mdy, mldy;
static INT32 turnheld[2]; // for accelerative turning
static boolean keyboard_look[2]; // true if lookup/down using keyboard
@ -1101,6 +1101,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
invertmouse = cv_invertmouse.value;
turnmultiplier = cv_cam_turnmultiplier.value;
mousemove = cv_mousemove.value;
mdx = mouse.dx;
mdy = -mouse.dy;
mldy = -mouse.mlookdy;
G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver
}
else
@ -1112,10 +1115,15 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
invertmouse = cv_invertmouse2.value;
turnmultiplier = cv_cam2_turnmultiplier.value;
mousemove = cv_mousemove2.value;
m = &mouse2;
mdx = mouse2.dx;
mdy = -mouse2.dy;
mldy = -mouse2.mlookdy;
G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); // empty, or external driver
}
if (menuactive || CON_Ready() || chat_on)
mdx = mdy = mldy = 0;
strafeisturn = controlstyle == CS_SIMPLE && ticcmd_centerviewdown[forplayer] &&
((cv_cam_lockedinput[forplayer].value && !ticcmd_ztargetfocus[forplayer]) || (player->pflags & PF_STARTDASH)) &&
!player->climbing && player->powers[pw_carry] != CR_MINECART;
@ -1455,7 +1463,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
keyboard_look[forplayer] = false;
// looking up/down
*myaiming += (m->mlookdy<<19)*player_invert*screen_invert;
*myaiming += (mldy<<19)*player_invert*screen_invert;
}
if (analogjoystickmove && joyaiming[forplayer] && lookjoystickvector.yaxis != 0 && configlookaxis != 0)
@ -1489,22 +1497,22 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
}
if (!mouseaiming && mousemove)
forward += m->dy;
forward += mdy;
if ((!demoplayback && (player->pflags & PF_SLIDING))) // Analog for mouse
side += m->dx*2;
side += mdx*2;
else if (controlstyle == CS_LMAOGALOG)
{
if (m->dx)
if (mdx)
{
if (m->dx > 0)
if (mdx > 0)
cmd->buttons |= BT_CAMRIGHT;
else
cmd->buttons |= BT_CAMLEFT;
}
}
else
cmd->angleturn = (INT16)(cmd->angleturn - (m->dx*8));
cmd->angleturn = (INT16)(cmd->angleturn - (mdx*8));
if (forward > MAXPLMOVE)
forward = MAXPLMOVE;
@ -1850,8 +1858,8 @@ void G_DoLoadLevel(boolean resetplayer)
joyxmove[i] = joyymove[i] = 0;
joy2xmove[i] = joy2ymove[i] = 0;
}
G_SetMouseData(0, 0, 1);
G_SetMouseData(0, 0, 2);
G_SetMouseDeltas(0, 0, 1);
G_SetMouseDeltas(0, 0, 2);
// clear hud messages remains (usually from game startup)
CON_ClearHUD();
@ -3082,8 +3090,8 @@ void G_DoReborn(INT32 playernum)
joyxmove[i] = joyymove[i] = 0;
joy2xmove[i] = joy2ymove[i] = 0;
}
G_SetMouseData(0, 0, 1);
G_SetMouseData(0, 0, 2);
G_SetMouseDeltas(0, 0, 1);
G_SetMouseDeltas(0, 0, 2);
// clear hud messages remains (usually from game startup)
CON_ClearHUD();

View file

@ -138,8 +138,6 @@ void G_MapEventsToControls(event_t *ev)
break;
case ev_mouse: // buttons are virtual keys
if (menuactive || CON_Ready() || chat_on)
break;
mouse.rdx = ev->data2;
mouse.rdy = ev->data3;
break;
@ -1070,19 +1068,15 @@ void Command_Setcontrol2_f(void)
setcontrol(gamecontrolbis);
}
void G_SetMouseData(INT32 realdx, INT32 realdy, UINT8 ssplayer)
void G_SetMouseDeltas(INT32 dx, INT32 dy, UINT8 ssplayer)
{
mouse_t *m = ssplayer == 1 ? &mouse : &mouse2;
consvar_t *cvsens, *cvysens;
if (!realdx && !realdy) {
memset(m, 0, sizeof(*m));
return;
}
cvsens = ssplayer == 1 ? &cv_mousesens : &cv_mousesens2;
cvysens = ssplayer == 1 ? &cv_mouseysens : &cv_mouseysens2;
m->rdx = realdx;
m->rdy = realdy;
m->rdx = dx;
m->rdy = dy;
m->dx = (INT32)(m->rdx*((cvsens->value*cvsens->value)/110.0f + 0.1f));
m->dy = (INT32)(m->rdy*((cvsens->value*cvsens->value)/110.0f + 0.1f));
m->mlookdy = (INT32)(m->rdy*((cvysens->value*cvsens->value)/110.0f + 0.1f));

View file

@ -123,8 +123,20 @@ typedef struct
INT32 mlookdy; // dy with mouselook sensitivity
INT32 rdx; // deltas without sensitivity
INT32 rdy;
UINT16 buttons;
} mouse_t;
#define MB_BUTTON1 0x0001
#define MB_BUTTON2 0x0002
#define MB_BUTTON3 0x0004
#define MB_BUTTON4 0x0008
#define MB_BUTTON5 0x0010
#define MB_BUTTON6 0x0020
#define MB_BUTTON7 0x0040
#define MB_BUTTON8 0x0080
#define MB_SCROLLUP 0x0100
#define MB_SCROLLDOWN 0x0200
extern mouse_t mouse;
extern mouse_t mouse2;
@ -184,6 +196,6 @@ void G_SaveKeySetting(FILE *f, INT32 (*fromcontrols)[2], INT32 (*fromcontrolsbis
INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify);
// sets the members of a mouse_t given position deltas
void G_SetMouseData(INT32 realdx, INT32 realdy, UINT8 ssplayer);
void G_SetMouseDeltas(INT32 dx, INT32 dy, UINT8 ssplayer);
#endif

View file

@ -314,4 +314,16 @@ const char *I_ClipboardPaste(void);
void I_RegisterSysCommands(void);
/** \brief Return the position of the cursor relative to the top-left window corner.
*/
void I_GetCursorPosition(INT32 *x, INT32 *y);
/** \brief Retursn whether the mouse is grabbed
*/
boolean I_GetMouseGrab(void);
/** \brief Sets whether the mouse is grabbed
*/
void I_SetMouseGrab(boolean grab);
#endif

View file

@ -14,6 +14,7 @@
#include "g_input.h"
#include "g_game.h"
#include "hu_stuff.h"
#include "i_system.h"
#include "lua_script.h"
#include "lua_libs.h"
@ -103,6 +104,28 @@ static int lib_shiftKeyNum(lua_State *L)
return 1;
}
static int lib_getMouseGrab(lua_State *L)
{
lua_pushboolean(L, I_GetMouseGrab());
return 1;
}
static int lib_setMouseGrab(lua_State *L)
{
boolean grab = luaL_checkboolean(L, 1);
I_SetMouseGrab(grab);
return 0;
}
static boolean lib_getCursorPosition(lua_State *L)
{
int x, y;
I_GetCursorPosition(&x, &y);
lua_pushinteger(L, x);
lua_pushinteger(L, y);
return 2;
}
static luaL_Reg lib[] = {
{"G_GameControlDown", lib_gameControlDown},
{"G_GameControl2Down", lib_gameControl2Down},
@ -114,6 +137,9 @@ static luaL_Reg lib[] = {
{"G_KeyStringToNum", lib_keyStringToNum},
{"HU_KeyNumPrintable", lib_keyNumPrintable},
{"HU_ShiftKeyNum", lib_shiftKeyNum},
{"I_GetMouseGrab", lib_getMouseGrab},
{"I_SetMouseGrab", lib_setMouseGrab},
{"I_GetCursorPosition", lib_getCursorPosition},
{NULL, NULL}
};
@ -167,6 +193,8 @@ static int mouse_get(lua_State *L)
lua_pushinteger(L, m->rdx);
else if (fastcmp(field,"rdy"))
lua_pushinteger(L, m->rdy);
else if (fastcmp(field,"buttons"))
lua_pushinteger(L, m->buttons);
else
return luaL_error(L, "mouse_t has no field named %s", field);

View file

@ -3305,7 +3305,7 @@ boolean M_Responder(event_t *ev)
}
else if (ev->type == ev_mouse && mousewait < I_GetTime())
{
pmousey += ev->data3;
pmousey -= ev->data3;
if (pmousey < lasty-30)
{
ch = KEY_DOWNARROW;

View file

@ -1969,7 +1969,7 @@ void I_GetMouseEvents(void)
event.data1 = 0;
// event.data1 = buttons; // not needed
event.data2 = handlermouse2x << 1;
event.data3 = -handlermouse2y << 1;
event.data3 = handlermouse2y << 1;
handlermouse2x = 0;
handlermouse2y = 0;

View file

@ -405,6 +405,19 @@ void I_UpdateMouseGrab(void)
SDLdoGrabMouse();
}
boolean I_GetMouseGrab(void)
{
return SDL_GetWindowGrab(window);
}
void I_SetMouseGrab(boolean grab)
{
if (grab)
SDLdoGrabMouse();
else
SDLdoUngrabMouse();
}
static void VID_Command_NumModes_f (void)
{
CONS_Printf(M_GetText("%d video mode(s) available(s)\n"), VID_NumModes());
@ -673,8 +686,8 @@ static void Impl_HandleMouseMotionEvent(SDL_MouseMotionEvent evt)
{
if (SDL_GetMouseFocus() == window && SDL_GetKeyboardFocus() == window)
{
mousemovex += evt.xrel;
mousemovey += -evt.yrel;
mousemovex += evt.xrel;
mousemovey += evt.yrel;
SDL_SetWindowGrab(window, SDL_TRUE);
}
firstmove = false;
@ -1938,3 +1951,8 @@ void I_ShutdownGraphics(void)
framebuffer = SDL_FALSE;
}
#endif
void I_GetCursorPosition(INT32 *x, INT32 *y)
{
SDL_GetMouseState(x, y);
}