From c1233cd9849432bb3d45883797b2f9a3d9a81c4d Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Fri, 16 Jul 2021 22:35:06 -0500 Subject: [PATCH] Eliminating radar movement. Still need to fix radar scale. At 460km from radar, error in bin distance is up to 15km. --- scwx-qt/source/scwx/qt/map/map_widget.cpp | 15 ++++---- scwx-qt/source/scwx/qt/map/map_widget.hpp | 7 ++-- scwx-qt/source/scwx/qt/map/radar_layer.cpp | 40 ++++++++++++---------- scwx-qt/source/scwx/qt/map/radar_layer.hpp | 6 ++-- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 4ff9c13d..46c6167c 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -62,10 +62,11 @@ void MapWidget::changeStyle() currentStyleIndex = 0; } } + void MapWidget::AddLayers() { // QMapboxGL::addCustomLayer will take ownership of the QScopedPointer - QScopedPointer pHost(new RadarLayer()); + QScopedPointer pHost(new RadarLayer(map_)); QString before = "ferry"; @@ -167,11 +168,7 @@ void MapWidget::wheelEvent(QWheelEvent* ev) factor = factor > -1 ? factor : 1 / factor; } -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) map_->scaleBy(1 + factor, ev->position()); -#else - map_->scaleBy(1 + factor, ev->pos()); -#endif ev->accept(); } @@ -179,10 +176,10 @@ void MapWidget::wheelEvent(QWheelEvent* ev) void MapWidget::initializeGL() { map_.reset(new QMapboxGL(nullptr, settings_, size(), pixelRatio())); - connect(map_.data(), SIGNAL(needsRendering()), this, SLOT(update())); + connect(map_.get(), SIGNAL(needsRendering()), this, SLOT(update())); // Set default location to KLSX. - map_->setCoordinateZoom(QMapbox::Coordinate(38.6986, -90.6828), 14); + map_->setCoordinateZoom(QMapbox::Coordinate(38.6986, -90.6828), 11); QString styleUrl = qgetenv("MAPBOX_STYLE_URL"); if (styleUrl.isEmpty()) @@ -209,9 +206,9 @@ void MapWidget::paintGL() void MapWidget::mapChanged(QMapboxGL::MapChange mapChange) { - if (mapChange == QMapboxGL::MapChangeDidFinishLoadingStyle) + switch (mapChange) { - AddLayers(); + case QMapboxGL::MapChangeDidFinishLoadingStyle: AddLayers(); break; } } diff --git a/scwx-qt/source/scwx/qt/map/map_widget.hpp b/scwx-qt/source/scwx/qt/map/map_widget.hpp index 768c028d..43837088 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.hpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.hpp @@ -1,10 +1,11 @@ #pragma once +#include + #include #include #include -#include #include class QKeyEvent; @@ -42,8 +43,8 @@ private: QPointF lastPos_; - QMapboxGLSettings settings_; - QScopedPointer map_; + QMapboxGLSettings settings_; + std::shared_ptr map_; uint64_t frameDraws_ = 0; diff --git a/scwx-qt/source/scwx/qt/map/radar_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_layer.cpp index 9c33eb67..51e58fc4 100644 --- a/scwx-qt/source/scwx/qt/map/radar_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_layer.cpp @@ -1,5 +1,3 @@ -#define _USE_MATH_DEFINES - #include #include @@ -21,7 +19,8 @@ static const std::string logPrefix_ = "[scwx::qt::map::radar_layer] "; class RadarLayerImpl { public: - explicit RadarLayerImpl() : + explicit RadarLayerImpl(std::shared_ptr map) : + map_(map), gl_(), shaderProgram_(), uMVPMatrixLocation_(GL_INVALID_INDEX), @@ -33,6 +32,8 @@ public: } ~RadarLayerImpl() = default; + std::shared_ptr map_; + QOpenGLFunctions_3_3_Core gl_; ShaderProgram shaderProgram_; @@ -43,7 +44,10 @@ public: GLsizeiptr numVertices_; }; -RadarLayer::RadarLayer() : p(std::make_unique()) {} +RadarLayer::RadarLayer(std::shared_ptr map) : + p(std::make_unique(map)) +{ +} RadarLayer::~RadarLayer() = default; RadarLayer::RadarLayer(RadarLayer&&) noexcept = default; @@ -69,10 +73,11 @@ void RadarLayer::initialize() static std::array vertices; - constexpr float angleDelta = 0.5f * static_cast(M_PI) / 180.0f; + constexpr float angleDelta = glm::radians(0.5f); + constexpr float angleDeltaH = angleDelta / 2.0f; - float angle1 = 0; - float angle2 = angleDelta; + float angle1 = -angleDeltaH; + float angle2 = angleDeltaH; GLsizeiptr index = 0; @@ -162,28 +167,25 @@ void RadarLayer::render(const QMapbox::CustomLayerRenderParameters& params) p->shaderProgram_.Use(); - float metersPerPixel = + const QMapbox::Coordinate radar(38.6986, -90.6828); + + const float metersPerPixel = QMapbox::metersPerPixelAtLatitude(params.latitude, params.zoom); const float scale = 1000.0f / metersPerPixel * 2.0f; const float xScale = scale / params.width; const float yScale = scale / params.height; - const QMapbox::Coordinate radar(38.6986, -90.6828); - - const QMapbox::ProjectedMeters radarMeters = - QMapbox::projectedMetersForCoordinate(radar); - const QMapbox::ProjectedMeters mapMeters = - QMapbox::projectedMetersForCoordinate( - {params.latitude, params.longitude}); - - const float yTranslate = (radarMeters.first - mapMeters.first) * 0.001f; - const float xTranslate = (radarMeters.second - mapMeters.second) * 0.001f; + QPointF radarScreen = p->map_->pixelForCoordinate(radar); + const float xTranslate = + (radarScreen.x() - (params.width * 0.5f)) / params.width * 2.0f; + const float yTranslate = + -(radarScreen.y() - (params.height * 0.5f)) / params.height * 2.0f; glm::mat4 uMVPMatrix(1.0f); - uMVPMatrix = glm::scale(uMVPMatrix, glm::vec3(xScale, yScale, 1.0f)); uMVPMatrix = glm::translate(uMVPMatrix, glm::vec3(xTranslate, yTranslate, 0.0f)); + uMVPMatrix = glm::scale(uMVPMatrix, glm::vec3(xScale, yScale, 1.0f)); uMVPMatrix = glm::rotate(uMVPMatrix, glm::radians(params.bearing), glm::vec3(0.0f, 0.0f, 1.0f)); diff --git a/scwx-qt/source/scwx/qt/map/radar_layer.hpp b/scwx-qt/source/scwx/qt/map/radar_layer.hpp index afb1bc20..c8c3eac0 100644 --- a/scwx-qt/source/scwx/qt/map/radar_layer.hpp +++ b/scwx-qt/source/scwx/qt/map/radar_layer.hpp @@ -1,4 +1,6 @@ -#include +#pragma once + +#include namespace scwx { @@ -10,7 +12,7 @@ class RadarLayerImpl; class RadarLayer : public QMapbox::CustomLayerHostInterface { public: - explicit RadarLayer(); + explicit RadarLayer(std::shared_ptr map); ~RadarLayer(); RadarLayer(const RadarLayer&) = delete;