| 1493 | } |
| 1494 | |
| 1495 | void MainInterface::renderCursor() { |
| 1496 | // if we're currently playing a cinematic, we should not render the mouse. |
| 1497 | if (m_cinematicOverlay && !m_cinematicOverlay->completed()) |
| 1498 | return m_guiContext->applicationController()->setCursorVisible(false); |
| 1499 | |
| 1500 | Vec2I cursorPos = m_cursorScreenIPos; |
| 1501 | Vec2I cursorSize = m_cursor.size(); |
| 1502 | Vec2I cursorOffset = m_cursor.offset(); |
| 1503 | unsigned int cursorScale = m_cursor.scale(interfaceScale()); |
| 1504 | Drawable cursorDrawable = m_cursor.drawable(); |
| 1505 | |
| 1506 | cursorPos[0] -= cursorOffset[0] * cursorScale; |
| 1507 | cursorPos[1] -= (cursorSize[1] - cursorOffset[1]) * cursorScale; |
| 1508 | if (!m_guiContext->trySetCursor(cursorDrawable, cursorOffset, cursorScale)) |
| 1509 | m_guiContext->drawDrawable(cursorDrawable, Vec2F(cursorPos), cursorScale); |
| 1510 | |
| 1511 | if (m_cursorTooltip) { |
| 1512 | auto assets = Root::singleton().assets(); |
| 1513 | auto imgDb = Root::singleton().imageMetadataDatabase(); |
| 1514 | |
| 1515 | auto config = assets->json("/interface.config:cursorTooltip"); |
| 1516 | auto backgroundImage = config.getString("background"); |
| 1517 | auto rawCursorOffset = jsonToVec2I(config.get("offset")); |
| 1518 | |
| 1519 | Vec2I tooltipSize = Vec2I(imgDb->imageSize(backgroundImage)) * interfaceScale(); |
| 1520 | Vec2I cursorOffset = (Vec2I{0, -m_cursor.size().y()} + rawCursorOffset) * cursorScale; |
| 1521 | Vec2I tooltipOffset = m_cursorScreenIPos + cursorOffset; |
| 1522 | TextStyle textStyle = config.get("textStyle"); |
| 1523 | size_t fontSize = config.get("fontSize").toUInt(); |
| 1524 | Vec4B fontColor = jsonToColor(config.get("color")).toRgba(); |
| 1525 | |
| 1526 | m_guiContext->drawQuad(backgroundImage, Vec2F(tooltipOffset) + Vec2F(-tooltipSize.x(), 0), interfaceScale()); |
| 1527 | m_guiContext->setTextStyle(textStyle); |
| 1528 | m_guiContext->setFontSize(fontSize); |
| 1529 | m_guiContext->setFontColor(fontColor); |
| 1530 | m_guiContext->renderText(*m_cursorTooltip, |
| 1531 | TextPositioning(Vec2F(tooltipOffset) + Vec2F(-tooltipSize.x(), tooltipSize.y()) / 2, |
| 1532 | HorizontalAnchor::HMidAnchor, |
| 1533 | VerticalAnchor::VMidAnchor)); |
| 1534 | m_guiContext->clearTextStyle(); |
| 1535 | } |
| 1536 | |
| 1537 | m_cursorItem->setPosition(m_cursorScreenIPos / interfaceScale() + m_config->inventoryItemMouseOffset); |
| 1538 | |
| 1539 | if (auto swapItem = m_client->mainPlayer()->inventory()->swapSlotItem()) |
| 1540 | m_cursorItem->setItem(swapItem); |
| 1541 | else |
| 1542 | m_cursorItem->setItem({}); |
| 1543 | |
| 1544 | m_cursorItem->render(RectI::withSize({}, {(int)windowWidth(), (int)windowHeight()})); |
| 1545 | m_guiContext->resetInterfaceScissorRect(); |
| 1546 | } |
| 1547 | |
| 1548 | bool MainInterface::overButton(PolyI buttonPoly, Vec2I const& mousePos) const { |
| 1549 | Vec2I barPos = mainBarPosition(); |
nothing calls this directly
no test coverage detected