{
Renderer renderer = mHorizontalBlurActor.GetRendererAt(0u);
renderer.SetShader(blurShader);
- renderer.RegisterUniqueProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(1.0f / downsampledWidth, 0.0f));
+ renderer.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(1.0f / downsampledWidth, 0.0f));
}
{
Renderer renderer = mVerticalBlurActor.GetRendererAt(0u);
renderer.SetShader(blurShader);
- renderer.RegisterUniqueProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(0.0f, 1.0f / downsampledHeight));
+ renderer.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(0.0f, 1.0f / downsampledHeight));
}
// Inject blurred output to control
return;
}
- mInputBackgroundFrameBuffer.Reset();
- mTemporaryFrameBuffer.Reset();
- mBlurredOutputFrameBuffer.Reset();
+ DestroyFrameBuffers();
Vector2 size = GetTargetSize();
uint32_t downsampledWidth = std::max(static_cast<uint32_t>(size.width * mDownscaleFactor), 1u);
mHorizontalBlurActor.SetProperty(Actor::Property::SIZE, Vector2(downsampledWidth, downsampledHeight));
mVerticalBlurActor.SetProperty(Actor::Property::SIZE, Vector2(downsampledWidth, downsampledHeight));
+ // Reset buffers and renderers
CreateFrameBuffers(ImageDimensions(downsampledWidth, downsampledHeight));
- SetRendererTexture(GetTargetRenderer(), mBlurredOutputFrameBuffer);
-
- // Reset shader constants
- mHorizontalBlurActor.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(1.0f, 0.0f) / downsampledWidth);
- mVerticalBlurActor.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(0.0f, 1.0f) / downsampledHeight);
mSourceRenderTask.SetFrameBuffer(mInputBackgroundFrameBuffer);
mHorizontalBlurTask.SetFrameBuffer(mTemporaryFrameBuffer);
mVerticalBlurTask.SetFrameBuffer(mBlurredOutputFrameBuffer);
+
+ {
+ Renderer renderer = mHorizontalBlurActor.GetRendererAt(0);
+ SetRendererTexture(renderer, mInputBackgroundFrameBuffer);
+ renderer.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(1.0f / downsampledWidth, 0.0f));
+ }
+ {
+ Renderer renderer = mVerticalBlurActor.GetRendererAt(0);
+ SetRendererTexture(renderer, mTemporaryFrameBuffer);
+ renderer.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(0.0f, 1.0f / downsampledHeight));
+ }
+
+ SetRendererTexture(GetTargetRenderer(), mBlurredOutputFrameBuffer);
}
void BackgroundBlurEffectImpl::CreateFrameBuffers(const ImageDimensions downsampledSize)
{
Renderer renderer = mHorizontalBlurActor.GetRendererAt(0u);
renderer.SetShader(blurShader);
- renderer.RegisterUniqueProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(1.0f / downsampledWidth, 0.0f));
+ renderer.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(1.0f / downsampledWidth, 0.0f));
}
{
Renderer renderer = mVerticalBlurActor.GetRendererAt(0u);
renderer.SetShader(blurShader);
- renderer.RegisterUniqueProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(0.0f, 1.0f / downsampledHeight));
+ renderer.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(0.0f, 1.0f / downsampledHeight));
}
// Inject blurred output to control
return;
}
- mInputFrameBuffer.Reset();
- mTemporaryFrameBuffer.Reset();
- mBlurredOutputFrameBuffer.Reset();
+ DestroyFrameBuffers();
Vector2 size = GetTargetSize();
uint32_t downsampledWidth = std::max(static_cast<uint32_t>(size.width * mDownscaleFactor), 1u);
mHorizontalBlurActor.SetProperty(Actor::Property::SIZE, Vector2(downsampledWidth, downsampledHeight));
mVerticalBlurActor.SetProperty(Actor::Property::SIZE, Vector2(downsampledWidth, downsampledHeight));
+ // Reset buffers and renderers
CreateFrameBuffers(ImageDimensions(downsampledWidth, downsampledHeight));
- SetRendererTexture(GetTargetRenderer(), mBlurredOutputFrameBuffer);
-
- // Reset shader constants
- mHorizontalBlurActor.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(1.0f, 0.0f) / downsampledWidth);
- mVerticalBlurActor.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(0.0f, 1.0f) / downsampledHeight);
mSourceRenderTask.SetFrameBuffer(mInputFrameBuffer);
mHorizontalBlurTask.SetFrameBuffer(mTemporaryFrameBuffer);
mVerticalBlurTask.SetFrameBuffer(mBlurredOutputFrameBuffer);
+
+ {
+ Renderer renderer = mHorizontalBlurActor.GetRendererAt(0);
+ SetRendererTexture(renderer, mInputFrameBuffer);
+ renderer.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(1.0f / downsampledWidth, 0.0f));
+ }
+ {
+ Renderer renderer = mVerticalBlurActor.GetRendererAt(0);
+ SetRendererTexture(renderer, mTemporaryFrameBuffer);
+ renderer.RegisterProperty(UNIFORM_BLUR_OFFSET_DIRECTION_NAME.data(), Vector2(0.0f, 1.0f / downsampledHeight));
+ }
+
+ SetRendererTexture(GetTargetRenderer(), mBlurredOutputFrameBuffer);
}
void GaussianBlurEffectImpl::CreateFrameBuffers(const ImageDimensions downsampledSize)
#include <dali-toolkit/internal/controls/control/control-renderers.h>
#include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
-namespace
-{
-static constexpr float SIZE_STEP_CONDITION = 3.0f;
-} // namespace
-
namespace Dali
{
namespace Toolkit
RenderEffectImpl::RenderEffectImpl()
: mRenderer(),
mOwnerControl(),
- mSizeNotification(),
mTargetSize(Vector2::ZERO),
mIsActivated(false)
{
mOwnerControl.Reset();
mPlacementSceneHolder.Reset();
- mSizeNotification.Reset();
-
// Don't call Deactivate here, since we cannot call virtual function during destruction.
// Deactivate already be called at Control's destructor, and InheritVisibilityChanged signal.
}
ownerControl.InheritedVisibilityChangedSignal().Connect(this, &RenderEffectImpl::OnControlInheritedVisibilityChanged);
- mSizeNotification = ownerControl.AddPropertyNotification(Actor::Property::SIZE, StepCondition(SIZE_STEP_CONDITION));
- mSizeNotification.NotifySignal().Connect(this, &RenderEffectImpl::OnSizeSet);
-
Activate(); // Dev note : Activate after set the owner control.
}
}
{
ownerControl.InheritedVisibilityChangedSignal().Disconnect(this, &RenderEffectImpl::OnControlInheritedVisibilityChanged);
- ownerControl.RemovePropertyNotification(mSizeNotification);
- mSizeNotification.Reset();
-
auto previousOwnerControl = ownerControl;
mOwnerControl.Reset();
mPlacementSceneHolder.Reset();
}
}
+void RenderEffectImpl::Refresh()
+{
+ Dali::Toolkit::Control ownerControl = mOwnerControl.GetHandle();
+ if(ownerControl)
+ {
+ const Vector2 targetSize = mTargetSize;
+ UpdateTargetSize();
+ if(mTargetSize != targetSize)
+ {
+ if(IsActivateValid())
+ {
+ if(!IsActivated())
+ {
+ Activate();
+ }
+ else
+ {
+ OnRefresh();
+ }
+ }
+ else
+ {
+ Deactivate();
+ }
+ }
+ }
+}
+
bool RenderEffectImpl::IsActivateValid() const
{
// Activate is valid if
mTargetSize = size;
}
-void RenderEffectImpl::OnSizeSet(PropertyNotification& source)
-{
- Dali::Toolkit::Control ownerControl = mOwnerControl.GetHandle();
- if(ownerControl)
- {
- const Vector2 targetSize = mTargetSize;
- UpdateTargetSize();
- if(mTargetSize != targetSize)
- {
- if(IsActivateValid())
- {
- if(!IsActivated())
- {
- Activate();
- }
- else
- {
- OnRefresh();
- }
- }
- else
- {
- Deactivate();
- }
- }
- }
-}
-
void RenderEffectImpl::OnControlInheritedVisibilityChanged(Actor actor, bool visible)
{
Dali::Toolkit::Control ownerControl = mOwnerControl.GetHandle();
*/
void Deactivate();
+ /**
+ * @brief Refreshes rendering
+ */
+ void Refresh();
+
protected:
/**
* @copydoc Dali::Toolkit::RenderEffect::RenderEffect
*/
void UpdateTargetSize();
- /**
- * @brief Callback when the size changes.
- */
- void OnSizeSet(PropertyNotification& source);
-
/**
* @brief Callback when the visibility of the actor is changed.
* @param[in] actor The actor
Dali::WeakHandle<Dali::Toolkit::Control> mOwnerControl; ///< Weakhandle of owner control.
WeakHandle<Integration::SceneHolder> mPlacementSceneHolder; ///< Weakhandle of scene
- PropertyNotification mSizeNotification; // Resize/Relayout signal.
- Vector2 mTargetSize; // The final size of mOwnerControl
+ Vector2 mTargetSize; // The final size of mOwnerControl
bool mIsActivated : 1;
};
// Apply FittingMode here
mImpl->mSize = Vector2(targetSize);
mImpl->RegisterProcessorOnce();
+
+ // Refresh render effects
+ if(mImpl->mRenderEffect)
+ {
+ mImpl->mRenderEffect->Refresh();
+ }
+
+ if(mImpl->mOffScreenRenderingImpl)
+ {
+ mImpl->mOffScreenRenderingImpl->Refresh();
+ }
}
void Control::OnSizeAnimation(Animation& animation, const Vector3& targetSize)