From: Eunki, Hong Date: Tue, 28 Mar 2023 04:02:18 +0000 (+0900) Subject: Move visual renderer updateArea calculation code X-Git-Tag: dali_2.2.20~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=42507c942aa4a96a6f66bf9aa293fe62448b17b5;p=platform%2Fcore%2Fuifw%2Fdali-core.git Move visual renderer updateArea calculation code 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 --- diff --git a/dali/internal/update/rendering/scene-graph-renderer.cpp b/dali/internal/update/rendering/scene-graph-renderer.cpp index b8ad3ae..c9951c3 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-renderer.cpp @@ -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& 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(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; } diff --git a/dali/internal/update/rendering/scene-graph-visual-renderer.cpp b/dali/internal/update/rendering/scene-graph-visual-renderer.cpp index 234edd9..fe290e6 100644 --- a/dali/internal/update/rendering/scene-graph-visual-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-visual-renderer.cpp @@ -21,7 +21,12 @@ #include #include -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(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 diff --git a/dali/internal/update/rendering/scene-graph-visual-renderer.h b/dali/internal/update/rendering/scene-graph-visual-renderer.h index 888131f..c90c735 100644 --- a/dali/internal/update/rendering/scene-graph-visual-renderer.h +++ b/dali/internal/update/rendering/scene-graph-visual-renderer.h @@ -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.