Add cursor position (screen coordinates) to mouse picking

This commit is contained in:
Dan Paulat 2023-09-08 22:57:30 -05:00
parent f158c4174c
commit 9ebc859756
13 changed files with 55 additions and 23 deletions

View file

@ -55,7 +55,9 @@ void DrawItem::Render(const QMapLibreGL::CustomLayerRenderParameters& params,
bool DrawItem::RunMousePicking( bool DrawItem::RunMousePicking(
const QMapLibreGL::CustomLayerRenderParameters& /* params */, const QMapLibreGL::CustomLayerRenderParameters& /* params */,
const glm::vec2& /* mousePos */) const QPointF& /* mouseLocalPos */,
const QPointF& /* mouseGlobalPos */,
const glm::vec2& /* mouseCoords */)
{ {
// By default, the draw item is not picked // By default, the draw item is not picked
return false; return false;

View file

@ -38,13 +38,17 @@ public:
* @brief Run mouse picking on the draw item. * @brief Run mouse picking on the draw item.
* *
* @param [in] params Custom layer render parameters * @param [in] params Custom layer render parameters
* @param [in] mousePos Mouse cursor location in map screen coordinates * @param [in] mouseLocalPos Mouse cursor widget position
* @param [in] mouseGlobalPos Mouse cursor screen position
* @param [in] mouseCoords Mouse cursor location in map screen coordinates
* *
* @return true if the draw item was picked, otherwise false * @return true if the draw item was picked, otherwise false
*/ */
virtual bool virtual bool
RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params, RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
const glm::vec2& mousePos); const QPointF& mouseLocalPos,
const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords);
protected: protected:
void void

View file

@ -684,7 +684,9 @@ void PlacefileIcons::Impl::Update(bool textureAtlasChanged)
bool PlacefileIcons::RunMousePicking( bool PlacefileIcons::RunMousePicking(
const QMapLibreGL::CustomLayerRenderParameters& params, const QMapLibreGL::CustomLayerRenderParameters& params,
const glm::vec2& mousePos) const QPointF& /* mouseLocalPos */,
const QPointF& /* mouseGlobalPos */,
const glm::vec2& mouseCoords)
{ {
std::unique_lock lock {p->iconMutex_}; std::unique_lock lock {p->iconMutex_};
@ -716,7 +718,7 @@ bool PlacefileIcons::RunMousePicking(
std::execution::par_unseq, std::execution::par_unseq,
p->currentHoverIcons_.crbegin(), p->currentHoverIcons_.crbegin(),
p->currentHoverIcons_.crend(), p->currentHoverIcons_.crend(),
[&mapDistance, &selectedTime, &mapMatrix, &mousePos](const auto& icon) [&mapDistance, &selectedTime, &mapMatrix, &mouseCoords](const auto& icon)
{ {
if (( if ((
// Placefile is thresholded // Placefile is thresholded
@ -766,7 +768,7 @@ bool PlacefileIcons::RunMousePicking(
tr += otr; tr += otr;
// Test point against polygon bounds // Test point against polygon bounds
return util::maplibre::IsPointInPolygon({tl, bl, br, tr}, mousePos); return util::maplibre::IsPointInPolygon({tl, bl, br, tr}, mouseCoords);
}); });
if (it != p->currentHoverIcons_.crend()) if (it != p->currentHoverIcons_.crend())

View file

@ -36,7 +36,9 @@ public:
void Deinitialize() override; void Deinitialize() override;
bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params, bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
const glm::vec2& mousePos) override; const QPointF& mouseLocalPos,
const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords) override;
/** /**
* Resets and prepares the draw item for adding a new set of icons. * Resets and prepares the draw item for adding a new set of icons.

View file

@ -497,7 +497,9 @@ void PlacefileLines::Impl::Update()
bool PlacefileLines::RunMousePicking( bool PlacefileLines::RunMousePicking(
const QMapLibreGL::CustomLayerRenderParameters& params, const QMapLibreGL::CustomLayerRenderParameters& params,
const glm::vec2& mousePos) const QPointF& /* mouseLocalPos */,
const QPointF& /* mouseGlobalPos */,
const glm::vec2& mouseCoords)
{ {
std::unique_lock lock {p->lineMutex_}; std::unique_lock lock {p->lineMutex_};
@ -529,7 +531,7 @@ bool PlacefileLines::RunMousePicking(
std::execution::par_unseq, std::execution::par_unseq,
p->currentHoverLines_.crbegin(), p->currentHoverLines_.crbegin(),
p->currentHoverLines_.crend(), p->currentHoverLines_.crend(),
[&mapDistance, &selectedTime, &mapMatrix, &mousePos](const auto& line) [&mapDistance, &selectedTime, &mapMatrix, &mouseCoords](const auto& line)
{ {
if (( if ((
// Placefile is thresholded // Placefile is thresholded
@ -581,7 +583,7 @@ bool PlacefileLines::RunMousePicking(
// TODO: X/Y offsets // TODO: X/Y offsets
// Test point against polygon bounds // Test point against polygon bounds
return util::maplibre::IsPointInPolygon({tl, bl, br, tr}, mousePos); return util::maplibre::IsPointInPolygon({tl, bl, br, tr}, mouseCoords);
}); });
if (it != p->currentHoverLines_.crend()) if (it != p->currentHoverLines_.crend())

View file

@ -33,7 +33,9 @@ public:
void Deinitialize() override; void Deinitialize() override;
bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params, bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
const glm::vec2& mousePos) override; const QPointF& mouseLocalPos,
const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords) override;
/** /**
* Resets and prepares the draw item for adding a new set of lines. * Resets and prepares the draw item for adding a new set of lines.

View file

@ -209,7 +209,9 @@ void PlacefileText::Deinitialize()
bool PlacefileText::RunMousePicking( bool PlacefileText::RunMousePicking(
const QMapLibreGL::CustomLayerRenderParameters& /* params */, const QMapLibreGL::CustomLayerRenderParameters& /* params */,
const glm::vec2& /* mousePos */) const QPointF& /* mouseLocalPos */,
const QPointF& /* mouseGlobalPos */,
const glm::vec2& /* mouseCoords */)
{ {
bool itemPicked = false; bool itemPicked = false;

View file

@ -35,7 +35,9 @@ public:
void Deinitialize() override; void Deinitialize() override;
bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params, bool RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
const glm::vec2& mousePos) override; const QPointF& mouseLocalPos,
const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords) override;
/** /**
* Resets and prepares the draw item for adding a new set of text. * Resets and prepares the draw item for adding a new set of text.

View file

@ -78,7 +78,9 @@ void DrawLayer::Deinitialize()
bool DrawLayer::RunMousePicking( bool DrawLayer::RunMousePicking(
const QMapLibreGL::CustomLayerRenderParameters& params, const QMapLibreGL::CustomLayerRenderParameters& params,
const glm::vec2& mousePos) const QPointF& mouseLocalPos,
const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords)
{ {
bool itemPicked = false; bool itemPicked = false;
@ -86,7 +88,8 @@ bool DrawLayer::RunMousePicking(
for (auto it = p->drawList_.rbegin(); it != p->drawList_.rend(); ++it) for (auto it = p->drawList_.rbegin(); it != p->drawList_.rend(); ++it)
{ {
// Run mouse picking on each draw item // Run mouse picking on each draw item
if ((*it)->RunMousePicking(params, mousePos)) if ((*it)->RunMousePicking(
params, mouseLocalPos, mouseGlobalPos, mouseCoords))
{ {
// If a draw item was picked, don't process additional items // If a draw item was picked, don't process additional items
itemPicked = true; itemPicked = true;

View file

@ -25,7 +25,9 @@ public:
virtual bool virtual bool
RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params, RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
const glm::vec2& mousePos) override; const QPointF& mouseLocalPos,
const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords) override;
protected: protected:
void AddDrawItem(const std::shared_ptr<gl::draw::DrawItem>& drawItem); void AddDrawItem(const std::shared_ptr<gl::draw::DrawItem>& drawItem);

View file

@ -28,6 +28,8 @@ GenericLayer::~GenericLayer() = default;
bool GenericLayer::RunMousePicking( bool GenericLayer::RunMousePicking(
const QMapLibreGL::CustomLayerRenderParameters& /* params */, const QMapLibreGL::CustomLayerRenderParameters& /* params */,
const QPointF& /* mouseLocalPos */,
const QPointF& /* mouseGlobalPos */,
const glm::vec2& /* mousePos */) const glm::vec2& /* mousePos */)
{ {
// By default, the layer has nothing to pick // By default, the layer has nothing to pick

View file

@ -33,13 +33,17 @@ public:
* @brief Run mouse picking on the layer. * @brief Run mouse picking on the layer.
* *
* @param [in] params Custom layer render parameters * @param [in] params Custom layer render parameters
* @param [in] mousePos Mouse cursor location in map screen coordinates * @param [in] mouseLocalPos Mouse cursor widget position
* @param [in] mouseGlobalPos Mouse cursor screen position
* @param [in] mouseCoords Mouse cursor location in map screen coordinates
* *
* @return true if a draw item was picked, otherwise false * @return true if a draw item was picked, otherwise false
*/ */
virtual bool virtual bool
RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params, RunMousePicking(const QMapLibreGL::CustomLayerRenderParameters& params,
const glm::vec2& mousePos); const QPointF& mouseLocalPos,
const QPointF& mouseGlobalPos,
const glm::vec2& mouseCoords);
protected: protected:
std::shared_ptr<MapContext> context() const; std::shared_ptr<MapContext> context() const;

View file

@ -70,7 +70,6 @@ public:
autoRefreshEnabled_ {true}, autoRefreshEnabled_ {true},
autoUpdateEnabled_ {true}, autoUpdateEnabled_ {true},
selectedLevel2Product_ {common::Level2Product::Unknown}, selectedLevel2Product_ {common::Level2Product::Unknown},
lastPos_(),
currentStyleIndex_ {0}, currentStyleIndex_ {0},
currentStyle_ {nullptr}, currentStyle_ {nullptr},
frameDraws_(0), frameDraws_(0),
@ -174,7 +173,8 @@ public:
common::Level2Product selectedLevel2Product_; common::Level2Product selectedLevel2Product_;
bool hasMouse_ {false}; bool hasMouse_ {false};
QPointF lastPos_; QPointF lastPos_ {};
QPointF lastGlobalPos_ {};
std::size_t currentStyleIndex_; std::size_t currentStyleIndex_;
const MapStyle* currentStyle_; const MapStyle* currentStyle_;
std::string initialStyleName_ {}; std::string initialStyleName_ {};
@ -898,7 +898,8 @@ void MapWidget::keyPressEvent(QKeyEvent* ev)
void MapWidget::mousePressEvent(QMouseEvent* ev) void MapWidget::mousePressEvent(QMouseEvent* ev)
{ {
p->lastPos_ = ev->position(); p->lastPos_ = ev->position();
p->lastGlobalPos_ = ev->globalPosition();
if (ev->type() == QEvent::MouseButtonPress) if (ev->type() == QEvent::MouseButtonPress)
{ {
@ -944,7 +945,8 @@ void MapWidget::mouseMoveEvent(QMouseEvent* ev)
} }
} }
p->lastPos_ = ev->position(); p->lastPos_ = ev->position();
p->lastGlobalPos_ = ev->globalPosition();
ev->accept(); ev->accept();
} }
@ -1064,7 +1066,8 @@ void MapWidgetImpl::RunMousePicking()
++it) ++it)
{ {
// Run mouse picking for each layer // Run mouse picking for each layer
if ((*it)->RunMousePicking(params, mouseScreenCoordinate)) if ((*it)->RunMousePicking(
params, lastPos_, lastGlobalPos_, mouseScreenCoordinate))
{ {
// If a draw item was picked, don't process additional layers // If a draw item was picked, don't process additional layers
break; break;