From c7a120aa2e77011d3a1edef984f8dc53b03162cd Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen <richard.gustavsen@qt.io> Date: Thu, 27 Jun 2019 15:47:24 +0200 Subject: [PATCH] QDemonView3D: add worldToView --- src/quick3d/qdemoncamera.cpp | 2 ++ src/quick3d/qdemonview3d.cpp | 21 +++++++++++++++++++++ src/quick3d/qdemonview3d.h | 2 ++ 3 files changed, 25 insertions(+) diff --git a/src/quick3d/qdemoncamera.cpp b/src/quick3d/qdemoncamera.cpp index 7ba65703..e742b154 100644 --- a/src/quick3d/qdemoncamera.cpp +++ b/src/quick3d/qdemoncamera.cpp @@ -157,6 +157,8 @@ void QDemonCamera::setProjectionMode(QDemonCamera::QDemonCameraProjectionMode pr * is normalized between 0 and 1. The top-left of the viewport is (0,0) and * the botton-right is (1,1). If the position is not visible in the viewport, a * position of [-1, -1] is returned. + * + * \sa QDemonView3D::worldToView */ QVector2D QDemonCamera::worldToViewport(const QVector3D &worldPos) const { diff --git a/src/quick3d/qdemonview3d.cpp b/src/quick3d/qdemonview3d.cpp index 3156ef37..d796853a 100644 --- a/src/quick3d/qdemonview3d.cpp +++ b/src/quick3d/qdemonview3d.cpp @@ -4,6 +4,7 @@ #include "qdemonscenemanager_p.h" #include "qdemonimage.h" #include "qdemonscenerenderer.h" +#include "qdemoncamera.h" #include <QtDemonRuntimeRender/QDemonRenderLayer> #include <QOpenGLFunctions> @@ -421,6 +422,26 @@ QSurfaceFormat QDemonView3D::idealSurfaceFormat() return f; } +/*! + * Transforms \a worldPoint from world space into view space. If the position + * is not visible in the viewport, a position of [-1, -1] is returned. This + * function requires that a camera is assigned to the view. + * + * \sa QDemonCamera::worldToViewport + */ +QVector2D QDemonView3D::worldToView(const QVector3D &worldPos) const +{ + if (!m_camera) { + qmlWarning(this) << "Cannot resolve position in view without a camera assigned!"; + return QVector2D(-1, -1); + } + + const QVector2D normalizedPos = m_camera->worldToViewport(worldPos); + if (normalizedPos.x() < 0) + return normalizedPos; + return normalizedPos * QVector2D(float(width()), float(height())); +} + void QDemonView3D::invalidateSceneGraph() { m_node = nullptr; diff --git a/src/quick3d/qdemonview3d.h b/src/quick3d/qdemonview3d.h index e50923eb..08f06892 100644 --- a/src/quick3d/qdemonview3d.h +++ b/src/quick3d/qdemonview3d.h @@ -57,6 +57,8 @@ public: static QSurfaceFormat idealSurfaceFormat(); + Q_INVOKABLE QVector2D worldToView(const QVector3D &worldPos) const; + protected: void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override; QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; -- GitLab