mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-22 11:51:41 +00:00
Mouse improvements
This commit is contained in:
parent
3faa98cf4a
commit
eb2dc9e99b
10 changed files with 153 additions and 30 deletions
45
src/d_main.c
45
src/d_main.c
|
@ -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);
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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}
|
||||
};
|
||||
|
||||
|
|
32
src/g_game.c
32
src/g_game.c
|
@ -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();
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue