summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire.ecortex.kdab.com>2014-10-27 15:35:33 +0100
committerPaul Lemire <paul.lemire@kdab.com>2014-10-30 17:22:21 +0100
commit1dcaa4a2206e1bfe849cfaf3314c1ed5a3877e89 (patch)
tree68f3c808b014ecafde8555289b057b2e64a4c5b2
parent8e5345043dd3658cd3f319cd1aee9e746c17fdbd (diff)
QTransform refactored
Change-Id: I9c05c37b7f9576b81169c30686de96c9267e4854 Task-number: QTBUG-41542 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--examples/cpp_example/main.cpp6
-rw-r--r--examples/cylinder-cpp/main.cpp4
-rw-r--r--examples/simple-cpp/main.cpp8
-rw-r--r--examples/torus-cpp/main.cpp4
-rw-r--r--src/core/transforms/qtransform.cpp48
-rw-r--r--src/core/transforms/qtransform.h22
-rw-r--r--src/core/transforms/qtransform_p.h5
-rw-r--r--src/plugins/sceneparsers/assimp/assimpparser.cpp5
-rw-r--r--src/quick3d/quick3d/items/quick3dtransform.cpp2
-rw-r--r--src/render/io/gltfparser.cpp2
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);
}