diff options
Diffstat (limited to 'View.cpp')
-rw-r--r-- | View.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
@@ -14,7 +14,8 @@ View::View(std::vector<Grid> grids) : m_grids {grids}, m_labels {}, m_grid {0}, - m_texture {LoadTexture("resources/wreck.png")} + m_texture {LoadTexture("resources/wreck.png")}, + m_active {nullptr} { m_camera.position = Vector3{10.0f, 10.0f, 10.0f}; m_camera.target = Vector3{0.0f, 0.0f, 0.0f}; @@ -45,6 +46,7 @@ View::update(const float dt) const auto wrecks = m_grids.at(m_grid).wrecks; m_labels.clear(); m_labels.reserve(wrecks.size()); + auto mouse = GetMousePosition(); for (const auto& wreck : wrecks) { const auto pos = GetWorldToScreen(wreck.position, m_camera); const auto base = GetWorldToScreen({wreck.position.x, 0.0f, wreck.position.z}, m_camera); @@ -60,9 +62,27 @@ View::update(const float dt) std::sqrt( std::pow(pos.x - base.x, 2) + std::pow(pos.y - base.y, 2)); - m_labels.push_back(Label{pos, base, depth, length}); + const bool hover = + 8.0f > std::sqrt( + std::pow(mouse.x - pos.x, 2) + + std::pow(mouse.y - pos.y, 2)); + m_labels.push_back(Label{pos, base, depth, length, hover}); } std::sort(m_labels.begin(), m_labels.end(), [](auto& a, auto& b){ return a.depth > b.depth; }); + m_active = nullptr; + for (auto& label : m_labels) { + if (label.hover) { + if (m_active) { + if (label.depth < m_active->depth) + m_active = &label; + } + else + m_active = &label; + label.hover = false; + } + } + if (m_active) + m_active->hover = true; } @@ -76,8 +96,8 @@ View::draw() const EndMode3D(); for (const auto& point : m_labels) { if (point.length > 8) - DrawLine(point.base.x, point.base.y, point.pos.x, point.pos.y, DARKGRAY); - DrawTexture(m_texture, point.pos.x - 8, point.pos.y - 8, WHITE); + DrawLine(point.base.x, point.base.y, point.pos.x, point.pos.y, point.hover ? ORANGE : DARKGRAY); + DrawTexture(m_texture, point.pos.x - 8, point.pos.y - 8, point.hover ? ORANGE : WHITE); } DrawFPS(5, 5); DrawText(TextFormat("%d", m_labels.size()), 5, 25, 20, DARKGRAY); |