Unified mouse movement handling
This commit is contained in:
parent
09dae4ee0b
commit
97975a314d
2 changed files with 44 additions and 87 deletions
|
|
@ -1160,38 +1160,7 @@ void VulkanExampleBase::handleMessages(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
|
||||||
}
|
}
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
{
|
{
|
||||||
bool handled = false;
|
handleMouseMove(LOWORD(lParam), HIWORD(lParam));
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
handled = io.WantCaptureMouse;
|
|
||||||
|
|
||||||
int32_t posx = LOWORD(lParam);
|
|
||||||
int32_t posy = HIWORD(lParam);
|
|
||||||
mouseMoved((float)posx, (float)posy, handled);
|
|
||||||
if (handled) {
|
|
||||||
mousePos = glm::vec2((float)posx, (float)posy);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (mouseButtons.right) {
|
|
||||||
zoom += (mousePos.y - (float)posy) * .005f * zoomSpeed;
|
|
||||||
camera.translate(glm::vec3(-0.0f, 0.0f, (mousePos.y - (float)posy) * .005f * zoomSpeed));
|
|
||||||
mousePos = glm::vec2((float)posx, (float)posy);
|
|
||||||
viewUpdated = true;
|
|
||||||
}
|
|
||||||
if (mouseButtons.left) {
|
|
||||||
rotation.x += (mousePos.y - (float)posy) * 1.25f * rotationSpeed;
|
|
||||||
rotation.y -= (mousePos.x - (float)posx) * 1.25f * rotationSpeed;
|
|
||||||
camera.rotate(glm::vec3((mousePos.y - (float)posy) * camera.rotationSpeed, -(mousePos.x - (float)posx) * camera.rotationSpeed, 0.0f));
|
|
||||||
mousePos = glm::vec2((float)posx, (float)posy);
|
|
||||||
viewUpdated = true;
|
|
||||||
}
|
|
||||||
if (mouseButtons.middle) {
|
|
||||||
cameraPos.x -= (mousePos.x - (float)posx) * 0.01f;
|
|
||||||
cameraPos.y -= (mousePos.y - (float)posy) * 0.01f;
|
|
||||||
camera.translate(glm::vec3(-(mousePos.x - (float)posx) * 0.01f, -(mousePos.y - (float)posy) * 0.01f, 0.0f));
|
|
||||||
mousePos = glm::vec2((float)posx, (float)posy);
|
|
||||||
viewUpdated = true;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WM_SIZE:
|
case WM_SIZE:
|
||||||
|
|
@ -1416,39 +1385,9 @@ void* VulkanExampleBase::setupWindow(void* view)
|
||||||
VulkanExampleBase *self = reinterpret_cast<VulkanExampleBase *>(data);
|
VulkanExampleBase *self = reinterpret_cast<VulkanExampleBase *>(data);
|
||||||
self->pointerMotion(pointer, time, sx, sy);
|
self->pointerMotion(pointer, time, sx, sy);
|
||||||
}
|
}
|
||||||
void VulkanExampleBase::pointerMotion(wl_pointer *pointer, uint32_t time,
|
void VulkanExampleBase::pointerMotion(wl_pointer *pointer, uint32_t time, wl_fixed_t sx, wl_fixed_t sy)
|
||||||
wl_fixed_t sx, wl_fixed_t sy)
|
|
||||||
{
|
{
|
||||||
double x = wl_fixed_to_double(sx);
|
handleMouseMove(wl_fixed_to_int(sx), wl_fixed_to_int(sy));
|
||||||
double y = wl_fixed_to_double(sy);
|
|
||||||
|
|
||||||
double dx = mousePos.x - x;
|
|
||||||
double dy = mousePos.y - y;
|
|
||||||
|
|
||||||
if (mouseButtons.left)
|
|
||||||
{
|
|
||||||
rotation.x += dy * 1.25f * rotationSpeed;
|
|
||||||
rotation.y -= dx * 1.25f * rotationSpeed;
|
|
||||||
camera.rotate(glm::vec3(
|
|
||||||
dy * camera.rotationSpeed,
|
|
||||||
-dx * camera.rotationSpeed,
|
|
||||||
0.0f));
|
|
||||||
viewUpdated = true;
|
|
||||||
}
|
|
||||||
if (mouseButtons.right)
|
|
||||||
{
|
|
||||||
zoom += dy * .005f * zoomSpeed;
|
|
||||||
camera.translate(glm::vec3(-0.0f, 0.0f, dy * .005f * zoomSpeed));
|
|
||||||
viewUpdated = true;
|
|
||||||
}
|
|
||||||
if (mouseButtons.middle)
|
|
||||||
{
|
|
||||||
cameraPos.x -= dx * 0.01f;
|
|
||||||
cameraPos.y -= dy * 0.01f;
|
|
||||||
camera.translate(glm::vec3(-dx * 0.01f, -dy * 0.01f, 0.0f));
|
|
||||||
viewUpdated = true;
|
|
||||||
}
|
|
||||||
mousePos = glm::vec2(x, y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*static*/void VulkanExampleBase::pointerButtonCb(void *data,
|
/*static*/void VulkanExampleBase::pointerButtonCb(void *data,
|
||||||
|
|
@ -1795,29 +1734,8 @@ void VulkanExampleBase::handleEvent(const xcb_generic_event_t *event)
|
||||||
case XCB_MOTION_NOTIFY:
|
case XCB_MOTION_NOTIFY:
|
||||||
{
|
{
|
||||||
xcb_motion_notify_event_t *motion = (xcb_motion_notify_event_t *)event;
|
xcb_motion_notify_event_t *motion = (xcb_motion_notify_event_t *)event;
|
||||||
if (mouseButtons.left)
|
handleMouseMove((int32_t)motion->event_x, (int32_t)motion->event_y);
|
||||||
{
|
break;
|
||||||
rotation.x += (mousePos.y - (float)motion->event_y) * 1.25f;
|
|
||||||
rotation.y -= (mousePos.x - (float)motion->event_x) * 1.25f;
|
|
||||||
camera.rotate(glm::vec3((mousePos.y - (float)motion->event_y) * camera.rotationSpeed, -(mousePos.x - (float)motion->event_x) * camera.rotationSpeed, 0.0f));
|
|
||||||
viewUpdated = true;
|
|
||||||
}
|
|
||||||
if (mouseButtons.right)
|
|
||||||
{
|
|
||||||
zoom += (mousePos.y - (float)motion->event_y) * .005f;
|
|
||||||
camera.translate(glm::vec3(-0.0f, 0.0f, (mousePos.y - (float)motion->event_y) * .005f * zoomSpeed));
|
|
||||||
viewUpdated = true;
|
|
||||||
}
|
|
||||||
if (mouseButtons.middle)
|
|
||||||
{
|
|
||||||
cameraPos.x -= (mousePos.x - (float)motion->event_x) * 0.01f;
|
|
||||||
cameraPos.y -= (mousePos.y - (float)motion->event_y) * 0.01f;
|
|
||||||
camera.translate(glm::vec3(-(mousePos.x - (float)(float)motion->event_x) * 0.01f, -(mousePos.y - (float)motion->event_y) * 0.01f, 0.0f));
|
|
||||||
viewUpdated = true;
|
|
||||||
mousePos.x = (float)motion->event_x;
|
|
||||||
mousePos.y = (float)motion->event_y;
|
|
||||||
}
|
|
||||||
mousePos = glm::vec2((float)motion->event_x, (float)motion->event_y);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case XCB_BUTTON_PRESS:
|
case XCB_BUTTON_PRESS:
|
||||||
|
|
@ -2131,6 +2049,44 @@ void VulkanExampleBase::windowResize()
|
||||||
prepared = true;
|
prepared = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VulkanExampleBase::handleMouseMove(int32_t x, int32_t y)
|
||||||
|
{
|
||||||
|
int32_t dx = (int32_t)mousePos.x - x;
|
||||||
|
int32_t dy = (int32_t)mousePos.y - y;
|
||||||
|
|
||||||
|
bool handled = false;
|
||||||
|
|
||||||
|
if (settings.overlay) {
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
handled = io.WantCaptureMouse;
|
||||||
|
}
|
||||||
|
mouseMoved((float)x, (float)y, handled);
|
||||||
|
|
||||||
|
if (handled) {
|
||||||
|
mousePos = glm::vec2((float)x, (float)y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mouseButtons.left) {
|
||||||
|
rotation.x += dy * 1.25f * rotationSpeed;
|
||||||
|
rotation.y -= dx * 1.25f * rotationSpeed;
|
||||||
|
camera.rotate(glm::vec3(dy * camera.rotationSpeed, -dx * camera.rotationSpeed, 0.0f));
|
||||||
|
viewUpdated = true;
|
||||||
|
}
|
||||||
|
if (mouseButtons.right) {
|
||||||
|
zoom += dy * .005f * zoomSpeed;
|
||||||
|
camera.translate(glm::vec3(-0.0f, 0.0f, dy * .005f * zoomSpeed));
|
||||||
|
viewUpdated = true;
|
||||||
|
}
|
||||||
|
if (mouseButtons.middle) {
|
||||||
|
cameraPos.x -= dx * 0.01f;
|
||||||
|
cameraPos.y -= dy * 0.01f;
|
||||||
|
camera.translate(glm::vec3(-dx * 0.01f, -dy * 0.01f, 0.0f));
|
||||||
|
viewUpdated = true;
|
||||||
|
}
|
||||||
|
mousePos = glm::vec2((float)x, (float)y);
|
||||||
|
}
|
||||||
|
|
||||||
void VulkanExampleBase::windowResized()
|
void VulkanExampleBase::windowResized()
|
||||||
{
|
{
|
||||||
// Can be overriden in derived class
|
// Can be overriden in derived class
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ private:
|
||||||
vks::UIOverlay *UIOverlay = nullptr;
|
vks::UIOverlay *UIOverlay = nullptr;
|
||||||
// Called if the window is resized and some resources have to be recreatesd
|
// Called if the window is resized and some resources have to be recreatesd
|
||||||
void windowResize();
|
void windowResize();
|
||||||
|
void handleMouseMove(int32_t x, int32_t y);
|
||||||
protected:
|
protected:
|
||||||
// Frame counter to display fps
|
// Frame counter to display fps
|
||||||
uint32_t frameCounter = 0;
|
uint32_t frameCounter = 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue