summaryrefslogtreecommitdiffstats
path: root/src/render/backend/renderscenebuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/backend/renderscenebuilder.cpp')
-rw-r--r--src/render/backend/renderscenebuilder.cpp63
1 files changed, 54 insertions, 9 deletions
diff --git a/src/render/backend/renderscenebuilder.cpp b/src/render/backend/renderscenebuilder.cpp
index e0a5d5ad4..4df476cf2 100644
--- a/src/render/backend/renderscenebuilder.cpp
+++ b/src/render/backend/renderscenebuilder.cpp
@@ -108,6 +108,7 @@ namespace Render {
RenderSceneBuilder::RenderSceneBuilder(Renderer *renderer)
: Qt3D::NodeVisitor()
, m_renderer(renderer)
+ , m_frameGraphRoot(Q_NULLPTR)
{
}
@@ -122,7 +123,7 @@ void RenderSceneBuilder::initializeFrameGraph()
// References that the FrameGraphItem may be usings have been inserted
// Into the scenegraph
// Retrieve and set Renderer FrameGraph
- QFrameGraph *fg = QEntity::findComponentInTree<QFrameGraph>(m_renderer->sceneGraphRoot());
+ QFrameGraph *fg = m_frameGraphRoot;
Q_ASSERT_X(fg, Q_FUNC_INFO, "No FrameGraph component found. The FrameGraph defines the renderer configuration. Cannot continue");
// m_frameGraphEntityNode = m_renderer->renderNodesManager()->lookupHandle(fg->parentNode()->asEntity()->uuid());
// createFrameGraph(fg);
@@ -191,12 +192,13 @@ void RenderSceneBuilder::createRenderElement(QNode *frontend)
RenderEntity *rEntity = createRenderNode(entity);
if (parentEntity)
rEntity->setParentHandle(m_renderer->renderNodesManager()->lookupHandle(parentEntity->uuid()));
+
if (m_rootNodeHandle.isNull())
m_rootNodeHandle = rEntity->handle();
}
else if (qobject_cast<QTransform *>(frontend)) {
createRenderElementHelper<QTransform, RenderTransform, TransformManager>(frontend,
- m_renderer->transformManager());
+ m_renderer->transformManager());
}
else if (qobject_cast<QAbstractMesh *>(frontend)) {
createRenderElementHelper<QAbstractMesh, RenderMesh, MeshManager>(frontend,
@@ -236,7 +238,7 @@ void RenderSceneBuilder::createRenderElement(QNode *frontend)
}
else if (qobject_cast<QAbstractSceneLoader *>(frontend)) {
createRenderElementHelper<QAbstractSceneLoader, RenderScene, SceneManager>(frontend,
- m_renderer->sceneManager());
+ m_renderer->sceneManager());
}
else if (qobject_cast<QTexture *>(frontend)) {
createRenderElementHelper<QTexture, RenderTexture, TextureManager>(frontend,
@@ -309,6 +311,31 @@ void RenderSceneBuilder::releaseRenderElement(QNode *frontend)
m_renderer->sortCriterionManager()->releaseResource(frontend->uuid());
}
+void RenderSceneBuilder::insertNodeTree(QNode *nd)
+{
+ if (nd != Q_NULLPTR) {
+ createRenderElement(nd);
+ Q_FOREACH (QObject *c, nd->children()) {
+ QNode *n = qobject_cast<QNode *>(c);
+ if (n != Q_NULLPTR)
+ createRenderElement(n);
+ }
+ }
+}
+
+void RenderSceneBuilder::releaseNodeTree(QNode *nd)
+{
+ if (nd != Q_NULLPTR) {
+ Q_FOREACH (QObject *c, nd->children()) {
+ QNode *n = qobject_cast<QNode *>(c);
+ if (n != Q_NULLPTR) {
+ releaseRenderElement(n);
+ }
+ }
+ releaseRenderElement(nd);
+ }
+}
+
RenderEntity* RenderSceneBuilder::createRenderNode(QEntity *entity)
{
HRenderNode renderNodeHandle;
@@ -318,12 +345,30 @@ RenderEntity* RenderSceneBuilder::createRenderNode(QEntity *entity)
rEntity->setRenderer(m_renderer);
rEntity->setPeer(entity);
- QList<QTransform *> transforms = entity->componentsOfType<QTransform>();
- QList<QMaterial *> materials = entity->componentsOfType<QMaterial>();
- QList<QAbstractMesh *> meshes = entity->componentsOfType<QAbstractMesh>();
- QList<QCameraLens *> lenses = entity->componentsOfType<QCameraLens>();
- QList<QLayer *> layers = entity->componentsOfType<QLayer>();
- QList<QAbstractLight *> lights = entity->componentsOfType<QAbstractLight>();
+ QList<QTransform *> transforms;
+ QList<QMaterial *> materials;
+ QList<QAbstractMesh *> meshes;
+ QList<QCameraLens *> lenses;
+ QList<QLayer *> layers;
+ QList<QAbstractLight *> lights;
+
+ Q_FOREACH (QComponent *c, entity->components()) {
+ // TO DO: switch based on typeId
+ if (qobject_cast<QTransform *>(c))
+ transforms << qobject_cast<QTransform *>(c);
+ else if (qobject_cast<QMaterial *>(c))
+ materials << qobject_cast<QMaterial *>(c);
+ else if (qobject_cast<QAbstractMesh *>(c))
+ meshes << qobject_cast<QAbstractMesh *>(c);
+ else if (qobject_cast<QCameraLens *>(c))
+ lenses << qobject_cast<QCameraLens *>(c);
+ else if (qobject_cast<QLayer *>(c))
+ layers << qobject_cast<QLayer *>(c);
+ else if (qobject_cast<QAbstractLight *>(c))
+ lights << qobject_cast<QAbstractLight *>(c);
+ else if (qobject_cast<QFrameGraph *>(c))
+ m_frameGraphRoot = qobject_cast<QFrameGraph *>(c);
+ }
// Retrieve Transform from Entity
if (!transforms.isEmpty()) {