2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "scene-graph-renderer.h"
21 #include <dali/internal/common/blending-options.h>
22 #include <dali/internal/common/internal-constants.h>
23 #include <dali/internal/common/memory-pool-object-allocator.h>
24 #include <dali/internal/render/data-providers/node-data-provider.h>
25 #include <dali/internal/render/data-providers/render-data-provider.h>
26 #include <dali/internal/render/queue/render-queue.h>
27 #include <dali/internal/render/renderers/render-geometry.h>
28 #include <dali/internal/render/shaders/program.h>
29 #include <dali/internal/render/shaders/render-shader.h>
30 #include <dali/internal/update/controllers/render-message-dispatcher.h>
31 #include <dali/internal/update/controllers/scene-controller.h>
32 #include <dali/internal/update/nodes/node.h>
33 #include <dali/internal/update/rendering/scene-graph-texture-set.h>
41 namespace // unnamed namespace
43 const uint32_t UNIFORM_MAP_READY = 0;
44 const uint32_t COPY_UNIFORM_MAP = 1;
45 const uint32_t REGENERATE_UNIFORM_MAP = 2;
47 //Memory pool used to allocate new renderers. Memory used by this pool will be released when shutting down DALi
48 MemoryPoolObjectAllocator<Renderer> gRendererMemoryPool;
50 void AddMappings(CollectedUniformMap& localMap, const UniformMap& uniformMap)
52 // Iterate thru uniformMap.
53 // Any maps that aren't in localMap should be added in a single step
55 // keep a static vector to avoid temporary heap allocation.
56 // As this function gets called only from update thread we don't have to
57 // make it thread safe (so no need to keep a thread_local variable).
58 static CollectedUniformMap newUniformMappings;
60 newUniformMappings.Clear();
62 for(UniformMap::SizeType i = 0, count = uniformMap.Count(); i < count; ++i)
66 for(CollectedUniformMap::Iterator iter = localMap.Begin(); iter != localMap.End(); ++iter)
68 const UniformPropertyMapping& map = (*iter);
69 if(map.uniformName == uniformMap[i].uniformName)
77 newUniformMappings.PushBack(uniformMap[i]);
81 if(newUniformMappings.Count() > 0)
83 localMap.Reserve(localMap.Count() + newUniformMappings.Count());
85 for(CollectedUniformMap::Iterator iter = newUniformMappings.Begin(),
86 end = newUniformMappings.End();
90 const UniformPropertyMapping& map = (*iter);
91 localMap.PushBack(map);
96 // Flags for re-sending data to renderer.
99 RESEND_GEOMETRY = 1 << 0,
100 RESEND_FACE_CULLING_MODE = 1 << 1,
101 RESEND_BLEND_COLOR = 1 << 2,
102 RESEND_BLEND_BIT_MASK = 1 << 3,
103 RESEND_PREMULTIPLIED_ALPHA = 1 << 4,
104 RESEND_INDEXED_DRAW_FIRST_ELEMENT = 1 << 5,
105 RESEND_INDEXED_DRAW_ELEMENTS_COUNT = 1 << 6,
106 RESEND_DEPTH_WRITE_MODE = 1 << 7,
107 RESEND_DEPTH_TEST_MODE = 1 << 8,
108 RESEND_DEPTH_FUNCTION = 1 << 9,
109 RESEND_RENDER_MODE = 1 << 10,
110 RESEND_STENCIL_FUNCTION = 1 << 11,
111 RESEND_STENCIL_FUNCTION_MASK = 1 << 12,
112 RESEND_STENCIL_FUNCTION_REFERENCE = 1 << 13,
113 RESEND_STENCIL_MASK = 1 << 14,
114 RESEND_STENCIL_OPERATION_ON_FAIL = 1 << 15,
115 RESEND_STENCIL_OPERATION_ON_Z_FAIL = 1 << 16,
116 RESEND_STENCIL_OPERATION_ON_Z_PASS = 1 << 17,
117 RESEND_WRITE_TO_COLOR_BUFFER = 1 << 18,
118 RESEND_SHADER = 1 << 19,
119 RESEND_DRAW_COMMANDS = 1 << 20
122 } // Anonymous namespace
124 Renderer* Renderer::New()
126 return new(gRendererMemoryPool.AllocateRawThreadSafe()) Renderer();
130 : mSceneController(nullptr),
132 mTextureSet(nullptr),
135 mBlendColor(nullptr),
136 mStencilParameters(RenderMode::AUTO, StencilFunction::ALWAYS, 0xFF, 0x00, 0xFF, StencilOperation::KEEP, StencilOperation::KEEP, StencilOperation::KEEP),
137 mIndexedDrawFirstElement(0u),
138 mIndexedDrawElementsCount(0u),
140 mRegenerateUniformMap(0u),
142 mDepthFunction(DepthFunction::LESS),
143 mFaceCullingMode(FaceCullingMode::NONE),
144 mBlendMode(BlendMode::AUTO),
145 mDepthWriteMode(DepthWriteMode::AUTO),
146 mDepthTestMode(DepthTestMode::AUTO),
147 mRenderingBehavior(DevelRenderer::Rendering::IF_REQUIRED),
148 mPremultipledAlphaEnabled(false),
152 mUniformMapChanged[0] = false;
153 mUniformMapChanged[1] = false;
155 // Observe our own PropertyOwner's uniform map
156 AddUniformMapObserver(*this);
159 Renderer::~Renderer()
163 mTextureSet = nullptr;
167 mShader->RemoveConnectionObserver(*this);
172 void Renderer::operator delete(void* ptr)
174 gRendererMemoryPool.FreeThreadSafe(static_cast<Renderer*>(ptr));
177 bool Renderer::PrepareRender(BufferIndex updateBufferIndex)
179 if(mRegenerateUniformMap == UNIFORM_MAP_READY)
181 mUniformMapChanged[updateBufferIndex] = false;
185 if(mRegenerateUniformMap == REGENERATE_UNIFORM_MAP)
187 CollectedUniformMap& localMap = mCollectedUniformMap[updateBufferIndex];
190 const UniformMap& rendererUniformMap = PropertyOwner::GetUniformMap();
192 auto size = rendererUniformMap.Count();
195 size += mShader->GetUniformMap().Count();
198 localMap.Reserve(size);
200 AddMappings(localMap, rendererUniformMap);
204 AddMappings(localMap, mShader->GetUniformMap());
207 else if(mRegenerateUniformMap == COPY_UNIFORM_MAP)
209 // Copy old map into current map
210 CollectedUniformMap& localMap = mCollectedUniformMap[updateBufferIndex];
211 CollectedUniformMap& oldMap = mCollectedUniformMap[1 - updateBufferIndex];
213 localMap.Resize(oldMap.Count());
216 for(CollectedUniformMap::Iterator iter = oldMap.Begin(), end = oldMap.End(); iter != end; ++iter, ++index)
218 localMap[index] = *iter;
222 mUniformMapChanged[updateBufferIndex] = true;
223 mRegenerateUniformMap--;
226 bool rendererUpdated = mUniformMapChanged[updateBufferIndex] || mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY;
230 if(mResendFlag & RESEND_GEOMETRY)
232 typedef MessageValue1<Render::Renderer, Render::Geometry*> DerivedType;
233 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
234 new(slot) DerivedType(mRenderer, &Render::Renderer::SetGeometry, mGeometry);
237 if(mResendFlag & RESEND_DRAW_COMMANDS)
239 using DerivedType = MessageValue2<Render::Renderer, Dali::DevelRenderer::DrawCommand*, uint32_t>;
240 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
241 new(slot) DerivedType(mRenderer, &Render::Renderer::SetDrawCommands, mDrawCommands.data(), mDrawCommands.size());
244 if(mResendFlag & RESEND_FACE_CULLING_MODE)
246 using DerivedType = MessageValue1<Render::Renderer, FaceCullingMode::Type>;
247 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
248 new(slot) DerivedType(mRenderer, &Render::Renderer::SetFaceCullingMode, mFaceCullingMode);
251 if(mResendFlag & RESEND_BLEND_BIT_MASK)
253 using DerivedType = MessageValue1<Render::Renderer, uint32_t>;
254 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
255 new(slot) DerivedType(mRenderer, &Render::Renderer::SetBlendingBitMask, mBlendBitmask);
258 if(mResendFlag & RESEND_BLEND_COLOR)
260 using DerivedType = MessageValue1<Render::Renderer, Vector4>;
261 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
262 new(slot) DerivedType(mRenderer, &Render::Renderer::SetBlendColor, GetBlendColor());
265 if(mResendFlag & RESEND_PREMULTIPLIED_ALPHA)
267 using DerivedType = MessageValue1<Render::Renderer, bool>;
268 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
269 new(slot) DerivedType(mRenderer, &Render::Renderer::EnablePreMultipliedAlpha, mPremultipledAlphaEnabled);
272 if(mResendFlag & RESEND_INDEXED_DRAW_FIRST_ELEMENT)
274 using DerivedType = MessageValue1<Render::Renderer, uint32_t>;
275 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
276 new(slot) DerivedType(mRenderer, &Render::Renderer::SetIndexedDrawFirstElement, mIndexedDrawFirstElement);
279 if(mResendFlag & RESEND_INDEXED_DRAW_ELEMENTS_COUNT)
281 using DerivedType = MessageValue1<Render::Renderer, uint32_t>;
282 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
283 new(slot) DerivedType(mRenderer, &Render::Renderer::SetIndexedDrawElementsCount, mIndexedDrawElementsCount);
286 if(mResendFlag & RESEND_DEPTH_WRITE_MODE)
288 using DerivedType = MessageValue1<Render::Renderer, DepthWriteMode::Type>;
289 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
290 new(slot) DerivedType(mRenderer, &Render::Renderer::SetDepthWriteMode, mDepthWriteMode);
293 if(mResendFlag & RESEND_DEPTH_TEST_MODE)
295 using DerivedType = MessageValue1<Render::Renderer, DepthTestMode::Type>;
296 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
297 new(slot) DerivedType(mRenderer, &Render::Renderer::SetDepthTestMode, mDepthTestMode);
300 if(mResendFlag & RESEND_DEPTH_FUNCTION)
302 using DerivedType = MessageValue1<Render::Renderer, DepthFunction::Type>;
303 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
304 new(slot) DerivedType(mRenderer, &Render::Renderer::SetDepthFunction, mDepthFunction);
307 if(mResendFlag & RESEND_RENDER_MODE)
309 using DerivedType = MessageValue1<Render::Renderer, RenderMode::Type>;
310 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
311 new(slot) DerivedType(mRenderer, &Render::Renderer::SetRenderMode, mStencilParameters.renderMode);
314 if(mResendFlag & RESEND_STENCIL_FUNCTION)
316 using DerivedType = MessageValue1<Render::Renderer, StencilFunction::Type>;
317 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
318 new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilFunction, mStencilParameters.stencilFunction);
321 if(mResendFlag & RESEND_STENCIL_FUNCTION_MASK)
323 using DerivedType = MessageValue1<Render::Renderer, int>;
324 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
325 new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilFunctionMask, mStencilParameters.stencilFunctionMask);
328 if(mResendFlag & RESEND_STENCIL_FUNCTION_REFERENCE)
330 using DerivedType = MessageValue1<Render::Renderer, int>;
331 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
332 new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilFunctionReference, mStencilParameters.stencilFunctionReference);
335 if(mResendFlag & RESEND_STENCIL_MASK)
337 using DerivedType = MessageValue1<Render::Renderer, int>;
338 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
339 new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilMask, mStencilParameters.stencilMask);
342 if(mResendFlag & RESEND_STENCIL_OPERATION_ON_FAIL)
344 using DerivedType = MessageValue1<Render::Renderer, StencilOperation::Type>;
345 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
346 new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilOperationOnFail, mStencilParameters.stencilOperationOnFail);
349 if(mResendFlag & RESEND_STENCIL_OPERATION_ON_Z_FAIL)
351 using DerivedType = MessageValue1<Render::Renderer, StencilOperation::Type>;
352 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
353 new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilOperationOnZFail, mStencilParameters.stencilOperationOnZFail);
356 if(mResendFlag & RESEND_STENCIL_OPERATION_ON_Z_PASS)
358 using DerivedType = MessageValue1<Render::Renderer, StencilOperation::Type>;
359 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
360 new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilOperationOnZPass, mStencilParameters.stencilOperationOnZPass);
363 if(mResendFlag & RESEND_SHADER)
365 using DerivedType = MessageValue1<Render::Renderer, bool>;
366 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
367 new(slot) DerivedType(mRenderer, &Render::Renderer::SetShaderChanged, true);
373 return rendererUpdated;
376 void Renderer::SetTextures(TextureSet* textureSet)
378 DALI_ASSERT_DEBUG(textureSet != NULL && "Texture set pointer is NULL");
380 mTextureSet = textureSet;
381 mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
384 const Vector<Render::Texture*>* Renderer::GetTextures() const
386 return mTextureSet ? &(mTextureSet->GetTextures()) : nullptr;
389 const Vector<Render::Sampler*>* Renderer::GetSamplers() const
391 return mTextureSet ? &(mTextureSet->GetSamplers()) : nullptr;
394 void Renderer::SetShader(Shader* shader)
396 DALI_ASSERT_DEBUG(shader != NULL && "Shader pointer is NULL");
400 mShader->RemoveConnectionObserver(*this);
404 mShader->AddConnectionObserver(*this);
405 mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
406 mResendFlag |= RESEND_GEOMETRY | RESEND_SHADER;
409 void Renderer::SetGeometry(Render::Geometry* geometry)
411 DALI_ASSERT_DEBUG(geometry != NULL && "Geometry pointer is NULL");
412 mGeometry = geometry;
416 mResendFlag |= RESEND_GEOMETRY;
420 void Renderer::SetDepthIndex(int depthIndex)
422 mDepthIndex = depthIndex;
425 void Renderer::SetFaceCullingMode(FaceCullingMode::Type faceCullingMode)
427 mFaceCullingMode = faceCullingMode;
428 mResendFlag |= RESEND_FACE_CULLING_MODE;
431 FaceCullingMode::Type Renderer::GetFaceCullingMode() const
433 return mFaceCullingMode;
436 void Renderer::SetBlendMode(BlendMode::Type blendingMode)
438 mBlendMode = blendingMode;
441 BlendMode::Type Renderer::GetBlendMode() const
446 void Renderer::SetBlendingOptions(uint32_t options)
448 if(mBlendBitmask != options)
450 mBlendBitmask = options;
451 mResendFlag |= RESEND_BLEND_BIT_MASK;
455 uint32_t Renderer::GetBlendingOptions() const
457 return mBlendBitmask;
460 void Renderer::SetBlendColor(const Vector4& blendColor)
462 if(blendColor == Color::TRANSPARENT)
464 mBlendColor = nullptr;
470 mBlendColor = new Vector4(blendColor);
474 *mBlendColor = blendColor;
478 mResendFlag |= RESEND_BLEND_COLOR;
481 Vector4 Renderer::GetBlendColor() const
487 return Color::TRANSPARENT;
490 void Renderer::SetIndexedDrawFirstElement(uint32_t firstElement)
492 mIndexedDrawFirstElement = firstElement;
493 mResendFlag |= RESEND_INDEXED_DRAW_FIRST_ELEMENT;
496 uint32_t Renderer::GetIndexedDrawFirstElement() const
498 return mIndexedDrawFirstElement;
501 void Renderer::SetIndexedDrawElementsCount(uint32_t elementsCount)
503 mIndexedDrawElementsCount = elementsCount;
504 mResendFlag |= RESEND_INDEXED_DRAW_ELEMENTS_COUNT;
507 uint32_t Renderer::GetIndexedDrawElementsCount() const
509 return mIndexedDrawElementsCount;
512 void Renderer::EnablePreMultipliedAlpha(bool preMultipled)
514 mPremultipledAlphaEnabled = preMultipled;
515 mResendFlag |= RESEND_PREMULTIPLIED_ALPHA;
518 bool Renderer::IsPreMultipliedAlphaEnabled() const
520 return mPremultipledAlphaEnabled;
523 void Renderer::SetDepthWriteMode(DepthWriteMode::Type depthWriteMode)
525 mDepthWriteMode = depthWriteMode;
526 mResendFlag |= RESEND_DEPTH_WRITE_MODE;
529 DepthWriteMode::Type Renderer::GetDepthWriteMode() const
531 return mDepthWriteMode;
534 void Renderer::SetDepthTestMode(DepthTestMode::Type depthTestMode)
536 mDepthTestMode = depthTestMode;
537 mResendFlag |= RESEND_DEPTH_TEST_MODE;
540 DepthTestMode::Type Renderer::GetDepthTestMode() const
542 return mDepthTestMode;
545 void Renderer::SetDepthFunction(DepthFunction::Type depthFunction)
547 mDepthFunction = depthFunction;
548 mResendFlag |= RESEND_DEPTH_FUNCTION;
551 DepthFunction::Type Renderer::GetDepthFunction() const
553 return mDepthFunction;
556 void Renderer::SetRenderMode(RenderMode::Type mode)
558 mStencilParameters.renderMode = mode;
559 mResendFlag |= RESEND_RENDER_MODE;
562 void Renderer::SetStencilFunction(StencilFunction::Type stencilFunction)
564 mStencilParameters.stencilFunction = stencilFunction;
565 mResendFlag |= RESEND_STENCIL_FUNCTION;
568 void Renderer::SetStencilFunctionMask(int stencilFunctionMask)
570 mStencilParameters.stencilFunctionMask = stencilFunctionMask;
571 mResendFlag |= RESEND_STENCIL_FUNCTION_MASK;
574 void Renderer::SetStencilFunctionReference(int stencilFunctionReference)
576 mStencilParameters.stencilFunctionReference = stencilFunctionReference;
577 mResendFlag |= RESEND_STENCIL_FUNCTION_REFERENCE;
580 void Renderer::SetStencilMask(int stencilMask)
582 mStencilParameters.stencilMask = stencilMask;
583 mResendFlag |= RESEND_STENCIL_MASK;
586 void Renderer::SetStencilOperationOnFail(StencilOperation::Type stencilOperationOnFail)
588 mStencilParameters.stencilOperationOnFail = stencilOperationOnFail;
589 mResendFlag |= RESEND_STENCIL_OPERATION_ON_FAIL;
592 void Renderer::SetStencilOperationOnZFail(StencilOperation::Type stencilOperationOnZFail)
594 mStencilParameters.stencilOperationOnZFail = stencilOperationOnZFail;
595 mResendFlag |= RESEND_STENCIL_OPERATION_ON_Z_FAIL;
598 void Renderer::SetStencilOperationOnZPass(StencilOperation::Type stencilOperationOnZPass)
600 mStencilParameters.stencilOperationOnZPass = stencilOperationOnZPass;
601 mResendFlag |= RESEND_STENCIL_OPERATION_ON_Z_PASS;
604 const Render::Renderer::StencilParameters& Renderer::GetStencilParameters() const
606 return mStencilParameters;
609 void Renderer::BakeOpacity(BufferIndex updateBufferIndex, float opacity)
611 mOpacity.Bake(updateBufferIndex, opacity);
614 float Renderer::GetOpacity(BufferIndex updateBufferIndex) const
616 return mOpacity[updateBufferIndex];
619 void Renderer::SetRenderingBehavior(DevelRenderer::Rendering::Type renderingBehavior)
621 mRenderingBehavior = renderingBehavior;
624 DevelRenderer::Rendering::Type Renderer::GetRenderingBehavior() const
626 return mRenderingBehavior;
629 //Called when SceneGraph::Renderer is added to update manager ( that happens when an "event-thread renderer" is created )
630 void Renderer::ConnectToSceneGraph(SceneController& sceneController, BufferIndex bufferIndex)
632 mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
633 mSceneController = &sceneController;
635 mRenderer = Render::Renderer::New(this, mGeometry, mBlendBitmask, GetBlendColor(), static_cast<FaceCullingMode::Type>(mFaceCullingMode), mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters);
637 OwnerPointer<Render::Renderer> transferOwnership(mRenderer);
638 mSceneController->GetRenderMessageDispatcher().AddRenderer(transferOwnership);
641 //Called just before destroying the scene-graph renderer ( when the "event-thread renderer" is no longer referenced )
642 void Renderer::DisconnectFromSceneGraph(SceneController& sceneController, BufferIndex bufferIndex)
644 //Remove renderer from RenderManager
647 mSceneController->GetRenderMessageDispatcher().RemoveRenderer(*mRenderer);
650 mSceneController = nullptr;
653 Render::Renderer& Renderer::GetRenderer()
658 const CollectedUniformMap& Renderer::GetUniformMap(BufferIndex bufferIndex) const
660 return mCollectedUniformMap[bufferIndex];
663 Renderer::OpacityType Renderer::GetOpacityType(BufferIndex updateBufferIndex, const Node& node) const
665 Renderer::OpacityType opacityType = Renderer::OPAQUE;
667 if(node.IsTransparent())
669 return Renderer::TRANSPARENT;
674 case BlendMode::ON_WITHOUT_CULL: // If the renderer should always be use blending and never want to be transparent by alpha.
676 opacityType = Renderer::TRANSLUCENT;
679 case BlendMode::ON: // If the renderer should always be use blending
681 float alpha = node.GetWorldColor(updateBufferIndex).a * mOpacity[updateBufferIndex];
682 if(alpha <= FULLY_TRANSPARENT)
684 opacityType = Renderer::TRANSPARENT;
688 opacityType = Renderer::TRANSLUCENT;
692 case BlendMode::AUTO:
694 if(BlendingOptions::IsAdvancedBlendEquationIncluded(mBlendBitmask))
696 opacityType = Renderer::TRANSLUCENT;
700 bool shaderRequiresBlending(mShader->HintEnabled(Dali::Shader::Hint::OUTPUT_IS_TRANSPARENT));
701 if(shaderRequiresBlending || (mTextureSet && mTextureSet->HasAlpha()))
703 opacityType = Renderer::TRANSLUCENT;
706 // renderer should determine opacity using the actor color
707 float alpha = node.GetWorldColor(updateBufferIndex).a * mOpacity[updateBufferIndex];
708 if(alpha <= FULLY_TRANSPARENT)
710 opacityType = Renderer::TRANSPARENT;
712 else if(alpha <= FULLY_OPAQUE)
714 opacityType = Renderer::TRANSLUCENT;
719 case BlendMode::OFF: // the renderer should never use blending
722 opacityType = Renderer::OPAQUE;
730 void Renderer::ConnectionsChanged(PropertyOwner& object)
732 // One of our child objects has changed it's connections. Ensure the uniform
733 // map gets regenerated during PrepareRender
734 mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
737 void Renderer::ConnectedUniformMapChanged()
739 mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
742 void Renderer::UniformMappingsChanged(const UniformMap& mappings)
744 // The mappings are either from PropertyOwner base class, or the Actor
745 mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
748 void Renderer::ObservedObjectDestroyed(PropertyOwner& owner)
750 if(reinterpret_cast<PropertyOwner*>(mShader) == &owner)
756 void Renderer::SetDrawCommands(Dali::DevelRenderer::DrawCommand* pDrawCommands, uint32_t size)
758 mDrawCommands.clear();
759 mDrawCommands.insert(mDrawCommands.end(), pDrawCommands, pDrawCommands + size);
760 mResendFlag |= RESEND_DRAW_COMMANDS;
763 } // namespace SceneGraph
764 } // namespace Internal