summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire350@gmail.com>2018-08-09 06:48:37 +0200
committerPaul Lemire <paul.lemire@kdab.com>2018-08-20 04:34:47 +0000
commit4030e1796ca10c0eeab4fcb6cc6000b5bdb08028 (patch)
treeecff3450a2794f65e6f9d8becc76400b6a2488f7
parentebd195c59fe50c49dd28f27828afa802384d7011 (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>
-rw-r--r--src/quick3d/imports/core/qt3dquick3dcoreplugin.cpp3
-rw-r--r--src/quick3d/quick3d/items/quick3dentityloader.cpp49
-rw-r--r--src/quick3d/quick3d/items/quick3dentityloader_p.h7
-rw-r--r--src/quick3d/quick3d/items/quick3dentityloader_p_p.h2
-rw-r--r--tests/manual/dynamic-model-loader-qml/main.qml75
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 ]
+ }
+ }
+
}