summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2014-05-02 11:07:38 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-05-24 11:10:42 +0200
commit727d7f83735f5128058d661a1633a2b435fcf4b5 (patch)
tree5465bef6fea4ca61cf466c98cda6e30afa53fc82
parent67e0e3e06589fde78e5587afa2f6870d7120deb2 (diff)
RenderMesh set to dirty on peer change
This allows the RenderMesh - MeshData link to be updated when the frontent peer Mesh assigned to RenderMesh is updated. Change-Id: I36c6beca551709e5f0f68e3bfe354bf7baa78885 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--examples/simple-qml/main.qml3
-rw-r--r--src/render/backend/rendermesh.cpp1
-rw-r--r--src/render/backend/rendernode.cpp5
-rw-r--r--src/render/backend/renderview.cpp5
4 files changed, 10 insertions, 4 deletions
diff --git a/examples/simple-qml/main.qml b/examples/simple-qml/main.qml
index ffb7311c0..436cdfb31 100644
--- a/examples/simple-qml/main.qml
+++ b/examples/simple-qml/main.qml
@@ -64,7 +64,8 @@ Node {
{
console.log("Triggered <<<<<<<<<<<<<<<<<<<<< " + test);
camera2.transform = test ? transform_0 : transform_1
- ball2.mesh = test ? cubeMesh : ballMesh
+ ball2.mesh = test ? null : ballMesh
+ ball1.mesh = test ? cubeMesh : ballMesh
test = !test
}
}
diff --git a/src/render/backend/rendermesh.cpp b/src/render/backend/rendermesh.cpp
index 5b78eb252..2a2c57f9d 100644
--- a/src/render/backend/rendermesh.cpp
+++ b/src/render/backend/rendermesh.cpp
@@ -86,6 +86,7 @@ void RenderMesh::setPeer(Mesh *peer)
if (m_peer)
arbiter->unregisterObserver(this, m_peer);
m_peer = peer;
+ m_meshDirty = true;
if (m_peer)
arbiter->registerObserver(this, m_peer, ComponentUpdated);
}
diff --git a/src/render/backend/rendernode.cpp b/src/render/backend/rendernode.cpp
index 90f6d00b4..9ae59959d 100644
--- a/src/render/backend/rendernode.cpp
+++ b/src/render/backend/rendernode.cpp
@@ -47,6 +47,7 @@
#include "cameramanager.h"
#include "materialmanager.h"
#include "meshmanager.h"
+#include "meshdatamanager.h"
#include "mesh.h"
#include <cameralens.h>
#include <transform.h>
@@ -157,8 +158,10 @@ void RenderNode::sceneChangeEvent(const QSceneChangePtr &e)
}
else if (qobject_cast<Mesh *>(component)) {
RenderMesh *mesh = m_renderer->meshManager()->lookupResource(m_frontEndPeer->asEntity()->uuid());
- if (mesh != Q_NULLPTR)
+ if (mesh != Q_NULLPTR) {
mesh->setPeer(qobject_cast<Mesh *>(component));
+ m_renderer->meshDataManager()->addMeshData(mesh->peer());
+ }
}
}
break;
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 0decb43f2..d080654fb 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -157,10 +157,11 @@ void RenderView::buildRenderCommands(RenderNode *node)
HMesh meshHandle;
if (m_renderer->meshManager()->contains(frontEndEntity->uuid()) &&
(meshHandle = m_renderer->meshManager()->lookupHandle(frontEndEntity->uuid())) != HMesh()) {
+ RenderMesh *mesh = m_renderer->meshManager()->data(meshHandle);
+ if (mesh == Q_NULLPTR || mesh->peer() == Q_NULLPTR)
+ return ;
RenderCommand *command = new RenderCommand();
command->m_mesh = meshHandle;
- RenderMesh *mesh = m_renderer->meshManager()->data(command->m_mesh);
- Q_ASSERT(mesh);
if (mesh->meshDirty()) {
mesh->setMeshData(m_renderer->meshDataManager()->lookupHandle(mesh->peer()->uuid()));
qCDebug(Backend) << Q_FUNC_INFO << "Updating RenderMesh -> MeshData handle";