From a350f4758a74f337bb201c84aef30c6e799d01fe Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Thu, 20 Jun 2024 13:35:07 +0900 Subject: [PATCH] [Tizen] Mark dirty flag into SG::Renderer directly if visual property changed Since age-down the visual property every frames make performance down, let we update VisualRenderer's property send updated flag into SG::Renderer directly. Now it will reduce some useless call of PrepareProperties of visual renderer. Change-Id: I576e6929fca6945379b72988b4f3633e2ad70e22 Signed-off-by: Eunki, Hong --- .../rendering/decorated-visual-renderer-impl.cpp | 35 +++-- .../event/rendering/visual-renderer-impl.cpp | 4 +- .../update/rendering/scene-graph-renderer.cpp | 30 ++-- .../update/rendering/scene-graph-renderer.h | 32 +++-- .../scene-graph-visual-renderer-property.h | 38 ++++-- .../rendering/scene-graph-visual-renderer.cpp | 26 +--- .../update/rendering/scene-graph-visual-renderer.h | 152 ++++++++++----------- 7 files changed, 170 insertions(+), 147 deletions(-) diff --git a/dali/internal/event/rendering/decorated-visual-renderer-impl.cpp b/dali/internal/event/rendering/decorated-visual-renderer-impl.cpp index f68862d..b70bbcc 100644 --- a/dali/internal/event/rendering/decorated-visual-renderer-impl.cpp +++ b/dali/internal/event/rendering/decorated-visual-renderer-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -78,12 +78,11 @@ DecoratedVisualRendererPtr DecoratedVisualRenderer::New() // create scene object first so it's guaranteed to exist for the event side auto sceneObjectKey = SceneGraph::Renderer::NewKey(); - auto animatableVisualProperties = new SceneGraph::VisualRenderer::AnimatableVisualProperties(); - auto animatableDecoratedVisualProperties = new SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties(); + auto animatableVisualProperties = new SceneGraph::VisualRenderer::AnimatableVisualProperties(*sceneObjectKey.Get()); + auto animatableDecoratedVisualProperties = new SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties(*sceneObjectKey.Get()); // Append extended properties as AnimatableDecoratedVisualProperties. - animatableVisualProperties->mExtendedProperties = animatableDecoratedVisualProperties; - animatableVisualProperties->mExtendedPropertiesDeleteFunction = SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties::DeleteFunction; + animatableVisualProperties->mExtendedProperties = animatableDecoratedVisualProperties; sceneObjectKey->SetVisualProperties(animatableVisualProperties); @@ -123,7 +122,7 @@ void DecoratedVisualRenderer::SetDefaultProperty(Property::Index index, if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { @@ -243,7 +242,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property auto visualProperties = sceneObject.GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { value = decoratedVisualProperties->mCornerRadius[GetEventThreadServices().GetEventBufferIndex()]; @@ -256,7 +255,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property auto visualProperties = sceneObject.GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { value = decoratedVisualProperties->mCornerRadiusPolicy[GetEventThreadServices().GetEventBufferIndex()]; @@ -269,7 +268,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property auto visualProperties = sceneObject.GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { value = decoratedVisualProperties->mBorderlineWidth[GetEventThreadServices().GetEventBufferIndex()]; @@ -282,7 +281,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property auto visualProperties = sceneObject.GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { value = decoratedVisualProperties->mBorderlineColor[GetEventThreadServices().GetEventBufferIndex()]; @@ -295,7 +294,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property auto visualProperties = sceneObject.GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { value = decoratedVisualProperties->mBorderlineOffset[GetEventThreadServices().GetEventBufferIndex()]; @@ -308,7 +307,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property auto visualProperties = sceneObject.GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { value = decoratedVisualProperties->mBlurRadius[GetEventThreadServices().GetEventBufferIndex()]; @@ -412,7 +411,7 @@ const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatabl auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { property = &decoratedVisualProperties->mCornerRadius; @@ -425,7 +424,7 @@ const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatabl auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { property = &decoratedVisualProperties->mBorderlineWidth; @@ -438,7 +437,7 @@ const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatabl auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { property = &decoratedVisualProperties->mBorderlineColor; @@ -451,7 +450,7 @@ const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatabl auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { property = &decoratedVisualProperties->mBorderlineOffset; @@ -464,7 +463,7 @@ const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatabl auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { property = &decoratedVisualProperties->mBlurRadius; @@ -496,7 +495,7 @@ const PropertyInputImpl* DecoratedVisualRenderer::GetSceneObjectInputProperty(Pr auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties(); if(visualProperties) { - auto decoratedVisualProperties = static_cast(visualProperties->mExtendedProperties); + auto decoratedVisualProperties = visualProperties->mExtendedProperties; if(decoratedVisualProperties) { return &decoratedVisualProperties->mCornerRadiusPolicy; diff --git a/dali/internal/event/rendering/visual-renderer-impl.cpp b/dali/internal/event/rendering/visual-renderer-impl.cpp index 62a78ac..7a5c10a 100644 --- a/dali/internal/event/rendering/visual-renderer-impl.cpp +++ b/dali/internal/event/rendering/visual-renderer-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,7 +69,7 @@ VisualRendererPtr VisualRenderer::New() // create scene object first so it's guaranteed to exist for the event side auto sceneObjectKey = SceneGraph::Renderer::NewKey(); - sceneObjectKey->SetVisualProperties(new SceneGraph::VisualRenderer::AnimatableVisualProperties()); + sceneObjectKey->SetVisualProperties(new SceneGraph::VisualRenderer::AnimatableVisualProperties(*sceneObjectKey.Get())); // pass the pointer to base for message passing VisualRendererPtr rendererPtr(new VisualRenderer(sceneObjectKey.Get())); diff --git a/dali/internal/update/rendering/scene-graph-renderer.cpp b/dali/internal/update/rendering/scene-graph-renderer.cpp index 3cc80cb..958ae0c 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-renderer.cpp @@ -112,6 +112,7 @@ Renderer::Renderer() mDepthTestMode(DepthTestMode::AUTO), mRenderingBehavior(DevelRenderer::Rendering::IF_REQUIRED), mUpdateDecay(Renderer::Decay::INITIAL), + mVisualPropertiesDirtyFlags(CLEAN_FLAG), mRegenerateUniformMap(false), mPremultipledAlphaEnabled(false), mOpacity(1.0f), @@ -169,7 +170,16 @@ bool Renderer::PrepareRender(BufferIndex updateBufferIndex) mUpdateDecay = static_cast(static_cast(mUpdateDecay) - 1); } - if(mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY) // We don't check mUpdateDecay + // Age down visual properties dirty flag + if(mVisualPropertiesDirtyFlags != CLEAN_FLAG) + { + DALI_ASSERT_DEBUG(mVisualProperties && "Visual Property not created yet! something wrong (maybe event message flush ordering issue)"); + + rendererUpdated |= mVisualProperties->PrepareProperties(); + mVisualPropertiesDirtyFlags >>= 1; + } + + if(mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY || mVisualPropertiesDirtyFlags != CLEAN_FLAG) // We don't check mUpdateDecay { SetUpdated(true); } @@ -326,12 +336,6 @@ bool Renderer::PrepareRender(BufferIndex updateBufferIndex) mResendFlag = 0; } - // Age down visual properties dirty flag - if(mVisualProperties) - { - rendererUpdated |= mVisualProperties->PrepareProperties(); - } - // Ensure collected map is up to date UpdateUniformMap(updateBufferIndex); @@ -863,7 +867,7 @@ bool Renderer::IsUpdated() const // 2. Renderer's opacity changed // 3. Shader's propperties are changed // 4. Visual properties are changed - if(IsDirty() || (mShader && mShader->Updated()) || (mVisualProperties && mVisualProperties->Updated())) + if(IsDirty() || (mShader && mShader->Updated()) || (mVisualPropertiesDirtyFlags != CLEAN_FLAG)) { return true; } @@ -879,6 +883,16 @@ Vector4 Renderer::GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, return originalUpdateArea; } +void Renderer::OnVisualRendererPropertyUpdated(bool bake) +{ + mVisualPropertiesDirtyFlags |= bake ? BAKED_FLAG : SET_FLAG; +} + +uint8_t Renderer::GetUpdatedFlag() const +{ + return static_cast(mVisualPropertiesDirtyFlags); +} + } // namespace SceneGraph } // namespace Internal } // namespace Dali diff --git a/dali/internal/update/rendering/scene-graph-renderer.h b/dali/internal/update/rendering/scene-graph-renderer.h index e2753c1..29ddb43 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.h +++ b/dali/internal/update/rendering/scene-graph-renderer.h @@ -74,7 +74,8 @@ using RendererConstIter = RendererContainer::ConstIterator; class Renderer : public PropertyOwner, public UniformMapDataProvider, - public RenderDataProvider + public RenderDataProvider, + public VisualRenderer::VisualRendererPropertyObserver { public: enum OpacityType @@ -528,6 +529,9 @@ public: // For VisualProperties void SetVisualProperties(VisualRenderer::AnimatableVisualProperties* visualProperties) { mVisualProperties = visualProperties; + + // Initialize visual dirty flags. + mVisualPropertiesDirtyFlags = BAKED_FLAG; } /** @@ -538,6 +542,17 @@ public: // For VisualProperties return mVisualProperties.Get(); } +public: // From VisualRenderer::VisualRendererPropertyObserver + /** + * @copydoc VisualRenderer::VisualRendererPropertyObserver::OnVisualRendererPropertyUpdated + */ + void OnVisualRendererPropertyUpdated(bool bake) override; + + /** + * @copydoc VisualRenderer::VisualRendererPropertyObserver::GetUpdatedFlag + */ + uint8_t GetUpdatedFlag() const override; + private: /** * Protected constructor; See also Renderer::New() @@ -574,13 +589,14 @@ private: UniformMap::SizeType mUniformMapChangeCounter{0u}; ///< Value to check if uniform data should be updated UniformMap::SizeType mShaderMapChangeCounter{0u}; ///< Value to check if uniform data should be updated - DepthFunction::Type mDepthFunction : 4; ///< Local copy of the depth function - FaceCullingMode::Type mFaceCullingMode : 3; ///< Local copy of the mode of face culling - BlendMode::Type mBlendMode : 3; ///< Local copy of the mode of blending - DepthWriteMode::Type mDepthWriteMode : 3; ///< Local copy of the depth write mode - DepthTestMode::Type mDepthTestMode : 3; ///< Local copy of the depth test mode - DevelRenderer::Rendering::Type mRenderingBehavior : 2; ///< The rendering behavior - Decay mUpdateDecay : 2; ///< Update decay (aging) + DepthFunction::Type mDepthFunction : 4; ///< Local copy of the depth function + FaceCullingMode::Type mFaceCullingMode : 3; ///< Local copy of the mode of face culling + BlendMode::Type mBlendMode : 3; ///< Local copy of the mode of blending + DepthWriteMode::Type mDepthWriteMode : 3; ///< Local copy of the depth write mode + DepthTestMode::Type mDepthTestMode : 3; ///< Local copy of the depth test mode + DevelRenderer::Rendering::Type mRenderingBehavior : 2; ///< The rendering behavior + Decay mUpdateDecay : 2; ///< Update decay (aging) + uint8_t mVisualPropertiesDirtyFlags : 2; ///< Update decay for visual properties (aging) bool mRegenerateUniformMap : 1; ///< true if the map should be regenerated bool mPremultipledAlphaEnabled : 1; ///< Flag indicating whether the Pre-multiplied Alpha Blending is required diff --git a/dali/internal/update/rendering/scene-graph-visual-renderer-property.h b/dali/internal/update/rendering/scene-graph-visual-renderer-property.h index d1f8691..37f3de1 100644 --- a/dali/internal/update/rendering/scene-graph-visual-renderer-property.h +++ b/dali/internal/update/rendering/scene-graph-visual-renderer-property.h @@ -22,6 +22,30 @@ namespace Dali::Internal::SceneGraph::VisualRenderer { /** + * @brief Interface to notify updated flags to the owner. + * @note This is a pure virtual class. + */ +class VisualRendererPropertyObserver +{ +protected: + /** + * Destructor + */ + virtual ~VisualRendererPropertyObserver() = default; + +public: + /** + * @brief Called when some visual properties are changed. + */ + virtual void OnVisualRendererPropertyUpdated(bool bake) = 0; + + /** + * @brief Get the current owner's updated flags as visual properties. + */ + virtual uint8_t GetUpdatedFlag() const = 0; +}; + +/** * @brief Base class for VisualRender properties coefficient. * It will mark update flag as dirty if some properties are changed. * By that update flag, we can determine that we need to re-calculate @@ -29,8 +53,8 @@ namespace Dali::Internal::SceneGraph::VisualRenderer */ struct VisualRendererCoefficientCacheBase { - VisualRendererCoefficientCacheBase() - : mUpdatedFlag(Dali::Internal::SceneGraph::BAKED_FLAG), + VisualRendererCoefficientCacheBase(VisualRendererPropertyObserver& owner) + : mOwner(owner), mUpdateCurrentFrame(true), mCoefficientCalculated(false) { @@ -54,7 +78,7 @@ struct VisualRendererCoefficientCacheBase void Update(bool bake) { mUpdateCurrentFrame = true; - mUpdatedFlag |= bake ? Dali::Internal::SceneGraph::BAKED_FLAG : Dali::Internal::SceneGraph::SET_FLAG; + mOwner.OnVisualRendererPropertyUpdated(bake); } /** @@ -79,14 +103,12 @@ struct VisualRendererCoefficientCacheBase */ void ResetFlag() { - mUpdateCurrentFrame = (mUpdatedFlag != Dali::Internal::SceneGraph::CLEAN_FLAG); ///< Keep the flag whether it was updated or not. - mCoefficientCalculated &= (!mUpdateCurrentFrame); ///< Re-calculate coefficient only if previous update flag was not clean. - - mUpdatedFlag >>= 1; + mUpdateCurrentFrame = (mOwner.GetUpdatedFlag() != Dali::Internal::SceneGraph::CLEAN_FLAG); ///< Keep the flag whether it was updated or not. + mCoefficientCalculated &= (!mUpdateCurrentFrame); ///< Re-calculate coefficient only if previous update flag was not clean. } private: - uint8_t mUpdatedFlag : 2; ///< Updated flag for this coefficient cache. + VisualRendererPropertyObserver& mOwner; ///< Owner of this cache. It will be used to Update dirty flag for this coefficient cache. bool mUpdateCurrentFrame : 1; ///< Whether we need to update this frame or not. bool mCoefficientCalculated : 1; ///< Whether we need to re-calculate coefficient or not. diff --git a/dali/internal/update/rendering/scene-graph-visual-renderer.cpp b/dali/internal/update/rendering/scene-graph-visual-renderer.cpp index 81b5a67..156949a 100644 --- a/dali/internal/update/rendering/scene-graph-visual-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-visual-renderer.cpp @@ -40,16 +40,10 @@ void AnimatableVisualProperties::RequestResetToBaseValues() mPreMultipliedAlpha.RequestResetToBaseValue(); if(mExtendedProperties) { - auto* decoratedVisualProperties = static_cast(mExtendedProperties); - decoratedVisualProperties->RequestResetToBaseValues(); + mExtendedProperties->RequestResetToBaseValues(); } } -bool AnimatableVisualProperties::Updated() const -{ - return mCoefficient.IsUpdated() || (mExtendedProperties && static_cast(mExtendedProperties)->Updated()); -} - Vector4 AnimatableVisualProperties::GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, const Vector4& originalUpdateArea) noexcept { auto& coefficient = mCoefficient; @@ -115,17 +109,15 @@ Vector4 AnimatableVisualProperties::GetVisualTransformedUpdateArea(BufferIndex u if(mExtendedProperties) { - const auto decoratedVisualProperties = static_cast(mExtendedProperties); - - auto& decoratedCoefficient = decoratedVisualProperties->mCoefficient; + auto& decoratedCoefficient = mExtendedProperties->mCoefficient; // Recalculate only if coefficient need to be updated. if(!decoratedCoefficient.IsCoefficientCalculated()) { // DecoratedVisualProperty - const float borderlineWidth = decoratedVisualProperties->mBorderlineWidth.Get(updateBufferIndex); - const float borderlineOffset = decoratedVisualProperties->mBorderlineOffset.Get(updateBufferIndex); - const float blurRadius = decoratedVisualProperties->mBlurRadius.Get(updateBufferIndex); + const float borderlineWidth = mExtendedProperties->mBorderlineWidth.Get(updateBufferIndex); + const float borderlineOffset = mExtendedProperties->mBorderlineOffset.Get(updateBufferIndex); + const float blurRadius = mExtendedProperties->mBlurRadius.Get(updateBufferIndex); // Extra padding information for anti-alias const float extraPadding = 2.0f; @@ -184,8 +176,7 @@ bool AnimatableVisualProperties::PrepareProperties() if(mExtendedProperties) { - auto* decoratedVisualProperties = static_cast(mExtendedProperties); - rendererUpdated |= (decoratedVisualProperties->PrepareProperties()); + rendererUpdated |= mExtendedProperties->PrepareProperties(); } return rendererUpdated; @@ -201,11 +192,6 @@ void AnimatableDecoratedVisualProperties::RequestResetToBaseValues() mBlurRadius.RequestResetToBaseValue(); } -bool AnimatableDecoratedVisualProperties::Updated() const -{ - return mCoefficient.IsUpdated(); -} - bool AnimatableDecoratedVisualProperties::PrepareProperties() { bool rendererUpdated = mCoefficient.IsUpdated(); diff --git a/dali/internal/update/rendering/scene-graph-visual-renderer.h b/dali/internal/update/rendering/scene-graph-visual-renderer.h index 6ca2d64..bf97650 100644 --- a/dali/internal/update/rendering/scene-graph-visual-renderer.h +++ b/dali/internal/update/rendering/scene-graph-visual-renderer.h @@ -26,27 +26,21 @@ namespace Dali::Internal::SceneGraph::VisualRenderer { -struct AnimatableVisualProperties +struct AnimatableDecoratedVisualProperties { - AnimatableVisualProperties() - : mTransformOffset(Vector2::ZERO), - mTransformSize(Vector2::ONE), - mTransformOrigin(Vector2::ZERO), - mTransformAnchorPoint(Vector2::ZERO), - mTransformOffsetSizeMode(Vector4::ZERO), - mExtraSize(Vector2::ZERO), - mMixColor(Vector3::ONE), - mPreMultipliedAlpha(0.0f), - mExtendedPropertiesDeleteFunction(nullptr) + AnimatableDecoratedVisualProperties(VisualRendererPropertyObserver& owner) + : mCoefficient(owner), + mBorderlineWidth(0.0f), + mBorderlineOffset(0.0f), + mBlurRadius(0.0f), + mBorderlineColor(Color::BLACK), + mCornerRadius(Vector4::ZERO), + mCornerRadiusPolicy(1.0f) { } - ~AnimatableVisualProperties() + ~AnimatableDecoratedVisualProperties() { - if(mExtendedProperties && mExtendedPropertiesDeleteFunction) - { - mExtendedPropertiesDeleteFunction(mExtendedProperties); - } } public: // Public API @@ -55,16 +49,6 @@ public: // Public API */ void RequestResetToBaseValues(); - /** - * @copydoc Dali::Internal::SceneGraph::Renderer::Updated - */ - bool Updated() const; - - /** - * @copydoc RenderDataProvider::GetVisualTransformedUpdateArea() - */ - Vector4 GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, const Vector4& originalUpdateArea) noexcept; - public: /** * @brief Prepare properties and ready to render sequence @@ -78,79 +62,70 @@ public: * @brief Cached coefficient value when we calculate visual transformed update size. * It can reduce complexity of calculate the vertex position. * - * Vector2 vertexPosition = (XA * aPosition + XB) * originalSize + (CA * aPosition + CB) + * Vector2 vertexPosition += Vector2(D, D) * aPosition */ - struct VisualTransformedUpdateSizeCoefficientCache : public VisualRendererCoefficientCacheBase + struct DecoratedVisualTransformedUpdateSizeCoefficientCache : public VisualRendererCoefficientCacheBase { - VisualTransformedUpdateSizeCoefficientCache() - : VisualRendererCoefficientCacheBase(), - coefXA(Vector2::ZERO), - coefXB(Vector2::ZERO), - coefCA(Vector2::ZERO), - coefCB(Vector2::ZERO) + DecoratedVisualTransformedUpdateSizeCoefficientCache(VisualRendererPropertyObserver& owner) + : VisualRendererCoefficientCacheBase(owner), + coefD(0.0f) { } - ~VisualTransformedUpdateSizeCoefficientCache() override = default; + ~DecoratedVisualTransformedUpdateSizeCoefficientCache() override = default; - Vector2 coefXA; - Vector2 coefXB; - Vector2 coefCA; - Vector2 coefCB; + float coefD; }; public: // Default properties // Define a base offset for the following wrappers. The wrapper macros calculate offsets from the previous // element such that each wrapper type generates a compile time offset to the CoefficientCache data. - BASE(VisualTransformedUpdateSizeCoefficientCache, mCoefficient); ///< Coefficient value to calculate visual transformed update size by VisualProperties more faster. + BASE(DecoratedVisualTransformedUpdateSizeCoefficientCache, mCoefficient); ///< Coefficient value to calculate visual transformed update size by VisualProperties more faster. - PROPERTY_WRAPPER(mCoefficient, VisualRendererProperty, Vector2, mTransformOffset); - PROPERTY_WRAPPER(mTransformOffset, VisualRendererProperty, Vector2, mTransformSize); - PROPERTY_WRAPPER(mTransformSize, VisualRendererProperty, Vector2, mTransformOrigin); - PROPERTY_WRAPPER(mTransformOrigin, VisualRendererProperty, Vector2, mTransformAnchorPoint); - PROPERTY_WRAPPER(mTransformAnchorPoint, VisualRendererProperty, Vector4, mTransformOffsetSizeMode); - PROPERTY_WRAPPER(mTransformOffsetSizeMode, VisualRendererProperty, Vector2, mExtraSize); + PROPERTY_WRAPPER(mCoefficient, VisualRendererProperty, float, mBorderlineWidth); + PROPERTY_WRAPPER(mBorderlineWidth, VisualRendererProperty, float, mBorderlineOffset); + PROPERTY_WRAPPER(mBorderlineOffset, VisualRendererProperty, float, mBlurRadius); // Properties that don't give any effort to coefficient. - AnimatableProperty mMixColor; - AnimatableProperty mPreMultipliedAlpha; - -public: // Extended properties - void* mExtendedProperties{nullptr}; // Enable derived class to extend properties further - void (*mExtendedPropertiesDeleteFunction)(void*){nullptr}; // Derived class's custom delete functor + AnimatableProperty mBorderlineColor; + AnimatableProperty mCornerRadius; + AnimatableProperty mCornerRadiusPolicy; }; -struct AnimatableDecoratedVisualProperties +struct AnimatableVisualProperties { - AnimatableDecoratedVisualProperties() - : mBorderlineWidth(0.0f), - mBorderlineOffset(0.0f), - mBlurRadius(0.0f), - mBorderlineColor(Color::BLACK), - mCornerRadius(Vector4::ZERO), - mCornerRadiusPolicy(1.0f) - { - } - ~AnimatableDecoratedVisualProperties() + AnimatableVisualProperties(VisualRendererPropertyObserver& owner) + : mCoefficient(owner), + mTransformOffset(Vector2::ZERO), + mTransformSize(Vector2::ONE), + mTransformOrigin(Vector2::ZERO), + mTransformAnchorPoint(Vector2::ZERO), + mTransformOffsetSizeMode(Vector4::ZERO), + mExtraSize(Vector2::ZERO), + mMixColor(Vector3::ONE), + mPreMultipliedAlpha(0.0f), + mExtendedProperties(nullptr) { } -public: // Public API - // Delete function of AnimatableDecoratedVisualProperties* converted as void* - static void DeleteFunction(void* data) + ~AnimatableVisualProperties() { - delete static_cast(data); + if(mExtendedProperties) + { + delete mExtendedProperties; + } } +public: // Public API /** * @copydoc Dali::Internal::SceneGraph::Renderer::RequestResetToBaseValues */ void RequestResetToBaseValues(); /** - * @copydoc Dali::Internal::SceneGraph::Renderer::Updated + * @copydoc RenderDataProvider::GetVisualTransformedUpdateArea() */ - bool Updated() const; + Vector4 GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, const Vector4& originalUpdateArea) noexcept; public: /** @@ -165,34 +140,45 @@ public: * @brief Cached coefficient value when we calculate visual transformed update size. * It can reduce complexity of calculate the vertex position. * - * Vector2 vertexPosition += Vector2(D, D) * aPosition + * Vector2 vertexPosition = (XA * aPosition + XB) * originalSize + (CA * aPosition + CB) */ - struct DecoratedVisualTransformedUpdateSizeCoefficientCache : public VisualRendererCoefficientCacheBase + struct VisualTransformedUpdateSizeCoefficientCache : public VisualRendererCoefficientCacheBase { - DecoratedVisualTransformedUpdateSizeCoefficientCache() - : VisualRendererCoefficientCacheBase(), - coefD(0.0f) + VisualTransformedUpdateSizeCoefficientCache(VisualRendererPropertyObserver& owner) + : VisualRendererCoefficientCacheBase(owner), + coefXA(Vector2::ZERO), + coefXB(Vector2::ZERO), + coefCA(Vector2::ZERO), + coefCB(Vector2::ZERO) { } - ~DecoratedVisualTransformedUpdateSizeCoefficientCache() override = default; + ~VisualTransformedUpdateSizeCoefficientCache() override = default; - float coefD; + Vector2 coefXA; + Vector2 coefXB; + Vector2 coefCA; + Vector2 coefCB; }; public: // Default properties // Define a base offset for the following wrappers. The wrapper macros calculate offsets from the previous // element such that each wrapper type generates a compile time offset to the CoefficientCache data. - BASE(DecoratedVisualTransformedUpdateSizeCoefficientCache, mCoefficient); ///< Coefficient value to calculate visual transformed update size by VisualProperties more faster. + BASE(VisualTransformedUpdateSizeCoefficientCache, mCoefficient); ///< Coefficient value to calculate visual transformed update size by VisualProperties more faster. - PROPERTY_WRAPPER(mCoefficient, VisualRendererProperty, float, mBorderlineWidth); - PROPERTY_WRAPPER(mBorderlineWidth, VisualRendererProperty, float, mBorderlineOffset); - PROPERTY_WRAPPER(mBorderlineOffset, VisualRendererProperty, float, mBlurRadius); + PROPERTY_WRAPPER(mCoefficient, VisualRendererProperty, Vector2, mTransformOffset); + PROPERTY_WRAPPER(mTransformOffset, VisualRendererProperty, Vector2, mTransformSize); + PROPERTY_WRAPPER(mTransformSize, VisualRendererProperty, Vector2, mTransformOrigin); + PROPERTY_WRAPPER(mTransformOrigin, VisualRendererProperty, Vector2, mTransformAnchorPoint); + PROPERTY_WRAPPER(mTransformAnchorPoint, VisualRendererProperty, Vector4, mTransformOffsetSizeMode); + PROPERTY_WRAPPER(mTransformOffsetSizeMode, VisualRendererProperty, Vector2, mExtraSize); // Properties that don't give any effort to coefficient. - AnimatableProperty mBorderlineColor; - AnimatableProperty mCornerRadius; - AnimatableProperty mCornerRadiusPolicy; + AnimatableProperty mMixColor; + AnimatableProperty mPreMultipliedAlpha; + +public: // Extended properties for decorated visual properties + AnimatableDecoratedVisualProperties* mExtendedProperties{nullptr}; }; } // namespace Dali::Internal::SceneGraph::VisualRenderer -- 2.7.4