diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2017-06-19 10:37:25 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-06-19 10:37:25 +0100 |
commit | 5af4e423be269a9edf3037ff0302d438f077de04 (patch) | |
tree | a7e5eb78a718921141380658f00f1caedcdb1ba4 | |
parent | 02e960493ef9a2f8dc25a06616fbde8fd869d1af (diff) | |
parent | 01a6bcd086cecef3169e5d79bd72dbb0d1393a0f (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
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 } |