/*
- * 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.
// 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);
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mCornerRadius[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mCornerRadiusPolicy[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mBorderlineWidth[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mBorderlineColor[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mBorderlineOffset[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mBlurRadius[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
property = &decoratedVisualProperties->mCornerRadius;
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
property = &decoratedVisualProperties->mBorderlineWidth;
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
property = &decoratedVisualProperties->mBorderlineColor;
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
property = &decoratedVisualProperties->mBorderlineOffset;
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
property = &decoratedVisualProperties->mBlurRadius;
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = visualProperties->mExtendedProperties;
if(decoratedVisualProperties)
{
return &decoratedVisualProperties->mCornerRadiusPolicy;
/*
- * 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.
// 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()));
mDepthTestMode(DepthTestMode::AUTO),
mRenderingBehavior(DevelRenderer::Rendering::IF_REQUIRED),
mUpdateDecay(Renderer::Decay::INITIAL),
+ mVisualPropertiesDirtyFlags(CLEAN_FLAG),
mRegenerateUniformMap(false),
mPremultipledAlphaEnabled(false),
mOpacity(1.0f),
mUpdateDecay = static_cast<Renderer::Decay>(static_cast<int>(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);
}
mResendFlag = 0;
}
- // Age down visual properties dirty flag
- if(mVisualProperties)
- {
- rendererUpdated |= mVisualProperties->PrepareProperties();
- }
-
// Ensure collected map is up to date
UpdateUniformMap(updateBufferIndex);
// 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;
}
return originalUpdateArea;
}
+void Renderer::OnVisualRendererPropertyUpdated(bool bake)
+{
+ mVisualPropertiesDirtyFlags |= bake ? BAKED_FLAG : SET_FLAG;
+}
+
+uint8_t Renderer::GetUpdatedFlag() const
+{
+ return static_cast<uint8_t>(mVisualPropertiesDirtyFlags);
+}
+
} // namespace SceneGraph
} // namespace Internal
} // namespace Dali
class Renderer : public PropertyOwner,
public UniformMapDataProvider,
- public RenderDataProvider
+ public RenderDataProvider,
+ public VisualRenderer::VisualRendererPropertyObserver
{
public:
enum OpacityType
void SetVisualProperties(VisualRenderer::AnimatableVisualProperties* visualProperties)
{
mVisualProperties = visualProperties;
+
+ // Initialize visual dirty flags.
+ mVisualPropertiesDirtyFlags = BAKED_FLAG;
}
/**
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()
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
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.
*/
struct VisualRendererCoefficientCacheBase
{
- VisualRendererCoefficientCacheBase()
- : mUpdatedFlag(Dali::Internal::SceneGraph::BAKED_FLAG),
+ VisualRendererCoefficientCacheBase(VisualRendererPropertyObserver& owner)
+ : mOwner(owner),
mUpdateCurrentFrame(true),
mCoefficientCalculated(false)
{
void Update(bool bake)
{
mUpdateCurrentFrame = true;
- mUpdatedFlag |= bake ? Dali::Internal::SceneGraph::BAKED_FLAG : Dali::Internal::SceneGraph::SET_FLAG;
+ mOwner.OnVisualRendererPropertyUpdated(bake);
}
/**
*/
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.
mPreMultipliedAlpha.RequestResetToBaseValue();
if(mExtendedProperties)
{
- auto* decoratedVisualProperties = static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mExtendedProperties);
- decoratedVisualProperties->RequestResetToBaseValues();
+ mExtendedProperties->RequestResetToBaseValues();
}
}
-bool AnimatableVisualProperties::Updated() const
-{
- return mCoefficient.IsUpdated() || (mExtendedProperties && static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mExtendedProperties)->Updated());
-}
-
Vector4 AnimatableVisualProperties::GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, const Vector4& originalUpdateArea) noexcept
{
auto& coefficient = mCoefficient;
if(mExtendedProperties)
{
- const auto decoratedVisualProperties = static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(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;
if(mExtendedProperties)
{
- auto* decoratedVisualProperties = static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mExtendedProperties);
- rendererUpdated |= (decoratedVisualProperties->PrepareProperties());
+ rendererUpdated |= mExtendedProperties->PrepareProperties();
}
return rendererUpdated;
mBlurRadius.RequestResetToBaseValue();
}
-bool AnimatableDecoratedVisualProperties::Updated() const
-{
- return mCoefficient.IsUpdated();
-}
-
bool AnimatableDecoratedVisualProperties::PrepareProperties()
{
bool rendererUpdated = mCoefficient.IsUpdated();
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
*/
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
* @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<Vector3> mMixColor;
- AnimatableProperty<float> 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<Vector4> mBorderlineColor;
+ AnimatableProperty<Vector4> mCornerRadius;
+ AnimatableProperty<float> 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<AnimatableDecoratedVisualProperties*>(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:
/**
* @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<Vector4> mBorderlineColor;
- AnimatableProperty<Vector4> mCornerRadius;
- AnimatableProperty<float> mCornerRadiusPolicy;
+ AnimatableProperty<Vector3> mMixColor;
+ AnimatableProperty<float> mPreMultipliedAlpha;
+
+public: // Extended properties for decorated visual properties
+ AnimatableDecoratedVisualProperties* mExtendedProperties{nullptr};
};
} // namespace Dali::Internal::SceneGraph::VisualRenderer