Merge remote-tracking branch 'origin/5.14' into 5.15

Change-Id: I3a0df1d21f3556afc9f26eab13fcc525cf584e7e
This commit is contained in:
Qt Forward Merge Bot 2019-11-16 03:05:05 +01:00
commit 00dc70ae70
57 changed files with 293 additions and 138 deletions

20
dist/changes-5.13.2 vendored Normal file
View File

@ -0,0 +1,20 @@
Qt 5.13.2 is a bug-fix release. It maintains both forward and backward
compatibility (source and binary) with Qt 5.13.0 through 5.13.1.
For more details, refer to the online documentation included in this
distribution. The documentation is also available online:
https://doc.qt.io/qt-5/index.html
The Qt version 5.13 series is binary compatible with the 5.12.x series.
Applications compiled for 5.12 will continue to run with 5.13.
Some of the changes listed in this file include issue tracking numbers
corresponding to tasks in the Qt Bug Tracker:
https://bugreports.qt.io/
Each of these identifiers can be entered in the bug tracker to obtain more
information about a particular change.
- This release contains only minor code improvements.

View File

@ -42,7 +42,7 @@
Advanced custom material example shows more complex shaders, and demonstrates controlling your Advanced custom material example shows more complex shaders, and demonstrates controlling your
shader properties with QtQuick user interface and Animation. Water is a 3D mesh, that is shader properties with QtQuick user interface and Animation. Water is a 3D mesh, that is
modeled and uv mapped inside Blender, and then brought into Scene 3D as an \c {.obj} file. modeled and uv mapped inside Blender, and then brought into Scene 3D as an \c {.obj} file.
Shader properties that user can control, are defined in \l {advancedcustommaterial/WaterMaterial.qml}{WaterMaterial}. Shader properties that user can control, are defined in \c {advancedcustommaterial/WaterMaterial.qml}.
\section1 Controls \section1 Controls
\section2 Texture scale slider \section2 Texture scale slider
@ -53,7 +53,7 @@
\section2 Texture speed slider \section2 Texture speed slider
Offsets values for texture coordinates which are animated in Offsets values for texture coordinates which are animated in
\l {advancedcustommaterial/Water.qml}{Water.qml} and then passed to vertex shader. \c {advancedcustommaterial/Water.qml} and then passed to vertex shader.
Creates the effect of textures scrolling over the surface. Creates the effect of textures scrolling over the surface.
\section2 Specularity \section2 Specularity
@ -80,5 +80,5 @@
\section2 Mesh rotation \section2 Mesh rotation
Rotates the water mesh in \l {advancedcustommaterial/Water.qml}{Water.qml}. Rotates the water mesh in \c {advancedcustommaterial/Water.qml}.
*/ */

View File

@ -41,7 +41,7 @@
\section1 Qt Quick 2D Implementation \section1 Qt Quick 2D Implementation
The Qt Quick Implementation \l{audio-visualizer-qml/main.qml}{main.qml} of the example uses The Qt Quick Implementation in \c {audio-visualizer-qml/main.qml} of the example uses
\c{MediaPlayer} to play audio content. \c{MediaPlayer} to play audio content.
\snippet audio-visualizer-qml/main.qml 0 \snippet audio-visualizer-qml/main.qml 0
@ -57,8 +57,8 @@
\section1 Qt 3D Implementation \section1 Qt 3D Implementation
The 3D elements of the example are created in the The 3D elements of the example are created in
\l{audio-visualizer-qml/Visualizer.qml}{Visualizer.qml}. The camera is set to a fixed position \c {audio-visualizer-qml/Visualizer.qml}. The camera is set to a fixed position
to show the visualized bars from a correct angle. to show the visualized bars from a correct angle.
\snippet audio-visualizer-qml/Visualizer.qml 0 \snippet audio-visualizer-qml/Visualizer.qml 0
@ -73,7 +73,7 @@
\snippet audio-visualizer-qml/Visualizer.qml 2 \snippet audio-visualizer-qml/Visualizer.qml 2
In \l{audio-visualizer-qml/BarEntity.qml}{BarEntity.qml} there are animations for rotating the In \c {audio-visualizer-qml/BarEntity.qml} there are animations for rotating the
bars and changing the bar color. The bars are rotated on a level following a ring form. At the bars and changing the bar color. The bars are rotated on a level following a ring form. At the
same time the color of the bars is animated. same time the color of the bars is animated.

View File

@ -50,14 +50,14 @@
\section1 Qt Quick 2D Implementation \section1 Qt Quick 2D Implementation
The Qt Quick Implementation \l{planets-qml/PlanetsMain.qml}{PlanetsMain.qml} of the The Qt Quick Implementation in \c {planets-qml/PlanetsMain.qml} of the
example renders the 3D content using the \c Scene3D type. example renders the 3D content using the \c Scene3D type.
\snippet planets-qml/PlanetsMain.qml 0 \snippet planets-qml/PlanetsMain.qml 0
The planet related information is stored into a \c{ListModel}. The selection buttons for the The planet related information is stored into a \c{ListModel}. The selection buttons for the
planets and the information sheet are created based on the model. The 2D elements, selection planets and the information sheet are created based on the model. The 2D elements, selection
buttons and sliders, are implemented in the \l{planets-qml/PlanetsMain.qml}{PlanetsMain.qml}. buttons and sliders, are implemented in \c {planets-qml/PlanetsMain.qml}.
The selection buttons change the \c{focusedPlanet} property of the \c{mainview}. As the property The selection buttons change the \c{focusedPlanet} property of the \c{mainview}. As the property
changes, the planet information is updated, and the camera is animated to the new position. changes, the planet information is updated, and the camera is animated to the new position.
@ -65,14 +65,14 @@
\snippet planets-qml/PlanetsMain.qml 1 \snippet planets-qml/PlanetsMain.qml 1
The camera position and the camera look at point are updated based on values that are animated The camera position and the camera look at point are updated based on values that are animated
in the \l{planets-qml/SolarSystem.qml}{SolarSystem.qml}, triggered from the in \c {planets-qml/SolarSystem.qml}, triggered from the
\c{changePlanetFocus()} function. \c{changePlanetFocus()} function.
\snippet planets-qml/SolarSystem.qml 0 \snippet planets-qml/SolarSystem.qml 0
The sliders are used to adjust the rotation speed, the planet size, and the viewing distance. The sliders are used to adjust the rotation speed, the planet size, and the viewing distance.
When a slider value changes, a JavaScript function in \l{planets-qml/SolarSystem.qml} When a slider value changes, a JavaScript function in \c {planets-qml/SolarSystem.qml}
{SolarSystem.qml} is called to adjust the given property. For example, changing the value of is called to adjust the given property. For example, changing the value of
the \e{Viewing Distance} slider calls the \c{changeCameraDistance()} method. the \e{Viewing Distance} slider calls the \c{changeCameraDistance()} method.
\snippet planets-qml/PlanetsMain.qml 2 \snippet planets-qml/PlanetsMain.qml 2
@ -80,7 +80,7 @@
\section1 Qt 3D Implementation \section1 Qt 3D Implementation
The main part of the implementation, including the movement and rotation maths for the planets, The main part of the implementation, including the movement and rotation maths for the planets,
is done in the \l{planets-qml/SolarSystem.qml}{SolarSystem.qml}. is done in \c {planets-qml/SolarSystem.qml}.
First, a \c Camera, a \c{Light}, and a \c Configuration are added, followed by \c{Effect}s for First, a \c Camera, a \c{Light}, and a \c Configuration are added, followed by \c{Effect}s for
the planet \c{Material}s, and finally the planets themselves. For example, Earth is constructed the planet \c{Material}s, and finally the planets themselves. For example, Earth is constructed
@ -89,7 +89,7 @@
\snippet planets-qml/SolarSystem.qml 1 \snippet planets-qml/SolarSystem.qml 1
Planet data, which is needed for the movement and rotation calculations, among other things, is Planet data, which is needed for the movement and rotation calculations, among other things, is
constructed with JavaScript in \l{planets-qml/planets.js}{planets.js} by calling constructed with JavaScript in \c {planets-qml/planets.js} by calling
\c{loadPlanetData()} as the component completes. Other initializations, such as inserting the \c{loadPlanetData()} as the component completes. Other initializations, such as inserting the
planets into an array for easier handling, calculating the ring radii for Saturn and Uranus planets into an array for easier handling, calculating the ring radii for Saturn and Uranus
rings, and setting the default scale, speed, and camera offset, are done as well: rings, and setting the default scale, speed, and camera offset, are done as well:

View File

@ -48,7 +48,7 @@
\section1 Specifying the Material \section1 Specifying the Material
The material is specified in \l{simplecustommaterial/SimpleMaterial.qml}{SimpleMaterial.qml} The material is specified in \c {simplecustommaterial/SimpleMaterial.qml}
using \l Material type. First the material specifies parameters, using \l Material type. First the material specifies parameters,
which are mapped to the corresponding uniforms in the shaders so that they can be which are mapped to the corresponding uniforms in the shaders so that they can be
changed from the qml. changed from the qml.

View File

@ -121,7 +121,7 @@ void QAbstractAnimationClipPrivate::setDuration(float duration)
animator->setRunning(true); animator->setRunning(true);
\endcode \endcode
\sa QAnimationClip, QAnimationClipLoader \sa Qt3DAnimation::QAnimationClip, Qt3DAnimation::QAnimationClipLoader
*/ */
/*! /*!

View File

@ -0,0 +1,51 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** 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$
**
****************************************************************************/
/*!
\class Qt3DAnimation::QAnimationCallback
\inmodule Qt3DAnimation
\brief Represents an animation callback object.
*/
/*!
\enum Qt3DAnimation::QAnimationCallback::Flag
Flags to indicate how the valueChanged() function is called.
\value OnOwningThread
Callback function is called on the owning (GUI or main) thread.
\value OnThreadPool
Callback function is called on the thread pool's worker thread.
*/
/*!
\fn Qt3DAnimation::QAnimationCallback::valueChanged(const QVariant &value)
Callback function that is triggered for changes in the animated \a value.
\sa QCallbackMapping::setCallback()
*/

View File

@ -51,8 +51,8 @@ QAnimationClipPrivate::QAnimationClipPrivate()
} }
/*! /*!
\class QAnimationClip \class Qt3DAnimation::QAnimationClip
\inherits QAbstractAnimationClip \inherits Qt3dAnimation::QAbstractAnimationClip
\inmodule Qt3DAnimation \inmodule Qt3DAnimation
\brief Specifies key frame animation data. \brief Specifies key frame animation data.
*/ */

View File

@ -53,7 +53,7 @@ public:
}; };
/*! /*!
\class QAnimationClipData \class Qt3DAnimation::QAnimationClipData
\inmodule Qt3DAnimation \inmodule Qt3DAnimation
\brief Class containing the animation data. \brief Class containing the animation data.
*/ */

View File

@ -57,7 +57,7 @@ QCallbackMappingPrivate::QCallbackMappingPrivate()
} }
/*! /*!
\class QCallbackMapping \class Qt3DAnimation::QCallbackMapping
\inherits Qt3DCore::QAbstractChannelMapping \inherits Qt3DCore::QAbstractChannelMapping
\inmodule Qt3DAnimation \inmodule Qt3DAnimation
\brief Allows to map the channels within the clip onto an invocation \brief Allows to map the channels within the clip onto an invocation

View File

@ -54,7 +54,7 @@ public:
}; };
/*! /*!
\class QChannel \class Qt3DAnimation::QChannel
\inmodule Qt3DAnimation \inmodule Qt3DAnimation
\brief Defines a channel for a QAnimationClipData. \brief Defines a channel for a QAnimationClipData.
The animation system interpolates each channel component independently The animation system interpolates each channel component independently

View File

@ -49,7 +49,7 @@ QChannelMapperPrivate::QChannelMapperPrivate()
} }
/*! /*!
\class QChannelMapper \class Qt3DAnimation::QChannelMapper
\inmodule Qt3DAnimation \inmodule Qt3DAnimation
\brief Allows to map the channels within the clip onto properties of \brief Allows to map the channels within the clip onto properties of
objects in the application. objects in the application.

View File

@ -161,7 +161,7 @@ void QChannelMappingPrivate::updatePropertyNameTypeAndComponentCount()
} }
/*! /*!
\class QChannelMapping \class Qt3DAnimation::QChannelMapping
\inherits Qt3DCore::QNode \inherits Qt3DCore::QNode
\inmodule Qt3DAnimation \inmodule Qt3DAnimation
\brief Allows to map the channels within the clip onto properties of \brief Allows to map the channels within the clip onto properties of

View File

@ -107,7 +107,8 @@ bool QClipAnimatorPrivate::canPlay() const
The properties for controlling the animator are provided by the QAbstractClipAnimator base The properties for controlling the animator are provided by the QAbstractClipAnimator base
class. class.
\sa QAbstractClipAnimator, QAbstractAnimationClip, QChannelMapper, QBlendedClipAnimator \sa Qt3DAnimation::QAbstractClipAnimator, Qt3DAnimation::QAbstractAnimationClip,
Qt3DAnimation::QChannelMapper, Qt3DAnimation::QBlendedClipAnimator
*/ */
QClipAnimator::QClipAnimator(Qt3DCore::QNode *parent) QClipAnimator::QClipAnimator(Qt3DCore::QNode *parent)

View File

@ -53,14 +53,14 @@ QClipBlendValuePrivate::QClipBlendValuePrivate()
} }
/*! /*!
\class QClipBlendValue \class Qt3DAnimation::QClipBlendValue
\inherits Qt3DAnimation::QAbstractClipBlendNode \inherits Qt3DAnimation::QAbstractClipBlendNode
\inmodule Qt3DAnimation \inmodule Qt3DAnimation
\brief Class used for including a clip in a blend tree. \brief Class used for including a clip in a blend tree.
*/ */
/*! /*!
\qmltype ClipBlendValue \qmltype ClipBlendValue
\instantiates QClipBlendValue \instantiates Qt3DAnimation::QClipBlendValue
\inqmlmodule Qt3D.Animation \inqmlmodule Qt3D.Animation
\brief Type used for including a clip in a blend tree. \brief Type used for including a clip in a blend tree.
*/ */

View File

@ -86,8 +86,8 @@ namespace Qt3DAnimation {
*/ */
/*! /*!
\qmlmethod MorphTarget Qt3D.Animation::MorphTarget::fromGeometry(geometry, stringList) \qmlmethod MorphTarget Qt3D.Animation::MorphTarget::fromGeometry(geometry, stringList)
Returns a morph target based on the attributes defined by the given stringList from Returns a morph target based on the attributes defined by the given \a stringList from
the given geometry. the given \a geometry.
*/ */
QMorphTargetPrivate::QMorphTargetPrivate() QMorphTargetPrivate::QMorphTargetPrivate()

View File

@ -508,6 +508,11 @@ QVector<QAspectJobPtr> QAbstractAspectPrivate::jobsToExecute(qint64 time)
return res; return res;
} }
void QAbstractAspectPrivate::jobsDone()
{
}
/*! /*!
* Called in the context of the aspect thread once the aspect has been registered. * Called in the context of the aspect thread once the aspect has been registered.
* This provides an opportunity for the aspect to do any initialization tasks that * This provides an opportunity for the aspect to do any initialization tasks that

View File

@ -127,6 +127,7 @@ public:
QAbstractAspectJobManager *jobManager() const; QAbstractAspectJobManager *jobManager() const;
QVector<QAspectJobPtr> jobsToExecute(qint64 time) override; QVector<QAspectJobPtr> jobsToExecute(qint64 time) override;
void jobsDone() override;
QBackendNode *createBackendNode(const NodeTreeChange &change) const; QBackendNode *createBackendNode(const NodeTreeChange &change) const;
void clearBackendNode(const NodeTreeChange &change) const; void clearBackendNode(const NodeTreeChange &change) const;

View File

@ -69,6 +69,7 @@ public:
private: private:
virtual QVector<QAspectJobPtr> jobsToExecute(qint64 time) = 0; virtual QVector<QAspectJobPtr> jobsToExecute(qint64 time) = 0;
virtual void jobsDone() = 0;
friend class QScheduler; friend class QScheduler;
}; };

View File

@ -75,7 +75,7 @@ namespace Qt3DCore {
*/ */
/*! /*!
\fn template<typename T> QVector<T *> QEntity::componentsOfType() const \fn template<typename T> QVector<T *> Qt3DCore::QEntity::componentsOfType() const
Returns all the components added to this entity that can be cast to Returns all the components added to this entity that can be cast to
type T or an empty vector if there are no such components. type T or an empty vector if there are no such components.

View File

@ -94,6 +94,9 @@ void QScheduler::scheduleAndWaitForFrameAspectJobs(qint64 time)
for (auto &job : qAsConst(jobQueue)) for (auto &job : qAsConst(jobQueue))
QAspectJobPrivate::get(job.data())->postFrame(m_aspectManager); QAspectJobPrivate::get(job.data())->postFrame(m_aspectManager);
for (QAbstractAspect *aspect : aspects)
QAbstractAspectPrivate::get(aspect)->jobsDone();
} }
} // namespace Qt3DCore } // namespace Qt3DCore

View File

@ -100,7 +100,7 @@ QAbstractSpriteSheet::~QAbstractSpriteSheet()
} }
/*! /*!
\property QAbstractSpriteSheet::texture \property Qt3DExtras::QAbstractSpriteSheet::texture
Holds the current texture used by the material. Holds the current texture used by the material.
*/ */

View File

@ -181,7 +181,7 @@ QAbstractPhysicalDevice *QActionInput::sourceDevice() const
/*! /*!
\qmlsignal Qt3D.Input::ActionInput::buttonsChanged(const QVector<int> &buttons) \qmlsignal Qt3D.Input::ActionInput::buttonsChanged(const QVector<int> &buttons)
This signal is emitted when the buttons associated with the action input is changed. This signal is emitted when the \a buttons associated with the action input is changed.
The corresponding handler is \c onbuttonsChanged The corresponding handler is \c onbuttonsChanged
*/ */

View File

@ -160,7 +160,7 @@ QKeyEvent::~QKeyEvent()
/*! /*!
\qmlmethod bool Qt3D.Input::KeyEvent::matches(StandardKey key) \qmlmethod bool Qt3D.Input::KeyEvent::matches(StandardKey key)
Returns \c true if the key event matches the given standard key; otherwise Returns \c true if the key event matches the given standard \a key; otherwise
returns \c false. returns \c false.
\sa QKeySequence::StandardKey \sa QKeySequence::StandardKey
@ -174,7 +174,7 @@ QKeyEvent::~QKeyEvent()
See \l [CPP] {Qt::Key}{Qt.Key} for the list of keyboard codes. See \l [CPP] {Qt::Key}{Qt.Key} for the list of keyboard codes.
\sa {QKeyEvent::key} \b {See also} \l [QtGui] {QKeyEvent::key()}.
*/ */
/*! /*!
@ -194,7 +194,7 @@ QKeyEvent::~QKeyEvent()
This property holds the keyboard modifier flags that existed immediately This property holds the keyboard modifier flags that existed immediately
before the event occurred. before the event occurred.
\sa {QKeyEvent::modifiers} \b {See also} \l [QtGui] {QKeyEvent::modifiers()}.
*/ */
/*! /*!

View File

@ -197,21 +197,21 @@ void QMouseHandlerPrivate::mouseEvent(const QMouseEventPtr &event)
\qmlsignal Qt3D.Input::MouseHandler::wheel(MouseEvent mouse) \qmlsignal Qt3D.Input::MouseHandler::wheel(MouseEvent mouse)
This signal is emitted when the mouse wheel is used with the event details This signal is emitted when the mouse wheel is used with the event details
being contained within \a wheel being contained within \a mouse.
*/ */
/*! /*!
\fn Qt3DInput::QMouseHandler::clicked(Qt3DInput::QMouseEvent *mouse) \fn Qt3DInput::QMouseHandler::clicked(Qt3DInput::QMouseEvent *mouse)
This signal is emitted when a mouse button is clicked with the event details This signal is emitted when a mouse button is clicked with the event details
being contained within \a mouse being contained within \a mouse.
*/ */
/*! /*!
\fn Qt3DInput::QMouseHandler::doubleClicked(Qt3DInput::QMouseEvent *mouse) \fn Qt3DInput::QMouseHandler::doubleClicked(Qt3DInput::QMouseEvent *mouse)
This signal is emitted when a mouse button is double clicked with the event This signal is emitted when a mouse button is double clicked with the event
details being contained within \a mouse details being contained within \a mouse.
*/ */
/*! /*!

View File

@ -54,7 +54,7 @@ QPhysicalDeviceCreatedChangeBasePrivate::QPhysicalDeviceCreatedChangeBasePrivate
} }
/*! /*!
\class QPhysicalDeviceCreatedChangeBase \class Qt3DInput::QPhysicalDeviceCreatedChangeBase
\inmodule Qt3DInput \inmodule Qt3DInput
\brief Base class for handling changes in physical devices. \brief Base class for handling changes in physical devices.
*/ */

View File

@ -558,7 +558,7 @@ void Scene3DItem::setWindowSurface(QObject *rootObject)
/*! /*!
\qmlmethod void Scene3D::setItemAreaAndDevicePixelRatio(size area, real devicePixelRatio) \qmlmethod void Scene3D::setItemAreaAndDevicePixelRatio(size area, real devicePixelRatio)
\brief \TODO Sets the item area to \a area and the pixel ratio to \a devicePixelRatio.
*/ */
void Scene3DItem::setItemAreaAndDevicePixelRatio(QSize area, qreal devicePixelRatio) void Scene3DItem::setItemAreaAndDevicePixelRatio(QSize area, qreal devicePixelRatio)
{ {

View File

@ -51,6 +51,12 @@ namespace Qt3DRender {
namespace Quick { namespace Quick {
/*!
\namespace Qt3DRender::Quick
\inmodule Qt3DScene2D
\brief Internal namespace to import QML types.
*/
/*! /*!
\class Qt3DRender::Quick::QScene2D \class Qt3DRender::Quick::QScene2D
\inheaderfile Qt3DQuickScene2D/QScene2D \inheaderfile Qt3DQuickScene2D/QScene2D

View File

@ -51,11 +51,6 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender { namespace Qt3DRender {
/*!
\namespace Qt3DRender::Quick
\brief Internal namespace to import QML types.
*/
namespace Quick { namespace Quick {
class QScene2DPrivate; class QScene2DPrivate;

View File

@ -248,10 +248,10 @@ QJsonObject parameterPackToJson(const Render::ShaderParameterPack &pack)
const Render::PackUniformHash &uniforms = pack.uniforms(); const Render::PackUniformHash &uniforms = pack.uniforms();
QJsonArray uniformsArray; QJsonArray uniformsArray;
for (auto it = uniforms.cbegin(), end = uniforms.cend(); it != end; ++it) { for (int i = 0, m = uniforms.keys.size(); i < m; ++i) {
QJsonObject uniformObj; QJsonObject uniformObj;
uniformObj.insert(QLatin1String("name"), Render::StringToInt::lookupString(it.key())); uniformObj.insert(QLatin1String("name"), Render::StringToInt::lookupString(uniforms.keys.at(i)));
const Render::UniformValue::ValueType type = it.value().valueType(); const Render::UniformValue::ValueType type = uniforms.values.at(i).valueType();
uniformObj.insert(QLatin1String("type"), uniformObj.insert(QLatin1String("type"),
type == Render::UniformValue::ScalarValue type == Render::UniformValue::ScalarValue
? QLatin1String("value") ? QLatin1String("value")

View File

@ -227,9 +227,9 @@ public:
return !(*this == other); return !(*this == other);
} }
private: private:
// Allocate 4 floats on stack // Allocate 16 floats on stack
// For larger elements, heap allocation will be used // For larger elements, heap allocation will be used
QVarLengthArray<float, 4> m_data; QVarLengthArray<float, 16> m_data;
ValueType m_valueType = ScalarValue; ValueType m_valueType = ScalarValue;

View File

@ -70,6 +70,10 @@ namespace Qt3DRender {
Specifies the interpolation applied if the image is stretched. Specifies the interpolation applied if the image is stretched.
\value Nearest
Nearest-neighbor interpolation.
\value Linear
Linear interpolation.
*/ */
/*! /*!
\property Qt3DRender::QBlitFramebuffer::destination \property Qt3DRender::QBlitFramebuffer::destination

View File

@ -54,7 +54,8 @@ QSetFencePrivate::QSetFencePrivate()
} }
/*! /*!
\class QSetFence \class Qt3DRender::QSetFence
\inmodule Qt3DRender
\brief FrameGraphNode used to insert a fence in the graphics command stream. \brief FrameGraphNode used to insert a fence in the graphics command stream.
Fence allow to synchronosize GPU and CPU workloads. GPU commands usually Fence allow to synchronosize GPU and CPU workloads. GPU commands usually
@ -100,7 +101,7 @@ QSetFence::QSetFence(QSetFencePrivate &dd, Qt3DCore::QNode *parent)
are supported. are supported.
*/ */
/*! /*!
\property QSetFence::handleType \property Qt3DRender::QSetFence::handleType
Specifies the type of handle being used. Currently only OpenGL Fence ids Specifies the type of handle being used. Currently only OpenGL Fence ids
are supported. are supported.
@ -123,12 +124,12 @@ void QSetFencePrivate::setHandleType(QSetFence::HandleType type)
} }
/*! /*!
\qmlproperty variant AbstractFence::handle \qmlproperty variant SetFence::handle
Holds the underlying fence handle wrapped in a variant. Holds the underlying fence handle wrapped in a variant.
*/ */
/*! /*!
\property QAbstractFence::handle \property Qt3DRender::QSetFence::handle
Holds the underlying fence handle wrapped in a QVariant. Holds the underlying fence handle wrapped in a QVariant.
*/ */

View File

@ -56,8 +56,8 @@ QWaitFencePrivate::QWaitFencePrivate()
} }
/*! /*!
\class QWaitFence \class Qt3DRender::QWaitFence
\inmodule Qt3DRender
\brief FrameGraphNode used to wait for a fence in the graphics command \brief FrameGraphNode used to wait for a fence in the graphics command
stream to become signaled. stream to become signaled.
@ -98,7 +98,7 @@ QWaitFence::~QWaitFence()
become signaled. This is false by default. become signaled. This is false by default.
*/ */
/*! /*!
\property QWaitFence::waitOnCPU \property Qt3DRender::QWaitFence::waitOnCPU
Specifies whether the CPU should be block while waiting for the fence to Specifies whether the CPU should be block while waiting for the fence to
become signaled. This is false by default. become signaled. This is false by default.
@ -125,7 +125,7 @@ void QWaitFence::setWaitOnCPU(bool waitOnCPU)
to become signaled. to become signaled.
*/ */
/*! /*!
\property QWaitFence::timeout \property Qt3DRender::QWaitFence::timeout
Specifies the maximum amount of time in nanoseconds to wait for the fence Specifies the maximum amount of time in nanoseconds to wait for the fence
to become signaled. to become signaled.
@ -157,7 +157,7 @@ QWaitFence::QWaitFence(QWaitFencePrivate &dd, Qt3DCore::QNode *parent)
are supported. are supported.
*/ */
/*! /*!
\property QWaitFence::handleType \property Qt3DRender::QWaitFence::handleType
Specifies the type of handle being used. Currently only OpenGL Fence ids Specifies the type of handle being used. Currently only OpenGL Fence ids
are supported. are supported.
@ -183,7 +183,7 @@ void QWaitFence::setHandleType(QWaitFence::HandleType type)
Holds the underlying fence handle wrapped in a variant. Holds the underlying fence handle wrapped in a variant.
*/ */
/*! /*!
\property QWaitFence::handle \property Qt3DRender::QWaitFence::handle
Holds the underlying fence handle wrapped in a QVariant. Holds the underlying fence handle wrapped in a QVariant.
*/ */

View File

@ -235,7 +235,7 @@ void QCameraPrivate::updateViewMatrixAndTransform(bool doEmit)
* \qmlmethod void Qt3D.Render::Camera::viewEntity(Entity entity) * \qmlmethod void Qt3D.Render::Camera::viewEntity(Entity entity)
* *
* Rotates and moves the camera so that it's viewCenter is the center of the entity's bounding volume * Rotates and moves the camera so that it's viewCenter is the center of the entity's bounding volume
* and the entire entity fits in the view port. * and the entire \a entity fits in the view port.
* *
* \note Only works if the lens is in perspective projection mode. * \note Only works if the lens is in perspective projection mode.
* \sa Qt3D.Render::Camera::projectionType * \sa Qt3D.Render::Camera::projectionType

View File

@ -92,15 +92,15 @@ namespace Qt3DRender {
*/ */
/*! /*!
\qmlproperty QComputeCommand::runType \qmlproperty enumeration ComputeCommand::runType
Specifies whether the compute command should be performed every frame or Specifies whether the compute command should be performed every frame or
manually triggered. manually triggered.
\value Continuous Compute command is executed everyframe. This is the \value ComputeCommand.Continuous Compute command is executed everyframe. This is the
default. default.
\value Manual CompouteCommand is executed for a given number of frames and \value ComputeCommand.Manual CompouteCommand is executed for a given number of frames and
then the component disables itself. then the component disables itself.
*/ */

View File

@ -170,10 +170,8 @@
#include <Qt3DCore/QAspectEngine> #include <Qt3DCore/QAspectEngine>
#include <Qt3DCore/private/qservicelocator_p.h> #include <Qt3DCore/private/qservicelocator_p.h>
#include <QDebug>
#include <QOffscreenSurface>
#include <QThread> #include <QThread>
#include <QWindow> #include <QOpenGLContext>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -202,11 +200,16 @@ QRenderAspectPrivate::QRenderAspectPrivate(QRenderAspect::RenderType type)
, m_nodeManagers(nullptr) , m_nodeManagers(nullptr)
, m_renderer(nullptr) , m_renderer(nullptr)
, m_initialized(false) , m_initialized(false)
, m_renderAfterJobs(false)
, m_renderType(type) , m_renderType(type)
, m_offscreenHelper(nullptr) , m_offscreenHelper(nullptr)
{ {
m_instances.append(this); m_instances.append(this);
loadSceneParsers(); loadSceneParsers();
if (m_renderType == QRenderAspect::Threaded && !QOpenGLContext::supportsThreadedOpenGL()) {
m_renderType = QRenderAspect::Synchronous;
m_renderAfterJobs = true;
}
} }
/*! \internal */ /*! \internal */
@ -239,6 +242,12 @@ void QRenderAspectPrivate::syncDirtyFrontEndNode(QNode *node, QBackendNode *back
renderBackend->syncFromFrontEnd(node, firstTime); renderBackend->syncFromFrontEnd(node, firstTime);
} }
void QRenderAspectPrivate::jobsDone()
{
if (m_renderAfterJobs)
m_renderer->doRender(true);
}
/*! \internal */ /*! \internal */
void QRenderAspectPrivate::registerBackendTypes() void QRenderAspectPrivate::registerBackendTypes()
{ {
@ -539,6 +548,8 @@ QVariant QRenderAspect::executeCommand(const QStringList &args)
void QRenderAspect::onEngineStartup() void QRenderAspect::onEngineStartup()
{ {
Q_D(QRenderAspect); Q_D(QRenderAspect);
if (d->m_renderAfterJobs) // synchronous rendering but using QWindow
d->m_renderer->initialize();
Render::NodeManagers *managers = d->m_renderer->nodeManagers(); Render::NodeManagers *managers = d->m_renderer->nodeManagers();
Render::Entity *rootEntity = managers->lookupResource<Render::Entity, Render::EntityManager>(rootEntityId()); Render::Entity *rootEntity = managers->lookupResource<Render::Entity, Render::EntityManager>(rootEntityId());
Q_ASSERT(rootEntity); Q_ASSERT(rootEntity);

View File

@ -87,6 +87,7 @@ public:
static QRenderAspectPrivate* findPrivate(Qt3DCore::QAspectEngine *engine); static QRenderAspectPrivate* findPrivate(Qt3DCore::QAspectEngine *engine);
void syncDirtyFrontEndNode(Qt3DCore::QNode *node, Qt3DCore::QBackendNode *backend, bool firstTime) const override; void syncDirtyFrontEndNode(Qt3DCore::QNode *node, Qt3DCore::QBackendNode *backend, bool firstTime) const override;
void jobsDone() override;
void registerBackendTypes(); void registerBackendTypes();
void unregisterBackendTypes(); void unregisterBackendTypes();
@ -101,6 +102,7 @@ public:
Render::AbstractRenderer *m_renderer; Render::AbstractRenderer *m_renderer;
bool m_initialized; bool m_initialized;
bool m_renderAfterJobs;
QList<QSceneImporter *> m_sceneImporter; QList<QSceneImporter *> m_sceneImporter;
QVector<QString> m_loadedPlugins; QVector<QString> m_loadedPlugins;
QVector<Render::QRenderPlugin *> m_renderPlugins; QVector<Render::QRenderPlugin *> m_renderPlugins;

View File

@ -147,17 +147,6 @@ void QMeshPrivate::setStatus(QMesh::Status status)
* \sa QRegularExpression * \sa QRegularExpression
*/ */
/*!
\enum QMesh::Status
This enum identifies the status of shader used.
\value None A source mesh hasn't been assigned a source yet
\value Loading The mesh geometry is loading
\value Ready The mesh geometry was successfully loaded
\value Error An error occurred while loading the mesh
*/
/*! /*!
\qmlproperty enumeration Mesh::status \qmlproperty enumeration Mesh::status
@ -196,6 +185,17 @@ void QMeshPrivate::setStatus(QMesh::Status status)
* \sa Qt3DRender::QSceneLoader * \sa Qt3DRender::QSceneLoader
*/ */
/*!
\enum Qt3DRender::QMesh::Status
This enum identifies the status of shader used.
\value None A source mesh hasn't been assigned a source yet
\value Loading The mesh geometry is loading
\value Ready The mesh geometry was successfully loaded
\value Error An error occurred while loading the mesh
*/
/*! /*!
* Constructs a new QMesh with \a parent. * Constructs a new QMesh with \a parent.
*/ */

View File

@ -317,7 +317,7 @@ QStringList QSceneLoader::entityNames() const
/*! /*!
\qmlmethod Entity SceneLoader::component(string entityName, enumeration componentType) \qmlmethod Entity SceneLoader::component(string entityName, enumeration componentType)
Returns a component matching \a componentType of a loaded entity with an \a objectName matching Returns a component matching \a componentType of a loaded entity with an \e objectName matching
the \a entityName. the \a entityName.
If the entity has multiple matching components, the first match in the component list of If the entity has multiple matching components, the first match in the component list of
the entity is returned. the entity is returned.

View File

@ -57,9 +57,9 @@ void FilterProximityDistanceJob::run()
// Fill m_filteredEntities // Fill m_filteredEntities
// If no filtering needs to be done, this will be the output value // If no filtering needs to be done, this will be the output value
// otherwise it will be used as the base list of entities to filter // otherwise it will be used as the base list of entities to filter
selectAllEntities();
if (hasProximityFilter()) { if (hasProximityFilter()) {
selectAllEntities();
QVector<Entity *> entitiesToFilter = std::move(m_filteredEntities); QVector<Entity *> entitiesToFilter = std::move(m_filteredEntities);
FrameGraphManager *frameGraphManager = m_manager->frameGraphManager(); FrameGraphManager *frameGraphManager = m_manager->frameGraphManager();
EntityManager *entityManager = m_manager->renderNodesManager(); EntityManager *entityManager = m_manager->renderNodesManager();

View File

@ -342,7 +342,7 @@ QShaderImagePrivate::~QShaderImagePrivate()
*/ */
/*! /*!
\qmlproperty Qt3DRender::QShaderImage::mipLevel \qmlproperty int Qt3D.Render::ShaderImage::mipLevel
Holds which mipLevel out of the referenced texture should be used for the Holds which mipLevel out of the referenced texture should be used for the
ShaderImage. ShaderImage.
@ -351,7 +351,7 @@ QShaderImagePrivate::~QShaderImagePrivate()
*/ */
/*! /*!
\qmlproperty Qt3DRender::QShaderImage::layer \qmlproperty int Qt3D.Render::ShaderImage::layer
Holds which layer out of the referenced texture should be used for the Holds which layer out of the referenced texture should be used for the
ShaderImage. This property does nothing if \a layered is set to true or if ShaderImage. This property does nothing if \a layered is set to true or if
@ -365,11 +365,11 @@ QShaderImagePrivate::~QShaderImagePrivate()
cubeMapFace = layer - (cubeMapLayer * 6) cubeMapFace = layer - (cubeMapLayer * 6)
\endcode \endcode
\default 0 Default value is 0.
*/ */
/*! /*!
* \qmlproperty Qt3DRender::QShaderImage::layered * \qmlproperty bool Qt3D.Render::ShaderImage::layered
If set to true, if the referenced texture is a one-dimensional array, If set to true, if the referenced texture is a one-dimensional array,
two-dimensional array, three-dimensional, cube map, cube map array, or two-dimensional array, three-dimensional, cube map, cube map array, or
@ -377,21 +377,28 @@ QShaderImagePrivate::~QShaderImagePrivate()
for all layers. If set to false, only the single layer specified by the \a for all layers. If set to false, only the single layer specified by the \a
layer property will be bound. layer property will be bound.
\default false Default value is \c false.
*/ */
/*! /*!
\qmlproperty Qt3DRender::QShaderImage::access \qmlproperty enumeration Qt3D.Render::ShaderImage::access
Specifies the type of access we want to allow from our shader instances to Specifies the type of access we want to allow from our shader instances to
the image. If a shader tries to write or read from an image that has the image. If a shader tries to write or read from an image that has
incompatible access, the behavior is undefined. incompatible access, the behavior is undefined.
\default ShaderImage.ReadWrite \value ShaderImage.ReadOnly
Read-only access.
\value ShaderImage.WriteOnly
Write-only access.
\value ShaderImage.ReadWrite
Read-write access.
Default value is ShaderImage.ReadWrite.
*/ */
/*! /*!
\qmlproperty Qt3DRender::QShaderImage::format \qmlproperty enumeration Qt3D.Render::ShaderImage::format
Specifies the image format, which is essentially important when storing values Specifies the image format, which is essentially important when storing values
in the ShaderImage from a shader. in the ShaderImage from a shader.
@ -407,7 +414,7 @@ QShaderImagePrivate::~QShaderImagePrivate()
By default Qt3D will try to set the image format to match that of the By default Qt3D will try to set the image format to match that of the
referenced texture. referenced texture.
\default ShaderImage.Automatic Default value is ShaderImage.Automatic.
*/ */
/*! /*!

View File

@ -244,13 +244,13 @@ void Shader::prepareUniforms(ShaderParameterPack &pack)
{ {
const PackUniformHash &values = pack.uniforms(); const PackUniformHash &values = pack.uniforms();
auto it = values.cbegin(); auto it = values.keys.cbegin();
const auto end = values.cend(); const auto end = values.keys.cend();
while (it != end) { while (it != end) {
// Find if there's a uniform with the same name id // Find if there's a uniform with the same name id
for (const ShaderUniform &uniform : qAsConst(m_uniforms)) { for (const ShaderUniform &uniform : qAsConst(m_uniforms)) {
if (uniform.m_nameId == it.key()) { if (uniform.m_nameId == *it) {
pack.setSubmissionUniform(uniform); pack.setSubmissionUniform(uniform);
break; break;
} }

View File

@ -58,10 +58,6 @@ QAbstractRayCasterPrivate::QAbstractRayCasterPrivate()
m_shareable = false; m_shareable = false;
} }
/*!
\property Qt3DRender::QAbstractRayCaster::Hits
*/
QAbstractRayCasterPrivate *QAbstractRayCasterPrivate::get(QAbstractRayCaster *obj) QAbstractRayCasterPrivate *QAbstractRayCasterPrivate::get(QAbstractRayCaster *obj)
{ {
return obj->d_func(); return obj->d_func();

View File

@ -152,7 +152,7 @@ namespace Qt3DRender {
This signal is emitted when the bounding volume defined by the This signal is emitted when the bounding volume defined by the
pickAttribute property intersects with a ray on a mouse click. Intersection pickAttribute property intersects with a ray on a mouse click. Intersection
information are accessible through the pick \a parameter. information are accessible through the \a pick parameter.
*/ */
/*! /*!

View File

@ -1171,7 +1171,7 @@ bool SubmissionContext::setParameters(ShaderParameterPack &parameterPack)
if (uniformValues.contains(namedTex.glslNameId)) { if (uniformValues.contains(namedTex.glslNameId)) {
GLTexture *t = manager->glTextureManager()->lookupResource(namedTex.nodeId); GLTexture *t = manager->glTextureManager()->lookupResource(namedTex.nodeId);
if (t != nullptr) { if (t != nullptr) {
UniformValue &texUniform = uniformValues[namedTex.glslNameId]; UniformValue &texUniform = uniformValues.value(namedTex.glslNameId);
if (texUniform.valueType() == UniformValue::TextureValue) { if (texUniform.valueType() == UniformValue::TextureValue) {
const int texUnit = m_textureContext.activateTexture(TextureSubmissionContext::TextureScopeMaterial, m_gl, t); const int texUnit = m_textureContext.activateTexture(TextureSubmissionContext::TextureScopeMaterial, m_gl, t);
texUniform.data<int>()[namedTex.uniformArrayIndex] = texUnit; texUniform.data<int>()[namedTex.uniformArrayIndex] = texUnit;
@ -1201,7 +1201,7 @@ bool SubmissionContext::setParameters(ShaderParameterPack &parameterPack)
qCWarning(Backend) << "Shader Image referencing invalid texture"; qCWarning(Backend) << "Shader Image referencing invalid texture";
continue; continue;
} else { } else {
UniformValue &imgUniform = uniformValues[namedTex.glslNameId]; UniformValue &imgUniform = uniformValues.value(namedTex.glslNameId);
if (imgUniform.valueType() == UniformValue::ShaderImageValue) { if (imgUniform.valueType() == UniformValue::ShaderImageValue) {
const int imgUnit = m_imageContext.activateImage(img, t); const int imgUnit = m_imageContext.activateImage(img, t);
imgUniform.data<int>()[namedTex.uniformArrayIndex] = imgUnit; imgUniform.data<int>()[namedTex.uniformArrayIndex] = imgUnit;
@ -1260,7 +1260,7 @@ bool SubmissionContext::setParameters(ShaderParameterPack &parameterPack)
for (const ShaderUniform &uniform : activeUniforms) { for (const ShaderUniform &uniform : activeUniforms) {
// We can use [] as we are sure the the uniform wouldn't // We can use [] as we are sure the the uniform wouldn't
// be un activeUniforms if there wasn't a matching value // be un activeUniforms if there wasn't a matching value
const UniformValue &v = values[uniform.m_nameId]; const UniformValue &v = values.value(uniform.m_nameId);
// skip invalid textures/images // skip invalid textures/images
if ((v.valueType() == UniformValue::TextureValue || if ((v.valueType() == UniformValue::TextureValue ||

View File

@ -552,10 +552,8 @@ void RenderView::sort()
// We need the reference here as we are modifying the original container // We need the reference here as we are modifying the original container
// not the copy // not the copy
PackUniformHash &uniforms = m_commands[j].m_parameterPack.m_uniforms; PackUniformHash &uniforms = m_commands[j].m_parameterPack.m_uniforms;
PackUniformHash::iterator it = uniforms.begin();
const PackUniformHash::iterator end = uniforms.end();
while (it != end) { for (int u = 0; u < uniforms.keys.size();) {
// We are comparing the values: // We are comparing the values:
// - raw uniform values // - raw uniform values
// - the texture Node id if the uniform represents a texture // - the texture Node id if the uniform represents a texture
@ -563,15 +561,17 @@ void RenderView::sort()
// sharing the same material (shader) are rendered, we can't have the case // sharing the same material (shader) are rendered, we can't have the case
// where two uniforms, referencing the same texture eventually have 2 different // where two uniforms, referencing the same texture eventually have 2 different
// texture unit values // texture unit values
const UniformValue refValue = cachedUniforms.value(it.key()); const int uniformNameId = uniforms.keys.at(u);
if (it.value() == refValue) { const UniformValue &refValue = cachedUniforms.value(uniformNameId);
it = uniforms.erase(it); const UniformValue &newValue = uniforms.values.at(u);
if (newValue == refValue) {
uniforms.erase(u);
} else { } else {
// Record updated value so that subsequent comparison // Record updated value so that subsequent comparison
// for the next command will be made againts latest // for the next command will be made againts latest
// uniform value // uniform value
cachedUniforms.insert(it.key(), it.value()); cachedUniforms.insert(uniformNameId, newValue);
++it; ++u;
} }
} }
++j; ++j;

View File

@ -310,7 +310,8 @@ public:
if (rv->frustumCulling()) if (rv->frustumCulling())
renderableEntities = RenderViewBuilder::entitiesInSubset(renderableEntities, m_frustumCullingJob->visibleEntities()); renderableEntities = RenderViewBuilder::entitiesInSubset(renderableEntities, m_frustumCullingJob->visibleEntities());
// Filter out entities which didn't satisfy proximity filtering // Filter out entities which didn't satisfy proximity filtering
renderableEntities = RenderViewBuilder::entitiesInSubset(renderableEntities, m_filterProximityJob->filteredEntities()); if (!rv->proximityFilterIds().empty())
renderableEntities = RenderViewBuilder::entitiesInSubset(renderableEntities, m_filterProximityJob->filteredEntities());
} }
// Filter out Render commands for which the Entity wasn't selected because // Filter out Render commands for which the Entity wasn't selected because

View File

@ -57,7 +57,6 @@ namespace Render {
ShaderParameterPack::~ShaderParameterPack() ShaderParameterPack::~ShaderParameterPack()
{ {
m_uniforms.clear();
} }
void ShaderParameterPack::setUniform(const int glslNameId, const UniformValue &val) void ShaderParameterPack::setUniform(const int glslNameId, const UniformValue &val)

View File

@ -89,7 +89,56 @@ struct BlockToSSBO {
QT3D_DECLARE_TYPEINFO_2(Qt3DRender, Render, BlockToSSBO, Q_PRIMITIVE_TYPE) QT3D_DECLARE_TYPEINFO_2(Qt3DRender, Render, BlockToSSBO, Q_PRIMITIVE_TYPE)
typedef QHash<int, UniformValue> PackUniformHash; struct PackUniformHash
{
QVector<int> keys;
QVector<UniformValue> values;
PackUniformHash()
{
keys.reserve(10);
values.reserve(10);
}
void insert(int key, const UniformValue &value)
{
const int idx = keys.indexOf(key);
if (idx != -1) {
values[idx] = value;
} else {
keys.push_back(key);
values.push_back(value);
}
}
UniformValue value(int key) const
{
const int idx = keys.indexOf(key);
if (idx != -1)
return values.at(idx);
return UniformValue();
}
UniformValue& value(int key)
{
const int idx = keys.indexOf(key);
if (idx != -1)
return values[idx];
insert(key, UniformValue());
return value(key);
}
void erase(int idx)
{
keys.removeAt(idx);
values.removeAt(idx);
}
bool contains(int key) const
{
return keys.contains(key);
}
};
class Q_AUTOTEST_EXPORT ShaderParameterPack class Q_AUTOTEST_EXPORT ShaderParameterPack
{ {

View File

@ -48,7 +48,7 @@ namespace Qt3DRender {
/*! /*!
\class Qt3DRender::QRasterMode \class Qt3DRender::QRasterMode
\brief The QRasterMode render state allows to control the type of \brief The QRasterMode render state allows to control the type of
rasterization to be performed rasterization to be performed.
\since 5.14 \since 5.14
\inmodule Qt3DRender \inmodule Qt3DRender
\ingroup renderstates \ingroup renderstates
@ -65,7 +65,7 @@ namespace Qt3DRender {
/*! /*!
\qmltype RasterMode \qmltype RasterMode
\brief The RasterMode render state allows to control the type of \brief The RasterMode render state allows to control the type of
rasterization to be performed rasterization to be performed.
\since 5.14 \since 5.14
\inqmlmodule Qt3D.Render \inqmlmodule Qt3D.Render
\inherits RenderState \inherits RenderState

View File

@ -977,7 +977,7 @@ float QAbstractTexture::maximumAnisotropy() const
} }
/*! /*!
\property Qt3DRender::QAbstractTexture::ComparisonFunction \property Qt3DRender::QAbstractTexture::comparisonFunction
Holds the comparison function of the texture provider. Holds the comparison function of the texture provider.
*/ */
@ -1008,7 +1008,7 @@ QAbstractTexture::ComparisonFunction QAbstractTexture::comparisonFunction() cons
} }
/*! /*!
\property Qt3DRender::QAbstractTexture::ComparisonMode \property Qt3DRender::QAbstractTexture::comparisonMode
Holds the comparison mode of the texture provider. Holds the comparison mode of the texture provider.
*/ */
@ -1055,9 +1055,12 @@ QTextureGeneratorPtr QAbstractTexture::dataGenerator() const
*/ */
/*! /*!
* \qmlproperty handleType * \qmlproperty enumeration AbstractTexture::handleType
* *
* Holds the current texture handle type. * Holds the current texture handle type.
*
* \value AbstractTexture.NoHandle
* \value AbstractTexture.OpenGLTextureId
*/ */
/*! /*!
@ -1070,7 +1073,6 @@ QAbstractTexture::HandleType QAbstractTexture::handleType() const
return d->m_handleType; return d->m_handleType;
} }
/*! /*!
* \property Qt3DRender::QAbstractTexture::handle * \property Qt3DRender::QAbstractTexture::handle
* *
@ -1079,7 +1081,7 @@ QAbstractTexture::HandleType QAbstractTexture::handleType() const
*/ */
/*! /*!
* \qmlproperty handle * \qmlproperty var AbstractTexture::handle
* *
* Holds the current texture handle, if Qt 3D is using the OpenGL renderer, * Holds the current texture handle, if Qt 3D is using the OpenGL renderer,
* handle is a texture id integer. * handle is a texture id integer.
@ -1098,8 +1100,8 @@ QVariant QAbstractTexture::handle() const
} }
/*! /*!
* Allow to update a sub region of the texture without having to change the data * Updates a sub region of the texture, defined by \a update, without having
* generator or rely on adding or removing texture images. * to change the data generator or rely on adding or removing texture images.
* \since 5.14 * \since 5.14
*/ */
void QAbstractTexture::updateData(const QTextureDataUpdate &update) void QAbstractTexture::updateData(const QTextureDataUpdate &update)
@ -1135,7 +1137,7 @@ Qt3DCore::QNodeCreatedChangeBasePtr QAbstractTexture::createNodeCreationChange()
data.dataFunctor = d->m_dataFunctor; data.dataFunctor = d->m_dataFunctor;
data.sharedTextureId = d->m_sharedTextureId; data.sharedTextureId = d->m_sharedTextureId;
data.initialDataUpdates = d->m_pendingDataUpdates; data.initialDataUpdates = d->m_pendingDataUpdates;
return std::move(creationChange); return creationChange;
} }
/*! /*!

View File

@ -131,8 +131,8 @@ QTextureImageDataGeneratorPtr QAbstractTextureImagePrivate::dataGenerator() cons
/*! /*!
\fn Qt3DRender::QTextureImageDataGeneratorPtr Qt3DRender::QAbstractTextureImage::dataGenerator() const \fn Qt3DRender::QTextureImageDataGeneratorPtr Qt3DRender::QAbstractTextureImage::dataGenerator() const
Implement this method to return the \l QTextureImageDataGeneratorPtr, which will Implement this method to return the QTextureImageDataGeneratorPtr instance,
provide the data for the texture image. which will provide the data for the texture image.
*/ */
/*! /*!

View File

@ -52,8 +52,7 @@ QTextureGenerator::~QTextureGenerator()
} }
/*! /*!
\class QTextureGenerator \class Qt3DRender::QTextureGenerator
\inherits QAbstractFunctor
\inmodule Qt3DRender \inmodule Qt3DRender
\brief Provides the image data for a texture. \brief Provides the image data for a texture.
*/ */

View File

@ -117,14 +117,20 @@ private Q_SLOTS:
{ {
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity(); Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity); Qt3DCore::QEntity *targetEntity = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity); Qt3DCore::QEntity *childEntity1 = buildEntityAtDistance(50.0f, rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity); Qt3DCore::QEntity *childEntity2 = buildEntityAtDistance(25.0f, rootEntity);
Qt3DCore::QEntity *childEntity3 = buildEntityAtDistance(75.0f, rootEntity);
Qt3DRender::QProximityFilter *proximityFilter = new Qt3DRender::QProximityFilter(rootEntity);
proximityFilter->setDistanceThreshold(200.0f);
proximityFilter->setEntity(targetEntity);
QTest::newRow("ShouldSelectAll") << rootEntity QTest::newRow("ShouldSelectAll") << rootEntity
<< Qt3DCore::QNodeIdVector() << (Qt3DCore::QNodeIdVector() << proximityFilter->id())
<< (Qt3DCore::QNodeIdVector() << (Qt3DCore::QNodeIdVector()
<< rootEntity->id() << rootEntity->id()
<< targetEntity->id()
<< childEntity1->id() << childEntity1->id()
<< childEntity2->id() << childEntity2->id()
<< childEntity3->id() << childEntity3->id()

View File

@ -51,16 +51,11 @@ void compareShaderParameterPacks(const ShaderParameterPack &t1,
const PackUniformHash hash1 = t1.uniforms(); const PackUniformHash hash1 = t1.uniforms();
const PackUniformHash hash2 = t2.uniforms(); const PackUniformHash hash2 = t2.uniforms();
QCOMPARE(hash1.size(), hash2.size()); QCOMPARE(hash1.keys.size(), hash2.keys.size());
auto it = hash1.constBegin(); for (int i = 0, m = hash1.keys.size(); i < m; ++i) {
const auto end = hash1.constEnd(); const int key = hash1.keys.at(i);
QCOMPARE(hash1.value(key), hash2.value(key));
while (it != end) {
const auto h2It = hash2.find(it.key());
QVERIFY(h2It != hash2.cend());
QCOMPARE(it.value(), h2It.value());
++it;
} }
} }

View File

@ -112,7 +112,7 @@ private Q_SLOTS:
QCOMPARE(v.constData<float>()[0], 572.0f); QCOMPARE(v.constData<float>()[0], 572.0f);
QCOMPARE(v.constData<float>()[1], 355.0f); QCOMPARE(v.constData<float>()[1], 355.0f);
QCOMPARE(v.constData<float>()[2], 383.0f); QCOMPARE(v.constData<float>()[2], 383.0f);
QCOMPARE(v.constData<float>()[4], 0.0f); QCOMPARE(v.constData<float>()[3], 0.0f);
} }
{ {
// GIVEN // GIVEN