X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fmanager%2Ftransform-manager.cpp;h=277ccfb505848001b1f3d8bab82c46021cae2887;hb=ee9d14cd99ad293d46b17dc2f3591cc061ec403c;hp=e9baa271563137421513078069d28dd3051c6c9a;hpb=ef965273f67a17ef2120cf3f0f1072ea0e56878c;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/manager/transform-manager.cpp b/dali/internal/update/manager/transform-manager.cpp index e9baa27..277ccfb 100644 --- a/dali/internal/update/manager/transform-manager.cpp +++ b/dali/internal/update/manager/transform-manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -21,10 +21,10 @@ //EXTERNAL INCLUDES #include #include +#include //INTERNAL INCLUDES #include -#include #include namespace Dali @@ -42,19 +42,47 @@ namespace static const float gDefaultTransformComponentAnimatableData[] = { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }; //Default values for anchor point (CENTER) and parent origin (TOP_LEFT) -static const float gDefaultTransformComponentStaticData[] = { 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.5f }; - -DALI_COMPILE_TIME_ASSERT( sizeof(gDefaultTransformComponentAnimatableData) == sizeof(TransformComponentAnimatable) ); -DALI_COMPILE_TIME_ASSERT( sizeof(gDefaultTransformComponentStaticData) == sizeof(TransformComponentStatic) ); +static const float gDefaultTransformComponentStaticData[] = { 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.5f, true }; + +static_assert( sizeof(gDefaultTransformComponentAnimatableData) == sizeof(TransformComponentAnimatable), "gDefaultTransformComponentAnimatableData should have the same number of floats as specified in TransformComponentAnimatable" ); +static_assert( sizeof(gDefaultTransformComponentStaticData) == sizeof(TransformComponentStatic), "gDefaultTransformComponentStaticData should have the same number of floats as specified in TransformComponentStatic" ); + +/** + * @brief Calculates the center position for the transform component + * @param[out] centerPosition The calculated center-position of the transform component + * @param[in] transformComponentStatic A const reference to the static component transform struct + * @param[in] transformComponentAnimatable A const reference to the animatable component transform struct + * @param[in] size The size of the current transform component + * @param[in] half Halfway point of the transform + * @param[in] topLeft The top-left coords of the transform + */ +inline void CalculateCenterPosition( + Vector3& centerPosition, + const TransformComponentStatic& transformComponentStatic, + const TransformComponentAnimatable& transformComponentAnimatable, + const Vector3& size, + const Vector3& half, + const Vector3& topLeft ) +{ + // Calculate the center-point by applying the scale and rotation on the anchor point. + centerPosition = ( half - transformComponentStatic.mAnchorPoint ) * size * transformComponentAnimatable.mScale; + centerPosition *= transformComponentAnimatable.mOrientation; + + // If the position is ignoring the anchor-point, then remove the anchor-point shift from the position. + if( ! transformComponentStatic.mPositionUsesAnchorPoint ) + { + centerPosition -= ( topLeft - transformComponentStatic.mAnchorPoint ) * size; + } } +} // unnamed namespace + TransformManager::TransformManager() :mComponentCount(0), mReorder(false) {} -TransformManager::~TransformManager() -{} +TransformManager::~TransformManager() = default; TransformId TransformManager::CreateTransform() { @@ -104,7 +132,7 @@ void TransformManager::RemoveTransform(TransformId id) { //Move the last element to the gap mComponentCount--; - unsigned int index = mIds[id]; + TransformId index = mIds[id]; mTxComponentAnimatable[index] = mTxComponentAnimatable[mComponentCount]; mTxComponentStatic[index] = mTxComponentStatic[mComponentCount]; mInheritanceMode[index] = mInheritanceMode[mComponentCount]; @@ -129,7 +157,9 @@ void TransformManager::RemoveTransform(TransformId id) void TransformManager::SetParent( TransformId id, TransformId parentId ) { DALI_ASSERT_ALWAYS( id != parentId ); - mParent[ mIds[id] ] = parentId; + TransformId index = mIds[id]; + mParent[ index ] = parentId; + mComponentDirty[ index ] = true; mReorder = true; } @@ -145,7 +175,7 @@ Matrix& TransformManager::GetWorldMatrix( TransformId id ) void TransformManager::SetInheritPosition( TransformId id, bool inherit ) { - unsigned int index = mIds[id]; + TransformId index = mIds[id]; if( inherit ) { mInheritanceMode[ index ] |= INHERIT_POSITION; @@ -160,7 +190,7 @@ void TransformManager::SetInheritPosition( TransformId id, bool inherit ) void TransformManager::SetInheritScale( TransformId id, bool inherit ) { - unsigned int index = mIds[id]; + TransformId index = mIds[id]; if( inherit ) { mInheritanceMode[ index ] |= INHERIT_SCALE; @@ -175,7 +205,7 @@ void TransformManager::SetInheritScale( TransformId id, bool inherit ) void TransformManager::SetInheritOrientation( TransformId id, bool inherit ) { - unsigned int index = mIds[id]; + TransformId index = mIds[id]; if( inherit ) { mInheritanceMode[ index ] |= INHERIT_ORIENTATION; @@ -198,8 +228,10 @@ void TransformManager::ResetToBaseValue() } } -void TransformManager::Update() +bool TransformManager::Update() { + bool componentsChanged = false; + if( mReorder ) { //If some transform component has change its parent or has been removed since last update @@ -209,26 +241,24 @@ void TransformManager::Update() } //Iterate through all components to compute its world matrix - Vector3 anchorPosition; + Vector3 centerPosition; Vector3 localPosition; - Vector3 half( 0.5f,0.5f,0.5f ); + const Vector3 half( 0.5f,0.5f,0.5f ); + const Vector3 topLeft( 0.0f, 0.0f, 0.5f ); for( unsigned int i(0); i