some problems fixed
This commit is contained in:
@ -187,15 +187,10 @@ void LevelSelectorState::handleEvent(const SDL_Event& e) {
|
||||
if (ctx.startLevelSelection) *ctx.startLevelSelection = hoveredLevel;
|
||||
} else if (e.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
|
||||
if (e.button.button == SDL_BUTTON_LEFT) {
|
||||
// compute visible logical viewport
|
||||
float vw = (lastLogicalScale > 0.f) ? float(lastLogicalVP.w) / lastLogicalScale : float(LOGICAL_W);
|
||||
float vh = (lastLogicalScale > 0.f) ? float(lastLogicalVP.h) / lastLogicalScale : float(LOGICAL_H);
|
||||
float offX = 0.f;
|
||||
if (lastLogicalScale > 0.f) offX = (vw / 2.f) - (float(LOGICAL_W) / 2.f);
|
||||
// convert mouse to logical coords
|
||||
// convert mouse to logical coords (viewport is already centered)
|
||||
float lx = (float(e.button.x) - float(lastLogicalVP.x)) / (lastLogicalScale > 0.f ? lastLogicalScale : 1.f);
|
||||
float ly = (float(e.button.y) - float(lastLogicalVP.y)) / (lastLogicalScale > 0.f ? lastLogicalScale : 1.f);
|
||||
SDL_FRect panel = DrawPanel(nullptr, vw, vh, /*draw=*/false, offX, 0.f);
|
||||
SDL_FRect panel = DrawPanel(nullptr, LOGICAL_W, LOGICAL_H, /*draw=*/false, 0.f, 0.f);
|
||||
Grid g = MakeGrid(panel);
|
||||
int hit = HitTest(g, int(lx), int(ly));
|
||||
if (hit != -1) {
|
||||
@ -205,14 +200,10 @@ void LevelSelectorState::handleEvent(const SDL_Event& e) {
|
||||
}
|
||||
}
|
||||
} else if (e.type == SDL_EVENT_MOUSE_MOTION) {
|
||||
// compute visible logical viewport and convert mouse coords once
|
||||
float vw = (lastLogicalScale > 0.f) ? float(lastLogicalVP.w) / lastLogicalScale : float(LOGICAL_W);
|
||||
float vh = (lastLogicalScale > 0.f) ? float(lastLogicalVP.h) / lastLogicalScale : float(LOGICAL_H);
|
||||
float offX = 0.f;
|
||||
if (lastLogicalScale > 0.f) offX = (vw / 2.f) - (float(LOGICAL_W) / 2.f);
|
||||
// convert mouse to logical coords (viewport is already centered)
|
||||
float lx = (float(e.motion.x) - float(lastLogicalVP.x)) / (lastLogicalScale > 0.f ? lastLogicalScale : 1.f);
|
||||
float ly = (float(e.motion.y) - float(lastLogicalVP.y)) / (lastLogicalScale > 0.f ? lastLogicalScale : 1.f);
|
||||
SDL_FRect panel = DrawPanel(nullptr, vw, vh, /*draw=*/false, offX, 0.f);
|
||||
SDL_FRect panel = DrawPanel(nullptr, LOGICAL_W, LOGICAL_H, /*draw=*/false, 0.f, 0.f);
|
||||
Grid g = MakeGrid(panel);
|
||||
hoveredLevel = HitTest(g, int(lx), int(ly));
|
||||
}
|
||||
@ -233,18 +224,11 @@ void LevelSelectorState::render(SDL_Renderer* renderer, float logicalScale, SDL_
|
||||
void LevelSelectorState::drawLevelSelectionPopup(SDL_Renderer* renderer) {
|
||||
if (!renderer) return;
|
||||
|
||||
// Important: main sets viewport + logical scale before calling us.
|
||||
// Draw in logical coordinates to avoid artifacts in fullscreen.
|
||||
// Use the actual visible logical size (viewport in logical coords) instead of hardcoded constants
|
||||
float vw = (lastLogicalScale > 0.f) ? float(lastLogicalVP.w) / lastLogicalScale : float(LOGICAL_W);
|
||||
float vh = (lastLogicalScale > 0.f) ? float(lastLogicalVP.h) / lastLogicalScale : float(LOGICAL_H);
|
||||
|
||||
// compute horizontal offset so content centers within the visible logical viewport
|
||||
float offX = 0.f;
|
||||
if (lastLogicalScale > 0.f) {
|
||||
float visibleLogicalW = float(lastLogicalVP.w) / lastLogicalScale;
|
||||
offX = (visibleLogicalW / 2.f) - (vw / 2.f);
|
||||
}
|
||||
// Since ApplicationManager sets up a centered viewport, we draw directly in logical coordinates
|
||||
// The viewport (LOGICAL_W x LOGICAL_H) is already centered within the window
|
||||
float vw = float(LOGICAL_W);
|
||||
float vh = float(LOGICAL_H);
|
||||
float offX = 0.f; // No offset needed since viewport is centered
|
||||
|
||||
// Panel and title strip (in logical space)
|
||||
SDL_FRect panel = DrawPanel(renderer, vw, vh-140.0f, /*draw=*/true, offX, 0.f);
|
||||
@ -268,19 +252,14 @@ void LevelSelectorState::drawLevelSelectionPopup(SDL_Renderer* renderer) {
|
||||
}
|
||||
|
||||
bool LevelSelectorState::isMouseInPopup(float mouseX, float mouseY, float& popupX, float& popupY, float& popupW, float& popupH) {
|
||||
// Re-implement using new panel geometry in window coordinates
|
||||
// Convert from window pixels to logical coords using cached viewport/scale
|
||||
// Simplified: viewport is already centered, just convert mouse to logical coords
|
||||
(void)mouseX; (void)mouseY;
|
||||
float lx = 0.f, ly = 0.f;
|
||||
if (lastLogicalScale > 0.0f) {
|
||||
lx = (float(mouseX) - float(lastLogicalVP.x)) / lastLogicalScale;
|
||||
ly = (float(mouseY) - float(lastLogicalVP.y)) / lastLogicalScale;
|
||||
}
|
||||
float vw = (lastLogicalScale > 0.f) ? float(lastLogicalVP.w) / lastLogicalScale : float(LOGICAL_W);
|
||||
float vh = (lastLogicalScale > 0.f) ? float(lastLogicalVP.h) / lastLogicalScale : float(LOGICAL_H);
|
||||
float offX = 0.f;
|
||||
if (lastLogicalScale > 0.f) offX = (vw / 2.f) - (float(LOGICAL_W) / 2.f);
|
||||
SDL_FRect p = DrawPanel(nullptr, vw, vh, /*draw=*/false, offX, 0.f);
|
||||
SDL_FRect p = DrawPanel(nullptr, LOGICAL_W, LOGICAL_H, /*draw=*/false, 0.f, 0.f);
|
||||
popupX = p.x; popupY = p.y; popupW = p.w; popupH = p.h;
|
||||
return lx >= popupX && lx <= popupX + popupW && ly >= popupY && ly <= popupY + popupH;
|
||||
}
|
||||
@ -292,11 +271,7 @@ int LevelSelectorState::getLevelFromMouse(float mouseX, float mouseY, float popu
|
||||
lx = (float(mouseX) - float(lastLogicalVP.x)) / lastLogicalScale;
|
||||
ly = (float(mouseY) - float(lastLogicalVP.y)) / lastLogicalScale;
|
||||
}
|
||||
float vw = (lastLogicalScale > 0.f) ? float(lastLogicalVP.w) / lastLogicalScale : float(LOGICAL_W);
|
||||
float vh = (lastLogicalScale > 0.f) ? float(lastLogicalVP.h) / lastLogicalScale : float(LOGICAL_H);
|
||||
float offX = 0.f;
|
||||
if (lastLogicalScale > 0.f) offX = (vw / 2.f) - (float(LOGICAL_W) / 2.f);
|
||||
SDL_FRect p = DrawPanel(nullptr, vw, vh, /*draw=*/false, offX, 0.f);
|
||||
SDL_FRect p = DrawPanel(nullptr, LOGICAL_W, LOGICAL_H, /*draw=*/false, 0.f, 0.f);
|
||||
Grid g = MakeGrid(p);
|
||||
return HitTest(g, (int)lx, (int)ly);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user