Move visual renderer updateArea calculation code 18/290518/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Tue, 28 Mar 2023 04:02:18 +0000 (13:02 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 28 Mar 2023 05:17:40 +0000 (14:17 +0900)
scene-graph-renderer.cpp already have a lots of jobs to do.
To reduce complexity of code readability, move calculation ownership
into AnimatableVisualProoperties

+

Make UpdateArea calculate more exact size

Change-Id: I5814f45ad457e5c10caae307e647b49d306ea0d9
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali/internal/update/rendering/scene-graph-renderer.cpp
dali/internal/update/rendering/scene-graph-visual-renderer.cpp
dali/internal/update/rendering/scene-graph-visual-renderer.h

index b8ad3ae..c9951c3 100644 (file)
@@ -43,12 +43,12 @@ namespace Internal
 {
 namespace SceneGraph
 {
-namespace // unnamed namespace
-{
 #ifdef DEBUG_ENABLED
 Debug::Filter* gSceneGraphRendererLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_SG_RENDERER");
 #endif
 
+namespace // unnamed namespace
+{
 // Memory pool used to allocate new renderers. Memory used by this pool will be released when shutting down DALi
 MemoryPoolObjectAllocator<Renderer>& GetRendererMemoryPool()
 {
@@ -816,124 +816,7 @@ Vector4 Renderer::GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex,
 {
   if(mVisualProperties)
   {
-    auto& coefficient = mVisualProperties->mCoefficient;
-
-    // Recalculate only if coefficient need to be updated.
-    if(coefficient.IsUpdated())
-    {
-      // VisualProperty
-      const Vector2 transformOffset         = mVisualProperties->mTransformOffset.Get(updateBufferIndex);
-      const Vector4 transformOffsetSizeMode = mVisualProperties->mTransformOffsetSizeMode.Get(updateBufferIndex);
-      const Vector2 transformSize           = mVisualProperties->mTransformSize.Get(updateBufferIndex);
-      const Vector2 transformOrigin         = mVisualProperties->mTransformOrigin.Get(updateBufferIndex);
-      const Vector2 transformAnchorPoint    = mVisualProperties->mTransformAnchorPoint.Get(updateBufferIndex);
-      const Vector2 extraSize               = mVisualProperties->mExtraSize.Get(updateBufferIndex);
-
-      DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "transform size   %5.3f %5.3f\n", transformSize.x, transformSize.y);
-      DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "transform offset %5.3f %5.3f\n", transformOffset.x, transformOffset.y);
-      DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "transform origin %5.3f %5.3f\n", transformOrigin.x, transformOrigin.y);
-      DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "transform anchor %5.3f %5.3f\n", transformAnchorPoint.x, transformAnchorPoint.y);
-      DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "extra size       %5.3f %5.3f\n", extraSize.x, extraSize.y);
-
-      // const Vector2 visualSize = Vector2(Dali::Lerp(transformOffsetSizeMode.z, originalSize.x * transformSize.x, transformSize.x),
-      //                                    Dali::Lerp(transformOffsetSizeMode.w, originalSize.y * transformSize.y, transformSize.y)) +
-      //                            extraSize;
-      // const Vector2 visualOffset = Vector2(Dali::Lerp(transformOffsetSizeMode.x, originalSize.x * transformOffset.x, transformOffset.x),
-      //                                      Dali::Lerp(transformOffsetSizeMode.y, originalSize.y * transformOffset.y, transformOffset.y));
-
-      // const float decoratedBorderlineWidth = std::max((1.0f + Dali::Clamp(borderlineOffset, -1.0f, 1.0f)) * borderlineWidth, 2.0f * blurRadius);
-      // const Vector2 decoratedVisualSize    = visualSize + Vector2(decoratedBorderlineWidth, decoratedBorderlineWidth);
-
-      // Note : vertexPositoin.xy = aPosition * decoratedVisualSize
-      //                          + anchorPoint * visualSize
-      //                          + origin * uSize.xy
-      //                          + visualOffset;
-
-      // Calculate same logic of visual's vertex shader transform.
-      // minVertexPosition = -0.5f * decoratedVisualSize + transformAnchorPoint * visualSize + transformOrigin * originalSize.xy + visualOffset
-      // maxVertexPosition =  0.5f * decoratedVisualSize + transformAnchorPoint * visualSize + transformOrigin * originalSize.xy + visualOffset
-
-      // Update cached VisualTransformedUpdateSizeCoefficientCache
-
-      // Note : vertexPosition = (XA * aPosition + XB) * originalSize + (CA * aPosition + CB) + Vector2(D, D) * aPosition
-
-      // XA = transformSize * (1.0 - transformOffsetSizeMode.zw)
-      // XB = transformSize * (1.0 - transformOffsetSizeMode.zw) * transformAnchorPoint
-      //    + transformOffset * (1.0 - transformOffsetSizeMode.xy)
-      //    + transformOrigin
-      // CA = transformSize * transformOffsetSizeMode.zw + extraSize
-      // CB = (transformSize * transformOffsetSizeMode.zw + extraSize) * transformAnchorPoint
-      //    + transformOffset * transformOffsetSizeMode.xy
-      // D = max((1.0 + clamp(borderlineOffset, -1.0, 1.0)) * borderlineWidth, 2.0 * blurRadius)
-
-      coefficient.coefXA = transformSize * Vector2(1.0f - transformOffsetSizeMode.z, 1.0f - transformOffsetSizeMode.w);
-      coefficient.coefXB = coefficient.coefXA * transformAnchorPoint + transformOffset * Vector2(1.0f - transformOffsetSizeMode.x, 1.0f - transformOffsetSizeMode.y) + transformOrigin;
-      coefficient.coefCA = transformSize * Vector2(transformOffsetSizeMode.z, transformOffsetSizeMode.w) + extraSize;
-      coefficient.coefCB = coefficient.coefCA * transformAnchorPoint + transformOffset * Vector2(transformOffsetSizeMode.x, transformOffsetSizeMode.y);
-    }
-
-    float coefD = 0.0f; ///< Default as 0.0f when we don't use decorated renderer.
-
-    if(mVisualProperties->mExtendedProperties)
-    {
-      const auto decoratedVisualProperties = static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mVisualProperties->mExtendedProperties);
-
-      auto& decoratedCoefficient = decoratedVisualProperties->mCoefficient;
-
-      // Recalculate only if coefficient need to be updated.
-      if(decoratedCoefficient.IsUpdated())
-      {
-        // DecoratedVisualProperty
-        const float borderlineWidth  = decoratedVisualProperties->mBorderlineWidth.Get(updateBufferIndex);
-        const float borderlineOffset = decoratedVisualProperties->mBorderlineOffset.Get(updateBufferIndex);
-        const float blurRadius       = decoratedVisualProperties->mBlurRadius.Get(updateBufferIndex);
-
-        DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "borderline width  %5.3f\n", borderlineWidth);
-        DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "borderline offset %5.3f\n", borderlineOffset);
-        DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "blur radius       %5.3f\n", blurRadius);
-
-        // D coefficients be used only decoratedVisual.
-        // It can be calculated parallely with visual transform.
-        decoratedCoefficient.coefD = std::max((1.0f + Dali::Clamp(borderlineOffset, -1.0f, 1.0f)) * borderlineWidth, 2.0f * blurRadius);
-      }
-
-      // Update coefD so we can use this value out of this scope.
-      coefD = decoratedCoefficient.coefD;
-    }
-
-    // Calculate vertex position by coefficient
-    // It will reduce the number of operations
-
-    // const Vector2 minVertexPosition = (XA * -0.5 + XB) * originalSize + (CA * -0.5 + CB) + Vector2(D, D) * -0.5;
-    // const Vector2 maxVertexPosition = (XA * +0.5 + XB) * originalSize + (CA * +0.5 + CB) + Vector2(D, D) * +0.5;
-
-    // When we set
-    // basicVertexPosition = XB * originalSize + CB
-    // scaleVertexPosition = XA * originalSize + CA + D
-
-    // --> minVertexPosition = basicVertexPosition + scaleVertexPosition * -0.5
-    //     maxVertexPosition = basicVertexPosition + scaleVertexPosition * +0.5
-
-    // Then, resultSize = 2.0f * max(-minVertexPosition, maxVertexPosition);
-    //                  = 2.0f * max(scaleVertexPosition * 0.5 - basicVertexPosition, scaleVertexPosition * 0.5 + basicVertexPosition)
-    //                  = scaleVertexPosition + 2.0f * abs(basicVertexPosition)
-    // Cause transform matrix will think center of vertex is (0, 0)
-
-    const Vector2 originalXY = Vector2(originalUpdateArea.x, originalUpdateArea.y);
-    const Vector2 originalWH = Vector2(originalUpdateArea.z, originalUpdateArea.w);
-
-    const Vector2 basicVertexPosition = coefficient.coefXB * originalWH + coefficient.coefCB;
-    const Vector2 scaleVertexPosition = coefficient.coefXA * originalWH + coefficient.coefCA;
-
-    // TODO : We need to re-generate coefficient to consitder area width/height
-    const Vector4 resultArea = Vector4(originalXY.x,
-                                       originalXY.y,
-                                       scaleVertexPosition.x + 2.0f * abs(basicVertexPosition.x) + coefD,
-                                       scaleVertexPosition.y + 2.0f * abs(basicVertexPosition.y) + coefD);
-
-    DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "%f %f %f %f--> %f %f %f %f\n", originalUpdateArea.x, originalUpdateArea.y, originalUpdateArea.z, originalUpdateArea.w, resultArea.x, resultArea.y, resultArea.z, resultArea.w);
-
-    return resultArea;
+    return mVisualProperties->GetVisualTransformedUpdateArea(updateBufferIndex, originalUpdateArea);
   }
   return originalUpdateArea;
 }
index 234edd9..fe290e6 100644 (file)
 #include <dali/internal/update/common/property-resetter.h>
 #include <dali/internal/update/rendering/scene-graph-renderer.h>
 
-namespace Dali::Internal::SceneGraph::VisualRenderer
+namespace Dali::Internal::SceneGraph
+{
+#ifdef DEBUG_ENABLED
+extern Debug::Filter* gSceneGraphRendererLogFilter; ///< Defined at scene-graph-renderer.cpp
+#endif
+namespace VisualRenderer
 {
 void AnimatableVisualProperties::ResetToBaseValues(BufferIndex updateBufferIndex)
 {
@@ -57,6 +62,126 @@ void AnimatableVisualProperties::MarkAsDirty()
   }
 }
 
+Vector4 AnimatableVisualProperties::GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, const Vector4& originalUpdateArea) noexcept
+{
+  auto& coefficient = mCoefficient;
+
+  // Recalculate only if coefficient need to be updated.
+  if(coefficient.IsUpdated())
+  {
+    // VisualProperty
+    const Vector2 transformOffset         = mTransformOffset.Get(updateBufferIndex);
+    const Vector4 transformOffsetSizeMode = mTransformOffsetSizeMode.Get(updateBufferIndex);
+    const Vector2 transformSize           = mTransformSize.Get(updateBufferIndex);
+    const Vector2 transformOrigin         = mTransformOrigin.Get(updateBufferIndex);
+    const Vector2 transformAnchorPoint    = mTransformAnchorPoint.Get(updateBufferIndex);
+    const Vector2 extraSize               = mExtraSize.Get(updateBufferIndex);
+
+    DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "transform size   %5.3f %5.3f\n", transformSize.x, transformSize.y);
+    DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "transform offset %5.3f %5.3f\n", transformOffset.x, transformOffset.y);
+    DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "transform origin %5.3f %5.3f\n", transformOrigin.x, transformOrigin.y);
+    DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "transform anchor %5.3f %5.3f\n", transformAnchorPoint.x, transformAnchorPoint.y);
+    DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "extra size       %5.3f %5.3f\n", extraSize.x, extraSize.y);
+
+    // const Vector2 visualSize = Vector2(Dali::Lerp(transformOffsetSizeMode.z, originalWH.x * transformSize.x, transformSize.x),
+    //                                    Dali::Lerp(transformOffsetSizeMode.w, originalWH.y * transformSize.y, transformSize.y)) +
+    //                            extraSize;
+    // const Vector2 visualOffset = Vector2(Dali::Lerp(transformOffsetSizeMode.x, originalWH.x * transformOffset.x, transformOffset.x),
+    //                                      Dali::Lerp(transformOffsetSizeMode.y, originalWH.y * transformOffset.y, transformOffset.y)) +
+    //                              originalXY;
+
+    // const float decoratedBorderlineWidth = std::max((1.0f + Dali::Clamp(borderlineOffset, -1.0f, 1.0f)) * borderlineWidth, 2.0f * blurRadius);
+    // const Vector2 decoratedVisualSize    = visualSize + Vector2(decoratedBorderlineWidth, decoratedBorderlineWidth);
+
+    // Note : vertexPositoin.xy = aPosition * decoratedVisualSize
+    //                          + anchorPoint * visualSize
+    //                          + origin * uSize.xy
+    //                          + visualOffset;
+
+    // Calculate same logic of visual's vertex shader transform.
+    // minVertexPosition = -0.5f * decoratedVisualSize + transformAnchorPoint * visualSize + transformOrigin * originalWH.xy + visualOffset
+    // maxVertexPosition =  0.5f * decoratedVisualSize + transformAnchorPoint * visualSize + transformOrigin * originalWH.xy + visualOffset
+
+    // Update cached VisualTransformedUpdateSizeCoefficientCache
+
+    // Note : vertexPosition = (XA * aPosition + XB) * originalWH + (CA * aPosition + CB) + Vector2(D, D) * aPosition + originalXY
+
+    // XA = transformSize * (1.0 - transformOffsetSizeMode.zw)
+    // XB = transformSize * (1.0 - transformOffsetSizeMode.zw) * transformAnchorPoint
+    //    + transformOffset * (1.0 - transformOffsetSizeMode.xy)
+    //    + transformOrigin
+    // CA = transformSize * transformOffsetSizeMode.zw + extraSize
+    // CB = (transformSize * transformOffsetSizeMode.zw + extraSize) * transformAnchorPoint
+    //    + transformOffset * transformOffsetSizeMode.xy
+    // D = max((1.0 + clamp(borderlineOffset, -1.0, 1.0)) * borderlineWidth, 2.0 * blurRadius)
+
+    coefficient.coefXA = transformSize * Vector2(1.0f - transformOffsetSizeMode.z, 1.0f - transformOffsetSizeMode.w);
+    coefficient.coefXB = coefficient.coefXA * transformAnchorPoint + transformOffset * Vector2(1.0f - transformOffsetSizeMode.x, 1.0f - transformOffsetSizeMode.y) + transformOrigin;
+    coefficient.coefCA = transformSize * Vector2(transformOffsetSizeMode.z, transformOffsetSizeMode.w) + extraSize;
+    coefficient.coefCB = coefficient.coefCA * transformAnchorPoint + transformOffset * Vector2(transformOffsetSizeMode.x, transformOffsetSizeMode.y);
+  }
+
+  float coefD = 0.0f; ///< Default as 0.0f when we don't use decorated renderer.
+
+  if(mExtendedProperties)
+  {
+    const auto decoratedVisualProperties = static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mExtendedProperties);
+
+    auto& decoratedCoefficient = decoratedVisualProperties->mCoefficient;
+
+    // Recalculate only if coefficient need to be updated.
+    if(decoratedCoefficient.IsUpdated())
+    {
+      // DecoratedVisualProperty
+      const float borderlineWidth  = decoratedVisualProperties->mBorderlineWidth.Get(updateBufferIndex);
+      const float borderlineOffset = decoratedVisualProperties->mBorderlineOffset.Get(updateBufferIndex);
+      const float blurRadius       = decoratedVisualProperties->mBlurRadius.Get(updateBufferIndex);
+
+      DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "borderline width  %5.3f\n", borderlineWidth);
+      DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "borderline offset %5.3f\n", borderlineOffset);
+      DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "blur radius       %5.3f\n", blurRadius);
+
+      // D coefficients be used only decoratedVisual.
+      // It can be calculated parallely with visual transform.
+      decoratedCoefficient.coefD = std::max((1.0f + Dali::Clamp(borderlineOffset, -1.0f, 1.0f)) * borderlineWidth, 2.0f * blurRadius);
+    }
+
+    // Update coefD so we can use this value out of this scope.
+    coefD = decoratedCoefficient.coefD;
+  }
+
+  // Calculate vertex position by coefficient
+  // It will reduce the number of operations
+
+  // const Vector2 minVertexPosition = (XA * -0.5 + XB) * originalWH + (CA * -0.5 + CB) + Vector2(D, D) * -0.5 + originalXY;
+  // const Vector2 maxVertexPosition = (XA * +0.5 + XB) * originalWH + (CA * +0.5 + CB) + Vector2(D, D) * +0.5 + originalXY;
+
+  // When we set
+  // basicVertexPosition = XB * originalWH + CB + originalXY
+  // scaleVertexPosition = XA * originalWH + CA + D
+
+  // --> minVertexPosition = basicVertexPosition + scaleVertexPosition * -0.5
+  //     maxVertexPosition = basicVertexPosition + scaleVertexPosition * +0.5
+
+  // Then, resultPosition = basicVertexPosition
+  //       resultSize     = scaleVertexPosition
+
+  const Vector2 originalXY = Vector2(originalUpdateArea.x, originalUpdateArea.y);
+  const Vector2 originalWH = Vector2(originalUpdateArea.z, originalUpdateArea.w);
+
+  const Vector2 basicVertexPosition = coefficient.coefXB * originalWH + coefficient.coefCB + originalXY;
+  const Vector2 scaleVertexPosition = coefficient.coefXA * originalWH + coefficient.coefCA + Vector2(coefD, coefD);
+
+  const Vector4 resultArea = Vector4(basicVertexPosition.x,
+                                     basicVertexPosition.y,
+                                     scaleVertexPosition.x,
+                                     scaleVertexPosition.y);
+
+  DALI_LOG_INFO(gSceneGraphRendererLogFilter, Debug::Verbose, "%f %f %f %f--> %f %f %f %f\n", originalUpdateArea.x, originalUpdateArea.y, originalUpdateArea.z, originalUpdateArea.w, resultArea.x, resultArea.y, resultArea.z, resultArea.w);
+
+  return resultArea;
+}
+
 void AnimatableDecoratedVisualProperties::ResetToBaseValues(BufferIndex updateBufferIndex)
 {
   mCornerRadius.ResetToBaseValue(updateBufferIndex);
@@ -77,4 +202,5 @@ void AnimatableDecoratedVisualProperties::MarkAsDirty()
   mBlurRadius.MarkAsDirty();
 }
 
-} // namespace Dali::Internal::SceneGraph::VisualRenderer
\ No newline at end of file
+} // namespace VisualRenderer
+} // namespace Dali::Internal::SceneGraph
\ No newline at end of file
index 888131f..c90c735 100644 (file)
@@ -60,6 +60,11 @@ public: // Public API
    */
   void MarkAsDirty();
 
+  /**
+   * @copydoc RenderDataProvider::GetVisualTransformedUpdateArea()
+   */
+  Vector4 GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, const Vector4& originalUpdateArea) noexcept;
+
 public:
   /**
    * @brief Cached coefficient value when we calculate visual transformed update size.