+ 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).
+
+ const void* nodePtr = static_cast<const void*>(&node);
+ auto iter = std::find_if(mNodeIndexMap.begin(), mNodeIndexMap.end(), [nodePtr](RenderItemLookup& element) { return element.node == nodePtr; });
+
+ int renderItemMapIndex;
+ if(iter == mNodeIndexMap.end())
+ {
+ renderItemMapIndex = mUniformIndexMaps.size();
+ RenderItemLookup renderItemLookup;
+ renderItemLookup.node = &node;
+ renderItemLookup.index = renderItemMapIndex;
+ renderItemLookup.nodeChangeCounter = uniformMapNode.GetChangeCounter();
+ renderItemLookup.renderItemMapChangeCounter = uniformMap.GetChangeCounter();
+ mNodeIndexMap.emplace_back(renderItemLookup);
+
+ updateMaps = true;
+ mUniformIndexMaps.resize(mUniformIndexMaps.size() + 1);
+ }
+ else
+ {
+ renderItemMapIndex = iter->index;
+
+ updateMaps = (uniformMapNode.GetChangeCounter() != iter->nodeChangeCounter) ||
+ (uniformMap.GetChangeCounter() != iter->renderItemMapChangeCounter) ||
+ (mUniformIndexMaps[renderItemMapIndex].size() == 0);
+
+ iter->nodeChangeCounter = uniformMapNode.GetChangeCounter();
+ iter->renderItemMapChangeCounter = uniformMap.GetChangeCounter();
+ }
+
+ if(updateMaps || mShaderChanged)