blob: fd8a5b825584ec54a2ee77e58a5b8d2d4b3269d0 [file] [log] [blame]
/****************************************************************************
**
** 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.
*/