mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-03 08:03:50 +00:00
Prevent target deselection during camera rotation
Left-click targeting now fires on mouse-up with a drag threshold so camera rotation drags no longer clear the current target.
This commit is contained in:
parent
c51801dca8
commit
ef15079613
2 changed files with 64 additions and 48 deletions
|
|
@ -173,6 +173,10 @@ private:
|
||||||
// Action bar drag state (-1 = not dragging)
|
// Action bar drag state (-1 = not dragging)
|
||||||
int actionBarDragSlot_ = -1;
|
int actionBarDragSlot_ = -1;
|
||||||
GLuint actionBarDragIcon_ = 0;
|
GLuint actionBarDragIcon_ = 0;
|
||||||
|
|
||||||
|
// Left-click targeting: distinguish click from camera drag
|
||||||
|
glm::vec2 leftClickPressPos_ = glm::vec2(0.0f);
|
||||||
|
bool leftClickWasPress_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ui
|
} // namespace ui
|
||||||
|
|
|
||||||
|
|
@ -566,19 +566,30 @@ void GameScreen::processTargetInput(game::GameHandler& gameHandler) {
|
||||||
refocusChatInput = true;
|
refocusChatInput = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Left-click targeting (when mouse not captured by UI)
|
// Left-click targeting: only on mouse-up if the mouse didn't drag (camera rotate)
|
||||||
// Suppress when right button is held (both-button run)
|
// Record press position on mouse-down
|
||||||
if (!io.WantCaptureMouse && input.isMouseButtonJustPressed(SDL_BUTTON_LEFT) && !input.isMouseButtonPressed(SDL_BUTTON_RIGHT)) {
|
if (!io.WantCaptureMouse && input.isMouseButtonJustPressed(SDL_BUTTON_LEFT) && !input.isMouseButtonPressed(SDL_BUTTON_RIGHT)) {
|
||||||
|
leftClickPressPos_ = input.getMousePosition();
|
||||||
|
leftClickWasPress_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On mouse-up, check if it was a click (not a drag)
|
||||||
|
if (leftClickWasPress_ && input.isMouseButtonJustReleased(SDL_BUTTON_LEFT)) {
|
||||||
|
leftClickWasPress_ = false;
|
||||||
|
glm::vec2 releasePos = input.getMousePosition();
|
||||||
|
float dragDist = glm::length(releasePos - leftClickPressPos_);
|
||||||
|
constexpr float CLICK_THRESHOLD = 5.0f; // pixels
|
||||||
|
|
||||||
|
if (dragDist < CLICK_THRESHOLD) {
|
||||||
auto* renderer = core::Application::getInstance().getRenderer();
|
auto* renderer = core::Application::getInstance().getRenderer();
|
||||||
auto* camera = renderer ? renderer->getCamera() : nullptr;
|
auto* camera = renderer ? renderer->getCamera() : nullptr;
|
||||||
auto* window = core::Application::getInstance().getWindow();
|
auto* window = core::Application::getInstance().getWindow();
|
||||||
|
|
||||||
if (camera && window) {
|
if (camera && window) {
|
||||||
glm::vec2 mousePos = input.getMousePosition();
|
|
||||||
float screenW = static_cast<float>(window->getWidth());
|
float screenW = static_cast<float>(window->getWidth());
|
||||||
float screenH = static_cast<float>(window->getHeight());
|
float screenH = static_cast<float>(window->getHeight());
|
||||||
|
|
||||||
rendering::Ray ray = camera->screenToWorldRay(mousePos.x, mousePos.y, screenW, screenH);
|
rendering::Ray ray = camera->screenToWorldRay(leftClickPressPos_.x, leftClickPressPos_.y, screenW, screenH);
|
||||||
|
|
||||||
float closestT = 1e30f;
|
float closestT = 1e30f;
|
||||||
uint64_t closestGuid = 0;
|
uint64_t closestGuid = 0;
|
||||||
|
|
@ -627,6 +638,7 @@ void GameScreen::processTargetInput(game::GameHandler& gameHandler) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Right-click: select NPC (if needed) then interact / loot / auto-attack
|
// Right-click: select NPC (if needed) then interact / loot / auto-attack
|
||||||
// Suppress when left button is held (both-button run)
|
// Suppress when left button is held (both-button run)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue