/*
- * 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.
#include <dali/internal/common/internal-constants.h>
#include <dali/internal/common/memory-pool-object-allocator.h>
#include <dali/internal/render/data-providers/node-data-provider.h>
+#include <dali/internal/render/data-providers/render-data-provider.h>
#include <dali/internal/render/queue/render-queue.h>
#include <dali/internal/render/renderers/render-geometry.h>
#include <dali/internal/render/shaders/program.h>
RESEND_STENCIL_OPERATION_ON_Z_PASS = 1 << 17,
RESEND_WRITE_TO_COLOR_BUFFER = 1 << 18,
RESEND_SHADER = 1 << 19,
- RESEND_DRAW_COMMANDS = 1 << 20
+ RESEND_DRAW_COMMANDS = 1 << 20,
+ RESEND_SET_RENDER_CALLBACK = 1 << 21
};
} // Anonymous namespace
mTextureSet(nullptr),
mGeometry(nullptr),
mShader(nullptr),
- mRenderDataProvider(nullptr),
mBlendColor(nullptr),
mStencilParameters(RenderMode::AUTO, StencilFunction::ALWAYS, 0xFF, 0x00, 0xFF, StencilOperation::KEEP, StencilOperation::KEEP, StencilOperation::KEEP),
mIndexedDrawFirstElement(0u),
{
if(mTextureSet)
{
- mTextureSet->RemoveObserver(this);
mTextureSet = nullptr;
}
if(mShader)
new(slot) DerivedType(mRenderer, &Render::Renderer::SetShaderChanged, true);
}
+ if(mResendFlag & RESEND_SET_RENDER_CALLBACK)
+ {
+ using DerivedType = MessageValue1<Render::Renderer, Dali::RenderCallback*>;
+ uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
+ new(slot) DerivedType(mRenderer, &Render::Renderer::SetRenderCallback, mRenderCallback);
+ }
+
mResendFlag = 0;
}
{
DALI_ASSERT_DEBUG(textureSet != NULL && "Texture set pointer is NULL");
- if(mTextureSet)
- {
- mTextureSet->RemoveObserver(this);
- }
-
- mTextureSet = textureSet;
- mTextureSet->AddObserver(this);
+ mTextureSet = textureSet;
mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
+}
- UpdateTextureSet();
+const Vector<Render::Texture*>* Renderer::GetTextures() const
+{
+ return mTextureSet ? &(mTextureSet->GetTextures()) : nullptr;
+}
+
+const Vector<Render::Sampler*>* Renderer::GetSamplers() const
+{
+ return mTextureSet ? &(mTextureSet->GetSamplers()) : nullptr;
}
void Renderer::SetShader(Shader* shader)
mShader->AddConnectionObserver(*this);
mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
mResendFlag |= RESEND_GEOMETRY | RESEND_SHADER;
-
- if(mRenderDataProvider)
- {
- mRenderDataProvider->mShader = mShader;
- }
}
void Renderer::SetGeometry(Render::Geometry* geometry)
mResendFlag |= RESEND_STENCIL_OPERATION_ON_Z_PASS;
}
+void Renderer::SetRenderCallback(RenderCallback* callback)
+{
+ mRenderCallback = callback;
+ mResendFlag |= RESEND_SET_RENDER_CALLBACK;
+}
+
const Render::Renderer::StencilParameters& Renderer::GetStencilParameters() const
{
return mStencilParameters;
mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
mSceneController = &sceneController;
- mRenderDataProvider = new RenderDataProvider(mOpacity);
- mRenderDataProvider->mUniformMapDataProvider = this;
-
- mRenderer = Render::Renderer::New(mRenderDataProvider, mGeometry, mBlendBitmask, GetBlendColor(), static_cast<FaceCullingMode::Type>(mFaceCullingMode), mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters);
+ mRenderer = Render::Renderer::New(this, mGeometry, mBlendBitmask, GetBlendColor(), static_cast<FaceCullingMode::Type>(mFaceCullingMode), mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters);
OwnerPointer<Render::Renderer> transferOwnership(mRenderer);
mSceneController->GetRenderMessageDispatcher().AddRenderer(transferOwnership);
mSceneController->GetRenderMessageDispatcher().RemoveRenderer(*mRenderer);
mRenderer = nullptr;
}
- mSceneController = nullptr;
- mRenderDataProvider = nullptr;
-}
-
-void Renderer::UpdateTextureSet()
-{
- if(mRenderDataProvider)
- {
- if(mTextureSet)
- {
- uint32_t textureCount = mTextureSet->GetTextureCount();
- mRenderDataProvider->mTextures.resize(textureCount);
- mRenderDataProvider->mSamplers.resize(textureCount);
- for(uint32_t i = 0; i < textureCount; ++i)
- {
- mRenderDataProvider->mTextures[i] = mTextureSet->GetTexture(i);
- mRenderDataProvider->mSamplers[i] = mTextureSet->GetTextureSampler(i);
- }
- }
- else
- {
- mRenderDataProvider->mTextures.clear();
- mRenderDataProvider->mSamplers.clear();
- }
- }
+ mSceneController = nullptr;
}
Render::Renderer& Renderer::GetRenderer()
switch(mBlendMode)
{
+ case BlendMode::ON_WITHOUT_CULL: // If the renderer should always be use blending and never want to be transparent by alpha.
+ {
+ opacityType = Renderer::TRANSLUCENT;
+ break;
+ }
case BlendMode::ON: // If the renderer should always be use blending
{
float alpha = node.GetWorldColor(updateBufferIndex).a * mOpacity[updateBufferIndex];
return opacityType;
}
-void Renderer::TextureSetChanged()
-{
- mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
-
- UpdateTextureSet();
-}
-
-void Renderer::TextureSetDeleted()
-{
- mTextureSet = nullptr;
-
- mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
-
- UpdateTextureSet();
-}
-
void Renderer::ConnectionsChanged(PropertyOwner& object)
{
// One of our child objects has changed it's connections. Ensure the uniform