[core] Fix some mouse issues on SDL
(#3428)
* Fix mouse wheel getting stucked scrolling up or down * Fix mouse movement on 3D * Fix mouse button presses
This commit is contained in:
parent
84818c96f2
commit
73363f829b
1 changed files with 35 additions and 22 deletions
|
@ -60,7 +60,7 @@
|
|||
typedef struct {
|
||||
SDL_Window *window;
|
||||
SDL_GLContext glContext;
|
||||
|
||||
|
||||
SDL_Joystick *gamepad;
|
||||
} PlatformData;
|
||||
|
||||
|
@ -134,12 +134,12 @@ void InitWindow(int width, int height, const char *title)
|
|||
CORE.Input.Mouse.scale = (Vector2){ 1.0f, 1.0f };
|
||||
CORE.Input.Mouse.cursor = MOUSE_CURSOR_ARROW;
|
||||
CORE.Input.Gamepad.lastButtonPressed = GAMEPAD_BUTTON_UNKNOWN;
|
||||
|
||||
|
||||
// Initialize platform
|
||||
//--------------------------------------------------------------
|
||||
//--------------------------------------------------------------
|
||||
InitPlatform();
|
||||
//--------------------------------------------------------------
|
||||
|
||||
|
||||
// Initialize rlgl default data (buffers and shaders)
|
||||
// NOTE: CORE.Window.currentFbo.width and CORE.Window.currentFbo.height not used, just stored as globals in rlgl
|
||||
rlglInit(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height);
|
||||
|
@ -214,7 +214,7 @@ void CloseWindow(void)
|
|||
rlglClose(); // De-init rlgl
|
||||
|
||||
// De-initialize platform
|
||||
//--------------------------------------------------------------
|
||||
//--------------------------------------------------------------
|
||||
ClosePlatform();
|
||||
//--------------------------------------------------------------
|
||||
|
||||
|
@ -481,7 +481,7 @@ void SwapScreenBuffer(void)
|
|||
double GetTime(void)
|
||||
{
|
||||
unsigned int ms = SDL_GetTicks(); // Elapsed time in milliseconds since SDL_Init()
|
||||
double time = (double)ms/1000;
|
||||
double time = (double)ms/1000;
|
||||
return time;
|
||||
}
|
||||
|
||||
|
@ -531,6 +531,13 @@ void PollInputEvents(void)
|
|||
// Reset key repeats
|
||||
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++) CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||
|
||||
// Reset mouse wheel
|
||||
CORE.Input.Mouse.currentWheelMove.x = 0;
|
||||
CORE.Input.Mouse.currentWheelMove.y = 0;
|
||||
|
||||
// Register previous mouse position
|
||||
CORE.Input.Mouse.previousPosition = CORE.Input.Mouse.currentPosition;
|
||||
|
||||
// Reset last gamepad button/axis registered state
|
||||
CORE.Input.Gamepad.lastButtonPressed = GAMEPAD_BUTTON_UNKNOWN;
|
||||
for (int i = 0; i < MAX_GAMEPADS; i++) CORE.Input.Gamepad.axisCount[i] = 0;
|
||||
|
@ -551,6 +558,9 @@ void PollInputEvents(void)
|
|||
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||
}
|
||||
|
||||
// Register previous mouse states
|
||||
for (int i = 0; i < MAX_MOUSE_BUTTONS; i++) CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i];
|
||||
|
||||
// Poll input events for current plaform
|
||||
//-----------------------------------------------------------------------------
|
||||
/*
|
||||
|
@ -602,12 +612,15 @@ void PollInputEvents(void)
|
|||
case SDL_KEYUP: break;
|
||||
|
||||
// Check mouse events
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
{
|
||||
CORE.Input.Mouse.currentButtonState[event.button.button - 1] = 1;
|
||||
} break;
|
||||
case SDL_MOUSEBUTTONUP: break;
|
||||
case SDL_MOUSEWHEEL:
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
{
|
||||
CORE.Input.Mouse.currentButtonState[event.button.button - 1] = 0;
|
||||
} break;
|
||||
case SDL_MOUSEWHEEL:
|
||||
{
|
||||
CORE.Input.Mouse.currentWheelMove.x = (float)event.wheel.x;
|
||||
CORE.Input.Mouse.currentWheelMove.y = (float)event.wheel.y;
|
||||
|
@ -653,7 +666,7 @@ static int InitPlatform(void)
|
|||
// Initialize SDL internal global state
|
||||
int result = SDL_Init(SDL_INIT_EVERYTHING);
|
||||
if (result < 0) { TRACELOG(LOG_WARNING, "SDL: Failed to initialize SDL"); return -1; }
|
||||
|
||||
|
||||
unsigned int flags = 0;
|
||||
flags |= SDL_WINDOW_SHOWN;
|
||||
flags |= SDL_WINDOW_OPENGL;
|
||||
|
@ -662,12 +675,12 @@ static int InitPlatform(void)
|
|||
flags |= SDL_WINDOW_MOUSE_CAPTURE; // Window has mouse captured
|
||||
|
||||
// Check window creation flags
|
||||
if ((CORE.Window.flags & FLAG_FULLSCREEN_MODE) > 0)
|
||||
if ((CORE.Window.flags & FLAG_FULLSCREEN_MODE) > 0)
|
||||
{
|
||||
CORE.Window.fullscreen = true;
|
||||
flags |= SDL_WINDOW_FULLSCREEN;
|
||||
}
|
||||
|
||||
|
||||
//if ((CORE.Window.flags & FLAG_WINDOW_HIDDEN) == 0) flags |= SDL_WINDOW_HIDDEN;
|
||||
if ((CORE.Window.flags & FLAG_WINDOW_UNDECORATED) > 0) flags |= SDL_WINDOW_BORDERLESS;
|
||||
if ((CORE.Window.flags & FLAG_WINDOW_RESIZABLE) > 0) flags |= SDL_WINDOW_RESIZABLE;
|
||||
|
@ -684,11 +697,11 @@ static int InitPlatform(void)
|
|||
if ((CORE.Window.flags & FLAG_WINDOW_MOUSE_PASSTHROUGH) > 0) flags &= ~SDL_WINDOW_MOUSE_CAPTURE;
|
||||
|
||||
if ((CORE.Window.flags & FLAG_WINDOW_HIGHDPI) > 0) flags |= SDL_WINDOW_ALLOW_HIGHDPI;
|
||||
|
||||
|
||||
//if ((CORE.Window.flags & FLAG_WINDOW_TRANSPARENT) > 0) flags |= SDL_WINDOW_TRANSPARENT; // Alternative: SDL_GL_ALPHA_SIZE = 8
|
||||
|
||||
|
||||
//if ((CORE.Window.flags & FLAG_FULLSCREEN_DESKTOP) > 0) flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
|
||||
|
||||
|
||||
// NOTE: Some OpenGL context attributes must be set before window creation
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
|
||||
|
@ -702,12 +715,12 @@ static int InitPlatform(void)
|
|||
|
||||
// Init window
|
||||
platform.window = SDL_CreateWindow(CORE.Window.title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, CORE.Window.screen.width, CORE.Window.screen.height, flags);
|
||||
|
||||
|
||||
// Init OpenGL context
|
||||
platform.glContext = SDL_GL_CreateContext(platform.window);
|
||||
|
||||
|
||||
// Check window and glContext have been initialized succesfully
|
||||
if ((platform.window != NULL) && (platform.glContext != NULL))
|
||||
if ((platform.window != NULL) && (platform.glContext != NULL))
|
||||
{
|
||||
CORE.Window.ready = true;
|
||||
|
||||
|
@ -728,21 +741,21 @@ static int InitPlatform(void)
|
|||
// NOTE: GL procedures address loader is required to load extensions
|
||||
rlLoadExtensions(SDL_GL_GetProcAddress);
|
||||
|
||||
|
||||
|
||||
// Init input gamepad
|
||||
if (SDL_NumJoysticks() >= 1)
|
||||
{
|
||||
SDL_Joystick *gamepad = SDL_JoystickOpen(0);
|
||||
//if (SDL_Joystick *gamepad == NULL) SDL_Log("WARNING: Unable to open game controller! SDL Error: %s\n", SDL_GetError());
|
||||
}
|
||||
|
||||
|
||||
// Initialize hi-res timer
|
||||
//InitTimer();
|
||||
CORE.Time.previous = GetTime(); // Get time as double
|
||||
|
||||
|
||||
// Initialize base path for storage
|
||||
CORE.Storage.basePath = GetWorkingDirectory();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue