diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 994bb87d..fdeb2f08 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -312,6 +312,11 @@ void MainWindowImpl::SetActiveMap(map::MapWidget* mapWidget) } activeMap_ = mapWidget; + + for (map::MapWidget* widget : maps_) + { + widget->SetActive(mapWidget == widget); + } } void MainWindowImpl::UpdateElevationSelection(float elevation) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index f5d00819..68450af4 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -57,9 +57,15 @@ public: radarProductLayer_ {nullptr}, radarProductView_ {nullptr}, overlayLayer_ {nullptr}, + isActive_ {false}, lastPos_(), currentStyleIndex_ {0}, - frameDraws_(0) + frameDraws_(0), + prevLatitude_ {0.0}, + prevLongitude_ {0.0}, + prevZoom_ {0.0}, + prevBearing_ {0.0}, + prevPitch_ {0.0} { } ~MapWidgetImpl() = default; @@ -79,6 +85,7 @@ public: std::shared_ptr radarProductLayer_; std::shared_ptr overlayLayer_; + bool isActive_; QPointF lastPos_; uint8_t currentStyleIndex_; @@ -133,6 +140,7 @@ void MapWidget::SelectRadarProduct(common::Level2Product product) p->radarProductView_ = view::RadarProductViewFactory::Create( product, currentElevation, p->radarProductManager_); + p->radarProductView_->SetActive(p->isActive_); connect( p->radarProductView_.get(), @@ -169,6 +177,17 @@ void MapWidget::SelectRadarProduct(common::Level2Product product) } } +void MapWidget::SetActive(bool isActive) +{ + p->isActive_ = isActive; + + if (p->radarProductView_ != nullptr) + { + p->radarProductView_->SetActive(isActive); + update(); + } +} + void MapWidget::SetMapParameters( double latitude, double longitude, double zoom, double bearing, double pitch) { @@ -345,7 +364,7 @@ void MapWidget::initializeGL() &MapWidgetImpl::Update); // Set default location to KLSX. - p->map_->setCoordinateZoom(QMapbox::Coordinate(38.6986, -90.6828), 11); + p->map_->setCoordinateZoom(QMapbox::Coordinate(38.6986, -90.6828), 9); p->UpdateStoredMapParameters(); QString styleUrl = qgetenv("MAPBOX_STYLE_URL"); diff --git a/scwx-qt/source/scwx/qt/map/map_widget.hpp b/scwx-qt/source/scwx/qt/map/map_widget.hpp index 71a4a538..21139f33 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.hpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.hpp @@ -35,6 +35,7 @@ public: std::vector GetElevationCuts() const; void SelectElevation(float elevation); void SelectRadarProduct(common::Level2Product product); + void SetActive(bool isActive); void SetMapParameters(double latitude, double longitude, double zoom, diff --git a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp index 095ffe9c..ff2570d3 100644 --- a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp @@ -56,7 +56,7 @@ public: gl::ShaderProgram shaderProgram_; GLint uMVPMatrixLocation_; GLint uColorLocation_; - GLuint vbo_; + std::array vbo_; GLuint vao_; GLuint texture_; @@ -108,12 +108,20 @@ void OverlayLayer::initialize() gl.glGenVertexArrays(1, &p->vao_); // Generate vertex buffer objects - gl.glGenBuffers(1, &p->vbo_); + gl.glGenBuffers(static_cast(p->vbo_.size()), p->vbo_.data()); gl.glBindVertexArray(p->vao_); + // Active box (dynamic sized) + gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); + gl.glBufferData( + GL_ARRAY_BUFFER, sizeof(float) * 5 * 2, nullptr, GL_DYNAMIC_DRAW); + + gl.glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, static_cast(0)); + gl.glEnableVertexAttribArray(0); + // Upper right panel (dynamic sized) - gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_); + gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); gl.glBufferData( GL_ARRAY_BUFFER, sizeof(float) * 6 * 2, nullptr, GL_DYNAMIC_DRAW); @@ -160,6 +168,27 @@ void OverlayLayer::render(const QMapbox::CustomLayerRenderParameters& params) gl.glUniformMatrix4fv( p->uMVPMatrixLocation_, 1, GL_FALSE, glm::value_ptr(projection)); + if (p->radarProductView_->IsActive()) + { + const float vertexLX = 1.0f; + const float vertexRX = static_cast(params.width) - 1.0f; + const float vertexTY = static_cast(params.height) - 1.0f; + const float vertexBY = 1.0f; + const float vertices[5][2] = {{vertexLX, vertexTY}, // TL + {vertexLX, vertexBY}, // BL + {vertexRX, vertexBY}, // BR + {vertexRX, vertexTY}, // TR + {vertexLX, vertexTY}}; // TL + + // Draw vertices + gl.glBindVertexArray(p->vao_); + gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[0]); + gl.glVertexAttribPointer( + 0, 2, GL_FLOAT, GL_FALSE, 0, static_cast(0)); + gl.glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); + gl.glDrawArrays(GL_LINE_STRIP, 0, 5); + } + if (p->sweepTimeString_.length() > 0) { const float fontSize = 16.0f; @@ -182,7 +211,9 @@ void OverlayLayer::render(const QMapbox::CustomLayerRenderParameters& params) // Draw vertices gl.glBindVertexArray(p->vao_); - gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_); + gl.glBindBuffer(GL_ARRAY_BUFFER, p->vbo_[1]); + gl.glVertexAttribPointer( + 0, 2, GL_FLOAT, GL_FALSE, 0, static_cast(0)); gl.glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); gl.glDrawArrays(GL_TRIANGLES, 0, 6); @@ -209,7 +240,7 @@ void OverlayLayer::deinitialize() BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "deinitialize()"; gl.glDeleteVertexArrays(1, &p->vao_); - gl.glDeleteBuffers(1, &p->vbo_); + gl.glDeleteBuffers(static_cast(p->vbo_.size()), p->vbo_.data()); gl.glDeleteTextures(1, &p->texture_); p->uMVPMatrixLocation_ = GL_INVALID_INDEX; diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp index 0ddc78fa..e4d18638 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp @@ -24,8 +24,10 @@ static const uint16_t DEFAULT_COLOR_TABLE_MAX = 255u; class RadarProductViewImpl { public: - explicit RadarProductViewImpl() = default; - ~RadarProductViewImpl() = default; + explicit RadarProductViewImpl() : isActive_ {false} {}; + ~RadarProductViewImpl() = default; + + bool isActive_; }; RadarProductView::RadarProductView() : @@ -85,6 +87,16 @@ RadarProductView::GetCfpMomentData() const return std::tie(data, dataSize, componentSize); } +bool RadarProductView::IsActive() const +{ + return p->isActive_; +} + +void RadarProductView::SetActive(bool isActive) +{ + p->isActive_ = isActive; +} + void RadarProductView::ComputeSweep() { BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "ComputeSweep()"; diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp index c779a6e2..4966d1da 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp @@ -42,6 +42,10 @@ public: virtual std::tuple GetMomentData() const = 0; virtual std::tuple GetCfpMomentData() const; + bool IsActive() const; + + void SetActive(bool isActive); + protected: virtual void UpdateColorTable() = 0;