Fix mouse warping after ending relative mode
This commit is contained in:
@@ -376,7 +376,6 @@ public:
|
|||||||
void SetMousePosition(const Float2& newPosition) final override
|
void SetMousePosition(const Float2& newPosition) final override
|
||||||
{
|
{
|
||||||
SDL_WarpMouseGlobal(newPosition.X, newPosition.Y);
|
SDL_WarpMouseGlobal(newPosition.X, newPosition.Y);
|
||||||
|
|
||||||
OnMouseMoved(newPosition);
|
OnMouseMoved(newPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -385,15 +384,19 @@ public:
|
|||||||
if (relativeMode == _relativeMode)
|
if (relativeMode == _relativeMode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
auto sdlWindow = static_cast<SDLWindow*>(window)->GetSDLWindow();
|
||||||
if (relativeMode)
|
if (relativeMode)
|
||||||
SDL_GetGlobalMouseState(&oldPosition.X, &oldPosition.Y);
|
SDL_GetMouseState(&oldPosition.X, &oldPosition.Y);
|
||||||
|
|
||||||
Mouse::SetRelativeMode(relativeMode, window);
|
Mouse::SetRelativeMode(relativeMode, window);
|
||||||
if (!SDL_SetWindowRelativeMouseMode(static_cast<SDLWindow*>(window)->_window, relativeMode))
|
if (!SDL_SetWindowRelativeMouseMode(sdlWindow, relativeMode))
|
||||||
LOG(Error, "Failed to set mouse relative mode: {0}", String(SDL_GetError()));
|
LOG(Error, "Failed to set mouse relative mode: {0}", String(SDL_GetError()));
|
||||||
|
|
||||||
if (!relativeMode)
|
if (!relativeMode)
|
||||||
SetMousePosition(oldPosition);
|
{
|
||||||
|
SDL_WarpMouseInWindow(sdlWindow, oldPosition.X, oldPosition.Y);
|
||||||
|
OnMouseMoved(oldPosition);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -487,6 +490,17 @@ bool SDLInput::HandleEvent(SDLWindow* window, SDL_Event& event)
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
/*case SDL_EVENT_DROP_POSITION:
|
||||||
|
{
|
||||||
|
// We are not receiving mouse motion events during drag-and-drop
|
||||||
|
auto dpiScale = window->GetDpiScale();
|
||||||
|
//const Float2 mousePos(event.drop.x * dpiScale, event.drop.y * dpiScale);// = window->ClientToScreen({ event.drop.x * dpiScale, event.drop.y * dpiScale});
|
||||||
|
Float2 mousePos = window->ClientToScreen({ event.drop.x * dpiScale, event.drop.y * dpiScale});
|
||||||
|
if (window != Engine::MainWindow)
|
||||||
|
mousePos = window->GetPosition() - mousePos;
|
||||||
|
Input::Mouse->OnMouseMove(mousePos, window);
|
||||||
|
return true;
|
||||||
|
}*/
|
||||||
case SDL_EVENT_WINDOW_MOUSE_LEAVE:
|
case SDL_EVENT_WINDOW_MOUSE_LEAVE:
|
||||||
{
|
{
|
||||||
Input::Mouse->OnMouseLeave(window);
|
Input::Mouse->OnMouseLeave(window);
|
||||||
|
|||||||
Reference in New Issue
Block a user