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>
{
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()
{
{
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;
}
#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)
{
}
}
+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);
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
*/
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.