diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 787382a3..650d94f7 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -102,7 +102,8 @@ set(HDR_MAP source/scwx/qt/map/alert_layer.hpp source/scwx/qt/map/overlay_layer.hpp source/scwx/qt/map/placefile_layer.hpp source/scwx/qt/map/radar_product_layer.hpp - source/scwx/qt/map/radar_range_layer.hpp) + source/scwx/qt/map/radar_range_layer.hpp + source/scwx/qt/map/radar_site_layer.hpp) set(SRC_MAP source/scwx/qt/map/alert_layer.cpp source/scwx/qt/map/color_table_layer.cpp source/scwx/qt/map/draw_layer.cpp @@ -114,7 +115,8 @@ set(SRC_MAP source/scwx/qt/map/alert_layer.cpp source/scwx/qt/map/overlay_layer.cpp source/scwx/qt/map/placefile_layer.cpp source/scwx/qt/map/radar_product_layer.cpp - source/scwx/qt/map/radar_range_layer.cpp) + source/scwx/qt/map/radar_range_layer.cpp + source/scwx/qt/map/radar_site_layer.cpp) set(HDR_MODEL source/scwx/qt/model/alert_model.hpp source/scwx/qt/model/alert_proxy_model.hpp source/scwx/qt/model/imgui_context_model.hpp diff --git a/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp new file mode 100644 index 00000000..6350883a --- /dev/null +++ b/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include + +// #include +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace map +{ + +static const std::string logPrefix_ = "scwx::qt::map::radar_site_layer"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); + +class RadarSiteLayer::Impl +{ +public: + explicit Impl(std::shared_ptr context) {} + ~Impl() = default; + + void RenderRadarSite(const QMapLibreGL::CustomLayerRenderParameters& params, + std::shared_ptr& radarSite); + + std::vector> radarSites_ {}; + + glm::vec2 mapScreenCoordLocation_ {}; + float mapScale_ {1.0f}; + float mapBearingCos_ {1.0f}; + float mapBearingSin_ {0.0f}; + float halfWidth_ {}; + float halfHeight_ {}; +}; + +RadarSiteLayer::RadarSiteLayer(std::shared_ptr context) : + DrawLayer(context), p(std::make_unique(context)) +{ +} + +RadarSiteLayer::~RadarSiteLayer() = default; + +void RadarSiteLayer::Initialize() +{ + logger_->debug("Initialize()"); + + p->radarSites_ = config::RadarSite::GetAll(); +} + +void RadarSiteLayer::Render( + const QMapLibreGL::CustomLayerRenderParameters& params) +{ + gl::OpenGLFunctions& gl = context()->gl(); + + context()->set_render_parameters(params); + + // Update map screen coordinate and scale information + p->mapScreenCoordLocation_ = util::maplibre::LatLongToScreenCoordinate( + {params.latitude, params.longitude}); + p->mapScale_ = std::pow(2.0, params.zoom) * mbgl::util::tileSize_D / + mbgl::util::DEGREES_MAX; + p->mapBearingCos_ = cosf(params.bearing * common::kDegreesToRadians); + p->mapBearingSin_ = sinf(params.bearing * common::kDegreesToRadians); + p->halfWidth_ = params.width * 0.5f; + p->halfHeight_ = params.height * 0.5f; + + for (auto& radarSite : p->radarSites_) + { + p->RenderRadarSite(params, radarSite); + } + + SCWX_GL_CHECK_ERROR(); +} + +void RadarSiteLayer::Impl::RenderRadarSite( + const QMapLibreGL::CustomLayerRenderParameters& params, + std::shared_ptr& radarSite) +{ + const std::string windowName = fmt::format("radar-site-{}", radarSite->id()); + + const auto screenCoordinates = + (util::maplibre::LatLongToScreenCoordinate( + {radarSite->latitude(), radarSite->longitude()}) - + mapScreenCoordLocation_) * + mapScale_; + + // Rotate text according to map rotation + float rotatedX = screenCoordinates.x; + float rotatedY = screenCoordinates.y; + if (params.bearing != 0.0) + { + rotatedX = screenCoordinates.x * mapBearingCos_ - + screenCoordinates.y * mapBearingSin_; + rotatedY = screenCoordinates.x * mapBearingSin_ + + screenCoordinates.y * mapBearingCos_; + } + + // Convert screen to ImGui coordinates + float x = rotatedX + halfWidth_; + float y = params.height - (rotatedY + halfHeight_); + + // Setup window to hold text + ImGui::SetNextWindowPos( + ImVec2 {x, y}, ImGuiCond_Always, ImVec2 {0.5f, 0.5f}); + if (ImGui::Begin(windowName.c_str(), + nullptr, + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_AlwaysAutoResize)) + { + // Render text + ImGui::TextUnformatted(radarSite->id().c_str()); + + // Store hover text for mouse picking pass + if (ImGui::IsItemHovered()) + { + // TODO + } + + // End window + ImGui::End(); + } +} + +void RadarSiteLayer::Deinitialize() +{ + logger_->debug("Deinitialize()"); + + p->radarSites_.clear(); +} + +bool RadarSiteLayer::RunMousePicking( + const QMapLibreGL::CustomLayerRenderParameters& /* params */, + const QPointF& /* mouseLocalPos */, + const QPointF& /* mouseGlobalPos */, + const glm::vec2& /* mouseCoords */) +{ + // TODO + return false; +} + +} // namespace map +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/map/radar_site_layer.hpp b/scwx-qt/source/scwx/qt/map/radar_site_layer.hpp new file mode 100644 index 00000000..20375297 --- /dev/null +++ b/scwx-qt/source/scwx/qt/map/radar_site_layer.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include + +namespace scwx +{ +namespace qt +{ +namespace map +{ + +class RadarSiteLayer : public DrawLayer +{ +public: + explicit RadarSiteLayer(std::shared_ptr context); + ~RadarSiteLayer(); + + void Initialize() override final; + void Render(const QMapLibreGL::CustomLayerRenderParameters&) override final; + void Deinitialize() override final; + + bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params, + const QPointF& mouseLocalPos, + const QPointF& mouseGlobalPos, + const glm::vec2& mouseCoords) override final; + +private: + class Impl; + std::unique_ptr p; +}; + +} // namespace map +} // namespace qt +} // namespace scwx