From e2fddf5f24b2c23c8188a3508e75e32db7f9ca57 Mon Sep 17 00:00:00 2001 From: Sean Harmer Date: Sun, 17 Jan 2016 14:31:18 +0000 Subject: Have Qt3DQuickWindow manage window surface Change-Id: I3d034728781aa5b99868c92ea73ebf427ee88c5a Reviewed-by: Paul Lemire --- examples/qt3d/anaglyph-rendering/main.qml | 1 - examples/qt3d/bigmodel-qml/main.qml | 1 - examples/qt3d/bigscene-instanced-qml/main.qml | 1 - examples/qt3d/clip-planes-qml/main.qml | 1 - examples/qt3d/custom-mesh-qml/main.qml | 1 - examples/qt3d/cylinder-qml/main.qml | 1 - examples/qt3d/examples-common/qt3dquickwindow.cpp | 41 +++++++++++++++++++++-- examples/qt3d/examples-common/qt3dquickwindow.h | 2 ++ examples/qt3d/gooch-qml/main.qml | 1 - examples/qt3d/instanced-arrays-qml/main.qml | 1 - examples/qt3d/keyboardinput-qml/main.qml | 1 - examples/qt3d/lights/main.qml | 1 - examples/qt3d/materials/main.qml | 1 - examples/qt3d/mouseinput-qml/main.qml | 1 - examples/qt3d/multiviewport/main.qml | 1 - examples/qt3d/picking-qml/main.qml | 1 - examples/qt3d/plasma/main.qml | 4 +-- examples/qt3d/simple-qml/main.qml | 1 - examples/qt3d/simple-shaders-qml/main.qml | 1 - examples/qt3d/skybox/main.qml | 1 - examples/qt3d/tessellation-modes/main.qml | 1 - examples/qt3d/torus-qml/main.qml | 1 - examples/qt3d/transforms-qml/main.qml | 1 - examples/qt3d/transparency-qml/main.qml | 1 - examples/qt3d/wave/main.qml | 1 - examples/qt3d/wireframe/main.qml | 1 - src/quick3d/quick3d/qqmlaspectengine.cpp | 5 +++ src/quick3d/quick3d/qqmlaspectengine.h | 1 + 28 files changed, 48 insertions(+), 28 deletions(-) diff --git a/examples/qt3d/anaglyph-rendering/main.qml b/examples/qt3d/anaglyph-rendering/main.qml index 7b9d5afd1..cb852a675 100644 --- a/examples/qt3d/anaglyph-rendering/main.qml +++ b/examples/qt3d/anaglyph-rendering/main.qml @@ -46,7 +46,6 @@ Entity { id: stereoFrameGraph leftCamera: stereoCamera.leftCamera rightCamera: stereoCamera.rightCamera - window: _q_window } } diff --git a/examples/qt3d/bigmodel-qml/main.qml b/examples/qt3d/bigmodel-qml/main.qml index d261dafdb..6280ad2d6 100644 --- a/examples/qt3d/bigmodel-qml/main.qml +++ b/examples/qt3d/bigmodel-qml/main.qml @@ -48,7 +48,6 @@ Entity { FrameGraph { activeFrameGraph:ForwardRenderer { camera: mainCamera - window: _q_window } } ] diff --git a/examples/qt3d/bigscene-instanced-qml/main.qml b/examples/qt3d/bigscene-instanced-qml/main.qml index 83fb57c4f..8b7623732 100644 --- a/examples/qt3d/bigscene-instanced-qml/main.qml +++ b/examples/qt3d/bigscene-instanced-qml/main.qml @@ -60,7 +60,6 @@ Entity { activeFrameGraph: ForwardRenderer { clearColor: Qt.rgba(0, 0.5, 1, 1) camera: camera - window: _q_window } } ] diff --git a/examples/qt3d/clip-planes-qml/main.qml b/examples/qt3d/clip-planes-qml/main.qml index e2f210122..06fd5bf14 100644 --- a/examples/qt3d/clip-planes-qml/main.qml +++ b/examples/qt3d/clip-planes-qml/main.qml @@ -59,7 +59,6 @@ Entity { ClipCappingFrameGraph { camera: camera; clearColor: Qt.rgba(0.0, 0.5, 1, 1) - window: _q_window } } diff --git a/examples/qt3d/custom-mesh-qml/main.qml b/examples/qt3d/custom-mesh-qml/main.qml index 1257676a5..cb7175b07 100644 --- a/examples/qt3d/custom-mesh-qml/main.qml +++ b/examples/qt3d/custom-mesh-qml/main.qml @@ -60,7 +60,6 @@ Entity { activeFrameGraph: ForwardRenderer { clearColor: Qt.rgba(0.5, 0.5, 1, 1) camera: camera - window: _q_window } } ] diff --git a/examples/qt3d/cylinder-qml/main.qml b/examples/qt3d/cylinder-qml/main.qml index b628faad9..d27439fe0 100644 --- a/examples/qt3d/cylinder-qml/main.qml +++ b/examples/qt3d/cylinder-qml/main.qml @@ -59,7 +59,6 @@ Entity { activeFrameGraph : ForwardRenderer { camera: camera clearColor: "black" - window: _q_window } } diff --git a/examples/qt3d/examples-common/qt3dquickwindow.cpp b/examples/qt3d/examples-common/qt3dquickwindow.cpp index 5aa5a6e85..4e633fc55 100644 --- a/examples/qt3d/examples-common/qt3dquickwindow.cpp +++ b/examples/qt3d/examples-common/qt3dquickwindow.cpp @@ -37,6 +37,8 @@ #include "qt3dquickwindow.h" #include #include +#include +#include #include #include @@ -110,8 +112,12 @@ void Qt3DQuickWindow::showEvent(QShowEvent *e) data.insert(QStringLiteral("eventSource"), QVariant::fromValue(this)); m_engine->aspectEngine()->setData(data); - // TODO: Remove this hack once we can automagically set the window on the framegraph - m_engine->qmlEngine()->rootContext()->setContextProperty("_q_window", this); + // Connect to the QQmlAspectEngine's statusChanged signal so that when the QML is loaded + // and th eobjects hav ebeen instantiated, but before we set them on the QAspectEngine we + // can swoop in and set the window surface and camera on the framegraph and ensure the camera + // respects the window's aspect ratio + connect(m_engine.data(), &Qt3DCore::Quick::QQmlAspectEngine::sceneCreated, + this, &Qt3DQuickWindow::onSceneCreated); m_engine->setSource(m_source); @@ -124,4 +130,35 @@ void Qt3DQuickWindow::showEvent(QShowEvent *e) QQuickWindow::showEvent(e); } +void Qt3DQuickWindow::onSceneCreated(QObject *rootObject) +{ + Q_ASSERT(rootObject); + + // Find surface selector in framegraph and set ourselves up as the + // render surface there + Qt3DRender::QFrameGraph *frameGraphComponent + = rootObject->findChild(); + if (!frameGraphComponent) { + qWarning() << "No frame graph component found"; + return; + } + + Qt3DCore::QNode *frameGraphRoot = frameGraphComponent->activeFrameGraph(); + if (!frameGraphRoot) { + qWarning() << "No active frame graph found"; + return; + } + + Qt3DRender::QRenderSurfaceSelector *surfaceSelector + = frameGraphRoot->findChild(); + if (!surfaceSelector) { + qWarning() << "No render surface selector found in frame graph"; + return; + } + + surfaceSelector->setWindow(this); + + // TODO: Set ourselves up as a source of input events for the input aspect +} + QT_END_NAMESPACE diff --git a/examples/qt3d/examples-common/qt3dquickwindow.h b/examples/qt3d/examples-common/qt3dquickwindow.h index 85009de20..9991a85e5 100644 --- a/examples/qt3d/examples-common/qt3dquickwindow.h +++ b/examples/qt3d/examples-common/qt3dquickwindow.h @@ -78,6 +78,8 @@ protected: void showEvent(QShowEvent *e) Q_DECL_OVERRIDE; private: + void onSceneCreated(QObject *rootObject); + QScopedPointer m_engine; // Aspects diff --git a/examples/qt3d/gooch-qml/main.qml b/examples/qt3d/gooch-qml/main.qml index 5649a03eb..abed8974b 100644 --- a/examples/qt3d/gooch-qml/main.qml +++ b/examples/qt3d/gooch-qml/main.qml @@ -47,7 +47,6 @@ Entity { FrameGraph { ForwardRenderer { camera: mainCamera - window: _q_window } } ] diff --git a/examples/qt3d/instanced-arrays-qml/main.qml b/examples/qt3d/instanced-arrays-qml/main.qml index fb17cae7f..4e9d7e144 100644 --- a/examples/qt3d/instanced-arrays-qml/main.qml +++ b/examples/qt3d/instanced-arrays-qml/main.qml @@ -60,7 +60,6 @@ Entity { activeFrameGraph: ForwardRenderer { clearColor: Qt.rgba(0, 0.5, 1, 1) camera: camera - window: _q_window } } ] diff --git a/examples/qt3d/keyboardinput-qml/main.qml b/examples/qt3d/keyboardinput-qml/main.qml index c07597e13..96cf9148e 100644 --- a/examples/qt3d/keyboardinput-qml/main.qml +++ b/examples/qt3d/keyboardinput-qml/main.qml @@ -58,7 +58,6 @@ Entity { components: FrameGraph { activeFrameGraph: ForwardRenderer { camera: camera - window: _q_window } } diff --git a/examples/qt3d/lights/main.qml b/examples/qt3d/lights/main.qml index 267582a74..1cfeb0cd4 100644 --- a/examples/qt3d/lights/main.qml +++ b/examples/qt3d/lights/main.qml @@ -44,7 +44,6 @@ Entity activeFrameGraph: ForwardRenderer { clearColor: Qt.rgba(0, 0, 0, 1) camera: camera - window: _q_window } } diff --git a/examples/qt3d/materials/main.qml b/examples/qt3d/materials/main.qml index 1d94c8c6f..a470e2415 100644 --- a/examples/qt3d/materials/main.qml +++ b/examples/qt3d/materials/main.qml @@ -49,7 +49,6 @@ Entity { activeFrameGraph: SortedForwardRenderer { id: renderer camera: mainCamera - window: _q_window } } ] diff --git a/examples/qt3d/mouseinput-qml/main.qml b/examples/qt3d/mouseinput-qml/main.qml index f38f85371..8158e18f7 100644 --- a/examples/qt3d/mouseinput-qml/main.qml +++ b/examples/qt3d/mouseinput-qml/main.qml @@ -59,7 +59,6 @@ Entity { ForwardRenderer { camera: camera clearColor: "black" - window: _q_window } } diff --git a/examples/qt3d/multiviewport/main.qml b/examples/qt3d/multiviewport/main.qml index 66ab274ab..cfdd7a1a5 100644 --- a/examples/qt3d/multiviewport/main.qml +++ b/examples/qt3d/multiviewport/main.qml @@ -48,7 +48,6 @@ Entity { topRightCamera: cameraSet.cameras[1] bottomLeftCamera: cameraSet.cameras[2] bottomRightCamera: cameraSet.cameras[3] - window: _q_window } Entity { diff --git a/examples/qt3d/picking-qml/main.qml b/examples/qt3d/picking-qml/main.qml index a1d3e6aa8..2c9e7a955 100644 --- a/examples/qt3d/picking-qml/main.qml +++ b/examples/qt3d/picking-qml/main.qml @@ -60,7 +60,6 @@ Entity { ForwardRenderer { camera: camera clearColor: "black" - window: _q_window } } diff --git a/examples/qt3d/plasma/main.qml b/examples/qt3d/plasma/main.qml index 8d6ce7f37..6e850bf8a 100644 --- a/examples/qt3d/plasma/main.qml +++ b/examples/qt3d/plasma/main.qml @@ -39,9 +39,7 @@ import Qt3D.Render 2.0 Entity { components: FrameGraph { - ForwardRenderer { - window: _q_window - } + ForwardRenderer {} } Entity { diff --git a/examples/qt3d/simple-qml/main.qml b/examples/qt3d/simple-qml/main.qml index aa4b5d7d5..9d25da81a 100644 --- a/examples/qt3d/simple-qml/main.qml +++ b/examples/qt3d/simple-qml/main.qml @@ -63,7 +63,6 @@ Entity { activeFrameGraph: ForwardRenderer { clearColor: Qt.rgba(0, 0.5, 1, 1) camera: camera - window: _q_window } } ] diff --git a/examples/qt3d/simple-shaders-qml/main.qml b/examples/qt3d/simple-shaders-qml/main.qml index c01fc8eb1..b51a25712 100644 --- a/examples/qt3d/simple-shaders-qml/main.qml +++ b/examples/qt3d/simple-shaders-qml/main.qml @@ -60,7 +60,6 @@ Entity { activeFrameGraph: ForwardRenderer { clearColor: Qt.rgba(0, 0.5, 1, 1) camera: camera - window: _q_window } } ] diff --git a/examples/qt3d/skybox/main.qml b/examples/qt3d/skybox/main.qml index 65947ee10..e8cfdb2cf 100644 --- a/examples/qt3d/skybox/main.qml +++ b/examples/qt3d/skybox/main.qml @@ -44,7 +44,6 @@ Entity { ForwardRenderer { camera: basicCamera clearColor: "black" - window: _q_window } } diff --git a/examples/qt3d/tessellation-modes/main.qml b/examples/qt3d/tessellation-modes/main.qml index 487f75a39..e2b06f21f 100644 --- a/examples/qt3d/tessellation-modes/main.qml +++ b/examples/qt3d/tessellation-modes/main.qml @@ -50,7 +50,6 @@ Entity { id: renderer camera: mainCamera clearColor: "black" - window: _q_window } } ] diff --git a/examples/qt3d/torus-qml/main.qml b/examples/qt3d/torus-qml/main.qml index 1fbd62494..fc86231d8 100644 --- a/examples/qt3d/torus-qml/main.qml +++ b/examples/qt3d/torus-qml/main.qml @@ -59,7 +59,6 @@ Entity { activeFrameGraph : ForwardRenderer { camera: camera clearColor: "black" - window: _q_window } } diff --git a/examples/qt3d/transforms-qml/main.qml b/examples/qt3d/transforms-qml/main.qml index 493c4c932..332905f65 100644 --- a/examples/qt3d/transforms-qml/main.qml +++ b/examples/qt3d/transforms-qml/main.qml @@ -45,7 +45,6 @@ Entity { activeFrameGraph: ForwardRenderer { clearColor: Qt.rgba(0, 0.5, 1, 1) camera: camera - window: _q_window } } ] diff --git a/examples/qt3d/transparency-qml/main.qml b/examples/qt3d/transparency-qml/main.qml index e98531787..c9ae6b7f7 100644 --- a/examples/qt3d/transparency-qml/main.qml +++ b/examples/qt3d/transparency-qml/main.qml @@ -59,7 +59,6 @@ Entity { activeFrameGraph: ForwardRenderer{ camera: camera clearColor: Qt.rgba(0.0, 0.5, 1, 1) - window: _q_window } } diff --git a/examples/qt3d/wave/main.qml b/examples/qt3d/wave/main.qml index 1006f69d8..a6f46bfa7 100644 --- a/examples/qt3d/wave/main.qml +++ b/examples/qt3d/wave/main.qml @@ -62,7 +62,6 @@ Entity { id: frameGraph activeFrameGraph: WaveForwardRenderer { camera: mainCamera - window: _q_window } } diff --git a/examples/qt3d/wireframe/main.qml b/examples/qt3d/wireframe/main.qml index 944923618..35033951d 100644 --- a/examples/qt3d/wireframe/main.qml +++ b/examples/qt3d/wireframe/main.qml @@ -47,7 +47,6 @@ Entity { activeFrameGraph: ForwardRenderer { id: renderer camera: mainCamera - window: _q_window } } ] diff --git a/src/quick3d/quick3d/qqmlaspectengine.cpp b/src/quick3d/quick3d/qqmlaspectengine.cpp index cf2372ca5..d7e540c42 100644 --- a/src/quick3d/quick3d/qqmlaspectengine.cpp +++ b/src/quick3d/quick3d/qqmlaspectengine.cpp @@ -133,6 +133,11 @@ void QQmlAspectEnginePrivate::_q_continueExecute() return; } + // Let users know we have loaded the QML file, and the scene has been instantiated. + // This gives a chance to manipulate the scene before passing it over to the + // aspect engine. Useful for convenience window classes to set up cameras and surfaces + // on the framegraph and event sources for the input aspect etc. + emit q->sceneCreated(obj); m_aspectEngine->setRootEntity(qobject_cast(obj)); emit q->statusChanged(q->status()); } diff --git a/src/quick3d/quick3d/qqmlaspectengine.h b/src/quick3d/quick3d/qqmlaspectengine.h index 7f742e83f..b94c6ab10 100644 --- a/src/quick3d/quick3d/qqmlaspectengine.h +++ b/src/quick3d/quick3d/qqmlaspectengine.h @@ -64,6 +64,7 @@ public: Q_SIGNALS: void statusChanged(Status); + void sceneCreated(QObject* rootObject); private: Q_DECLARE_PRIVATE(QQmlAspectEngine) -- cgit v1.2.3