diff options
author | Paul Lemire <paul.lemire350@gmail.com> | 2018-08-09 06:48:37 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2018-08-20 04:34:47 +0000 |
commit | 4030e1796ca10c0eeab4fcb6cc6000b5bdb08028 (patch) | |
tree | ecff3450a2794f65e6f9d8becc76400b6a2488f7 | |
parent | ebd195c59fe50c49dd28f27828afa802384d7011 (diff) |
EntityLoader: add sourceComponent property
Now handles either loading from file or from a Component
[ChangeLog] EntityLoader now also supports loading an Entity from a Component
Change-Id: I1988f897071e5527b36e1b494bba57e9ab165bd8
Reviewed-by: Mike Krus <mike.krus@kdab.com>
5 files changed, 105 insertions, 31 deletions
diff --git a/src/quick3d/imports/core/qt3dquick3dcoreplugin.cpp b/src/quick3d/imports/core/qt3dquick3dcoreplugin.cpp index 05d99f05f..176983ccb 100644 --- a/src/quick3d/imports/core/qt3dquick3dcoreplugin.cpp +++ b/src/quick3d/imports/core/qt3dquick3dcoreplugin.cpp @@ -54,6 +54,8 @@ #include <Qt3DQuick/private/qquaternionanimation_p.h> #include <Qt3DQuick/private/qt3dquick_global_p.h> +#include <QtQml/qqml.h> + QT_BEGIN_NAMESPACE void Qt3DQuick3DCorePlugin::registerTypes(const char *uri) @@ -64,6 +66,7 @@ void Qt3DQuick3DCorePlugin::registerTypes(const char *uri) Qt3DCore::Quick::registerExtendedType<Qt3DCore::QEntity, Qt3DCore::Quick::Quick3DEntity>("QEntity", "Qt3D.Core/Entity", uri, 2, 0, "Entity"); qmlRegisterType<Qt3DCore::Quick::Quick3DEntityLoader>(uri, 2, 0, "EntityLoader"); + qmlRegisterRevision<Qt3DCore::Quick::Quick3DEntityLoader, 12>(uri, 2, 12); qmlRegisterType<Qt3DCore::Quick::Quick3DNodeInstantiator>(uri, 2, 0, "NodeInstantiator"); qmlRegisterType<Qt3DCore::QTransform>(uri, 2, 0, "Transform"); qmlRegisterType<Qt3DCore::QArmature>(uri, 2, 10, "Armature"); diff --git a/src/quick3d/quick3d/items/quick3dentityloader.cpp b/src/quick3d/quick3d/items/quick3dentityloader.cpp index 48f2af658..61801e8df 100644 --- a/src/quick3d/quick3d/items/quick3dentityloader.cpp +++ b/src/quick3d/quick3d/items/quick3dentityloader.cpp @@ -192,6 +192,24 @@ void Quick3DEntityLoader::setSource(const QUrl &url) d->loadFromSource(); } +QQmlComponent *Quick3DEntityLoader::sourceComponent() const +{ + Q_D(const Quick3DEntityLoader); + return d->m_sourceComponent; +} + +void Quick3DEntityLoader::setSourceComponent(QQmlComponent *component) +{ + Q_D(Quick3DEntityLoader); + if (d->m_sourceComponent == component) + return; + + d->clear(); + d->m_sourceComponent = component; + emit sourceComponentChanged(); + d->loadComponent(d->m_sourceComponent); +} + /*! \qmlproperty Status Qt3DCore::EntityLoader::status @@ -214,6 +232,7 @@ Quick3DEntityLoaderPrivate::Quick3DEntityLoaderPrivate() m_incubator(nullptr), m_context(nullptr), m_component(nullptr), + m_sourceComponent(nullptr), m_entity(nullptr), m_status(Quick3DEntityLoader::Null) { @@ -233,10 +252,11 @@ void Quick3DEntityLoaderPrivate::clear() m_entity = nullptr; } - if (m_component) { + // Only delete m_component if we were loading from a URL otherwise it means + // m_component = m_sourceComponent which we don't own. + if (m_component && m_component != m_sourceComponent) delete m_component; - m_component = nullptr; - } + m_component = nullptr; if (m_context) { delete m_context; @@ -271,17 +291,36 @@ void Quick3DEntityLoaderPrivate::loadComponent(const QUrl &source) m_component->loadUrl(source, QQmlComponent::Asynchronous); } +void Quick3DEntityLoaderPrivate::loadComponent(QQmlComponent *component) +{ + Q_Q(Quick3DEntityLoader); + + Q_ASSERT(m_entity == nullptr); + Q_ASSERT(m_component == nullptr); + Q_ASSERT(m_context == nullptr); + + m_component = component; + _q_componentStatusChanged(m_component ? m_component->status() : QQmlComponent::Null); +} + void Quick3DEntityLoaderPrivate::_q_componentStatusChanged(QQmlComponent::Status status) { Q_Q(Quick3DEntityLoader); Q_ASSERT(m_entity == nullptr); - Q_ASSERT(m_component != nullptr); Q_ASSERT(m_context == nullptr); Q_ASSERT(m_incubator == nullptr); - auto owner = _q_findQmlOwner(q); + qDebug() << Q_FUNC_INFO << status; + + if (!m_component) { + clear(); + emit q->entityChanged(); + return; + } + + auto owner = _q_findQmlOwner(q); if (!m_component->errors().isEmpty()) { QQmlEnginePrivate::warning(owner.engine, m_component->errors()); clear(); diff --git a/src/quick3d/quick3d/items/quick3dentityloader_p.h b/src/quick3d/quick3d/items/quick3dentityloader_p.h index 6a2fe5473..beb72ba79 100644 --- a/src/quick3d/quick3d/items/quick3dentityloader_p.h +++ b/src/quick3d/quick3d/items/quick3dentityloader_p.h @@ -60,6 +60,8 @@ QT_BEGIN_NAMESPACE +class QQmlComponent; + namespace Qt3DCore { class QEntity; @@ -74,6 +76,7 @@ class QT3DQUICKSHARED_PRIVATE_EXPORT Quick3DEntityLoader : public QEntity Q_PROPERTY(QObject *entity READ entity NOTIFY entityChanged) Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(Status status READ status NOTIFY statusChanged) + Q_PROPERTY(QQmlComponent *sourceComponent WRITE setSourceComponent NOTIFY sourceComponentChanged REVISION 12) public: enum Status { Null = 0, @@ -91,11 +94,15 @@ public: QUrl source() const; void setSource(const QUrl &url); + QQmlComponent *sourceComponent() const; + void setSourceComponent(QQmlComponent *components); + Status status() const; Q_SIGNALS: void entityChanged(); void sourceChanged(); + void sourceComponentChanged(); void statusChanged(Status status); private: diff --git a/src/quick3d/quick3d/items/quick3dentityloader_p_p.h b/src/quick3d/quick3d/items/quick3dentityloader_p_p.h index 4d067f0e6..b37990d34 100644 --- a/src/quick3d/quick3d/items/quick3dentityloader_p_p.h +++ b/src/quick3d/quick3d/items/quick3dentityloader_p_p.h @@ -79,6 +79,7 @@ public: void clear(); void loadFromSource(); void loadComponent(const QUrl &source); + void loadComponent(QQmlComponent *component); void _q_componentStatusChanged(QQmlComponent::Status status); void setStatus(Quick3DEntityLoader::Status status); @@ -89,6 +90,7 @@ public: Quick3DEntityLoaderIncubator *m_incubator; QQmlContext *m_context; QQmlComponent *m_component; + QQmlComponent *m_sourceComponent; QEntity *m_entity; Quick3DEntityLoader::Status m_status; }; diff --git a/tests/manual/dynamic-model-loader-qml/main.qml b/tests/manual/dynamic-model-loader-qml/main.qml index 72d0529b8..dc6b929cf 100644 --- a/tests/manual/dynamic-model-loader-qml/main.qml +++ b/tests/manual/dynamic-model-loader-qml/main.qml @@ -49,7 +49,7 @@ ****************************************************************************/ import QtQuick 2.2 as QQ2 -import Qt3D.Core 2.0 +import Qt3D.Core 2.12 import Qt3D.Render 2.0 import Qt3D.Input 2.0 import Qt3D.Extras 2.0 @@ -81,44 +81,27 @@ Entity { InputSettings { } ] - - PhongMaterial { - id: material - diffuse: "yellow" - } - - TorusMesh { - id: torusMesh - radius: 5 - minorRadius: 1 - rings: 100 - slices: 20 - } - - Transform { - id: torusTransform - scale3D: Qt.vector3d(1.5, 1, 0.5) - rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), 45) - } - - Entity { - id: torusEntity - components: [ torusMesh, material, torusTransform ] - } - QQ2.Timer { + id: timer interval: 1000 running: true repeat: true property bool addMore: true + property bool odd: false onTriggered: { if (instantiator.model > 10 || instantiator.model < 2) addMore = !addMore instantiator.model += (addMore ? 1 : -1) + odd = !odd } } + PhongMaterial { + id: material + diffuse: "yellow" + } + NodeInstantiator { id: instantiator model: 2 @@ -135,6 +118,46 @@ Entity { } source: model.index % 2 === 0 ? "qrc:/CuboidEntity.qml" : "qrc:/SphereEntity.qml" } + } + + + EntityLoader { + sourceComponent: timer.odd ? cylEntityCmp : torusEntityCmp + } + + QQ2.Component { + id: cylEntityCmp + Entity { + CylinderMesh { + id: cylMesh + } + PhongMaterial { + id: phong + } + components: [cylMesh, phong] + } } + + QQ2.Component { + id: torusEntityCmp + Entity { + TorusMesh { + id: torusMesh + radius: 5 + minorRadius: 1 + rings: 100 + slices: 20 + } + + Transform { + id: torusTransform + scale3D: Qt.vector3d(1.5, 1, 0.5) + rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), 45) + } + + components: [ torusMesh, material, torusTransform ] + } + } + } |