/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Matrix nodeModelViewMatrix(false);
bool nodeModelViewMatrixSet(false);
- if(cull && renderable.mRenderer && !renderable.mRenderer->GetShader().HintEnabled(Dali::Shader::Hint::MODIFIES_GEOMETRY) && node->GetClippingMode() == ClippingMode::DISABLED)
+ // Don't cull items which have render callback
+ bool hasRenderCallback = (renderable.mRenderer && renderable.mRenderer->GetRenderCallback());
+
+ if(cull && renderable.mRenderer && (hasRenderCallback || (!renderable.mRenderer->GetShader().HintEnabled(Dali::Shader::Hint::MODIFIES_GEOMETRY) && node->GetClippingMode() == ClippingMode::DISABLED)))
{
const Vector4& boundingSphere = node->GetBoundingSphere();
inside = (boundingSphere.w > Math::MACHINE_EPSILON_1000) &&
if(inside)
{
- Renderer::OpacityType opacityType = renderable.mRenderer ? renderable.mRenderer->GetOpacityType(updateBufferIndex, *node) : Renderer::OPAQUE;
+ bool skipRender(false);
+ bool isOpaque = true;
+ if(!hasRenderCallback)
+ {
+ Renderer::OpacityType opacityType = renderable.mRenderer ? renderable.mRenderer->GetOpacityType(updateBufferIndex, *node) : Renderer::OPAQUE;
+
+ // We can skip render when node is not clipping and transparent
+ skipRender = (opacityType == Renderer::TRANSPARENT && node->GetClippingMode() == ClippingMode::DISABLED);
+
+ isOpaque = (opacityType == Renderer::OPAQUE);
+ }
- // We can skip render when node is not clipping and transparent
- const bool skipRender(opacityType == Renderer::TRANSPARENT && node->GetClippingMode() == ClippingMode::DISABLED);
if(!skipRender)
{
// Get the next free RenderItem.
auto& partialRenderingCacheInfo = node->GetPartialRenderingData().GetCurrentCacheInfo();
partialRenderingCacheInfo.node = node;
- partialRenderingCacheInfo.isOpaque = (opacityType == Renderer::OPAQUE);
+ partialRenderingCacheInfo.isOpaque = isOpaque;
partialRenderingCacheInfo.renderer = renderable.mRenderer;
- partialRenderingCacheInfo.color = node->GetColor(updateBufferIndex);
+ partialRenderingCacheInfo.color = node->GetWorldColor(updateBufferIndex);
partialRenderingCacheInfo.depthIndex = node->GetDepthIndex();
- if(renderable.mRenderer)
+ if(DALI_LIKELY(renderable.mRenderer))
{
partialRenderingCacheInfo.textureSet = renderable.mRenderer->GetTextureSet();
}
item.mNode = node;
- item.mIsOpaque = (opacityType == Renderer::OPAQUE);
+ item.mIsOpaque = isOpaque;
item.mColor = node->GetColor(updateBufferIndex);
item.mDepthIndex = 0;
partialRenderingCacheInfo.updatedSize = item.mUpdateSize;
item.mIsUpdated = partialRenderingData.IsUpdated() || item.mIsUpdated;
+
+ partialRenderingData.mRendered = true;
+
partialRenderingData.SwapBuffers();
}
+ else
+ {
+ // Mark as not rendered
+ auto& partialRenderingData = node->GetPartialRenderingData();
+ partialRenderingData.mRendered = false;
+ }
+
node->SetCulled(updateBufferIndex, false);
}
else
{
+ // Mark as not rendered
+ auto& partialRenderingData = node->GetPartialRenderingData();
+ partialRenderingData.mRendered = false;
+
node->SetCulled(updateBufferIndex, true);
}
}
size_t checkSumOld = 0;
for(uint32_t index = 0; index < renderableCount; ++index)
{
- const Render::Renderer& renderer = renderables[index].mRenderer->GetRenderer();
- checkSumNew += reinterpret_cast<std::size_t>(&renderer);
- checkSumOld += reinterpret_cast<std::size_t>(&renderList.GetRenderer(index));
+ if(DALI_LIKELY(renderables[index].mRenderer))
+ {
+ const Render::Renderer& renderer = renderables[index].mRenderer->GetRenderer();
+ checkSumNew += reinterpret_cast<std::size_t>(&renderer);
+ }
+ if(DALI_LIKELY(renderList.GetItem(index).mRenderer))
+ {
+ checkSumOld += reinterpret_cast<std::size_t>(&renderList.GetRenderer(index));
+ }
}
if(checkSumNew == checkSumOld)
{
{
RenderItem& item = renderList.GetItem(index);
- if(item.mRenderer)
+ if(DALI_LIKELY(item.mRenderer))
{
item.mRenderer->SetSortAttributes(mSortingHelper[index]);
}
{
RenderItem& item = renderList.GetItem(index);
- item.mRenderer->SetSortAttributes(mSortingHelper[index]);
+ if(DALI_LIKELY(item.mRenderer))
+ {
+ item.mRenderer->SetSortAttributes(mSortingHelper[index]);
+ }
// texture set
mSortingHelper[index].textureSet = item.mTextureSet;