summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2017-06-19 10:37:25 +0100
committerSean Harmer <sean.harmer@kdab.com>2017-06-19 10:37:25 +0100
commit5af4e423be269a9edf3037ff0302d438f077de04 (patch)
treea7e5eb78a718921141380658f00f1caedcdb1ba4
parent02e960493ef9a2f8dc25a06616fbde8fd869d1af (diff)
parent01a6bcd086cecef3169e5d79bd72dbb0d1393a0f (diff)
Merge branch '5.9' into dev
Conflicts: src/render/frontend/qcameralens_p.h src/render/texture/qtexture.cpp src/render/texture/qtexture_p.h Change-Id: I20b25cf123f44c96f69ca5f8e042a38692e5cb49
-rw-r--r--src/animation/backend/animationutils.cpp31
-rw-r--r--src/animation/backend/fcurve.cpp52
-rw-r--r--src/animation/frontend/qabstractclipanimator.cpp2
-rw-r--r--src/animation/frontend/qanimationclip.cpp6
-rw-r--r--src/animation/frontend/qanimationclipdata.cpp5
-rw-r--r--src/animation/frontend/qanimationcliploader.cpp6
-rw-r--r--src/animation/frontend/qanimationgroup.cpp2
-rw-r--r--src/animation/frontend/qchannelmapper.cpp7
-rw-r--r--src/animation/frontend/qchannelmapping.cpp17
-rw-r--r--src/animation/frontend/qclipblendnodecreatedchange.cpp11
-rw-r--r--src/animation/frontend/qclipblendvalue.cpp6
-rw-r--r--src/animation/frontend/qkeyframe.cpp5
-rw-r--r--src/animation/frontend/qmorphtarget.cpp3
-rw-r--r--src/core/aspects/qaspectengine.cpp6
-rw-r--r--src/core/jobs/qabstractaspectjobmanager.cpp5
-rw-r--r--src/core/nodes/propertychangehandler.cpp5
-rw-r--r--src/input/backend/axisaccumulatorjob.cpp3
-rw-r--r--src/input/backend/eventsourcesetterhelper.cpp2
-rw-r--r--src/input/frontend/qkeyboardhandler.cpp2
-rw-r--r--src/input/frontend/qphysicaldevicecreatedchange.cpp5
-rw-r--r--src/plugins/sceneparsers/assimp/assimpimporter.cpp2
-rw-r--r--src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp15
-rw-r--r--src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h3
-rw-r--r--src/quick3d/quick3d/qt3dquick_global.cpp9
-rw-r--r--src/quick3d/quick3dscene2d/items/scene2d.cpp7
-rw-r--r--src/render/backend/commandthread.cpp2
-rw-r--r--src/render/backend/nodemanagers.cpp5
-rw-r--r--src/render/backend/renderer.cpp28
-rw-r--r--src/render/backend/renderview.cpp1
-rw-r--r--src/render/frontend/qcamera_p.h3
-rw-r--r--src/render/frontend/qcameralens_p.h8
-rw-r--r--src/render/frontend/qcomputecommand_p.h3
-rw-r--r--src/render/frontend/qlayer_p.h3
-rw-r--r--src/render/frontend/qlevelofdetail_p.h3
-rw-r--r--src/render/frontend/qpickingsettings_p.h3
-rw-r--r--src/render/frontend/qrenderaspect.cpp21
-rw-r--r--src/render/frontend/qrendersettings_p.h3
-rw-r--r--src/render/frontend/qrendertarget_p.h3
-rw-r--r--src/render/frontend/qrendertargetoutput_p.h3
-rw-r--r--src/render/geometry/buffer.cpp4
-rw-r--r--src/render/geometry/buffermanager.cpp24
-rw-r--r--src/render/geometry/buffermanager_p.h6
-rw-r--r--src/render/geometry/qgeometryrenderer_p.h3
-rw-r--r--src/render/geometry/qmesh_p.h3
-rw-r--r--src/render/graphicshelpers/graphicscontext.cpp2
-rw-r--r--src/render/jobs/pickboundingvolumejob.cpp2
-rw-r--r--src/render/jobs/renderviewjobutils.cpp7
-rw-r--r--src/render/lights/qabstractlight_p.h3
-rw-r--r--src/render/lights/qdirectionallight_p.h3
-rw-r--r--src/render/lights/qenvironmentlight_p.h3
-rw-r--r--src/render/lights/qpointlight_p.h3
-rw-r--r--src/render/lights/qspotlight_p.h3
-rw-r--r--src/render/materialsystem/qeffect_p.h3
-rw-r--r--src/render/materialsystem/qfilterkey_p.h3
-rw-r--r--src/render/materialsystem/qgraphicsapifilter_p.h3
-rw-r--r--src/render/picking/qobjectpicker_p.h3
-rw-r--r--src/render/renderstates/qblendequation_p.h3
-rw-r--r--src/render/renderstates/qblendequationarguments_p.h3
-rw-r--r--src/render/renderstates/qclipplane_p.h3
-rw-r--r--src/render/renderstates/qcolormask_p.h3
-rw-r--r--src/render/renderstates/qcullface_p.h3
-rw-r--r--src/render/renderstates/qdepthtest_p.h3
-rw-r--r--src/render/renderstates/qfrontface_p.h3
-rw-r--r--src/render/renderstates/qpointsize_p.h3
-rw-r--r--src/render/renderstates/qpolygonoffset_p.h3
-rw-r--r--src/render/renderstates/qscissortest_p.h3
-rw-r--r--src/render/renderstates/qstencilmask_p.h3
-rw-r--r--src/render/renderstates/qstenciloperation_p.h3
-rw-r--r--src/render/renderstates/qstenciloperationarguments_p.h3
-rw-r--r--src/render/renderstates/qstenciltest_p.h3
-rw-r--r--src/render/renderstates/qstenciltestarguments_p.h3
-rw-r--r--src/render/renderstates/renderstates.cpp15
-rw-r--r--src/render/renderstates/renderstates_p.h6
-rw-r--r--src/render/renderstates/renderstateset.cpp4
-rw-r--r--src/render/texture/qpaintedtextureimage_p.h3
-rw-r--r--src/render/texture/qtexture.cpp104
-rw-r--r--src/render/texture/qtexture_p.h17
-rw-r--r--src/render/texture/qtexturegenerator.cpp6
-rw-r--r--src/render/texture/qtextureimage_p.h3
-rw-r--r--tests/auto/animation/animationutils/animationutils.qrc1
-rw-r--r--tests/auto/animation/animationutils/clip4.json65
-rw-r--r--tests/auto/animation/animationutils/tst_animationutils.cpp65
-rw-r--r--tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml15
-rw-r--r--tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro1
-rw-r--r--tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp29
-rw-r--r--tests/auto/render/buffer/tst_buffer.cpp24
-rw-r--r--tests/auto/render/qgraphicsapifilter/tst_qgraphicsapifilter.cpp2
-rw-r--r--tests/manual/downloading/main.qml2
88 files changed, 613 insertions, 178 deletions
diff --git a/src/animation/backend/animationutils.cpp b/src/animation/backend/animationutils.cpp
index 1f675f271..c12ad99f7 100644
--- a/src/animation/backend/animationutils.cpp
+++ b/src/animation/backend/animationutils.cpp
@@ -46,6 +46,7 @@
#include <QtGui/qvector3d.h>
#include <QtGui/qvector4d.h>
#include <QtGui/qquaternion.h>
+#include <QtGui/qcolor.h>
#include <QtCore/qvariant.h>
#include <Qt3DAnimation/private/animationlogging_p.h>
@@ -60,6 +61,7 @@ int componentsForType(int type)
{
int componentCount = 1;
switch (type) {
+ case QMetaType::Float:
case QVariant::Double:
componentCount = 1;
break;
@@ -69,6 +71,7 @@ int componentsForType(int type)
break;
case QVariant::Vector3D:
+ case QVariant::Color:
componentCount = 3;
break;
@@ -108,7 +111,7 @@ double localTimeFromGlobalTime(double t_global,
double loopNumber = 0;
if (loopCount == 1) {
t_local = qBound(0.0, t_local, duration);
- } else if (loopCount == 0) {
+ } else if (loopCount < 0) {
// Loops forever
(void) std::modf(t_local / duration, &loopNumber);
t_local = std::fmod(t_local, duration);
@@ -149,15 +152,21 @@ ComponentIndices channelComponentsToIndices(const Channel &channel, int dataType
#if defined Q_COMPILER_UNIFORM_INIT
static const QVector<char> standardSuffixes = { 'X', 'Y', 'Z', 'W' };
static const QVector<char> quaternionSuffixes = { 'W', 'X', 'Y', 'Z' };
+ static const QVector<char> colorSuffixes = { 'R', 'G', 'B' };
#else
static const QVector<char> standardSuffixes = (QVector<char>() << 'X' << 'Y' << 'Z' << 'W');
static const QVector<char> quaternionSuffixes = (QVector<char>() << 'W' << 'X' << 'Y' << 'Z');
+ static const QVector<char> colorSuffixes = (QVector<char>() << 'R' << 'G' << 'B');
#endif
- if (dataType != QVariant::Quaternion)
- return channelComponentsToIndicesHelper(channel, dataType, offset, standardSuffixes);
- else
+ switch (dataType) {
+ case QVariant::Quaternion:
return channelComponentsToIndicesHelper(channel, dataType, offset, quaternionSuffixes);
+ case QVariant::Color:
+ return channelComponentsToIndicesHelper(channel, dataType, offset, colorSuffixes);
+ default:
+ return channelComponentsToIndicesHelper(channel, dataType, offset, standardSuffixes);
+ }
}
ComponentIndices channelComponentsToIndicesHelper(const Channel &channel,
@@ -229,6 +238,7 @@ QVector<Qt3DCore::QSceneChangePtr> preparePropertyChanges(Qt3DCore::QNodeId anim
// Build the new value from the channel/fcurve evaluation results
QVariant v;
switch (mappingData.type) {
+ case QMetaType::Float:
case QVariant::Double: {
v = QVariant::fromValue(channelResults[mappingData.channelIndices[0]]);
break;
@@ -268,6 +278,14 @@ QVector<Qt3DCore::QSceneChangePtr> preparePropertyChanges(Qt3DCore::QNodeId anim
break;
}
+ case QVariant::Color: {
+ const QColor color = QColor::fromRgbF(channelResults[mappingData.channelIndices[0]],
+ channelResults[mappingData.channelIndices[1]],
+ channelResults[mappingData.channelIndices[2]]);
+ v = QVariant::fromValue(color);
+ break;
+ }
+
default:
qWarning() << "Unhandled animation type";
continue;
@@ -301,7 +319,8 @@ QVector<MappingData> buildPropertyMappings(Handler *handler,
const QVector<Channel> &channels = clip->channels();
// Iterate over the mappings in the mapper object
- for (const Qt3DCore::QNodeId mappingId : mapper->mappingIds()) {
+ const auto mappingIds = mapper->mappingIds();
+ for (const Qt3DCore::QNodeId mappingId : mappingIds) {
// Get the mapping object
ChannelMapping *mapping = mappingManager->lookupResource(mappingId);
Q_ASSERT(mapping);
@@ -474,7 +493,7 @@ ComponentIndices generateClipFormatIndices(const QVector<ChannelNameAndType> &ta
// Reserve enough storage for all the format indices
int indexCount = 0;
- for (const auto targetIndexVec : targetIndices)
+ for (const auto targetIndexVec : qAsConst(targetIndices))
indexCount += targetIndexVec.size();
ComponentIndices format;
format.resize(indexCount);
diff --git a/src/animation/backend/fcurve.cpp b/src/animation/backend/fcurve.cpp
index 809949472..4a2cf30fd 100644
--- a/src/animation/backend/fcurve.cpp
+++ b/src/animation/backend/fcurve.cpp
@@ -60,12 +60,35 @@ float FCurve::evaluateAtTime(float localTime) const
return m_keyframes.last().value;
} else {
// Find keyframes that sandwich the requested localTime
- int keyframe0 = m_rangeFinder.findLowerBound(localTime);
-
- BezierEvaluator evaluator(m_localTimes[keyframe0], m_keyframes[keyframe0],
- m_localTimes[keyframe0 + 1], m_keyframes[keyframe0 + 1]);
- return evaluator.valueForTime(localTime);
+ const int idx = m_rangeFinder.findLowerBound(localTime);
+
+ const float t0 = m_localTimes[idx];
+ const float t1 = m_localTimes[idx + 1];
+ const Keyframe &keyframe0(m_keyframes[idx]);
+ const Keyframe &keyframe1(m_keyframes[idx + 1]);
+
+ switch (keyframe0.interpolation) {
+ case QKeyFrame::ConstantInterpolation:
+ qWarning("Constant interpolation not implemented yet");
+ break;
+ case QKeyFrame::LinearInterpolation:
+ if (localTime >= t0 && localTime <= t1 && t1 > t0) {
+ float t = (localTime - t0) / (t1 - t0);
+ return (1 - t) * keyframe0.value + t * keyframe1.value;
+ }
+ break;
+ case QKeyFrame::BezierInterpolation:
+ {
+ BezierEvaluator evaluator(t0, keyframe0, t1, keyframe1);
+ return evaluator.valueForTime(localTime);
+ }
+ default:
+ qWarning("Unknown interpolation type %d", keyframe0.interpolation);
+ break;
+ }
}
+
+ return m_keyframes.first().value;
}
float FCurve::startTime() const
@@ -103,16 +126,21 @@ void FCurve::read(const QJsonObject &json)
float localTime = keyframeCoords.at(0).toDouble();
Keyframe keyframe;
- keyframe.interpolation = QKeyFrame::BezierInterpolation;
keyframe.value = keyframeCoords.at(1).toDouble();
- const QJsonArray leftHandle = keyframeData[QLatin1String("leftHandle")].toArray();
- keyframe.leftControlPoint[0] = leftHandle.at(0).toDouble();
- keyframe.leftControlPoint[1] = leftHandle.at(1).toDouble();
+ if (keyframeData.contains(QLatin1String("leftHandle"))) {
+ keyframe.interpolation = QKeyFrame::BezierInterpolation;
+
+ const QJsonArray leftHandle = keyframeData[QLatin1String("leftHandle")].toArray();
+ keyframe.leftControlPoint[0] = leftHandle.at(0).toDouble();
+ keyframe.leftControlPoint[1] = leftHandle.at(1).toDouble();
- const QJsonArray rightHandle = keyframeData[QLatin1String("rightHandle")].toArray();
- keyframe.rightControlPoint[0] = rightHandle.at(0).toDouble();
- keyframe.rightControlPoint[1] = rightHandle.at(1).toDouble();
+ const QJsonArray rightHandle = keyframeData[QLatin1String("rightHandle")].toArray();
+ keyframe.rightControlPoint[0] = rightHandle.at(0).toDouble();
+ keyframe.rightControlPoint[1] = rightHandle.at(1).toDouble();
+ } else {
+ keyframe.interpolation = QKeyFrame::LinearInterpolation;
+ }
appendKeyframe(localTime, keyframe);
}
diff --git a/src/animation/frontend/qabstractclipanimator.cpp b/src/animation/frontend/qabstractclipanimator.cpp
index 0d215b470..c75b92d47 100644
--- a/src/animation/frontend/qabstractclipanimator.cpp
+++ b/src/animation/frontend/qabstractclipanimator.cpp
@@ -54,7 +54,7 @@ QAbstractClipAnimatorPrivate::QAbstractClipAnimatorPrivate()
}
/*!
- \qmltype AbsractClipAnimator
+ \qmltype AbstractClipAnimator
\instantiates Qt3DAnimation::QAbstractClipAnimator
\inqmlmodule Qt3D.Animation
\since 5.9
diff --git a/src/animation/frontend/qanimationclip.cpp b/src/animation/frontend/qanimationclip.cpp
index c21d94b02..7e7250021 100644
--- a/src/animation/frontend/qanimationclip.cpp
+++ b/src/animation/frontend/qanimationclip.cpp
@@ -50,6 +50,12 @@ QAnimationClipPrivate::QAnimationClipPrivate()
{
}
+/*!
+ \class QAnimationClip
+ \inherits QAbstractAnimationClip
+ \inmodule Qt3DAnimation
+ \brief Specifies key frame animation data
+*/
QAnimationClip::QAnimationClip(Qt3DCore::QNode *parent)
: QAbstractAnimationClip(*new QAnimationClipPrivate, parent)
{
diff --git a/src/animation/frontend/qanimationclipdata.cpp b/src/animation/frontend/qanimationclipdata.cpp
index ef3b59012..fe5e7c1e0 100644
--- a/src/animation/frontend/qanimationclipdata.cpp
+++ b/src/animation/frontend/qanimationclipdata.cpp
@@ -52,6 +52,11 @@ public:
QString m_name;
};
+/*!
+ \class QAnimationClipData
+ \inmodule Qt3DAnimation
+ \brief Class containing the animation data
+*/
QAnimationClipData::QAnimationClipData()
: d(new QAnimationClipDataPrivate)
{
diff --git a/src/animation/frontend/qanimationcliploader.cpp b/src/animation/frontend/qanimationcliploader.cpp
index ed48438de..8c59a4e10 100644
--- a/src/animation/frontend/qanimationcliploader.cpp
+++ b/src/animation/frontend/qanimationcliploader.cpp
@@ -69,6 +69,12 @@ void QAnimationClipLoaderPrivate::setStatus(QAnimationClipLoader::Status status)
\value Ready The clip was successfully loaded
\value Error An error occurred while loading the clip
*/
+/*!
+ \class QAnimationClipLoader
+ \inherits QAbstractAnimationClip
+ \inmodule Qt3DAnimation
+ \brief Enables loading key frame animation data from a file
+*/
QAnimationClipLoader::QAnimationClipLoader(Qt3DCore::QNode *parent)
: QAbstractAnimationClip(*new QAnimationClipLoaderPrivate, parent)
diff --git a/src/animation/frontend/qanimationgroup.cpp b/src/animation/frontend/qanimationgroup.cpp
index 365745662..49193834d 100644
--- a/src/animation/frontend/qanimationgroup.cpp
+++ b/src/animation/frontend/qanimationgroup.cpp
@@ -192,7 +192,7 @@ void QAnimationGroup::removeAnimation(Qt3DAnimation::QAbstractAnimation *animati
d->m_animations.removeAll(animation);
if (qFuzzyCompare(d->m_duration, animation->duration())) {
d->m_duration = 0.0f;
- for (const Qt3DAnimation::QAbstractAnimation *a : d->m_animations)
+ for (const Qt3DAnimation::QAbstractAnimation *a : qAsConst(d->m_animations))
d->m_duration = qMax(d->m_duration, a->duration());
}
}
diff --git a/src/animation/frontend/qchannelmapper.cpp b/src/animation/frontend/qchannelmapper.cpp
index ee2e54267..ef7353e9b 100644
--- a/src/animation/frontend/qchannelmapper.cpp
+++ b/src/animation/frontend/qchannelmapper.cpp
@@ -49,6 +49,13 @@ QChannelMapperPrivate::QChannelMapperPrivate()
{
}
+/*!
+ \class QChannelMapper
+ \inmodule Qt3DAnimation
+ \brief Allows to map the channels within the clip onto properties of
+ objects in the application
+
+*/
QChannelMapper::QChannelMapper(Qt3DCore::QNode *parent)
: Qt3DCore::QNode(*new QChannelMapperPrivate, parent)
{
diff --git a/src/animation/frontend/qchannelmapping.cpp b/src/animation/frontend/qchannelmapping.cpp
index 1c305dd89..faa77f5db 100644
--- a/src/animation/frontend/qchannelmapping.cpp
+++ b/src/animation/frontend/qchannelmapping.cpp
@@ -74,6 +74,15 @@ void QChannelMappingPrivate::updatePropertyNameAndType()
QMetaProperty mp = mo->property(propertyIndex);
propertyName = mp.name();
type = mp.userType();
+ if (type == QMetaType::QVariant) {
+ QVariant currentValue = m_target->property(mp.name());
+ if (currentValue.isValid()) {
+ type = currentValue.userType();
+ } else {
+ qWarning("QChannelMapping: Attempted to target QVariant property with no value set. "
+ "Set a value first in order to be able to determine the type.");
+ }
+ }
}
if (m_type != type) {
@@ -98,6 +107,14 @@ void QChannelMappingPrivate::updatePropertyNameAndType()
notifyObservers(e);
}
}
+/*!
+ \class QChannelMapping
+ \inherits Qt3DCore::QNode
+ \inmodule Qt3DAnimation
+ \brief Allows to map the channels within the clip onto properties of
+ objects in the application
+
+*/
QChannelMapping::QChannelMapping(Qt3DCore::QNode *parent)
: Qt3DCore::QNode(*new QChannelMappingPrivate, parent)
diff --git a/src/animation/frontend/qclipblendnodecreatedchange.cpp b/src/animation/frontend/qclipblendnodecreatedchange.cpp
index 9251442bb..0dc417b1c 100644
--- a/src/animation/frontend/qclipblendnodecreatedchange.cpp
+++ b/src/animation/frontend/qclipblendnodecreatedchange.cpp
@@ -48,6 +48,12 @@ QClipBlendNodeCreatedChangeBasePrivate::QClipBlendNodeCreatedChangeBasePrivate(c
{
}
+/*!
+ \class QClipBlendNodeCreateChangeBase
+ \inherits Qt3DCore::QNodeCreatedChangeBase
+ \inmodule Qt3DAnimation
+ \brief Base class for changes in QClipBlendNode
+*/
QClipBlendNodeCreatedChangeBase::QClipBlendNodeCreatedChangeBase(const QAbstractClipBlendNode *node)
: Qt3DCore::QNodeCreatedChangeBase(*new QClipBlendNodeCreatedChangeBasePrivate(node), node)
{
@@ -56,6 +62,11 @@ QClipBlendNodeCreatedChangeBase::QClipBlendNodeCreatedChangeBase(const QAbstract
QClipBlendNodeCreatedChangeBase::~QClipBlendNodeCreatedChangeBase()
{
}
+/*!
+ typedef Qt3DAnimation::QClipBlendNodeCreatedChangeBasePtr
+
+ A shared pointer for QClipBlendNodeCreatedChangeBase
+*/
} // Qt3DAnimation
diff --git a/src/animation/frontend/qclipblendvalue.cpp b/src/animation/frontend/qclipblendvalue.cpp
index d329f6722..a17c63a69 100644
--- a/src/animation/frontend/qclipblendvalue.cpp
+++ b/src/animation/frontend/qclipblendvalue.cpp
@@ -52,6 +52,12 @@ QClipBlendValuePrivate::QClipBlendValuePrivate()
{
}
+/*!
+ \class QClipBlendValue
+ \inherits Qt3DAnimation::QAbstractClipBlendNode
+ \inmodule Qt3DAnimation
+ \brief Class used for including a clip in a blend tree.
+*/
QClipBlendValue::QClipBlendValue(Qt3DCore::QNode *parent)
: QAbstractClipBlendNode(*new QClipBlendValuePrivate(), parent)
{
diff --git a/src/animation/frontend/qkeyframe.cpp b/src/animation/frontend/qkeyframe.cpp
index b3d339bf4..1d63af3ab 100644
--- a/src/animation/frontend/qkeyframe.cpp
+++ b/src/animation/frontend/qkeyframe.cpp
@@ -43,6 +43,11 @@ QT_BEGIN_NAMESPACE
namespace Qt3DAnimation {
+/*!
+ \class QKeyframe
+ \inmodule Qt3DAnimation
+ \brief A base class for handling keyframes
+*/
} // namespace Qt3DAnimation
diff --git a/src/animation/frontend/qmorphtarget.cpp b/src/animation/frontend/qmorphtarget.cpp
index 9dc30b8ba..3abb3df74 100644
--- a/src/animation/frontend/qmorphtarget.cpp
+++ b/src/animation/frontend/qmorphtarget.cpp
@@ -176,7 +176,8 @@ void QMorphTarget::removeAttribute(Qt3DRender::QAttribute *attribute)
QMorphTarget *QMorphTarget::fromGeometry(Qt3DRender::QGeometry *geometry, const QStringList &attributes)
{
QMorphTarget *target = new QMorphTarget();
- for (Qt3DRender::QAttribute *attr : geometry->attributes()) {
+ const auto geometryAttributes = geometry->attributes();
+ for (Qt3DRender::QAttribute *attr : geometryAttributes) {
if (attributes.contains(attr->name()))
target->addAttribute(attr);
}
diff --git a/src/core/aspects/qaspectengine.cpp b/src/core/aspects/qaspectengine.cpp
index b9c9d2283..ef4faa4bd 100644
--- a/src/core/aspects/qaspectengine.cpp
+++ b/src/core/aspects/qaspectengine.cpp
@@ -290,7 +290,7 @@ void QAspectEngine::registerAspect(QAbstractAspect *aspect)
QMetaObject::invokeMethod(d->m_aspectThread->aspectManager(),
"registerAspect",
Qt::BlockingQueuedConnection,
- Q_ARG(Qt3DCore::QAbstractAspect *, aspect));
+ Q_ARG(Qt3DCore::QAbstractAspect*, aspect));
}
/*!
@@ -330,7 +330,7 @@ void QAspectEngine::unregisterAspect(QAbstractAspect *aspect)
QMetaObject::invokeMethod(d->m_aspectThread->aspectManager(),
"unregisterAspect",
Qt::BlockingQueuedConnection,
- Q_ARG(Qt3DCore::QAbstractAspect *, aspect));
+ Q_ARG(Qt3DCore::QAbstractAspect*, aspect));
// Remove from our collection of named aspects (if present)
const auto it = std::find_if(d->m_namedAspects.begin(), d->m_namedAspects.end(),
@@ -458,7 +458,7 @@ void QAspectEngine::setRootEntity(QEntityPtr root)
QMetaObject::invokeMethod(d->m_aspectThread->aspectManager(),
"setRootEntity",
Qt::BlockingQueuedConnection,
- Q_ARG(Qt3DCore::QEntity *, root.data()),
+ Q_ARG(Qt3DCore::QEntity*, root.data()),
Q_ARG(QVector<Qt3DCore::QNodeCreatedChangeBasePtr>, d->m_creationChanges));
qCDebug(Aspects) << "Done setting scene root on aspect manager";
diff --git a/src/core/jobs/qabstractaspectjobmanager.cpp b/src/core/jobs/qabstractaspectjobmanager.cpp
index afd49fdf3..97cce61d8 100644
--- a/src/core/jobs/qabstractaspectjobmanager.cpp
+++ b/src/core/jobs/qabstractaspectjobmanager.cpp
@@ -43,6 +43,11 @@ QT_BEGIN_NAMESPACE
namespace Qt3DCore {
+/*!
+ \class QAbstractAspectJobManager
+ \inmodule Qt3DCore
+ \brief A job manager for QAbstractAspect subclasses
+*/
QAbstractAspectJobManager::QAbstractAspectJobManager(QObject *parent)
: QObject(parent)
{
diff --git a/src/core/nodes/propertychangehandler.cpp b/src/core/nodes/propertychangehandler.cpp
index 8c66fdd6f..218d76f10 100644
--- a/src/core/nodes/propertychangehandler.cpp
+++ b/src/core/nodes/propertychangehandler.cpp
@@ -43,6 +43,11 @@ QT_BEGIN_NAMESPACE
namespace Qt3DCore {
+/*!
+ \class PropertyChangeHandlerBase
+ \inmodule Qt3DCore
+ \brief Base class for the property change handler
+*/
PropertyChangeHandlerBase::PropertyChangeHandlerBase(QObject *parent) :
QObject(parent)
{
diff --git a/src/input/backend/axisaccumulatorjob.cpp b/src/input/backend/axisaccumulatorjob.cpp
index 7ea2d063d..03e680ddb 100644
--- a/src/input/backend/axisaccumulatorjob.cpp
+++ b/src/input/backend/axisaccumulatorjob.cpp
@@ -61,7 +61,8 @@ AxisAccumulatorJob::AxisAccumulatorJob(AxisAccumulatorManager *axisAccumulatorma
void AxisAccumulatorJob::run()
{
// Iterate over the accumulators and ask each to step the integrations
- for (auto accumulatorHandle : m_axisAccumulatorManager->activeHandles()) {
+ const auto activeHandles = m_axisAccumulatorManager->activeHandles();
+ for (auto accumulatorHandle : activeHandles) {
AxisAccumulator *accumulator = m_axisAccumulatorManager->data(accumulatorHandle);
if (accumulator->isEnabled())
accumulator->stepIntegration(m_axisManager, m_dt);
diff --git a/src/input/backend/eventsourcesetterhelper.cpp b/src/input/backend/eventsourcesetterhelper.cpp
index 5c11ada38..bbc7ea54c 100644
--- a/src/input/backend/eventsourcesetterhelper.cpp
+++ b/src/input/backend/eventsourcesetterhelper.cpp
@@ -70,7 +70,7 @@ void EventSourceSetterHelper::setEventSource(QObject *eventSource)
QMetaObject::invokeMethod(this,
"setEventSourceHelper",
Qt::BlockingQueuedConnection,
- Q_ARG(QObject *, eventSource));
+ Q_ARG(QObject*, eventSource));
}
}
diff --git a/src/input/frontend/qkeyboardhandler.cpp b/src/input/frontend/qkeyboardhandler.cpp
index 5854a047d..c13939c04 100644
--- a/src/input/frontend/qkeyboardhandler.cpp
+++ b/src/input/frontend/qkeyboardhandler.cpp
@@ -133,7 +133,7 @@ void QKeyboardHandlerPrivate::keyEvent(QKeyEvent *event)
// That's what QQ2 does but since it accesses QML private classes to do so, that may not be
// applicable in our case
int idx = QKeyboardHandler::staticMetaObject.indexOfSignal(keySignal);
- q->metaObject()->method(idx).invoke(q, Qt::DirectConnection, Q_ARG(QKeyEvent *, event));
+ q->metaObject()->method(idx).invoke(q, Qt::DirectConnection, Q_ARG(QKeyEvent*, event));
}
} else if (event->type() == QEvent::KeyRelease) {
emit q->released(event);
diff --git a/src/input/frontend/qphysicaldevicecreatedchange.cpp b/src/input/frontend/qphysicaldevicecreatedchange.cpp
index 2f2452187..51aa3449a 100644
--- a/src/input/frontend/qphysicaldevicecreatedchange.cpp
+++ b/src/input/frontend/qphysicaldevicecreatedchange.cpp
@@ -53,6 +53,11 @@ QPhysicalDeviceCreatedChangeBasePrivate::QPhysicalDeviceCreatedChangeBasePrivate
}
+/*!
+ \class QPhysicalDeviceCreatedChangeBase
+ \inmodule Qt3DInput
+ \brief Base class for handling changes in physical devices
+*/
QPhysicalDeviceCreatedChangeBase::QPhysicalDeviceCreatedChangeBase(const QAbstractPhysicalDevice *device)
: Qt3DCore::QNodeCreatedChangeBase(*new QPhysicalDeviceCreatedChangeBasePrivate(device), device)
{
diff --git a/src/plugins/sceneparsers/assimp/assimpimporter.cpp b/src/plugins/sceneparsers/assimp/assimpimporter.cpp
index 4370ffe2b..fb0d8b1a9 100644
--- a/src/plugins/sceneparsers/assimp/assimpimporter.cpp
+++ b/src/plugins/sceneparsers/assimp/assimpimporter.cpp
@@ -989,7 +989,7 @@ void AssimpImporter::loadEmbeddedTexture(uint textureIndex)
bool isCompressed = assimpTexture->mHeight == 0;
uint textureSize = assimpTexture->mWidth *
- (isCompressed ? assimpTexture->mHeight : 1);
+ (isCompressed ? 1 : assimpTexture->mHeight);
// Set texture to RGBA8888
QByteArray textureContent;
textureContent.reserve(textureSize * 4);
diff --git a/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp b/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp
index 1626554ea..b99f6ae75 100644
--- a/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp
+++ b/src/quick3d/quick3d/items/quick3dnodeinstantiator.cpp
@@ -98,7 +98,8 @@ Quick3DNodeInstantiatorPrivate::Quick3DNodeInstantiatorPrivate()
Quick3DNodeInstantiatorPrivate::~Quick3DNodeInstantiatorPrivate()
{
- qDeleteAll(m_objects);
+ if (m_ownModel)
+ delete m_instanceModel;
}
void Quick3DNodeInstantiatorPrivate::clear()
@@ -244,6 +245,7 @@ void Quick3DNodeInstantiatorPrivate::makeModel()
Quick3DNodeInstantiator::Quick3DNodeInstantiator(QNode *parent)
: QNode(*new Quick3DNodeInstantiatorPrivate, parent)
{
+ connect(this, &QNode::parentChanged, this, &Quick3DNodeInstantiator::onParentChanged);
}
/*!
@@ -500,6 +502,17 @@ void Quick3DNodeInstantiator::componentComplete()
}
}
+/*!
+ \internal
+*/
+void Quick3DNodeInstantiator::onParentChanged(QObject *parent)
+{
+ Q_D(const Quick3DNodeInstantiator);
+ auto parentNode = static_cast<QNode *>(parent);
+ for (auto obj : d->m_objects)
+ static_cast<QNode *>(obj.data())->setParent(parentNode);
+}
+
// TODO: Avoid cloning here
//void Quick3DNodeInstantiator::copy(const QNode *ref)
//{
diff --git a/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h b/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h
index fd7a1d83d..a79cb4f90 100644
--- a/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h
+++ b/src/quick3d/quick3d/items/quick3dnodeinstantiator_p.h
@@ -113,6 +113,9 @@ Q_SIGNALS:
void objectAdded(int index, QObject *object);
void objectRemoved(int index, QObject *object);
+private slots:
+ void onParentChanged(QObject *parent);
+
private:
Q_DISABLE_COPY(Quick3DNodeInstantiator)
Q_DECLARE_PRIVATE(Quick3DNodeInstantiator)
diff --git a/src/quick3d/quick3d/qt3dquick_global.cpp b/src/quick3d/quick3d/qt3dquick_global.cpp
index a98211991..0ce0b8194 100644
--- a/src/quick3d/quick3d/qt3dquick_global.cpp
+++ b/src/quick3d/quick3d/qt3dquick_global.cpp
@@ -659,10 +659,12 @@ public:
#undef ASSERT_VALID_SIZE
};
-static Quick3DValueTypeProvider valueTypeProvider;
+Quick3DValueTypeProvider *valueTypeProvider = nullptr;
static Quick3DValueTypeProvider *getValueTypeProvider()
{
- return &valueTypeProvider;
+ if (valueTypeProvider == nullptr)
+ valueTypeProvider = new Quick3DValueTypeProvider();
+ return valueTypeProvider;
}
static Quick3DColorProvider *getColorProvider()
@@ -708,7 +710,8 @@ void Quick3D_initialize()
void Quick3D_uninitialize()
{
- QQml_removeValueTypeProvider(&valueTypeProvider);
+ delete valueTypeProvider;
+ valueTypeProvider = nullptr;
}
void Quick3D_registerType(const char *className, const char *quickName, int major, int minor)
diff --git a/src/quick3d/quick3dscene2d/items/scene2d.cpp b/src/quick3d/quick3dscene2d/items/scene2d.cpp
index 7bcc23077..4abc7cf42 100644
--- a/src/quick3d/quick3dscene2d/items/scene2d.cpp
+++ b/src/quick3d/quick3dscene2d/items/scene2d.cpp
@@ -254,14 +254,7 @@ void Scene2D::initializeRender()
return;
}
m_context = new QOpenGLContext();
-#ifdef Q_OS_MACOS
m_context->setFormat(m_shareContext->format());
-#else
- QSurfaceFormat format;
- format.setDepthBufferSize(24);
- format.setStencilBufferSize(8);
- m_context->setFormat(format);
-#endif
m_context->setShareContext(m_shareContext);
m_context->create();
diff --git a/src/render/backend/commandthread.cpp b/src/render/backend/commandthread.cpp
index f91cff017..9e764f0dd 100644
--- a/src/render/backend/commandthread.cpp
+++ b/src/render/backend/commandthread.cpp
@@ -97,7 +97,7 @@ void CommandThread::executeCommand(Command *command)
QMetaObject::invokeMethod(this,
"executeCommandInternal",
Qt::BlockingQueuedConnection,
- Q_ARG(Command *, command));
+ Q_ARG(Command*, command));
}
void CommandThread::run()
diff --git a/src/render/backend/nodemanagers.cpp b/src/render/backend/nodemanagers.cpp
index 2647bbb1a..80d0562b0 100644
--- a/src/render/backend/nodemanagers.cpp
+++ b/src/render/backend/nodemanagers.cpp
@@ -113,7 +113,6 @@ NodeManagers::~NodeManagers()
delete m_layerManager;
delete m_levelOfDetailManager;
delete m_filterKeyManager;
- delete m_frameGraphManager;
delete m_transformManager;
delete m_renderTargetManager;
delete m_sceneManager;
@@ -127,6 +126,10 @@ NodeManagers::~NodeManagers()
delete m_geometryManager;
delete m_geometryRendererManager;
delete m_objectPickerManager;
+
+ // Delete after m_objectPickerManager as that manager's shutdown needs to access
+ // the frame graph manager still.
+ delete m_frameGraphManager;
// delete m_boundingVolumeDebugManager;
delete m_lightManager;
delete m_environmentLightManager;
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index bea84a26e..c95f6a989 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -300,7 +300,7 @@ NodeManagers *Renderer::nodeManagers() const
*/
QOpenGLContext *Renderer::shareContext() const
{
- return m_shareContext ? m_shareContext : m_graphicsContext->openGLContext();
+ return m_shareContext ? m_shareContext : m_graphicsContext->openGLContext()->shareContext();
}
void Renderer::setOpenGLContext(QOpenGLContext *context)
@@ -344,9 +344,12 @@ void Renderer::initialize()
// Context is not owned by us, so we need to know if it gets destroyed
m_contextConnection = QObject::connect(m_glContext, &QOpenGLContext::aboutToBeDestroyed,
[this] { releaseGraphicsResources(); });
+ }
+
+ if (!ctx->shareContext()) {
m_shareContext = new QOpenGLContext;
- m_shareContext->setFormat(m_glContext->format());
- m_shareContext->setShareContext(m_glContext);
+ m_shareContext->setFormat(ctx->format());
+ m_shareContext->setShareContext(ctx);
m_shareContext->create();
}
@@ -470,7 +473,9 @@ void Renderer::setSurfaceExposed(bool exposed)
Render::FrameGraphNode *Renderer::frameGraphRoot() const
{
Q_ASSERT(m_settings);
- return m_nodesManager->frameGraphManager()->lookupNode(m_settings->activeFrameGraphID());
+ if (m_nodesManager && m_nodesManager->frameGraphManager() && m_settings)
+ return m_nodesManager->frameGraphManager()->lookupNode(m_settings->activeFrameGraphID());
+ return nullptr;
}
// QAspectThread context
@@ -1395,12 +1400,6 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs()
for (const QAspectJobPtr &bufferJob : bufferJobs)
m_calculateBoundingVolumeJob->addDependency(bufferJob);
- // Set values on pickBoundingVolumeJob
- m_pickBoundingVolumeJob->setFrameGraphRoot(frameGraphRoot());
- m_pickBoundingVolumeJob->setRenderSettings(settings());
- m_pickBoundingVolumeJob->setMouseEvents(pendingPickingEvents());
- m_pickBoundingVolumeJob->setKeyEvents(pendingKeyEvents());
-
m_updateLevelOfDetailJob->setFrameGraphRoot(frameGraphRoot());
// Add jobs
@@ -1480,6 +1479,15 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs()
QAspectJobPtr Renderer::pickBoundingVolumeJob()
{
+ // Set values on pickBoundingVolumeJob
+ RenderSettings *renderSetting = settings();
+ if (renderSetting != nullptr) {
+ m_pickBoundingVolumeJob->setRenderSettings(renderSetting);
+ m_pickBoundingVolumeJob->setFrameGraphRoot(frameGraphRoot());
+ m_pickBoundingVolumeJob->setMouseEvents(pendingPickingEvents());
+ m_pickBoundingVolumeJob->setKeyEvents(pendingKeyEvents());
+ }
+
return m_pickBoundingVolumeJob;
}
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 03f61b2d9..73cdbb6da 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -585,6 +585,7 @@ void RenderView::setUniformBlockValue(ShaderParameterPack &uniformPack,
BlockToUBO uniformBlockUBO;
uniformBlockUBO.m_blockIndex = block.m_index;
uniformBlockUBO.m_bufferID = buffer->peerId();
+ uniformBlockUBO.m_needsUpdate = false;
uniformPack.setUniformBuffer(std::move(uniformBlockUBO));
// Buffer update to GL buffer will be done at render time
}
diff --git a/src/render/frontend/qcamera_p.h b/src/render/frontend/qcamera_p.h
index 107b1d268..a310fc765 100644
--- a/src/render/frontend/qcamera_p.h
+++ b/src/render/frontend/qcamera_p.h
@@ -54,12 +54,13 @@
#include <Qt3DRender/qcameralens.h>
#include <Qt3DCore/qtransform.h>
#include <private/qentity_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QCameraPrivate : public Qt3DCore::QEntityPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QCameraPrivate : public Qt3DCore::QEntityPrivate
{
public:
QCameraPrivate();
diff --git a/src/render/frontend/qcameralens_p.h b/src/render/frontend/qcameralens_p.h
index d78579b70..0ec197945 100644
--- a/src/render/frontend/qcameralens_p.h
+++ b/src/render/frontend/qcameralens_p.h
@@ -51,8 +51,10 @@
// We mean it.
//
-#include <private/qcomponent_p.h>
-#include <private/qnodecommand_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
+#include <Qt3DCore/private/qcomponent_p.h>
+#include <Qt3DCore/private/qnodecommand_p.h>
+
#include "qcameralens.h"
#include <Qt3DCore/qpropertyupdatedchange.h>
@@ -63,7 +65,7 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QCameraLensPrivate : public Qt3DCore::QComponentPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QCameraLensPrivate : public Qt3DCore::QComponentPrivate
{
public:
QCameraLensPrivate();
diff --git a/src/render/frontend/qcomputecommand_p.h b/src/render/frontend/qcomputecommand_p.h
index 3b595ef99..874edb1fc 100644
--- a/src/render/frontend/qcomputecommand_p.h
+++ b/src/render/frontend/qcomputecommand_p.h
@@ -52,12 +52,13 @@
//
#include <Qt3DCore/private/qcomponent_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QComputeCommandPrivate : public Qt3DCore::QComponentPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QComputeCommandPrivate : public Qt3DCore::QComponentPrivate
{
public:
QComputeCommandPrivate();
diff --git a/src/render/frontend/qlayer_p.h b/src/render/frontend/qlayer_p.h
index e31d8fe7a..998dcce86 100644
--- a/src/render/frontend/qlayer_p.h
+++ b/src/render/frontend/qlayer_p.h
@@ -52,13 +52,14 @@
//
#include <private/qcomponent_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QLayerPrivate : public Qt3DCore::QComponentPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QLayerPrivate : public Qt3DCore::QComponentPrivate
{
public:
QLayerPrivate();
diff --git a/src/render/frontend/qlevelofdetail_p.h b/src/render/frontend/qlevelofdetail_p.h
index 1d7a05a71..136d2ffa3 100644
--- a/src/render/frontend/qlevelofdetail_p.h
+++ b/src/render/frontend/qlevelofdetail_p.h
@@ -54,6 +54,7 @@
#include <private/qcomponent_p.h>
#include <qlevelofdetail.h>
#include <Qt3DRender/qlevelofdetailboundingsphere.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
#include <QVector3D>
@@ -61,7 +62,7 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QLevelOfDetailPrivate : public Qt3DCore::QComponentPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QLevelOfDetailPrivate : public Qt3DCore::QComponentPrivate
{
public:
QLevelOfDetailPrivate();
diff --git a/src/render/frontend/qpickingsettings_p.h b/src/render/frontend/qpickingsettings_p.h
index 5da9bfd79..780a8b677 100644
--- a/src/render/frontend/qpickingsettings_p.h
+++ b/src/render/frontend/qpickingsettings_p.h
@@ -53,12 +53,13 @@
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DRender/qpickingsettings.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QPickingSettingsPrivate : public Qt3DCore::QNodePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QPickingSettingsPrivate : public Qt3DCore::QNodePrivate
{
public:
QPickingSettingsPrivate();
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index 4d775aeb3..f221e36a8 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -120,6 +120,7 @@
#include <Qt3DRender/private/geometryrenderermanager_p.h>
#include <Qt3DRender/private/loadgeometryjob_p.h>
#include <Qt3DRender/private/qsceneimportfactory_p.h>
+#include <Qt3DRender/private/qsceneimporter_p.h>
#include <Qt3DRender/private/frustumculling_p.h>
#include <Qt3DRender/private/light_p.h>
#include <Qt3DRender/private/environmentlight_p.h>
@@ -186,6 +187,7 @@ QRenderAspectPrivate::~QRenderAspectPrivate()
qWarning() << Q_FUNC_INFO << "The renderer should have been deleted when reaching this point (this warning may be normal when running tests)";
delete m_nodeManagers;
m_instances.removeAll(this);
+ qDeleteAll(m_sceneImporter);
}
QRenderAspectPrivate *QRenderAspectPrivate::findPrivate(Qt3DCore::QAspectEngine *engine)
@@ -268,7 +270,7 @@ void QRenderAspectPrivate::registerBackendTypes()
q->registerBackendType<QObjectPicker>(QSharedPointer<Render::NodeFunctor<Render::ObjectPicker, Render::ObjectPickerManager> >::create(m_renderer));
// Plugins
- for (const QString &plugin : m_pluginConfig)
+ for (const QString &plugin : qAsConst(m_pluginConfig))
loadRenderPlugin(plugin);
}
@@ -418,12 +420,6 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
// asked for jobs to execute (this function). If that is the case, the RenderSettings will
// be null and we should not generate any jobs.
if (d->m_renderer->isRunning() && d->m_renderer->settings()) {
- // don't spawn any jobs, if the renderer decides to skip this frame
- if (!d->m_renderer->shouldRender()) {
- d->m_renderer->skipNextFrame();
- QThread::msleep(1);
- return jobs;
- }
Render::NodeManagers *manager = d->m_renderer->nodeManagers();
QAspectJobPtr textureLoadingSync = d->m_renderer->syncTextureLoadingJob();
@@ -461,8 +457,19 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
// Add all jobs to queue
const Qt3DCore::QAspectJobPtr pickBoundingVolumeJob = d->m_renderer->pickBoundingVolumeJob();
+ // Note: the getter is also responsible for returning a job ready to run
jobs.append(pickBoundingVolumeJob);
+
+ // Don't spawn any rendering jobs, if the renderer decides to skip this frame
+ // Note: this only affects rendering jobs (jobs that load buffers,
+ // perform picking,... must still be run)
+ if (!d->m_renderer->shouldRender()) {
+ d->m_renderer->skipNextFrame();
+ QThread::msleep(1);
+ return jobs;
+ }
+
// Traverse the current framegraph and create jobs to populate
// RenderBins with RenderCommands
// All jobs needed to create the frame and their dependencies are set by
diff --git a/src/render/frontend/qrendersettings_p.h b/src/render/frontend/qrendersettings_p.h
index 5060634c9..60ebd0f0d 100644
--- a/src/render/frontend/qrendersettings_p.h
+++ b/src/render/frontend/qrendersettings_p.h
@@ -54,12 +54,13 @@
#include <Qt3DCore/private/qcomponent_p.h>
#include <Qt3DRender/qrendersettings.h>
#include <Qt3DRender/qpickingsettings.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QRenderSettingsPrivate : public Qt3DCore::QComponentPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QRenderSettingsPrivate : public Qt3DCore::QComponentPrivate
{
public:
QRenderSettingsPrivate();
diff --git a/src/render/frontend/qrendertarget_p.h b/src/render/frontend/qrendertarget_p.h
index 44a8ac0c1..f1035e846 100644
--- a/src/render/frontend/qrendertarget_p.h
+++ b/src/render/frontend/qrendertarget_p.h
@@ -52,6 +52,7 @@
//
#include <Qt3DCore/private/qcomponent_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
@@ -60,7 +61,7 @@ namespace Qt3DRender {
class QRenderTargetOutput;
class QRenderTarget;
-class QRenderTargetPrivate : public Qt3DCore::QComponentPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QRenderTargetPrivate : public Qt3DCore::QComponentPrivate
{
public:
QRenderTargetPrivate();
diff --git a/src/render/frontend/qrendertargetoutput_p.h b/src/render/frontend/qrendertargetoutput_p.h
index abd352ac9..df855f184 100644
--- a/src/render/frontend/qrendertargetoutput_p.h
+++ b/src/render/frontend/qrendertargetoutput_p.h
@@ -53,6 +53,7 @@
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DRender/qrendertargetoutput.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
@@ -60,7 +61,7 @@ namespace Qt3DRender {
class QAbstractTexture;
-class QRenderTargetOutputPrivate : public Qt3DCore::QNodePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QRenderTargetOutputPrivate : public Qt3DCore::QNodePrivate
{
public:
QRenderTargetOutputPrivate();
diff --git a/src/render/geometry/buffer.cpp b/src/render/geometry/buffer.cpp
index 3498e2c36..2f2b6ba31 100644
--- a/src/render/geometry/buffer.cpp
+++ b/src/render/geometry/buffer.cpp
@@ -133,6 +133,8 @@ void Buffer::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &chang
Q_ASSERT(m_manager);
if (m_functor)
m_manager->addDirtyBuffer(peerId());
+
+ m_manager->addBufferReference(peerId());
}
void Buffer::forceDataUpload()
@@ -210,7 +212,7 @@ Qt3DCore::QBackendNode *BufferFunctor::get(Qt3DCore::QNodeId id) const
void BufferFunctor::destroy(Qt3DCore::QNodeId id) const
{
- m_manager->addBufferToRelease(id);
+ m_manager->removeBufferReference(id);
return m_manager->releaseResource(id);
}
diff --git a/src/render/geometry/buffermanager.cpp b/src/render/geometry/buffermanager.cpp
index 78c2c0082..5bd44f80f 100644
--- a/src/render/geometry/buffermanager.cpp
+++ b/src/render/geometry/buffermanager.cpp
@@ -66,18 +66,34 @@ QVector<Qt3DCore::QNodeId> BufferManager::dirtyBuffers()
}
// Called in QAspectThread::syncChanges
-void BufferManager::addBufferToRelease(Qt3DCore::QNodeId bufferId)
+void BufferManager::removeBufferReference(Qt3DCore::QNodeId bufferId)
{
QMutexLocker lock(&m_mutex);
- m_buffersToRelease.push_back(bufferId);
+ Q_ASSERT(m_bufferReferences.contains(bufferId) && m_bufferReferences[bufferId] > 0);
+ m_bufferReferences[bufferId]--;
+}
+
+// Called in QAspectThread
+void BufferManager::addBufferReference(Qt3DCore::QNodeId bufferId)
+{
+ QMutexLocker lock(&m_mutex);
+ m_bufferReferences[bufferId]++;
}
// Called in Render thread
QVector<Qt3DCore::QNodeId> BufferManager::takeBuffersToRelease()
{
QMutexLocker lock(&m_mutex);
- // Clears the m_buffersToRelease vector
- return std::move(m_buffersToRelease);
+ QVector<Qt3DCore::QNodeId> buffersToRelease;
+ QMutableHashIterator<Qt3DCore::QNodeId, int> it(m_bufferReferences);
+ while (it.hasNext()) {
+ it.next();
+ if (it.value() == 0) {
+ buffersToRelease.append(it.key());
+ it.remove();
+ }
+ }
+ return buffersToRelease;
}
} // namespace Render
diff --git a/src/render/geometry/buffermanager_p.h b/src/render/geometry/buffermanager_p.h
index 6862cd973..3eecb3664 100644
--- a/src/render/geometry/buffermanager_p.h
+++ b/src/render/geometry/buffermanager_p.h
@@ -76,13 +76,15 @@ public:
QVector<Qt3DCore::QNodeId> dirtyBuffers();
// Aspect Thread
- void addBufferToRelease(Qt3DCore::QNodeId bufferId);
+ void addBufferReference(Qt3DCore::QNodeId bufferId);
+ void removeBufferReference(Qt3DCore::QNodeId bufferId);
+
// Render Thread (no concurrent access)
QVector<Qt3DCore::QNodeId> takeBuffersToRelease();
private:
QVector<Qt3DCore::QNodeId> m_dirtyBuffers;
- QVector<Qt3DCore::QNodeId> m_buffersToRelease;
+ QHash<Qt3DCore::QNodeId, int> m_bufferReferences;
QMutex m_mutex;
};
diff --git a/src/render/geometry/qgeometryrenderer_p.h b/src/render/geometry/qgeometryrenderer_p.h
index 622cfb254..324dc9609 100644
--- a/src/render/geometry/qgeometryrenderer_p.h
+++ b/src/render/geometry/qgeometryrenderer_p.h
@@ -54,6 +54,7 @@
#include <Qt3DCore/private/qcomponent_p.h>
#include <Qt3DRender/qgeometryrenderer.h>
#include <Qt3DRender/qgeometryfactory.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
#include <Qt3DCore/private/qtypedpropertyupdatechange_p.h>
#include <memory>
@@ -61,7 +62,7 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QGeometryRendererPrivate : public Qt3DCore::QComponentPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QGeometryRendererPrivate : public Qt3DCore::QComponentPrivate
{
public:
QGeometryRendererPrivate();
diff --git a/src/render/geometry/qmesh_p.h b/src/render/geometry/qmesh_p.h
index f7f8079eb..1f602ba89 100644
--- a/src/render/geometry/qmesh_p.h
+++ b/src/render/geometry/qmesh_p.h
@@ -53,6 +53,7 @@
#include <Qt3DCore/private/qdownloadhelperservice_p.h>
#include <Qt3DRender/private/qgeometryrenderer_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
#include <QUrl>
QT_BEGIN_NAMESPACE
@@ -61,7 +62,7 @@ namespace Qt3DRender {
class QMesh;
-class QMeshPrivate : public QGeometryRendererPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QMeshPrivate : public QGeometryRendererPrivate
{
public:
QMeshPrivate();
diff --git a/src/render/graphicshelpers/graphicscontext.cpp b/src/render/graphicshelpers/graphicscontext.cpp
index 80e8267da..c5440e45e 100644
--- a/src/render/graphicshelpers/graphicscontext.cpp
+++ b/src/render/graphicshelpers/graphicscontext.cpp
@@ -403,6 +403,8 @@ void GraphicsContext::releaseOpenGL()
m_debugLogger->stopLogging();
m_debugLogger.reset(nullptr);
}
+
+ qDeleteAll(m_glHelpers);
}
// The OpenGLContext is not current on any surface at this point
diff --git a/src/render/jobs/pickboundingvolumejob.cpp b/src/render/jobs/pickboundingvolumejob.cpp
index 592b270f3..d675d5db4 100644
--- a/src/render/jobs/pickboundingvolumejob.cpp
+++ b/src/render/jobs/pickboundingvolumejob.cpp
@@ -402,7 +402,7 @@ void PickBoundingVolumeJob::dispatchPickEvents(const QMouseEvent &event,
if ((objectPicker->isPressed() || objectPicker->isHoverEnabled()) && objectPicker->isDragEnabled()) {
objectPicker->onMoved(pickEvent);
}
- // fallthrough
+ Q_FALLTHROUGH(); // fallthrough
}
case QEvent::HoverMove: {
if (!m_hoveredPickers.contains(objectPickerHandle)) {
diff --git a/src/render/jobs/renderviewjobutils.cpp b/src/render/jobs/renderviewjobutils.cpp
index 9f1b51cc1..05e99314e 100644
--- a/src/render/jobs/renderviewjobutils.cpp
+++ b/src/render/jobs/renderviewjobutils.cpp
@@ -402,8 +402,11 @@ void addToRenderStateSet(RenderStateSet *stateSet,
const QVector<Qt3DCore::QNodeId> stateIds,
RenderStateManager *manager)
{
- for (const Qt3DCore::QNodeId &stateId : stateIds)
- stateSet->addState(manager->lookupResource(stateId)->impl());
+ for (const Qt3DCore::QNodeId &stateId : stateIds) {
+ RenderStateNode *node = manager->lookupResource(stateId);
+ if (node->isEnabled())
+ stateSet->addState(node->impl());
+ }
}
namespace {
diff --git a/src/render/lights/qabstractlight_p.h b/src/render/lights/qabstractlight_p.h
index bfab787a3..f7831dce2 100644
--- a/src/render/lights/qabstractlight_p.h
+++ b/src/render/lights/qabstractlight_p.h
@@ -52,6 +52,7 @@
//
#include <private/qcomponent_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
#include <qshaderdata.h>
QT_BEGIN_NAMESPACE
@@ -60,7 +61,7 @@ namespace Qt3DRender {
class QAbstractLight;
-class Q_AUTOTEST_EXPORT QAbstractLightPrivate : public Qt3DCore::QComponentPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QAbstractLightPrivate : public Qt3DCore::QComponentPrivate
{
public:
explicit QAbstractLightPrivate(QAbstractLight::Type type);
diff --git a/src/render/lights/qdirectionallight_p.h b/src/render/lights/qdirectionallight_p.h
index bc815ce30..ea80913eb 100644
--- a/src/render/lights/qdirectionallight_p.h
+++ b/src/render/lights/qdirectionallight_p.h
@@ -52,6 +52,7 @@
//
#include <private/qabstractlight_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
@@ -59,7 +60,7 @@ namespace Qt3DRender {
class QDirectionalLight;
-class QDirectionalLightPrivate : QAbstractLightPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QDirectionalLightPrivate : QAbstractLightPrivate
{
public:
QDirectionalLightPrivate();
diff --git a/src/render/lights/qenvironmentlight_p.h b/src/render/lights/qenvironmentlight_p.h
index e98da5f59..02358dafc 100644
--- a/src/render/lights/qenvironmentlight_p.h
+++ b/src/render/lights/qenvironmentlight_p.h
@@ -52,6 +52,7 @@
//
#include <private/qcomponent_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
#include <qshaderdata.h>
QT_BEGIN_NAMESPACE
@@ -61,7 +62,7 @@ namespace Qt3DRender {
class QAbstractTexture;
class QEnvironmentLight;
-class Q_AUTOTEST_EXPORT QEnvironmentLightPrivate : public Qt3DCore::QComponentPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QEnvironmentLightPrivate : public Qt3DCore::QComponentPrivate
{
public:
explicit QEnvironmentLightPrivate();
diff --git a/src/render/lights/qpointlight_p.h b/src/render/lights/qpointlight_p.h
index 978627fb7..147867667 100644
--- a/src/render/lights/qpointlight_p.h
+++ b/src/render/lights/qpointlight_p.h
@@ -52,6 +52,7 @@
//
#include <private/qabstractlight_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
@@ -59,7 +60,7 @@ namespace Qt3DRender {
class QPointLight;
-class QPointLightPrivate : public QAbstractLightPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QPointLightPrivate : public QAbstractLightPrivate
{
public:
QPointLightPrivate();
diff --git a/src/render/lights/qspotlight_p.h b/src/render/lights/qspotlight_p.h
index 0bb0cb80f..eabc00353 100644
--- a/src/render/lights/qspotlight_p.h
+++ b/src/render/lights/qspotlight_p.h
@@ -52,6 +52,7 @@
//
#include <private/qabstractlight_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
@@ -59,7 +60,7 @@ namespace Qt3DRender {
class QSpotLight;
-class QSpotLightPrivate : public QAbstractLightPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QSpotLightPrivate : public QAbstractLightPrivate
{
public:
QSpotLightPrivate();
diff --git a/src/render/materialsystem/qeffect_p.h b/src/render/materialsystem/qeffect_p.h
index 716bb76de..39c7d1ecc 100644
--- a/src/render/materialsystem/qeffect_p.h
+++ b/src/render/materialsystem/qeffect_p.h
@@ -53,6 +53,7 @@
#include <private/qnode_p.h>
#include <Qt3DRender/qt3drender_global.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
@@ -62,7 +63,7 @@ class QEffect;
class QParameter;
class QTechnique;
-class QEffectPrivate : public Qt3DCore::QNodePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QEffectPrivate : public Qt3DCore::QNodePrivate
{
public :
QEffectPrivate();
diff --git a/src/render/materialsystem/qfilterkey_p.h b/src/render/materialsystem/qfilterkey_p.h
index 3a9855f08..4050bc295 100644
--- a/src/render/materialsystem/qfilterkey_p.h
+++ b/src/render/materialsystem/qfilterkey_p.h
@@ -53,12 +53,13 @@
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DRender/qfilterkey.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QFilterKeyPrivate : public Qt3DCore::QNodePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QFilterKeyPrivate : public Qt3DCore::QNodePrivate
{
public:
QFilterKeyPrivate();
diff --git a/src/render/materialsystem/qgraphicsapifilter_p.h b/src/render/materialsystem/qgraphicsapifilter_p.h
index 723eb14c2..5a7d874ed 100644
--- a/src/render/materialsystem/qgraphicsapifilter_p.h
+++ b/src/render/materialsystem/qgraphicsapifilter_p.h
@@ -42,6 +42,7 @@
#include <private/qobject_p.h>
#include <Qt3DRender/qgraphicsapifilter.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
//
// W A R N I N G
@@ -74,7 +75,7 @@ struct Q_AUTOTEST_EXPORT GraphicsApiFilterData
bool operator <(const GraphicsApiFilterData &other) const;
};
-class Q_AUTOTEST_EXPORT QGraphicsApiFilterPrivate : public QObjectPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QGraphicsApiFilterPrivate : public QObjectPrivate
{
public:
QGraphicsApiFilterPrivate()
diff --git a/src/render/picking/qobjectpicker_p.h b/src/render/picking/qobjectpicker_p.h
index 884e5673b..3c48b9419 100644
--- a/src/render/picking/qobjectpicker_p.h
+++ b/src/render/picking/qobjectpicker_p.h
@@ -50,6 +50,7 @@
#include <Qt3DCore/private/qcomponent_p.h>
#include <Qt3DCore/qnodeid.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
@@ -58,7 +59,7 @@ namespace Qt3DRender {
/*!
\internal
*/
-class QObjectPickerPrivate : public Qt3DCore::QComponentPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QObjectPickerPrivate : public Qt3DCore::QComponentPrivate
{
public:
QObjectPickerPrivate()
diff --git a/src/render/renderstates/qblendequation_p.h b/src/render/renderstates/qblendequation_p.h
index 978944566..228e61f15 100644
--- a/src/render/renderstates/qblendequation_p.h
+++ b/src/render/renderstates/qblendequation_p.h
@@ -50,12 +50,13 @@
#include <Qt3DRender/private/qrenderstate_p.h>
#include <Qt3DRender/qblendequation.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QBlendEquationPrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QBlendEquationPrivate : public QRenderStatePrivate
{
public:
QBlendEquationPrivate()
diff --git a/src/render/renderstates/qblendequationarguments_p.h b/src/render/renderstates/qblendequationarguments_p.h
index 55766b1c2..110039295 100644
--- a/src/render/renderstates/qblendequationarguments_p.h
+++ b/src/render/renderstates/qblendequationarguments_p.h
@@ -50,12 +50,13 @@
#include <Qt3DRender/private/qrenderstate_p.h>
#include <Qt3DRender/qblendequationarguments.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QBlendEquationArgumentsPrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QBlendEquationArgumentsPrivate : public QRenderStatePrivate
{
public:
QBlendEquationArgumentsPrivate(Render::StateMask type = Render::BlendEquationArgumentsMask)
diff --git a/src/render/renderstates/qclipplane_p.h b/src/render/renderstates/qclipplane_p.h
index 11ce8335d..517831e10 100644
--- a/src/render/renderstates/qclipplane_p.h
+++ b/src/render/renderstates/qclipplane_p.h
@@ -50,12 +50,13 @@
#include <Qt3DRender/private/qrenderstate_p.h>
#include <Qt3DRender/qalphatest.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QClipPlanePrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QClipPlanePrivate : public QRenderStatePrivate
{
public:
QClipPlanePrivate()
diff --git a/src/render/renderstates/qcolormask_p.h b/src/render/renderstates/qcolormask_p.h
index 32a350b75..1e2386eb9 100644
--- a/src/render/renderstates/qcolormask_p.h
+++ b/src/render/renderstates/qcolormask_p.h
@@ -49,12 +49,13 @@
//
#include <Qt3DRender/private/qrenderstate_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QColorMaskPrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QColorMaskPrivate : public QRenderStatePrivate
{
public:
QColorMaskPrivate()
diff --git a/src/render/renderstates/qcullface_p.h b/src/render/renderstates/qcullface_p.h
index a258ef38f..98cf99454 100644
--- a/src/render/renderstates/qcullface_p.h
+++ b/src/render/renderstates/qcullface_p.h
@@ -50,12 +50,13 @@
#include <Qt3DRender/private/qrenderstate_p.h>
#include <Qt3DRender/qcullface.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QCullFacePrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QCullFacePrivate : public QRenderStatePrivate
{
public:
QCullFacePrivate()
diff --git a/src/render/renderstates/qdepthtest_p.h b/src/render/renderstates/qdepthtest_p.h
index b3a3106fd..555be2d4a 100644
--- a/src/render/renderstates/qdepthtest_p.h
+++ b/src/render/renderstates/qdepthtest_p.h
@@ -50,12 +50,13 @@
#include <Qt3DRender/private/qrenderstate_p.h>
#include <Qt3DRender/qdepthtest.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QDepthTestPrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QDepthTestPrivate : public QRenderStatePrivate
{
public :
QDepthTestPrivate()
diff --git a/src/render/renderstates/qfrontface_p.h b/src/render/renderstates/qfrontface_p.h
index c9354b0d5..3849714fd 100644
--- a/src/render/renderstates/qfrontface_p.h
+++ b/src/render/renderstates/qfrontface_p.h
@@ -50,12 +50,13 @@
#include <Qt3DRender/private/qrenderstate_p.h>
#include <Qt3DRender/qfrontface.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QFrontFacePrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QFrontFacePrivate : public QRenderStatePrivate
{
public:
QFrontFacePrivate()
diff --git a/src/render/renderstates/qpointsize_p.h b/src/render/renderstates/qpointsize_p.h
index e1f216133..eb669b131 100644
--- a/src/render/renderstates/qpointsize_p.h
+++ b/src/render/renderstates/qpointsize_p.h
@@ -50,12 +50,13 @@
#include <Qt3DRender/private/qrenderstate_p.h>
#include <Qt3DRender/qpointsize.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QPointSizePrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QPointSizePrivate : public QRenderStatePrivate
{
public:
QPointSizePrivate(QPointSize::SizeMode sizeMode, float value)
diff --git a/src/render/renderstates/qpolygonoffset_p.h b/src/render/renderstates/qpolygonoffset_p.h
index d1dc67530..66a62674e 100644
--- a/src/render/renderstates/qpolygonoffset_p.h
+++ b/src/render/renderstates/qpolygonoffset_p.h
@@ -50,12 +50,13 @@
#include <Qt3DRender/private/qrenderstate_p.h>
#include <Qt3DRender/qpolygonoffset.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QPolygonOffsetPrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QPolygonOffsetPrivate : public QRenderStatePrivate
{
public:
QPolygonOffsetPrivate()
diff --git a/src/render/renderstates/qscissortest_p.h b/src/render/renderstates/qscissortest_p.h
index e5bbaad13..7c7bfdfe0 100644
--- a/src/render/renderstates/qscissortest_p.h
+++ b/src/render/renderstates/qscissortest_p.h
@@ -50,12 +50,13 @@
#include <Qt3DRender/private/qrenderstate_p.h>
#include <Qt3DRender/qscissortest.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QScissorTestPrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QScissorTestPrivate : public QRenderStatePrivate
{
public:
QScissorTestPrivate()
diff --git a/src/render/renderstates/qstencilmask_p.h b/src/render/renderstates/qstencilmask_p.h
index 2333476b7..a6aad60b9 100644
--- a/src/render/renderstates/qstencilmask_p.h
+++ b/src/render/renderstates/qstencilmask_p.h
@@ -50,12 +50,13 @@
#include <Qt3DRender/private/qrenderstate_p.h>
#include <Qt3DRender/qstencilmask.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QStencilMaskPrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QStencilMaskPrivate : public QRenderStatePrivate
{
public:
QStencilMaskPrivate()
diff --git a/src/render/renderstates/qstenciloperation_p.h b/src/render/renderstates/qstenciloperation_p.h
index b6f9d5958..3273ada23 100644
--- a/src/render/renderstates/qstenciloperation_p.h
+++ b/src/render/renderstates/qstenciloperation_p.h
@@ -52,12 +52,13 @@
#include <Qt3DRender/qstenciloperation.h>
#include <Qt3DRender/qstenciloperationarguments.h>
#include <Qt3DRender/private/qstenciloperationarguments_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QStencilOperationPrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QStencilOperationPrivate : public QRenderStatePrivate
{
public:
QStencilOperationPrivate()
diff --git a/src/render/renderstates/qstenciloperationarguments_p.h b/src/render/renderstates/qstenciloperationarguments_p.h
index a0082c60b..3babd3373 100644
--- a/src/render/renderstates/qstenciloperationarguments_p.h
+++ b/src/render/renderstates/qstenciloperationarguments_p.h
@@ -50,12 +50,13 @@
#include <QtCore/private/qobject_p.h>
#include <Qt3DRender/qstenciloperationarguments.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QStencilOperationArgumentsPrivate : public QObjectPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QStencilOperationArgumentsPrivate : public QObjectPrivate
{
public:
QStencilOperationArgumentsPrivate(QStencilOperationArguments::FaceMode mode)
diff --git a/src/render/renderstates/qstenciltest_p.h b/src/render/renderstates/qstenciltest_p.h
index 67f465c69..fc17cfde8 100644
--- a/src/render/renderstates/qstenciltest_p.h
+++ b/src/render/renderstates/qstenciltest_p.h
@@ -52,12 +52,13 @@
#include <Qt3DRender/qstenciltest.h>
#include <Qt3DRender/qstenciltestarguments.h>
#include <Qt3DRender/private/qstenciltestarguments_p.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QStencilTestPrivate : public QRenderStatePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QStencilTestPrivate : public QRenderStatePrivate
{
public:
QStencilTestPrivate()
diff --git a/src/render/renderstates/qstenciltestarguments_p.h b/src/render/renderstates/qstenciltestarguments_p.h
index 06a5bb91a..662301843 100644
--- a/src/render/renderstates/qstenciltestarguments_p.h
+++ b/src/render/renderstates/qstenciltestarguments_p.h
@@ -50,12 +50,13 @@
#include <QtCore/private/qobject_p.h>
#include <Qt3DRender/qstenciltestarguments.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QStencilTestArgumentsPrivate : public QObjectPrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QStencilTestArgumentsPrivate : public QObjectPrivate
{
public:
QStencilTestArgumentsPrivate(QStencilTestArguments::StencilFaceMode face)
diff --git a/src/render/renderstates/renderstates.cpp b/src/render/renderstates/renderstates.cpp
index 3f2573c8f..9f2735b25 100644
--- a/src/render/renderstates/renderstates.cpp
+++ b/src/render/renderstates/renderstates.cpp
@@ -194,13 +194,7 @@ void StencilTest::apply(GraphicsContext *gc) const
void AlphaCoverage::apply(GraphicsContext *gc) const
{
- gc->setAlphaCoverageEnabled(std::get<0>(m_values));
-}
-
-void AlphaCoverage::updateProperty(const char *name, const QVariant &value)
-{
- if (name == QByteArrayLiteral("enabled"))
- std::get<0>(m_values) = value.toBool();
+ gc->setAlphaCoverageEnabled(true);
}
void PointSize::apply(GraphicsContext *gc) const
@@ -254,12 +248,7 @@ void ClipPlane::updateProperty(const char *name, const QVariant &value)
void SeamlessCubemap::apply(GraphicsContext *gc) const
{
- gc->setSeamlessCubemap(std::get<0>(m_values));
-}
-
-void SeamlessCubemap::updateProperty(const char *name, const QVariant &value)
-{
- if (name == QByteArrayLiteral("enabled")) std::get<0>(m_values) = value.toBool();
+ gc->setSeamlessCubemap(true);
}
void StencilOp::apply(GraphicsContext *gc) const
diff --git a/src/render/renderstates/renderstates_p.h b/src/render/renderstates/renderstates_p.h
index cbd12a7b5..98701b335 100644
--- a/src/render/renderstates/renderstates_p.h
+++ b/src/render/renderstates/renderstates_p.h
@@ -134,11 +134,10 @@ public:
void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT AlphaCoverage : public GenericState<AlphaCoverage, AlphaCoverageStateMask, GLboolean>
+class Q_AUTOTEST_EXPORT AlphaCoverage : public GenericState<AlphaCoverage, AlphaCoverageStateMask>
{
public:
void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
- void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
class Q_AUTOTEST_EXPORT PointSize : public GenericState<PointSize, PointSizeMask, bool, GLfloat>
@@ -169,11 +168,10 @@ public:
void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
-class Q_AUTOTEST_EXPORT SeamlessCubemap : public GenericState<SeamlessCubemap, SeamlessCubemapMask, GLboolean>
+class Q_AUTOTEST_EXPORT SeamlessCubemap : public GenericState<SeamlessCubemap, SeamlessCubemapMask>
{
public:
virtual void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
- void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
class Q_AUTOTEST_EXPORT StencilOp : public GenericState<StencilOp, StencilOpMask, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum>
diff --git a/src/render/renderstates/renderstateset.cpp b/src/render/renderstates/renderstateset.cpp
index c57a4fa0d..dd5f881d8 100644
--- a/src/render/renderstates/renderstateset.cpp
+++ b/src/render/renderstates/renderstateset.cpp
@@ -254,7 +254,7 @@ StateVariant RenderStateSet::initializeStateFromPeer(const Qt3DRender::QRenderSt
{
switch (change->renderStateType()) {
case AlphaCoverageStateMask: {
- return RenderStateSet::createState<AlphaCoverage>(change->isNodeEnabled());
+ return RenderStateSet::createState<AlphaCoverage>();
}
case AlphaTestMask: {
@@ -352,7 +352,7 @@ StateVariant RenderStateSet::initializeStateFromPeer(const Qt3DRender::QRenderSt
}
case SeamlessCubemapMask: {
- return RenderStateSet::createState<SeamlessCubemap>(change->isNodeEnabled());
+ return RenderStateSet::createState<SeamlessCubemap>();
}
case StencilOpMask: {
diff --git a/src/render/texture/qpaintedtextureimage_p.h b/src/render/texture/qpaintedtextureimage_p.h
index 4fcaa6c93..9db2f4d9c 100644
--- a/src/render/texture/qpaintedtextureimage_p.h
+++ b/src/render/texture/qpaintedtextureimage_p.h
@@ -54,6 +54,7 @@
#include <Qt3DRender/private/qabstracttextureimage_p.h>
#include <Qt3DRender/qtextureimagedatagenerator.h>
#include <Qt3DRender/qpaintedtextureimage.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
@@ -62,7 +63,7 @@ class QPainter;
namespace Qt3DRender {
-class QPaintedTextureImagePrivate : public QAbstractTextureImagePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QPaintedTextureImagePrivate : public QAbstractTextureImagePrivate
{
public:
QPaintedTextureImagePrivate();
diff --git a/src/render/texture/qtexture.cpp b/src/render/texture/qtexture.cpp
index 7508a5fef..e908b7663 100644
--- a/src/render/texture/qtexture.cpp
+++ b/src/render/texture/qtexture.cpp
@@ -777,6 +777,10 @@ QTextureDataPtr QTextureFromSourceGenerator::operator ()()
textureData = TextureLoadingHelper::loadTextureData(m_url, true, m_mirrored);
}
+ // Update any properties explicitly set by the user
+ if (m_format != QAbstractTexture::NoFormat && m_format != QAbstractTexture::Automatic)
+ textureData->setFormat(static_cast<QOpenGLTexture::TextureFormat>(m_format));
+
if (textureData && textureData->data().length() > 0) {
generatedData->setTarget(static_cast<QAbstractTexture::Target>(textureData->target()));
generatedData->setFormat(static_cast<QAbstractTexture::TextureFormat>(textureData->format()));
@@ -785,7 +789,6 @@ QTextureDataPtr QTextureFromSourceGenerator::operator ()()
generatedData->setDepth(textureData->depth());
generatedData->setLayers(textureData->layers());
generatedData->addImageData(textureData);
- // TO DO: Check that we aren't forgetting to set something here
m_status = QAbstractTexture::Ready;
} else {
m_status = QAbstractTexture::Error;
@@ -824,24 +827,6 @@ void TextureDownloadRequest::onCompleted()
texture->addDirtyFlag(Render::Texture::DirtyDataGenerator);
}
-QTextureLoaderPrivate::QTextureLoaderPrivate()
- : QAbstractTexturePrivate()
- , m_mirrored(true)
-{
-}
-
-void QTextureLoaderPrivate::setScene(Qt3DCore::QScene *scene)
-{
- QAbstractTexturePrivate::setScene(scene);
- updateFunctor();
-}
-
-void QTextureLoaderPrivate::updateFunctor()
-{
- Qt3DCore::QAspectEngine *engine = m_scene ? m_scene->engine() : nullptr;
- setDataFunctor(QTextureFromSourceGeneratorPtr::create(m_id, m_source, m_mirrored, engine));
-}
-
/*!
\class Qt3DRender::QTexture1D
\inmodule Qt3DRender
@@ -1062,6 +1047,25 @@ QTextureBuffer::~QTextureBuffer()
{
}
+QTextureLoaderPrivate::QTextureLoaderPrivate()
+ : QAbstractTexturePrivate()
+ , m_mirrored(true)
+{
+}
+
+void QTextureLoaderPrivate::setScene(Qt3DCore::QScene *scene)
+{
+ QAbstractTexturePrivate::setScene(scene);
+ updateGenerator();
+}
+
+void QTextureLoaderPrivate::updateGenerator()
+{
+ Q_Q(QTextureLoader);
+ Qt3DCore::QAspectEngine *engine = m_scene ? m_scene->engine() : nullptr;
+ setDataFunctor(QTextureFromSourceGeneratorPtr::create(q, engine, m_id));
+}
+
/*!
* Constructs a new Qt3DRender::QTextureLoader instance with \a parent as parent.
*
@@ -1084,6 +1088,12 @@ QTextureLoader::QTextureLoader(QNode *parent)
d_func()->m_autoMipMap = true;
d_func()->m_maximumAnisotropy = 16.0f;
d_func()->m_target = TargetAutomatic;
+
+ // Regenerate the texture functor when properties we support overriding
+ // from QAbstractTexture get changed.
+ Q_D(QTextureLoader);
+ auto regenerate = [=] () { d->updateGenerator(); };
+ connect(this, &QAbstractTexture::formatChanged, regenerate);
}
/*! \internal */
@@ -1115,7 +1125,7 @@ void QTextureLoader::setSource(const QUrl& source)
Q_D(QTextureLoader);
if (source != d->m_source) {
d->m_source = source;
- d->updateFunctor();
+ d->updateGenerator();
const bool blocked = blockNotifications(true);
emit sourceChanged(source);
blockNotifications(blocked);
@@ -1163,7 +1173,7 @@ void QTextureLoader::setMirrored(bool mirrored)
Q_D(QTextureLoader);
if (mirrored != d->m_mirrored) {
d->m_mirrored = mirrored;
- d->updateFunctor();
+ d->updateGenerator();
const bool blocked = blockNotifications(true);
emit mirroredChanged(mirrored);
blockNotifications(blocked);
@@ -1171,6 +1181,38 @@ void QTextureLoader::setMirrored(bool mirrored)
}
/*!
+ * Constructs a new QTextureFromSourceGenerator::QTextureFromSourceGenerator
+ * instance with properties passed in via \a textureLoader
+ * \param url
+ */
+QTextureFromSourceGenerator::QTextureFromSourceGenerator(QTextureLoader *textureLoader,
+ Qt3DCore::QAspectEngine *engine,
+ Qt3DCore::QNodeId textureId)
+ : QTextureGenerator()
+ , m_url()
+ , m_status(QAbstractTexture::None)
+ , m_mirrored()
+ , m_texture(textureId)
+ , m_engine(engine)
+ , m_format(QAbstractTexture::RGBA8_UNorm)
+{
+ Q_ASSERT(textureLoader);
+
+ // We always get QTextureLoader's "own" additional properties
+ m_url = textureLoader->source();
+ m_mirrored = textureLoader->isMirrored();
+
+ // For the properties on the base QAbstractTexture we only apply
+ // those that have been explicitly set and which we support here.
+ // For more control, the user can themselves use a QTexture2D and
+ // create the texture images themselves, or even better, go create
+ // proper texture files themselves (dds/ktx etc). This is purely a
+ // convenience for some common use cases and will always be less
+ // ideal than using compressed textures and generating mips offline.
+ m_format = textureLoader->format();
+}
+
+/*!
* Takes in a TextureGenerator via \a other and
* \return whether generators have the same source.
*/
@@ -1180,7 +1222,8 @@ bool QTextureFromSourceGenerator::operator ==(const QTextureGenerator &other) co
return (otherFunctor != nullptr &&
otherFunctor->m_url == m_url &&
otherFunctor->m_mirrored == m_mirrored &&
- otherFunctor->m_engine == m_engine);
+ otherFunctor->m_engine == m_engine &&
+ otherFunctor->m_format == m_format);
}
QUrl QTextureFromSourceGenerator::url() const
@@ -1193,23 +1236,6 @@ bool QTextureFromSourceGenerator::isMirrored() const
return m_mirrored;
}
-/*!
- * Constructs a new QTextureFromSourceGenerator::QTextureFromSourceGenerator
- * instance with \a url.
- * \param url
- */
-QTextureFromSourceGenerator::QTextureFromSourceGenerator(Qt3DCore::QNodeId texture,
- const QUrl &url, bool mirrored,
- Qt3DCore::QAspectEngine *engine)
- : QTextureGenerator()
- , m_url(url)
- , m_status(QAbstractTexture::None)
- , m_mirrored(mirrored)
- , m_texture(texture)
- , m_engine(engine)
-{
-}
-
} // namespace Qt3DRender
QT_END_NAMESPACE
diff --git a/src/render/texture/qtexture_p.h b/src/render/texture/qtexture_p.h
index 4afb14d62..490eed487 100644
--- a/src/render/texture/qtexture_p.h
+++ b/src/render/texture/qtexture_p.h
@@ -56,18 +56,21 @@
#include <Qt3DRender/private/qabstracttexture_p.h>
#include <Qt3DRender/qtexturegenerator.h>
#include <Qt3DRender/qtexture.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QTextureLoaderPrivate : public QAbstractTexturePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QTextureLoaderPrivate : public QAbstractTexturePrivate
{
public:
QTextureLoaderPrivate();
+ Q_DECLARE_PUBLIC(QTextureLoader)
+
void setScene(Qt3DCore::QScene *scene) override;
- void updateFunctor();
+ void updateGenerator();
QUrl m_source;
bool m_mirrored;
@@ -88,8 +91,10 @@ private:
class Q_AUTOTEST_EXPORT QTextureFromSourceGenerator : public QTextureGenerator
{
public:
- explicit QTextureFromSourceGenerator(Qt3DCore::QNodeId texture, const QUrl &url,
- bool mirrored, Qt3DCore::QAspectEngine *engine);
+ explicit QTextureFromSourceGenerator(QTextureLoader *textureLoader,
+ Qt3DCore::QAspectEngine *engine,
+ Qt3DCore::QNodeId textureId);
+
QTextureDataPtr operator ()() Q_DECL_OVERRIDE;
bool operator ==(const QTextureGenerator &other) const Q_DECL_OVERRIDE;
inline QAbstractTexture::Status status() const { return m_status; }
@@ -105,9 +110,13 @@ private:
QUrl m_url;
QAbstractTexture::Status m_status;
bool m_mirrored;
+
QByteArray m_sourceData;
Qt3DCore::QNodeId m_texture;
Qt3DCore::QAspectEngine *m_engine;
+
+ // Options that can be overridden on TextureLoader when loading
+ QAbstractTexture::TextureFormat m_format;
};
typedef QSharedPointer<QTextureFromSourceGenerator> QTextureFromSourceGeneratorPtr;
diff --git a/src/render/texture/qtexturegenerator.cpp b/src/render/texture/qtexturegenerator.cpp
index 65e615065..32b785128 100644
--- a/src/render/texture/qtexturegenerator.cpp
+++ b/src/render/texture/qtexturegenerator.cpp
@@ -47,6 +47,12 @@ QTextureGenerator::~QTextureGenerator()
{
}
+/*!
+ \class QTextureGenerator
+ \inherits QAbstractFunctor
+ \inmodule Qt3DRender
+ \brief Provides the image data for a texture.
+*/
} // Qt3DRender
QT_END_NAMESPACE
diff --git a/src/render/texture/qtextureimage_p.h b/src/render/texture/qtextureimage_p.h
index 323742781..8db8f50f0 100644
--- a/src/render/texture/qtextureimage_p.h
+++ b/src/render/texture/qtextureimage_p.h
@@ -57,12 +57,13 @@
#include <Qt3DRender/qtextureimage.h>
#include <Qt3DRender/private/qurlhelper_p.h>
#include <Qt3DRender/qtextureimagedatagenerator.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QTextureImagePrivate : public QAbstractTextureImagePrivate
+class QT3DRENDERSHARED_PRIVATE_EXPORT QTextureImagePrivate : public QAbstractTextureImagePrivate
{
public:
QTextureImagePrivate()
diff --git a/tests/auto/animation/animationutils/animationutils.qrc b/tests/auto/animation/animationutils/animationutils.qrc
index bbcd96524..ddaeab7f1 100644
--- a/tests/auto/animation/animationutils/animationutils.qrc
+++ b/tests/auto/animation/animationutils/animationutils.qrc
@@ -3,5 +3,6 @@
<file>clip1.json</file>
<file>clip2.json</file>
<file>clip3.json</file>
+ <file>clip4.json</file>
</qresource>
</RCC>
diff --git a/tests/auto/animation/animationutils/clip4.json b/tests/auto/animation/animationutils/clip4.json
new file mode 100644
index 000000000..0915294cd
--- /dev/null
+++ b/tests/auto/animation/animationutils/clip4.json
@@ -0,0 +1,65 @@
+{
+ "animations": [
+ {
+ "animationName": "LinearTranslation",
+ "channels": [
+ {
+ "channelComponents": [
+ {
+ "channelComponentName": "Location X",
+ "keyFrames": [
+ {
+ "coords": [
+ 0.0,
+ 0.0
+ ]
+ },
+ {
+ "coords": [
+ 10.0,
+ 5.0
+ ]
+ }
+ ]
+ },
+ {
+ "channelComponentName": "Location Y",
+ "keyFrames": [
+ {
+ "coords": [
+ 0.0,
+ 0.0
+ ]
+ },
+ {
+ "coords": [
+ 10.0,
+ -2.0
+ ]
+ }
+ ]
+ },
+ {
+ "channelComponentName": "Location Z",
+ "keyFrames": [
+ {
+ "coords": [
+ 0.0,
+ 0.0
+ ]
+ },
+ {
+ "coords": [
+ 10.0,
+ 6.0
+ ]
+ }
+ ]
+ }
+ ],
+ "channelName": "Location"
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/auto/animation/animationutils/tst_animationutils.cpp b/tests/auto/animation/animationutils/tst_animationutils.cpp
index ac4fb6fa0..4c97cf7e5 100644
--- a/tests/auto/animation/animationutils/tst_animationutils.cpp
+++ b/tests/auto/animation/animationutils/tst_animationutils.cpp
@@ -42,6 +42,7 @@
#include <QtGui/qvector3d.h>
#include <QtGui/qvector4d.h>
#include <QtGui/qquaternion.h>
+#include <QtGui/qcolor.h>
#include <qbackendnodetester.h>
#include <testpostmanarbiter.h>
@@ -626,7 +627,7 @@ private Q_SLOTS:
globalStartTime = 0.0;
playbackRate = 1.0;
duration = 1.0;
- loopCount = 0;
+ loopCount = -1;
expectedLocalTime = 0.5;
expectedCurrentLoop = 1;
QTest::newRow("simple, loopCount = inf, t_global = 1.5")
@@ -637,7 +638,7 @@ private Q_SLOTS:
globalStartTime = 0.0;
playbackRate = 1.0;
duration = 1.0;
- loopCount = 0;
+ loopCount = -1;
expectedLocalTime = 0.2;
expectedCurrentLoop = 10;
QTest::newRow("simple, loopCount = inf, t_global = 10.2")
@@ -791,7 +792,7 @@ private Q_SLOTS:
globalStartTime = 0.0;
playbackRate = 1.0;
duration = 1.0;
- loopCount = 0;
+ loopCount = -1;
expectedPhase = 0.5;
expectedCurrentLoop = 1;
QTest::newRow("simple, loopCount = inf, t_global = 1.5")
@@ -802,7 +803,7 @@ private Q_SLOTS:
globalStartTime = 0.0;
playbackRate = 1.0;
duration = 1.0;
- loopCount = 0;
+ loopCount = -1;
expectedPhase = 0.2;
expectedCurrentLoop = 10;
QTest::newRow("simple, loopCount = inf, t_global = 10.2")
@@ -1000,7 +1001,7 @@ private Q_SLOTS:
MappingData mapping;
mapping.targetId = Qt3DCore::QNodeId::createId();
mapping.propertyName = "foo";
- mapping.type = static_cast<int>(QVariant::Vector2D);
+ mapping.type = static_cast<int>(QVariant::Vector4D);
mapping.channelIndices = QVector<int>() << 0 << 1 << 2 << 3;
mappingData.push_back(mapping);
channelResults = QVector<float>() << 4.0f << 3.0f << 2.0f << 1.0f;
@@ -1036,7 +1037,7 @@ private Q_SLOTS:
auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(mapping.targetId);
change->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll);
change->setPropertyName(mapping.propertyName);
- change->setValue(QVariant::fromValue(QQuaternion(1.0f, 0.0f, 0.0f, 1.0f)));
+ change->setValue(QVariant::fromValue(QQuaternion(1.0f, 0.0f, 0.0f, 1.0f).normalized()));
expectedChanges.push_back(change);
QTest::newRow("quaternion rotation")
@@ -1047,6 +1048,34 @@ private Q_SLOTS:
channelResults.clear();
expectedChanges.clear();
}
+
+ // Single property, QColor
+ {
+ animatorId = Qt3DCore::QNodeId::createId();
+ MappingData mapping;
+ mapping.targetId = Qt3DCore::QNodeId::createId();
+ mapping.propertyName = "color";
+ mapping.type = static_cast<int>(QVariant::Color);
+ mapping.channelIndices = QVector<int>() << 0 << 1 << 2;
+ mappingData.push_back(mapping);
+ channelResults = QVector<float>() << 0.5f << 0.4f << 0.3f;
+ finalFrame = false;
+
+ auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(mapping.targetId);
+ change->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll);
+ change->setPropertyName(mapping.propertyName);
+ change->setValue(QVariant::fromValue(QColor::fromRgbF(0.5f, 0.4f, 0.3f)));
+ expectedChanges.push_back(change);
+
+ QTest::newRow("QColor color")
+ << animatorId << mappingData << channelResults << finalFrame
+ << expectedChanges;
+
+ mappingData.clear();
+ channelResults.clear();
+ expectedChanges.clear();
+ }
+
}
void checkPreparePropertyChanges()
@@ -1067,7 +1096,7 @@ private Q_SLOTS:
for (int i = 0; i < actualChanges.size(); ++i) {
auto expectedChange = expectedChanges[i];
auto actualChange
- = qSharedPointerCast<Qt3DCore::QPropertyUpdatedChange>(expectedChanges[i]);
+ = qSharedPointerCast<Qt3DCore::QPropertyUpdatedChange>(actualChanges[i]);
QCOMPARE(actualChange->subjectId(), expectedChange->subjectId());
QCOMPARE(actualChange->deliveryFlags(), expectedChange->deliveryFlags());
@@ -1157,6 +1186,28 @@ private Q_SLOTS:
<< handler << clip << localTime << expectedResults;
expectedResults.clear();
}
+ {
+ // a clip with linear interpolation
+ handler = new Handler();
+ clip = createAnimationClipLoader(handler, QUrl("qrc:/clip4.json"));
+ localTime = clip->duration();
+ expectedResults = QVector<float>() << 5.0 << -2.0f << 6.0f;
+
+ QTest::newRow("clip4.json, linear, t = duration")
+ << handler << clip << localTime << expectedResults;
+ expectedResults.clear();
+ }
+ {
+ // a clip with linear interpolation
+ handler = new Handler();
+ clip = createAnimationClipLoader(handler, QUrl("qrc:/clip4.json"));
+ localTime = clip->duration() / 2.0f;
+ expectedResults = QVector<float>() << 2.5f << -1.0f << 3.0f;
+
+ QTest::newRow("clip4.json, linear, t = duration/2")
+ << handler << clip << localTime << expectedResults;
+ expectedResults.clear();
+ }
}
void checkEvaluateClipAtLocalTime()
diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml b/tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml
new file mode 100644
index 000000000..55be54297
--- /dev/null
+++ b/tests/auto/quick3d/quick3dnodeinstantiator/data/createNested.qml
@@ -0,0 +1,15 @@
+import QtQml 2.1
+import Qt3D.Core 2.0
+
+Entity {
+ NodeInstantiator {
+ model: 3
+ delegate: NodeInstantiator {
+ model: 4
+ delegate: Entity {
+ property bool success: true
+ property int idx: index
+ }
+ }
+ }
+}
diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro b/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro
index 15435d13e..9026f91ff 100644
--- a/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro
+++ b/tests/auto/quick3d/quick3dnodeinstantiator/quick3dnodeinstantiator.pro
@@ -12,6 +12,7 @@ OTHER_FILES = \
data/createMultiple.qml \
data/createNone.qml \
data/createSingle.qml \
+ data/createNested.qml \
data/inactive.qml \
data/stringModel.qml
diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp
index acaba6690..d4d0d56e2 100644
--- a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp
+++ b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp
@@ -50,6 +50,7 @@ private slots:
void createNone();
void createSingle();
void createMultiple();
+ void createNested();
void stringModel();
void activeProperty();
void intModelChange();
@@ -109,6 +110,34 @@ void tst_quick3dnodeinstantiator::createMultiple()
}
}
+void tst_quick3dnodeinstantiator::createNested()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("createNested.qml"));
+ const auto root = qobject_cast<Qt3DCore::QNode*>(component.create());
+ QVERIFY(root != 0);
+
+ auto instantiators = root->findChildren<Quick3DNodeInstantiator*>();
+ QCOMPARE(instantiators.count(), 4);
+
+ const auto outerInstantiator = instantiators.takeFirst();
+ QCOMPARE(outerInstantiator->isActive(), true);
+ QCOMPARE(outerInstantiator->count(), 3);
+
+ for (const auto instantiator : instantiators) {
+ QCOMPARE(instantiator->isActive(), true);
+ QCOMPARE(instantiator->count(), 4);
+
+ for (int i = 0; i < 4; i++) {
+ auto object = instantiator->objectAt(i);
+ QVERIFY(object);
+ QCOMPARE(object->parent(), root);
+ QCOMPARE(object->property("success").toBool(), true);
+ QCOMPARE(object->property("idx").toInt(), i);
+ }
+ }
+}
+
void tst_quick3dnodeinstantiator::stringModel()
{
QQmlEngine engine;
diff --git a/tests/auto/render/buffer/tst_buffer.cpp b/tests/auto/render/buffer/tst_buffer.cpp
index 93b21e9c7..8d23f4184 100644
--- a/tests/auto/render/buffer/tst_buffer.cpp
+++ b/tests/auto/render/buffer/tst_buffer.cpp
@@ -283,6 +283,30 @@ private Q_SLOTS:
renderBuffer.unsetDirty();
QVERIFY(!renderBuffer.isDirty());
}
+
+ void checkBufferManagerReferenceCount()
+ {
+ // GIVEN
+ Qt3DRender::Render::Buffer renderBuffer;
+ Qt3DRender::QBuffer buffer(Qt3DRender::QBuffer::IndexBuffer);
+ Qt3DRender::Render::BufferManager bufferManager;
+
+ // WHEN
+ renderBuffer.setManager(&bufferManager);
+ simulateInitialization(&buffer, &renderBuffer);
+
+ // THEN
+ QVERIFY(bufferManager.takeBuffersToRelease().empty());
+
+ // WHEN
+ bufferManager.removeBufferReference(renderBuffer.peerId());
+ auto buffers = bufferManager.takeBuffersToRelease();
+
+ // THEN
+ QVERIFY(buffers.size() == 1);
+ QVERIFY(buffers.first() == renderBuffer.peerId());
+ QVERIFY(bufferManager.takeBuffersToRelease().empty());
+ }
};
diff --git a/tests/auto/render/qgraphicsapifilter/tst_qgraphicsapifilter.cpp b/tests/auto/render/qgraphicsapifilter/tst_qgraphicsapifilter.cpp
index 7d4a3bfc9..ac6f79b3f 100644
--- a/tests/auto/render/qgraphicsapifilter/tst_qgraphicsapifilter.cpp
+++ b/tests/auto/render/qgraphicsapifilter/tst_qgraphicsapifilter.cpp
@@ -241,6 +241,6 @@ private Q_SLOTS:
};
-QTEST_APPLESS_MAIN(tst_QGraphicsApiFilter)
+QTEST_MAIN(tst_QGraphicsApiFilter)
#include "tst_qgraphicsapifilter.moc"
diff --git a/tests/manual/downloading/main.qml b/tests/manual/downloading/main.qml
index e2f42284d..47d1c09fb 100644
--- a/tests/manual/downloading/main.qml
+++ b/tests/manual/downloading/main.qml
@@ -92,7 +92,7 @@ Entity {
DiffuseMapMaterial {
id: material
- diffuse: TextureLoader { source: "https://codereview.qt-project.org/gitweb?p=qt/qt3d.git;a=blob_plain;hb=refs/heads/dev;f=examples/qt3d/planets-qml/images/earthmap1k.jpg" }
+ diffuse: TextureLoader { source: "https://codereview.qt-project.org/gitweb?p=qt/qt3d.git;a=blob_plain;hb=refs/heads/dev;f=examples/qt3d/planets-qml/images/solarsystemscope/earthmap2k.jpg" }
specular: Qt.rgba( 0.2, 0.2, 0.2, 1.0 )
shininess: 2.0
}