+ const SceneGraph::UniformMapDataProvider& uniformMapDataProvider = mRenderDataProvider->GetUniformMapDataProvider();
+ const SceneGraph::CollectedUniformMap& uniformMap = uniformMapDataProvider.GetCollectedUniformMap();
+ const SceneGraph::UniformMap& uniformMapNode = node.GetNodeUniformMap();
+
+ bool updateMaps;
+
+ // Usual case is to only have 1 node, however we do allow multiple nodes to reuse the same
+ // renderer, so we have to cache uniform map per render item (node / renderer pair).
+
+ // Specially, if node don't have uniformMap, we mark nodePtr as nullptr.
+ // So, all nodes without uniformMap will share same UniformIndexMap, contains only render data providers.
+ const auto nodePtr = uniformMapNode.Count() ? &node : nullptr;
+
+ const auto nodeChangeCounter = nodePtr ? uniformMapNode.GetChangeCounter() : 0;
+ const auto renderItemMapChangeCounter = uniformMap.GetChangeCounter();
+
+ auto iter = std::find_if(mNodeIndexMap.begin(), mNodeIndexMap.end(), [nodePtr](RenderItemLookup& element) { return element.node == nodePtr; });
+
+ std::size_t renderItemMapIndex;
+ if(iter == mNodeIndexMap.end())
+ {
+ renderItemMapIndex = mUniformIndexMaps.size();
+ RenderItemLookup renderItemLookup;
+ renderItemLookup.node = nodePtr;
+ renderItemLookup.index = renderItemMapIndex;
+ renderItemLookup.nodeChangeCounter = nodeChangeCounter;
+ renderItemLookup.renderItemMapChangeCounter = renderItemMapChangeCounter;
+ mNodeIndexMap.emplace_back(renderItemLookup);
+
+ updateMaps = true;
+ mUniformIndexMaps.resize(mUniformIndexMaps.size() + 1);
+ }
+ else
+ {
+ renderItemMapIndex = iter->index;
+
+ updateMaps = (nodeChangeCounter != iter->nodeChangeCounter) ||
+ (renderItemMapChangeCounter != iter->renderItemMapChangeCounter) ||
+ (mUniformIndexMaps[renderItemMapIndex].size() == 0);
+
+ iter->nodeChangeCounter = nodeChangeCounter;
+ iter->renderItemMapChangeCounter = renderItemMapChangeCounter;
+ }