summaryrefslogtreecommitdiffstats
path: root/src/render/backend/renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/backend/renderer.cpp')
-rw-r--r--src/render/backend/renderer.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index 6217338eb..bb0585e6f 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -166,6 +166,7 @@ Renderer::Renderer(QRenderAspect::RenderType type)
, m_glContext(nullptr)
, m_shareContext(nullptr)
, m_pickBoundingVolumeJob(PickBoundingVolumeJobPtr::create())
+ , m_rayCastingJob(RayCastingJobPtr::create())
, m_time(0)
, m_settings(nullptr)
, m_updateShaderDataTransformJob(Render::UpdateShaderDataTransformJobPtr::create())
@@ -217,6 +218,7 @@ Renderer::Renderer(QRenderAspect::RenderType type)
// All world stuff depends on the RenderEntity's localBoundingVolume
m_updateLevelOfDetailJob->addDependency(m_updateMeshTriangleListJob);
m_pickBoundingVolumeJob->addDependency(m_updateMeshTriangleListJob);
+ m_rayCastingJob->addDependency(m_updateMeshTriangleListJob);
m_shaderGathererJob->addDependency(m_filterCompatibleTechniqueJob);
@@ -278,6 +280,7 @@ void Renderer::setNodeManagers(NodeManagers *managers)
m_cleanupJob->setManagers(m_nodesManager);
m_calculateBoundingVolumeJob->setManagers(m_nodesManager);
m_pickBoundingVolumeJob->setManagers(m_nodesManager);
+ m_rayCastingJob->setManagers(m_nodesManager);
m_updateWorldBoundingVolumeJob->setManager(m_nodesManager->renderNodesManager());
m_sendRenderCaptureJob->setManagers(m_nodesManager);
m_sendBufferCaptureJob->setManagers(m_nodesManager);
@@ -518,6 +521,7 @@ void Renderer::setSceneRoot(QBackendNodeFactory *factory, Entity *sgRoot)
m_calculateBoundingVolumeJob->setRoot(m_renderSceneRoot);
m_cleanupJob->setRoot(m_renderSceneRoot);
m_pickBoundingVolumeJob->setRoot(m_renderSceneRoot);
+ m_rayCastingJob->setRoot(m_renderSceneRoot);
m_updateLevelOfDetailJob->setRoot(m_renderSceneRoot);
m_updateSkinningPaletteJob->setRoot(m_renderSceneRoot);
m_updateTreeEnabledJob->setRoot(m_renderSceneRoot);
@@ -1562,6 +1566,8 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs()
const bool layersDirty = dirtyBitsForFrame & AbstractRenderer::LayersDirty;
const bool layersCacheNeedsToBeRebuilt = layersDirty || entitiesEnabledDirty;
+ const bool materialDirty = dirtyBitsForFrame & AbstractRenderer::MaterialDirty;
+
QMutexLocker lock(m_renderQueue->mutex());
if (m_renderQueue->wasReset()) { // Have we rendered yet? (Scene3D case)
// Traverse the current framegraph. For each leaf node create a
@@ -1583,6 +1589,7 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs()
for (int i = 0; i < fgBranchCount; ++i) {
RenderViewBuilder builder(fgLeaves.at(i), i, this);
builder.setLayerCacheNeedsToBeRebuilt(layersCacheNeedsToBeRebuilt);
+ builder.setMaterialGathererCacheNeedsToBeRebuilt(materialDirty);
builder.prepareJobs();
renderBinJobs.append(builder.buildJobHierachy());
}
@@ -1604,6 +1611,7 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs()
} else {
notCleared |= AbstractRenderer::TechniquesDirty;
notCleared |= AbstractRenderer::ShadersDirty;
+ notCleared |= AbstractRenderer::MaterialDirty;
}
m_dirtyBits.remaining = dirtyBitsForFrame & notCleared;
@@ -1625,6 +1633,18 @@ QAspectJobPtr Renderer::pickBoundingVolumeJob()
return m_pickBoundingVolumeJob;
}
+QAspectJobPtr Renderer::rayCastingJob()
+{
+ // Set values on rayCastingJob
+ RenderSettings *renderSetting = settings();
+ if (renderSetting != nullptr) {
+ m_rayCastingJob->setRenderSettings(renderSetting);
+ m_rayCastingJob->setFrameGraphRoot(frameGraphRoot());
+ }
+
+ return m_rayCastingJob;
+}
+
QAspectJobPtr Renderer::syncTextureLoadingJob()
{
return m_syncTextureLoadingJob;