summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-01-19 14:04:54 +0000
committerSean Harmer <sean.harmer@kdab.com>2016-01-19 14:35:43 +0000
commit7678557c2d2135b9c34c3402146d126cc1eed0b0 (patch)
treef71500d216512164d22bc797b1331f4a810d7f2e /src
parent704dca53b4575622127dc5351c4f88cc97e497b5 (diff)
Add automatic aspect ratio support for camera in Scene3D
Change-Id: Ibb3378e2e1d495986f68902e368847e89d8fbdd6 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/quick3d/imports/scene3d/scene3ditem.cpp57
-rw-r--r--src/quick3d/imports/scene3d/scene3ditem_p.h17
2 files changed, 72 insertions, 2 deletions
diff --git a/src/quick3d/imports/scene3d/scene3ditem.cpp b/src/quick3d/imports/scene3d/scene3ditem.cpp
index 8f356bda4..552204ffd 100644
--- a/src/quick3d/imports/scene3d/scene3ditem.cpp
+++ b/src/quick3d/imports/scene3d/scene3ditem.cpp
@@ -42,6 +42,7 @@
#include <Qt3DCore/QAspectEngine>
#include <Qt3DCore/qentity.h>
+#include <Qt3DRender/qcamera.h>
#include <Qt3DRender/QRenderAspect>
#include <Qt3DRender/qframegraph.h>
#include <Qt3DRender/qrendersurfaceselector.h>
@@ -73,6 +74,7 @@ Scene3DItem::Scene3DItem(QQuickItem *parent)
, m_renderer(Q_NULLPTR)
, m_rendererCleaner(new Scene3DCleaner())
, m_multisample(true)
+ , m_cameraAspectRatioMode(AutomaticAspectRatio)
{
setFlag(QQuickItem::ItemHasContents, true);
setAcceptedMouseButtons(Qt::MouseButtonMask);
@@ -136,14 +138,43 @@ void Scene3DItem::setEntity(Qt3DCore::QEntity *entity)
emit entityChanged();
}
+void Scene3DItem::setCameraAspectRatioMode(CameraAspectRatioMode mode)
+{
+ if (m_cameraAspectRatioMode == mode)
+ return;
+
+ m_cameraAspectRatioMode = mode;
+ setCameraAspectModeHelper();
+ emit cameraAspectRatioModeChanged(mode);
+}
+
+Scene3DItem::CameraAspectRatioMode Scene3DItem::cameraAspectRatioMode() const
+{
+ return m_cameraAspectRatioMode;
+}
+
void Scene3DItem::applyRootEntityChange()
{
if (m_aspectEngine->rootEntity() != m_entity) {
m_aspectEngine->setRootEntity(m_entity);
// Set the render surface
- if (m_entity)
- setWindowSurface(m_entity);
+ if (!m_entity)
+ return;
+
+ setWindowSurface(m_entity);
+
+ if (m_cameraAspectRatioMode == AutomaticAspectRatio) {
+ // Set aspect ratio of first camera to match the window
+ QList<Qt3DRender::QCamera *> cameras
+ = m_entity->findChildren<Qt3DRender::QCamera *>();
+ if (cameras.isEmpty()) {
+ qWarning() << "No camera found and automatic aspect ratio requested";
+ } else {
+ m_camera = cameras.first();
+ setCameraAspectModeHelper();
+ }
+ }
}
}
@@ -174,6 +205,28 @@ void Scene3DItem::setWindowSurface(QObject *rootObject)
surfaceSelector->setWindow(this->window());
}
+void Scene3DItem::setCameraAspectModeHelper()
+{
+ switch (m_cameraAspectRatioMode) {
+ case AutomaticAspectRatio:
+ connect(this, &Scene3DItem::widthChanged, this, &Scene3DItem::updateCameraAspectRatio);
+ connect(this, &Scene3DItem::heightChanged, this, &Scene3DItem::updateCameraAspectRatio);
+ break;
+ case UserAspectRatio:
+ disconnect(this, &Scene3DItem::widthChanged, this, &Scene3DItem::updateCameraAspectRatio);
+ disconnect(this, &Scene3DItem::heightChanged, this, &Scene3DItem::updateCameraAspectRatio);
+ break;
+ }
+}
+
+void Scene3DItem::updateCameraAspectRatio()
+{
+ if (m_camera) {
+ m_camera->setAspectRatio(static_cast<float>(width()) /
+ static_cast<float>(height()));
+ }
+}
+
/*!
\return \c true if a multisample renderbuffer is in use.
*/
diff --git a/src/quick3d/imports/scene3d/scene3ditem_p.h b/src/quick3d/imports/scene3d/scene3ditem_p.h
index bb078d6b8..f3379a7e9 100644
--- a/src/quick3d/imports/scene3d/scene3ditem_p.h
+++ b/src/quick3d/imports/scene3d/scene3ditem_p.h
@@ -49,6 +49,7 @@
//
#include <QQuickItem>
+#include <QtCore/qpointer.h>
QT_BEGIN_NAMESPACE
@@ -59,6 +60,7 @@ class QEntity;
namespace Qt3DRender {
+class QCamera;
class QRenderAspect;
class Scene3DRenderer;
class Scene3DCleaner;
@@ -69,6 +71,7 @@ class Scene3DItem : public QQuickItem
Q_PROPERTY(Qt3DCore::QEntity* entity READ entity WRITE setEntity NOTIFY entityChanged)
Q_PROPERTY(QStringList aspects READ aspects WRITE setAspects NOTIFY aspectsChanged)
Q_PROPERTY(bool multisample READ multisample WRITE setMultisample NOTIFY multisampleChanged)
+ Q_PROPERTY(CameraAspectRatioMode cameraAspectRatioMode READ cameraAspectRatioMode WRITE setCameraAspectRatioMode NOTIFY cameraAspectRatioModeChanged)
Q_CLASSINFO("DefaultProperty", "entity")
public:
explicit Scene3DItem(QQuickItem *parent = 0);
@@ -80,14 +83,23 @@ public:
bool multisample() const;
void setMultisample(bool enable);
+ enum CameraAspectRatioMode {
+ AutomaticAspectRatio,
+ UserAspectRatio
+ };
+ Q_ENUM(CameraAspectRatioMode);
+ CameraAspectRatioMode cameraAspectRatioMode() const;
+
public Q_SLOTS:
void setAspects(const QStringList &aspects);
void setEntity(Qt3DCore::QEntity *entity);
+ void setCameraAspectRatioMode(CameraAspectRatioMode mode);
Q_SIGNALS:
void aspectsChanged();
void entityChanged();
void multisampleChanged();
+ void cameraAspectRatioModeChanged(CameraAspectRatioMode mode);
private Q_SLOTS:
void applyRootEntityChange();
@@ -95,6 +107,8 @@ private Q_SLOTS:
private:
QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *nodeData) Q_DECL_OVERRIDE;
void setWindowSurface(QObject *rootObject);
+ void setCameraAspectModeHelper();
+ void updateCameraAspectRatio();
QStringList m_aspects;
Qt3DCore::QEntity *m_entity;
@@ -105,6 +119,9 @@ private:
Scene3DCleaner *m_rendererCleaner;
bool m_multisample;
+
+ QPointer<Qt3DRender::QCamera> m_camera;
+ CameraAspectRatioMode m_cameraAspectRatioMode;
};
} // Qt3DRender