summaryrefslogtreecommitdiffstats
path: root/src/render/backend/renderview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/backend/renderview.cpp')
-rw-r--r--src/render/backend/renderview.cpp114
1 files changed, 23 insertions, 91 deletions
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 606bfea88..36664515c 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -95,9 +95,6 @@ bool isEntityInLayers(const RenderEntity *entity, const QStringList &layers)
return false;
}
-const QString blockArray = QStringLiteral("[%1]");
-const int qNodeIdTypeId = qMetaTypeId<QNodeId>();
-
} // anonymouse namespace
RenderView::StandardUniformsPFuncsHash RenderView::ms_standardUniformSetters = RenderView::initializeStandardUniformSetters();
@@ -348,6 +345,12 @@ void RenderView::sort()
}
}
+void RenderView::setRenderer(Renderer *renderer)
+{
+ m_renderer = renderer;
+ m_data->m_uniformBlockBuilder.shaderDataManager = m_renderer->shaderDataManager();
+}
+
// Tries to order renderCommand by shader so as to minimize shader changes
void RenderView::buildRenderCommands(RenderEntity *node)
{
@@ -425,70 +428,6 @@ void RenderView::setUniformValue(QUniformPack &uniformPack, const QString &name,
}
}
-// Builds a QHash<QString, QString> -> QmlPropertyName / ActiveUniformName
-void RenderView::buildActiveUniformNameValueMap(const QHash<QString, ShaderUniform> &uniforms,
- const QString &blockName,
- const QString &qmlPropertyName,
- const QVariant &value,
- bool updatedPropertiesOnly)
-{
- // In the end, values are either scalar or a scalar array
- // Composed elements (structs, structs array) are simplified into simple scalars
- if (value.userType() == QMetaType::QVariantList) { // Array
- QVariantList list = value.value<QVariantList>();
- if (list.at(0).userType() == qNodeIdTypeId) { // Array of struct qmlPropertyName[i].structMember
- for (int i = 0; i < list.size(); ++i) {
- if (list.at(i).userType() == qNodeIdTypeId) {
- RenderShaderData *subShaderData = m_renderer->shaderDataManager()->lookupResource(list.at(i).value<QNodeId>());
- if (subShaderData)
- buildActiveUniformNameValueMapStructHelper(uniforms,
- subShaderData,
- blockName + QStringLiteral(".") + qmlPropertyName + blockArray.arg(i),
- QStringLiteral(""),
- updatedPropertiesOnly);
- }
- }
- } else { // Array of scalar/vec qmlPropertyName[0]
- QString varName = blockName + QStringLiteral(".") + qmlPropertyName + QStringLiteral("[0]");
- if (uniforms.contains(varName))
- m_activeUniformNamesToValue.insert(varName, value);
- }
- } else if (value.userType() == qNodeIdTypeId) { // Struct qmlPropertyName.structMember
- RenderShaderData *rSubShaderData = m_renderer->shaderDataManager()->lookupResource(value.value<QNodeId>());
- if (rSubShaderData)
- buildActiveUniformNameValueMapStructHelper(uniforms,
- rSubShaderData,
- blockName,
- qmlPropertyName,
- updatedPropertiesOnly);
- } else { // Scalar / Vec
- QString varName = blockName + QStringLiteral(".") + qmlPropertyName;
- if (uniforms.contains(varName))
- m_activeUniformNamesToValue.insert(varName, value);
- }
-}
-
-void RenderView::buildActiveUniformNameValueMapStructHelper(const QHash<QString, ShaderUniform> &uniforms,
- RenderShaderData *rShaderData,
- const QString &blockName,
- const QString &qmlPropertyName,
- bool updatedPropertiesOnly)
-{
- const QHash<QString, QVariant> &properties = updatedPropertiesOnly ? rShaderData->updatedProperties() : rShaderData->properties();
- QHash<QString, QVariant>::const_iterator it = properties.begin();
- const QHash<QString, QVariant>::const_iterator end = properties.end();
-
- while (it != end) {
- QString prefix = qmlPropertyName.isEmpty() ? QStringLiteral("") : QStringLiteral(".");
- buildActiveUniformNameValueMap(uniforms,
- blockName + prefix + qmlPropertyName,
- it.key(),
- it.value(),
- updatedPropertiesOnly);
- ++it;
- }
-}
-
void RenderView::setUniformBlockValue(QUniformPack &uniformPack, RenderShader *shader, const ShaderUniformBlock &block, const QVariant &value)
{
RenderShaderData *shaderData = Q_NULLPTR;
@@ -521,21 +460,17 @@ void RenderView::setUniformBlockValue(QUniformPack &uniformPack, RenderShader *s
// for all the updated properties (all the properties if the UBO was just created)
if (shaderData->needsUpdate(*m_data->m_viewMatrix) || uboNeedsUpdate) {
// Clear previous values remaining in the hash
- m_activeUniformNamesToValue.clear();
+ m_data->m_uniformBlockBuilder.activeUniformNamesToValue.clear();
+ // Update only update properties if uboNeedsUpdate is true, otherwise update the whole block
+ m_data->m_uniformBlockBuilder.updatedPropertiesOnly = uboNeedsUpdate;
// Retrieve names and description of each active uniforms in the uniform block
- const QHash<QString, ShaderUniform> &activeProperties = shader->activeUniformsForBlock(block.m_index);
-
- // We want a copy here in case another RenderViewJobs modifies the updatedProperties of the RenderShaderData
- const QHash<QString, QVariant> properties = uboNeedsUpdate ? shaderData->properties() : shaderData->updatedProperties();
- QHash<QString, QVariant>::const_iterator it = properties.begin();
- const QHash<QString, QVariant>::const_iterator end = properties.end();
-
- for (; it != end; ++it)
- buildActiveUniformNameValueMap(activeProperties, block.m_name, it.key(), it.value(), !uboNeedsUpdate);
-
+ m_data->m_uniformBlockBuilder.uniforms = shader->activeUniformsForBlock(block.m_index);
+ // Builds the name-value map for the block
+ m_data->m_uniformBlockBuilder.buildActiveUniformNameValueMapStructHelper(shaderData, block.m_name);
if (!uboNeedsUpdate)
shaderData->addToClearUpdateList();
- uniformBlockUBO.m_updatedProperties = m_activeUniformNamesToValue;
+ // copy the name-value map into the BlockToUBO
+ uniformBlockUBO.m_updatedProperties = m_data->m_uniformBlockBuilder.activeUniformNamesToValue;
uboNeedsUpdate = true;
}
@@ -546,22 +481,19 @@ void RenderView::setUniformBlockValue(QUniformPack &uniformPack, RenderShader *s
void RenderView::setDefaultUniformBlockShaderDataValue(QUniformPack &uniformPack, RenderShader *shader, RenderShaderData *shaderData, const QString &structName)
{
- m_activeUniformNamesToValue.clear();
+ m_data->m_uniformBlockBuilder.activeUniformNamesToValue.clear();
// updates transformed properties;
shaderData->needsUpdate(*m_data->m_viewMatrix);
+ // Force to update the whole block
+ m_data->m_uniformBlockBuilder.updatedPropertiesOnly = false;
// Retrieve names and description of each active uniforms in the uniform block
- const QHash<QString, ShaderUniform> &activeUniformsInDefaultBlock = shader->activeUniformsForBlock(-1);
-
- const QHash<QString, QVariant> &properties = shaderData->properties();
- QHash<QString, QVariant>::const_iterator pIt = properties.begin();
- const QHash<QString, QVariant>::const_iterator pEnd = properties.end();
-
- for (; pIt != pEnd; ++pIt)
- buildActiveUniformNameValueMap(activeUniformsInDefaultBlock, structName, pIt.key(), pIt.value(), false);
-
- QHash<QString, QVariant>::const_iterator activeValuesIt = m_activeUniformNamesToValue.begin();
- const QHash<QString, QVariant>::const_iterator activeValuesEnd = m_activeUniformNamesToValue.end();
+ m_data->m_uniformBlockBuilder.uniforms = shader->activeUniformsForBlock(-1);
+ // Build name-value map for the block
+ m_data->m_uniformBlockBuilder.buildActiveUniformNameValueMapStructHelper(shaderData, structName);
+ // Set uniform values for each entrie of the block name-value map
+ QHash<QString, QVariant>::const_iterator activeValuesIt = m_data->m_uniformBlockBuilder.activeUniformNamesToValue.begin();
+ const QHash<QString, QVariant>::const_iterator activeValuesEnd = m_data->m_uniformBlockBuilder.activeUniformNamesToValue.end();
while (activeValuesIt != activeValuesEnd) {
setUniformValue(uniformPack, activeValuesIt.key(), activeValuesIt.value());