diff options
-rw-r--r-- | examples/cpp_example/main.cpp | 6 | ||||
-rw-r--r-- | examples/cylinder-cpp/main.cpp | 4 | ||||
-rw-r--r-- | examples/simple-cpp/main.cpp | 8 | ||||
-rw-r--r-- | examples/torus-cpp/main.cpp | 4 | ||||
-rw-r--r-- | src/core/transforms/qtransform.cpp | 48 | ||||
-rw-r--r-- | src/core/transforms/qtransform.h | 22 | ||||
-rw-r--r-- | src/core/transforms/qtransform_p.h | 5 | ||||
-rw-r--r-- | src/plugins/sceneparsers/assimp/assimpparser.cpp | 5 | ||||
-rw-r--r-- | src/quick3d/quick3d/items/quick3dtransform.cpp | 2 | ||||
-rw-r--r-- | src/render/io/gltfparser.cpp | 2 |
10 files changed, 40 insertions, 66 deletions
diff --git a/examples/cpp_example/main.cpp b/examples/cpp_example/main.cpp index ac8128b47..d6d590955 100644 --- a/examples/cpp_example/main.cpp +++ b/examples/cpp_example/main.cpp @@ -101,8 +101,8 @@ int main(int ac, char **av) torusTranslation->setTranslation(QVector3D(-5.0f, 3.5f, 2.0f)); torusRotation->setAxis(QVector3D(1, 0, 0)); torusRotation->setAngleDeg(35.0f); - torusTransforms->appendTransform(torusTranslation); - torusTransforms->appendTransform(torusRotation); + torusTransforms->addTransform(torusTranslation); + torusTransforms->addTransform(torusRotation); torusEntity->addComponent(torusTransforms); // Scene file @@ -114,7 +114,7 @@ int main(int ac, char **av) sceneTranslateTransform->setDx(2.5); sceneTranslateTransform->setDy(0.5); sceneTranslateTransform->setDz(-10); - sceneTransform->appendTransform(sceneTranslateTransform); + sceneTransform->addTransform(sceneTranslateTransform); sceneEntity->addComponent(sceneTransform); // scene->setSource(":/assets/gltf/wine/wine.json"); scene->setSource(":/assets/test_scene.dae"); diff --git a/examples/cylinder-cpp/main.cpp b/examples/cylinder-cpp/main.cpp index ec6c411eb..c11435346 100644 --- a/examples/cylinder-cpp/main.cpp +++ b/examples/cylinder-cpp/main.cpp @@ -120,8 +120,8 @@ int main(int argc, char **argv) cylinderRotation->setAngleDeg(45.0f); cylinderRotation->setAxis(QVector3D(1, 0, 0)); - cylinderTransforms->appendTransform(cylinderScale); - cylinderTransforms->appendTransform(cylinderRotation); + cylinderTransforms->addTransform(cylinderScale); + cylinderTransforms->addTransform(cylinderRotation); // Cylinder Qt3D::QEntity *cylinderEntity = new Qt3D::QEntity(rootEntity); diff --git a/examples/simple-cpp/main.cpp b/examples/simple-cpp/main.cpp index 0cf838c71..44313ebca 100644 --- a/examples/simple-cpp/main.cpp +++ b/examples/simple-cpp/main.cpp @@ -125,8 +125,8 @@ int main(int argc, char* argv[]) torusRotateTransform->setAxis(QVector3D(1, 0, 0)); torusRotateTransform->setAngleDeg(45); - torusTransform->appendTransform(torusScaleTransform); - torusTransform->appendTransform(torusRotateTransform); + torusTransform->addTransform(torusScaleTransform); + torusTransform->addTransform(torusRotateTransform); torusEntity->addComponent(torusMesh); @@ -156,8 +156,8 @@ int main(int argc, char* argv[]) sphereRotateTransformAnimation->setLoopCount(-1); sphereRotateTransformAnimation->start(); - sphereTransform->appendTransform(sphereTranslateTransform); - sphereTransform->appendTransform(sphereRotateTransform); + sphereTransform->addTransform(sphereTranslateTransform); + sphereTransform->addTransform(sphereRotateTransform); sphereEntity->addComponent(sphereMesh); sphereEntity->addComponent(sphereTransform); diff --git a/examples/torus-cpp/main.cpp b/examples/torus-cpp/main.cpp index e9a3a9d5b..a26a9d581 100644 --- a/examples/torus-cpp/main.cpp +++ b/examples/torus-cpp/main.cpp @@ -120,8 +120,8 @@ int main(int argc, char **argv) torusRotation->setAngleDeg(45.0f); torusRotation->setAxis(QVector3D(1, 0, 0)); - torusTransforms->appendTransform(torusScale); - torusTransforms->appendTransform(torusRotation); + torusTransforms->addTransform(torusScale); + torusTransforms->addTransform(torusRotation); // Torus Qt3D::QEntity *torusEntity = new Qt3D::QEntity(rootEntity); diff --git a/src/core/transforms/qtransform.cpp b/src/core/transforms/qtransform.cpp index 96226c08e..8a4caf8ff 100644 --- a/src/core/transforms/qtransform.cpp +++ b/src/core/transforms/qtransform.cpp @@ -52,6 +52,7 @@ namespace Qt3D { QTransformPrivate::QTransformPrivate(QTransform *qq) : QComponentPrivate(qq) + , m_transformsDirty(false) , m_transforms() , m_matrix() , m_sceneMatrix() @@ -64,31 +65,25 @@ void QTransform::copy(const QNode *ref) const QTransform *transform = static_cast<const QTransform*>(ref); d_func()->m_matrix = transform->d_func()->m_matrix; Q_FOREACH (QAbstractTransform *t, transform->d_func()->m_transforms) - appendTransform(qobject_cast<QAbstractTransform *>(QNodePrivate::get(t)->clone())); + addTransform(qobject_cast<QAbstractTransform *>(QNodePrivate::get(t)->clone())); } QTransform::QTransform(QNode *parent) : Qt3D::QComponent(*new QTransformPrivate(this), parent) { - Q_D(QTransform); - d->m_transformsDirty.fetchAndStoreOrdered(0); } QTransform::QTransform(QList<QAbstractTransform *> transforms, QNode *parent) : Qt3D::QComponent(*new QTransformPrivate(this), parent) { - Q_D(QTransform); - d->m_transformsDirty.fetchAndStoreOrdered(0); Q_FOREACH (QAbstractTransform *t, transforms) - appendTransform(t); + addTransform(t); } QTransform::QTransform(QAbstractTransform *transform, QNode *parent) : Qt3D::QComponent(*new QTransformPrivate(this), parent) { - Q_D(QTransform); - d->m_transformsDirty.fetchAndStoreOrdered(0); - appendTransform(transform); + addTransform(transform); } QTransform::QTransform(QTransformPrivate &dd, QNode *parent) @@ -96,34 +91,23 @@ QTransform::QTransform(QTransformPrivate &dd, QNode *parent) { } -void QTransform::setTransformsDirty() +void QTransformPrivate::_q_update() { - Q_D(QTransform); - if (!d->m_transformsDirty.loadAcquire()) { - d->m_transformsDirty.fetchAndStoreOrdered(1); - } - emit matrixChanged(); + if (!m_transformsDirty) + m_transformsDirty = true; + emit static_cast<QTransform *>(q_ptr)->matrixChanged(); } QMatrix4x4 QTransform::matrix() const { Q_D(const QTransform); - if (d->m_transformsDirty.loadAcquire()) { + if (d->m_transformsDirty) { d->m_matrix = applyTransforms(); - d->m_transformsDirty.fetchAndStoreOrdered(0); + d->m_transformsDirty = false; } return d->m_matrix; } -void QTransform::setMatrix(const QMatrix4x4 &m) -{ - Q_D(QTransform); - qDeleteAll(d->m_transforms); - d->m_transforms.clear(); - appendTransform(new QMatrixTransform(m)); - setTransformsDirty(); -} - /*! The center of rotation for the entity. Defaults to the local origin. */ @@ -146,20 +130,20 @@ void QTransform::setRotationCenter(const QVector3D &rc) Q_UNUSED(rc); } -void QTransform::appendTransform(QAbstractTransform *transform) +void QTransform::addTransform(QAbstractTransform *transform) { Q_D(QTransform); d->m_transforms.append(transform); - QObject::connect(transform, SIGNAL(transformMatrixChanged()), this, SLOT(setTransformsDirty())); - setTransformsDirty(); + QObject::connect(transform, SIGNAL(transformMatrixChanged()), this, SLOT(_q_update())); + d->_q_update(); } void QTransform::removeTransform(QAbstractTransform *transform) { Q_D(QTransform); d->m_transforms.removeOne(transform); - QObject::disconnect(transform, SIGNAL(transformMatrixChanged()), this, SLOT(setTransformsDirty())); - setTransformsDirty(); + QObject::disconnect(transform, SIGNAL(transformMatrixChanged()), this, SLOT(_q_update())); + d->_q_update(); } QMatrix4x4 QTransform::applyTransforms() const @@ -180,3 +164,5 @@ QList<QAbstractTransform *> QTransform::transformList() const } // namespace Qt3D QT_END_NAMESPACE + +#include "moc_qtransform.cpp" diff --git a/src/core/transforms/qtransform.h b/src/core/transforms/qtransform.h index 0c330c522..78bdb8009 100644 --- a/src/core/transforms/qtransform.h +++ b/src/core/transforms/qtransform.h @@ -65,42 +65,28 @@ public: QTransform(QAbstractTransform *transform, QNode *parent = 0); QMatrix4x4 matrix() const; - void setMatrix(const QMatrix4x4 &m); QVector3D rotationCenter() const; void setRotationCenter(const QVector3D &rc); QList<QAbstractTransform*> transforms() const; - template <class T> - T *findFirstTransform() const - { - T *transform = Q_NULLPTR; - Q_FOREACH (QAbstractTransform *trans, transformList()) - if ((transform = qobject_cast<T*>(trans)) != Q_NULLPTR) - break; - return transform; - } - - void appendTransform(QAbstractTransform *xform); + void addTransform(QAbstractTransform *xform); void removeTransform(QAbstractTransform *xform); -private Q_SLOTS: - void setTransformsDirty(); - Q_SIGNALS: void matrixChanged(); protected: - QMatrix4x4 applyTransforms() const; - QList<QAbstractTransform *> transformList() const; - QTransform(QTransformPrivate &dd, QNode *parent = 0); + QList<QAbstractTransform *> transformList() const; void copy(const QNode *ref) Q_DECL_OVERRIDE; private: Q_DECLARE_PRIVATE(QTransform) QT3D_CLONEABLE(QTransform) + Q_PRIVATE_SLOT(d_func(), void _q_update()) + QMatrix4x4 applyTransforms() const; }; } // namespace Qt3D diff --git a/src/core/transforms/qtransform_p.h b/src/core/transforms/qtransform_p.h index ebd490fe0..43dd4db3b 100644 --- a/src/core/transforms/qtransform_p.h +++ b/src/core/transforms/qtransform_p.h @@ -58,11 +58,14 @@ public: Q_DECLARE_PUBLIC(QTransform) - mutable QAtomicInt m_transformsDirty; + mutable bool m_transformsDirty; QList<QAbstractTransform*> m_transforms; mutable QMatrix4x4 m_matrix; QMatrix4x4 m_sceneMatrix; + +private: + void _q_update(); }; } diff --git a/src/plugins/sceneparsers/assimp/assimpparser.cpp b/src/plugins/sceneparsers/assimp/assimpparser.cpp index ee2e6fd0c..8566898aa 100644 --- a/src/plugins/sceneparsers/assimp/assimpparser.cpp +++ b/src/plugins/sceneparsers/assimp/assimpparser.cpp @@ -344,9 +344,8 @@ QEntity *AssimpParser::node(aiNode *node) } // Add Transformations - QTransform *transform = new QTransform(); QMatrix4x4 qTransformMatrix = AssimpParser::aiMatrix4x4ToQMatrix4x4(node->mTransformation); - transform->setMatrix(qTransformMatrix); + QTransform *transform = new QTransform(new QMatrixTransform(qTransformMatrix)); entityNode->addComponent(transform); // Add Camera @@ -659,7 +658,7 @@ void AssimpParser::loadCamera(uint cameraIndex) viewMatrix.lookAt(QVector3D(0, 0, 0), QVector3D(assimpCamera->mLookAt.x, assimpCamera->mLookAt.y, assimpCamera->mLookAt.z), QVector3D(0, 0, 0)); - transform->setMatrix(viewMatrix); + transform->addTransform(new QMatrixTransform(viewMatrix)); camera->addComponent(transform); m_scene->m_cameras[cameraNode] = camera; } diff --git a/src/quick3d/quick3d/items/quick3dtransform.cpp b/src/quick3d/quick3d/items/quick3dtransform.cpp index d3a7e403a..979847d44 100644 --- a/src/quick3d/quick3d/items/quick3dtransform.cpp +++ b/src/quick3d/quick3d/items/quick3dtransform.cpp @@ -68,7 +68,7 @@ void Quick3DTransform::qmlAppendTransform(QQmlListProperty<QAbstractTransform> * return; Quick3DTransform *self = static_cast<Quick3DTransform *>(list->object); - self->parentTransform()->appendTransform(obj); + self->parentTransform()->addTransform(obj); } QAbstractTransform* Quick3DTransform::transformAt(QQmlListProperty<QAbstractTransform> *list, int index) diff --git a/src/render/io/gltfparser.cpp b/src/render/io/gltfparser.cpp index 38522b0e6..1a5f5e440 100644 --- a/src/render/io/gltfparser.cpp +++ b/src/render/io/gltfparser.cpp @@ -435,7 +435,7 @@ QEntity* GLTFParser::node(QString id) // ADD MATRIX TRANSFORM COMPONENT TO ENTITY QTransform *trans = new QTransform(); - trans->appendTransform(new QMatrixTransform(m)); + trans->addTransform(new QMatrixTransform(m)); result->addComponent(trans); } |