Remove BellCurveWidth parameter at Background Blur 70/314170/6
authorjmm <j0064423.lee@samsung.com>
Mon, 8 Jul 2024 04:47:27 +0000 (13:47 +0900)
committerjmm <j0064423.lee@samsung.com>
Tue, 9 Jul 2024 11:46:44 +0000 (20:46 +0900)
Change-Id: I9243b84b5269e4b7c4693407bd88aafdef214599

automated-tests/src/dali-toolkit/utc-Dali-RenderEffect.cpp
dali-toolkit/internal/controls/render-effects/blur-effect-impl.cpp
dali-toolkit/internal/controls/render-effects/blur-effect-impl.h
dali-toolkit/internal/controls/render-effects/render-effect-impl.cpp
dali-toolkit/internal/controls/render-effects/render-effect-impl.h
dali-toolkit/internal/graphics/shaders/render-effect.frag
dali-toolkit/public-api/controls/control-impl.cpp
dali-toolkit/public-api/controls/render-effects/background-blur-effect.cpp
dali-toolkit/public-api/controls/render-effects/background-blur-effect.h

index 1c75ae4a992127540113937e25694a043ef48593..8e08387fb8ea057757c1da0a31991a86185a394b 100644 (file)
@@ -30,7 +30,7 @@ int UtcDaliRenderEffectNewP(void)
   BackgroundBlurEffect blurEffect = BackgroundBlurEffect::New();
   DALI_TEST_CHECK(blurEffect);
 
-  BackgroundBlurEffect blurEffect2 = BackgroundBlurEffect::New(0.5f, 10.0f, 10.0f);
+  BackgroundBlurEffect blurEffect2 = BackgroundBlurEffect::New(0.5f, 10.0f);
   DALI_TEST_CHECK(blurEffect2);
 
   END_TEST;
@@ -43,8 +43,8 @@ int UtcDaliRenderEffectNewN(void)
 
   try
   {
-    BackgroundBlurEffect blurEffect  = BackgroundBlurEffect::New(-0.5f, 10.0f, 10.0f);
-    BackgroundBlurEffect blurEffect2 = BackgroundBlurEffect::New(10.0f, 10.0f, 10.0f);
+    BackgroundBlurEffect blurEffect  = BackgroundBlurEffect::New(-0.5f, 10.0f);
+    BackgroundBlurEffect blurEffect2 = BackgroundBlurEffect::New(10.0f, 10.0f);
     DALI_TEST_CHECK(!blurEffect && !blurEffect2);
   }
   catch(Dali::DaliException& e)
@@ -217,6 +217,7 @@ int UtcDaliRenderEffectResize(void)
   Integration::Scene scene   = application.GetScene();
   Control            control = Control::New();
   control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  control.SetProperty(Actor::Property::SIZE, Vector2(3.0f, 3.0f));
   scene.Add(control);
   control.SetRenderEffect(BackgroundBlurEffect::New());
 
@@ -247,7 +248,7 @@ int UtcDaliRenderEffectSynchronizeBackgroundCornerRadius(void)
   blackDimmerMap.Insert(Toolkit::Visual::Property::OPACITY, 0.2f);
   blackDimmerMap.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS, 30.0f);
 
-  RenderEffect effect = BackgroundBlurEffect::New(0.4f, 40, 10.0f);
+  RenderEffect effect = BackgroundBlurEffect::New(0.4f, 40);
 
   Control control = Control::New();
   DALI_TEST_CHECK(control.GetRendererCount() == 0u);
index 883b3e759ffdb052b3c4affc0492974b8b05cc0e..9d8b2a44c79c5b3821cca02166423d66f209b81c 100644 (file)
 namespace
 {
 // Default values
-static constexpr float    BLUR_EFFECT_DOWNSCALE_FACTOR    = 0.4f;
-static constexpr uint32_t BLUR_EFFECT_PIXEL_RADIUS        = 5u;
-static constexpr float    BLUR_EFFECT_BELL_CURVE_WIDTH    = 1.5f;
-static constexpr int32_t  BLUR_EFFECT_ORDER_INDEX         = 101;
-static constexpr float    BLUR_EFFECT_DIVIDE_ZERO_EPSILON = 0.001f;
+static constexpr float    BLUR_EFFECT_DOWNSCALE_FACTOR = 0.4f;
+static constexpr uint32_t BLUR_EFFECT_PIXEL_RADIUS     = 5u;
+static constexpr int32_t  BLUR_EFFECT_ORDER_INDEX      = 101;
 } // namespace
 
 namespace Dali
@@ -48,33 +46,23 @@ namespace Toolkit
 {
 namespace Internal
 {
-// mMultiplierForFraction and mDenominator are for CalculateGaussianWeight().
-// The original equation,
-//   (1.0f / sqrt(2.0f * Math::PI * mBellCurveWidth)) * exp(-(localOffset * localOffset) * (1.0f / (2.0f * mBellCurveWidth * mBellCurveWidth)));
-// is simplified as below:
-//   mDenominator * exp(-(localOffset * localOffset) * mMultiplierForFraction);
-
 BlurEffectImpl::BlurEffectImpl(bool isBackground)
 : RenderEffectImpl(),
   mInternalRoot(Actor::New()),
   mDownscaleFactor(BLUR_EFFECT_DOWNSCALE_FACTOR),
   mPixelRadius(BLUR_EFFECT_PIXEL_RADIUS),
-  mBellCurveWidth(BLUR_EFFECT_BELL_CURVE_WIDTH),
-  mMultiplierForFraction(1.0f / (2.0f * mBellCurveWidth * mBellCurveWidth)),
-  mDenominator(1.0f / sqrt(2.0f * Math::PI * mBellCurveWidth)),
+  mBellCurveWidth(0.001f),
   mIsActivated(false),
   mIsBackground(isBackground)
 {
 }
 
-BlurEffectImpl::BlurEffectImpl(float downscaleFactor, uint32_t blurRadius, float bellCurveWidth, bool isBackground)
+BlurEffectImpl::BlurEffectImpl(float downscaleFactor, uint32_t blurRadius, bool isBackground)
 : RenderEffectImpl(),
   mInternalRoot(Actor::New()),
   mDownscaleFactor(downscaleFactor),
   mPixelRadius((blurRadius >> 2) + 1),
-  mBellCurveWidth(std::max(bellCurveWidth, BLUR_EFFECT_DIVIDE_ZERO_EPSILON)),
-  mMultiplierForFraction(1.0f / (2.0f * mBellCurveWidth * mBellCurveWidth)),
-  mDenominator(1.0f / sqrt(2.0f * Math::PI * mBellCurveWidth)),
+  mBellCurveWidth(0.001f),
   mIsActivated(false),
   mIsBackground(isBackground)
 {
@@ -92,9 +80,9 @@ BlurEffectImplPtr BlurEffectImpl::New(bool isBackground)
   return handle;
 }
 
-BlurEffectImplPtr BlurEffectImpl::New(float downscaleFactor, uint32_t blurRadius, float bellCurveWidth, bool isBackground)
+BlurEffectImplPtr BlurEffectImpl::New(float downscaleFactor, uint32_t blurRadius, bool isBackground)
 {
-  BlurEffectImplPtr handle = new BlurEffectImpl(downscaleFactor, blurRadius, bellCurveWidth, isBackground);
+  BlurEffectImplPtr handle = new BlurEffectImpl(downscaleFactor, blurRadius, isBackground);
   handle->Initialize();
   return handle;
 }
@@ -125,6 +113,16 @@ void BlurEffectImpl::Initialize()
   fragmentStringStream << SHADER_BLUR_EFFECT_FRAG;
   std::string fragmentSource(fragmentStringStream.str());
 
+  float sigma = 0.5f;
+  {
+    float epsilon = 1e-2f / (mPixelRadius * 2);
+    while((CalculateGaussianWeight((mPixelRadius * 2) - 1, sigma) < epsilon) && (sigma < 50.0f))
+    {
+      sigma += 1.0f;
+    }
+  }
+  mBellCurveWidth = sigma;
+
   //////////////////////////////////////////////////////
   // Create actors
   mInternalRoot.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
@@ -144,23 +142,15 @@ void BlurEffectImpl::Initialize()
   mInternalRoot.Add(mVerticalBlurActor);
 }
 
-void BlurEffectImpl::Activate(Toolkit::Control ownerControl)
+void BlurEffectImpl::Activate()
 {
-  DALI_ASSERT_ALWAYS(ownerControl && "Given empty owner control");
-
   if(mIsActivated)
   {
-    if(ownerControl == GetOwnerControl())
-    {
-      return;
-    }
-    else
-    {
-      Deactivate();
-    }
+    return;
   }
-  SetOwnerControl(ownerControl);
-  mIsActivated = true;
+  mIsActivated                  = true;
+  Toolkit::Control ownerControl = GetOwnerControl();
+  DALI_ASSERT_ALWAYS(ownerControl && "Set the owner of RenderEffect before you activate.");
 
   // Get input texture size
   Vector2 size = GetTargetSize();
@@ -276,8 +266,6 @@ void BlurEffectImpl::Deactivate()
   taskList.RemoveTask(mHorizontalBlurTask);
   taskList.RemoveTask(mVerticalBlurTask);
   taskList.RemoveTask(mSourceRenderTask);
-
-  ClearOwnerControl();
 }
 
 void BlurEffectImpl::SetShaderConstants(float downsampledWidth, float downsampledHeight)
@@ -289,11 +277,11 @@ void BlurEffectImpl::SetShaderConstants(float downsampledWidth, float downsample
   unsigned int       halfSize = mPixelRadius * 2;
   std::vector<float> halfSideKernel(halfSize);
 
-  halfSideKernel[0]  = CalculateGaussianWeight(0.0f);
+  halfSideKernel[0]  = CalculateGaussianWeight(0.0f, mBellCurveWidth);
   float totalWeights = halfSideKernel[0];
   for(unsigned int i = 1; i < halfSize; i++)
   {
-    float w           = CalculateGaussianWeight(i);
+    float w           = CalculateGaussianWeight(i, mBellCurveWidth);
     halfSideKernel[i] = w;
     totalWeights += w * 2.0f;
   }
index 91b9953128af30c8b6d131a0a2afb80c12feca7f..3c6a29363aa44aa8a1ba015cd16fcdcc3e3f3157 100644 (file)
@@ -40,7 +40,6 @@ public:
    *
    * downscaleFactor = 0.4f
    * pixelRadius = 5u
-   * bellCurveWidth = 1.5f
    *
    * This blur algorithm is used for both foreground and background blurs.
    *
@@ -56,17 +55,15 @@ public:
    *
    * @param[in] downscaleFactor This value should reside in the range [0.0, 1.0].
    * @param[in] blurRadius The radius of Gaussian kernel.
-   * @param[in] bellCurveWidth Blur intensity.
    * @param[in] isBackground True when blurring background, False otherwise
    * @return A handle to a newly allocated Dali resource
    */
-  static BlurEffectImplPtr New(float downscaleFactor, uint32_t blurRadius, float bellCurveWidth, bool isBackground);
+  static BlurEffectImplPtr New(float downscaleFactor, uint32_t blurRadius, bool isBackground);
 
   /**
    * @brief Activates blur effect
-   * @param[in] ownerControl The control to apply effect
    */
-  void Activate(Toolkit::Control ownerControl) override;
+  void Activate() override;
 
   /**
    * @brief Dectivates blur effect
@@ -84,10 +81,9 @@ protected:
    * @brief Creates an uninitialized blur effect implementation
    * @param[in] downscaleFactor This value should reside in the range [0.0, 1.0].
    * @param[in] blurRadius The radius of Gaussian kernel.
-   * @param[in] bellCurveWidth Blur intensity.
    * @param[in] isBackground True when blurring background, False otherwise
    */
-  BlurEffectImpl(float downscaleFactor, uint32_t blurRadius, float bellCurveWidth, bool isBackground);
+  BlurEffectImpl(float downscaleFactor, uint32_t blurRadius, bool isBackground);
 
   /**
    * @brief Destructor
@@ -106,9 +102,9 @@ private:
    * @brief Calculates gaussian weight
    * @param[in] localOffset Input to the function
    */
-  inline float CalculateGaussianWeight(float localOffset) const
+  inline float CalculateGaussianWeight(float localOffset, float sigma) const
   {
-    return mDenominator * exp(-(localOffset * localOffset) * mMultiplierForFraction);
+    return (1.0f / sqrt(2.0f * Math::PI * sigma)) * exp(-(localOffset * localOffset) * (1.0f / (2.0f * sigma * sigma)));
   }
 
   /**
@@ -164,8 +160,6 @@ private:
   float    mDownscaleFactor;
   uint32_t mPixelRadius;
   float    mBellCurveWidth;
-  float    mMultiplierForFraction;
-  float    mDenominator;
 
   bool mIsActivated : 1;
   bool mIsBackground : 1;
index 1f0c8d74437c940833161a8ea5f1843616abbb9a..9c874d7ad09fa53470f69df63219c3c0aa67555f 100644 (file)
@@ -43,7 +43,7 @@ RenderEffectImpl::~RenderEffectImpl()
 
 void RenderEffectImpl::SetOwnerControl(Dali::Toolkit::Control control)
 {
-  if(control)
+  if(control && (control != mOwnerControl))
   {
     mOwnerControl = control;
 
@@ -73,9 +73,12 @@ Toolkit::Control RenderEffectImpl::GetOwnerControl() const
 
 void RenderEffectImpl::OnSizeSet(PropertyNotification& source)
 {
-  mTargetSize = mOwnerControl.GetProperty<Vector2>(Actor::Property::SIZE);
-  Deactivate();
-  Activate(mOwnerControl);
+  if(mOwnerControl)
+  {
+    mTargetSize = mOwnerControl.GetProperty<Vector2>(Actor::Property::SIZE);
+    Deactivate();
+    Activate();
+  }
 }
 
 Renderer RenderEffectImpl::GetTargetRenderer() const
index 1ae7f7a6115c150634741cac5e78f1ca693bc93b..40f4743deae69de525f07d32ab5bb76aeb9e3731 100644 (file)
@@ -39,15 +39,25 @@ class RenderEffectImpl : public BaseObject, public ConnectionTracker
 public:
   /**
    * @brief Activates effect on ownerControl
-   * @param[in] control The owner control to apply RenderEffect.
    */
-  virtual void Activate(Toolkit::Control ownerControl) = 0;
+  virtual void Activate() = 0;
 
   /**
    * @brief Deactivates effect
    */
   virtual void Deactivate() = 0;
 
+  /**
+   * @brief Sets owner Control. Applies effect on the owner.
+   * @param[in] control The owner control to apply RenderEffect.
+   */
+  void SetOwnerControl(Toolkit::Control control);
+
+  /**
+   * @brief Clears owner Control.
+   */
+  void ClearOwnerControl();
+
 protected:
   /**
    * @copydoc Dali::Toolkit::RenderEffect::RenderEffect
@@ -84,17 +94,6 @@ protected:
    */
   Vector2 GetTargetSize() const;
 
-  /**
-   * @brief Sets owner Control. Applies effect on the owner.
-   * @param[in] control The owner control to apply RenderEffect.
-   */
-  void SetOwnerControl(Toolkit::Control control);
-
-  /**
-   * @brief Clears owner Control.
-   */
-  void ClearOwnerControl();
-
   /**
    * @brief Get Owner control.
    * @return mOwnerControl
index 95ecb8cb1d9e102e87506f5d383daf3ac1df3e52..bed870a846af1beadc6326cc4539881243c4029a 100644 (file)
@@ -24,7 +24,7 @@ float roundedBoxSDF(vec2 PixelPositionFromCenter, vec2 RectangleEdgePositionFrom
     return length(max(abs(PixelPositionFromCenter)
                       - RectangleEdgePositionFromCenter
                       + Radius
-                      ,0.0))
+                      , 0.0))
            - Radius;
 }
 
@@ -52,10 +52,11 @@ void main()
 {
   gl_FragColor = texture2D(sTexture, vTexCoord);
 
-  float edgeSoftness = 1.0;
-  float distance = roundedBoxSDF(vFragCoord.xy - (uSize.xy/2.0), uSize.xy/2.0, getCurrentRadius());
+  float radius = getCurrentRadius();
+  float edgeSoftness = min(1.0, radius);
+  float distance = roundedBoxSDF(vFragCoord.xy - (uSize.xy/2.0), uSize.xy/2.0, radius);
 
-  float smoothedAlpha = 1.0 - smoothstep(0.0, edgeSoftness * 2.0, distance);
+  float smoothedAlpha = 1.0 - smoothstep(-edgeSoftness, edgeSoftness, distance);
   gl_FragColor.a *= smoothedAlpha;
 
   gl_FragColor.rgb = applyDithering(gl_FragColor.rgb);
index e9426102ef116a0d69c6b03c33a1b9a44a2b1f0a..8513e2f48551f3d58ca3740563493e69430d9f57 100644 (file)
@@ -179,7 +179,8 @@ void Control::SetRenderEffect(Toolkit::RenderEffect effect)
     DALI_ASSERT_ALWAYS(object && "Not a valid RenderEffect set.");
 
     Dali::Toolkit::Control ownerControl(GetOwner());
-    object->Activate(ownerControl);
+    object->SetOwnerControl(ownerControl);
+    object->Activate();
   }
 }
 
@@ -191,6 +192,7 @@ void Control::ClearRenderEffect()
   if(object)
   {
     object->Deactivate();
+    object->ClearOwnerControl();
   }
   mImpl->mRenderEffect.Reset();
 }
index 32ba804f797ef4a16c91964a73d05e7b28c17109..f02f276034398c85f08357354fc7a6952a0299b3 100644 (file)
@@ -45,11 +45,11 @@ BackgroundBlurEffect BackgroundBlurEffect::New()
   return BackgroundBlurEffect(internal.Get());
 }
 
-BackgroundBlurEffect BackgroundBlurEffect::New(float downscaleFactor, uint32_t blurRadius, float bellCurveWidth)
+BackgroundBlurEffect BackgroundBlurEffect::New(float downscaleFactor, uint32_t blurRadius)
 {
-  Internal::BlurEffectImplPtr internal = Internal::BlurEffectImpl::New(downscaleFactor, blurRadius, bellCurveWidth, true);
+  Internal::BlurEffectImplPtr internal = Internal::BlurEffectImpl::New(downscaleFactor, blurRadius, true);
   return BackgroundBlurEffect(internal.Get());
 }
 
-}// namespace Toolkit
-}// namespace Dali
+} // namespace Toolkit
+} // namespace Dali
index 7d0bf982d4d31ce4b442807564bd01c77aa40fbe..414d4fa7da3fe566140e2d3e3cc4ffe81aefe7fe 100644 (file)
@@ -54,7 +54,6 @@ public:
    *
    * downscaleFactor = 0.4f
    * pixelRadius = 5u
-   * bellCurveWidth = 1.5f
    *
    * @SINCE_2_3.28
    * @return A handle to a newly allocated Dali resource
@@ -65,11 +64,10 @@ public:
    * @brief Creates an initialized BackgroundBlurEffect.
    * @param[in] downscaleFactor This value should reside in the range [0.0, 1.0].
    * @param[in] blurRadius The radius of Gaussian kernel.
-   * @param[in] bellCurveWidth Blur intensity.
    * @SINCE_2_3.28
    * @return A handle to a newly allocated Dali resource
    */
-  static BackgroundBlurEffect New(float downscaleFactor, uint32_t blurRadius, float bellCurveWidth);
+  static BackgroundBlurEffect New(float downscaleFactor, uint32_t blurRadius);
 
   /**
    * @brief Creates an uninitialized blur effect.