| /**************************************************************************** |
| ** |
| ** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:FDL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU Free Documentation License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Free |
| ** Documentation License version 1.3 as published by the Free Software |
| ** Foundation and appearing in the file included in the packaging of |
| ** this file. Please review the following information to ensure |
| ** the GNU Free Documentation License version 1.3 requirements |
| ** will be met: https://www.gnu.org/licenses/fdl-1.3.html. |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| /*! |
| \example scene2d |
| \title Qt 3D: Scene2D QML Example |
| \ingroup qt3d-examples-qml |
| \brief A QML application that demonstrates using Qt Quick 2 within a Qt 3D scene. |
| |
| \image scene2d.png |
| |
| \e {Scene2D} demonstrates rendering a Qt Quick 2 scene into a texture and utilising |
| the texture within a Qt 3D application including handling mouse events. The 3D scene |
| contains a single active camera and renders a 3D Qt logo along with some controls |
| declared with Qt Quick Controls. |
| |
| \include examples-run.qdocinc |
| |
| \section1 Setting up the 3D Scene |
| |
| We set up the 3D scene in an Entity that acts as the root of the object tree. The |
| virtual camera is specified in \e main.qml: |
| |
| \quotefromfile scene2d/main.qml |
| \skipto Camera { |
| \printuntil } |
| |
| The RenderSettings specify the rendering algorithm used and also enable triangle |
| based picking which is needed to properly handle mouse events when projecting a |
| Qt Quick scene onto 3D geometry: |
| |
| \skipto RenderSettings { |
| \printuntil } |
| \printuntil } |
| |
| The 3D Qt logo that will be controlled by the controls in the Qt Quick scene is |
| declared with: |
| |
| \skipto Entity { |
| \printuntil } |
| \printuntil } |
| \printuntil } |
| \printuntil } |
| |
| It simply consists of a Mesh component to load the geometry; a PhongMaterial component |
| to give it a surface appearance, and a Transform component to specify its postion, |
| orientation, and scale. The properties of these components are bound to properties |
| on the logoControls element which we will discuss next. |
| |
| \section1 Rendering Qt Quick into a Texture |
| |
| We begin by declaring the Entity that will become our control panel. It consists of |
| a CuboidMesh onto which we will place the texture containing a rendering of the Qt Quick |
| scene. In this case we are using a simple cube for the geometry, but we could use |
| any valid 3D geometry as long as it has texture coordinates. The texture coordinates |
| are used for projecting the texture onto the 3D surface, and also for calculating the |
| coordinates of mouse events to be passed to the originating Qt Quick scene. |
| |
| \skipto Entity { |
| \printto Behavior |
| \skipto Transform { |
| \printuntil } |
| \printuntil } |
| |
| We also include an ObjectPicker component so that we can interact with the controls |
| using the mouse: |
| |
| \skipto ObjectPicker { |
| \printuntil } |
| \printuntil } |
| \printuntil } |
| |
| For this example we have chosen to use an interaction mechanism whereby you must |
| explicitly middle-click the controls to enable them. |
| |
| To apply the texture to the mesh, we make use of the built in TextureMaterial: |
| |
| \skipto TextureMaterial |
| \printuntil } |
| |
| The final remaining piece is how to render the above texture from a Qt Quick scene. |
| This is done with the Scene2D element: |
| |
| \skipto Scene2D |
| \printto } |
| \printto } |
| \printto } |
| |
| where we have made use of the Texture2D and RenderTargetOutput types to create a |
| destination texture and attach it as the output of the Scene2D renderer. |
| |
| Next, we tell the Scene2D object which entities may feed it input events and we |
| initially disable the handling of mouse events: |
| |
| \printto mouseEnabled: false |
| |
| Finally, we can specify the Qt Quick scene to render by adding a custom QML component |
| as a child to the Scene2D element: |
| |
| \skipto LogoControls |
| \printuntil } |
| \printuntil } |
| |
| When the mouseEnabled property is set to true by the ObjectPicker, then the Scene2D |
| object will process mouse events from any ObjectPickers attached to the listed entities. |
| In this way, you have the freedom to use the texture generated by the Scene2D object in |
| any way you wish, even on more than one Entity. |
| |
| The \e LogoControls.qml file is just a regular Qt Quick 2 scene which in this case |
| also makes use of the Qt Quick Controls components. |
| */ |