Merge "Add BuildPickingRay to devel api" into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / update / manager / transform-manager-property.h
index 609cac7..fe5fec4 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef TRANSFORM_MANAGER_PROPERTY_H_
-#define TRANSFORM_MANAGER_PROPERTY_H_
+#ifndef DALI_INTERNAL_UPDATE_TRANSFORM_MANAGER_PROPERTY_H
+#define DALI_INTERNAL_UPDATE_TRANSFORM_MANAGER_PROPERTY_H
 
 /*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 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.
@@ -18,8 +18,8 @@
  *
  */
 
-#include <dali/internal/update/manager/transform-manager.h>
 #include <dali/internal/update/common/animatable-property.h>
+#include <dali/internal/update/manager/transform-manager.h>
 
 namespace Dali
 {
@@ -27,17 +27,13 @@ namespace Internal
 {
 namespace SceneGraph
 {
-
-template <typename T>
+template<typename T>
 struct TransformManagerPropertyHandler : public AnimatablePropertyBase
 {
   /**
    * Constructor
    */
-  TransformManagerPropertyHandler()
-  :mTxManager(nullptr),
-   mId( INVALID_TRANSFORM_ID )
-  {}
+  TransformManagerPropertyHandler() = default;
 
   /**
    * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
@@ -47,17 +43,20 @@ struct TransformManagerPropertyHandler : public AnimatablePropertyBase
   /**
    * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
    */
-  virtual T& Get( BufferIndex bufferIndex ) = 0;
+  virtual T& Get(BufferIndex bufferIndex) = 0;
 
   /**
    * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
    */
-  virtual const T& Get( BufferIndex bufferIndex ) const = 0;
+  virtual const T& Get(BufferIndex bufferIndex) const = 0;
 
   /**
    * @copydoc Dali::PropertyInput::GetVector3()
    */
-  const Vector3& GetVector3( BufferIndex bufferIndex ) const override{ return Vector3::ZERO; }
+  const Vector3& GetVector3(BufferIndex bufferIndex) const override
+  {
+    return Vector3::ZERO;
+  }
 
   /**
    * Retrieve a component of property
@@ -65,7 +64,7 @@ struct TransformManagerPropertyHandler : public AnimatablePropertyBase
    */
   virtual const float& GetFloatComponent(uint32_t component) const
   {
-    DALI_ASSERT_DEBUG( 0 && "Invalid call");
+    DALI_ASSERT_DEBUG(0 && "Invalid call");
 
     static const float value = 0.0f;
     return value;
@@ -84,7 +83,9 @@ struct TransformManagerPropertyHandler : public AnimatablePropertyBase
    * @param[in] value The new value of the component
    * @param[in] component The component of the property
    */
-  virtual void SetFloatComponent( float value, uint32_t component){}
+  virtual void SetFloatComponent(float value, uint32_t component)
+  {
+  }
 
   /**
    * @copydoc Dali::AnimatableProperty::Bake()
@@ -96,22 +97,30 @@ struct TransformManagerPropertyHandler : public AnimatablePropertyBase
    * @param[in] value The new value of the component
    * @param[in] component The component of the property
    */
-  virtual void BakeFloatComponent( float value, uint32_t component){}
+  virtual void BakeFloatComponent(float value, uint32_t component)
+  {
+  }
 
   /**
    * @copydoc Dali::AnimatableProperty::BakeX()
    */
-  virtual void BakeX(BufferIndex bufferIndex, float value){}
+  virtual void BakeX(BufferIndex bufferIndex, float value)
+  {
+  }
 
   /**
    * @copydoc Dali::AnimatableProperty::BakeY()
    */
-  virtual void BakeY(BufferIndex bufferIndex, float value){}
+  virtual void BakeY(BufferIndex bufferIndex, float value)
+  {
+  }
 
   /**
    * @copydoc Dali::AnimatableProperty::BakeZ()
    */
-  virtual void BakeZ(BufferIndex bufferIndex, float value){}
+  virtual void BakeZ(BufferIndex bufferIndex, float value)
+  {
+  }
 
   /**
    * @copydoc Dali::AnimatableProperty::BakeRelative()
@@ -126,22 +135,16 @@ struct TransformManagerPropertyHandler : public AnimatablePropertyBase
   /**
    * @copydoc Dali::AnimatableProperty::ResetToBaseValue()
    */
-  void ResetToBaseValue(BufferIndex updateBufferIndex) override{}
+  void ResetToBaseValue(BufferIndex updateBufferIndex) override
+  {
+  }
 
   /**
    * @copydoc Dali::AnimatableProperty::IsClean()
    */
-  bool IsClean() const override{ return false; }
-
-  /**
-   * Initializes the property
-   * @param[in] transformManager Pointer to the transform manager
-   * @param[in] Id of the transformation the property is associated with
-   */
-  void Initialize( TransformManager* transformManager, TransformId id )
+  bool IsClean() const override
   {
-    mTxManager = transformManager;
-    mId = id;
+    return false;
   }
 
   /**
@@ -151,166 +154,196 @@ struct TransformManagerPropertyHandler : public AnimatablePropertyBase
   {
     return true;
   }
-
-  TransformManager* mTxManager;
-  TransformId mId;
 };
 
-struct TransformManagerPropertyVector3 : public TransformManagerPropertyHandler<Vector3>
+template<TransformManagerProperty PropertyT, size_t TxMgrDataOffset>
+struct TransformManagerPropertyVector3 final : public TransformManagerPropertyHandler<Vector3>
 {
+  enum
+  {
+    TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
+  };
+  TransformManagerData* GetTxManagerData()
+  {
+    return reinterpret_cast<TransformManagerData*>(
+      reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
+  }
+  const TransformManagerData* GetTxManagerData() const
+  {
+    return reinterpret_cast<const TransformManagerData*>(
+      reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
+  }
 
-  TransformManagerPropertyVector3(TransformManagerProperty property)
-  :TransformManagerPropertyHandler(),
-   mProperty( property )
-  {}
+  TransformManagerPropertyVector3() = default;
 
   Dali::Property::Type GetType() const override
   {
     return Dali::PropertyTypes::Get<Vector3>();
   }
 
-  Vector3& Get( BufferIndex bufferIndex ) override
+  Vector3& Get(BufferIndex bufferIndex) override
   {
-    return mTxManager->GetVector3PropertyValue( mId, mProperty );
+    return GetTxManagerData()->Manager()->GetVector3PropertyValue(GetTxManagerData()->Id(), PropertyT);
   }
 
-  const Vector3& Get( BufferIndex bufferIndex ) const override
+  const Vector3& Get(BufferIndex bufferIndex) const override
   {
-    const TransformManager* txManager = mTxManager;
-    return txManager->GetVector3PropertyValue( mId, mProperty );
+    return GetTxManagerData()->Manager()->GetVector3PropertyValue(GetTxManagerData()->Id(), PropertyT);
   }
 
-  const Vector3& GetVector3( BufferIndex bufferIndex ) const override
+  const Vector3& GetVector3(BufferIndex bufferIndex) const override
   {
     return Get(bufferIndex);
   }
 
-  const float& GetFloatComponent( uint32_t component ) const override
+  const float& GetFloatComponent(uint32_t component) const override
   {
-    const TransformManager* txManager = mTxManager;
-    return txManager->GetVector3PropertyComponentValue( mId, mProperty, component );
+    return GetTxManagerData()->Manager()->GetVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, component);
   }
 
   void Set(BufferIndex bufferIndex, const Vector3& value) override
   {
-    mTxManager->SetVector3PropertyValue( mId, mProperty, value );
+    GetTxManagerData()->Manager()->SetVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
   }
 
   void SetComponent(BufferIndex bufferIndex, float value, uint32_t component)
   {
-    mTxManager->SetVector3PropertyComponentValue( mId, mProperty, value, component);
+    GetTxManagerData()->Manager()->SetVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
   }
 
   void BakeComponent(BufferIndex bufferIndex, float value, uint32_t component)
   {
-    mTxManager->BakeVector3PropertyComponentValue( mId, mProperty, value, component);
+    GetTxManagerData()->Manager()->BakeVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
   }
 
   void Bake(BufferIndex bufferIndex, const Vector3& value) override
   {
-    mTxManager->BakeVector3PropertyValue(mId, mProperty, value );
+    GetTxManagerData()->Manager()->BakeVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
   }
 
   void BakeX(BufferIndex bufferIndex, float value) override
   {
-    mTxManager->BakeXVector3PropertyValue(mId, mProperty, value );
+    GetTxManagerData()->Manager()->BakeXVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
   }
 
   void BakeY(BufferIndex bufferIndex, float value) override
   {
-    mTxManager->BakeYVector3PropertyValue(mId, mProperty, value );
+    GetTxManagerData()->Manager()->BakeYVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
   }
 
   void BakeZ(BufferIndex bufferIndex, float value) override
   {
-    mTxManager->BakeZVector3PropertyValue(mId, mProperty, value );
+    GetTxManagerData()->Manager()->BakeZVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
   }
 
-  void SetFloatComponent( float value, uint32_t component) override
+  void SetFloatComponent(float value, uint32_t component) override
   {
-    mTxManager->SetVector3PropertyComponentValue( mId, mProperty, value, component);
+    GetTxManagerData()->Manager()->SetVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
   }
 
-  void BakeFloatComponent( float value, uint32_t component ) override
+  void BakeFloatComponent(float value, uint32_t component) override
   {
-    mTxManager->BakeVector3PropertyComponentValue( mId, mProperty, value, component);
+    GetTxManagerData()->Manager()->BakeVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
   }
 
   void BakeRelative(BufferIndex bufferIndex, const Vector3& value) override
   {
-    mTxManager->BakeRelativeVector3PropertyValue(mId, mProperty, value );
+    GetTxManagerData()->Manager()->BakeRelativeVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
   }
 
   void BakeRelativeMultiply(BufferIndex bufferIndex, const Vector3& value) override
   {
-    mTxManager->BakeMultiplyVector3PropertyValue(mId, mProperty, value );
+    GetTxManagerData()->Manager()->BakeMultiplyVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
   }
-
-  TransformManagerProperty mProperty;
 };
 
-class TransformManagerPropertyQuaternion : public TransformManagerPropertyHandler<Quaternion>
+template<size_t TxMgrDataOffset>
+class TransformManagerPropertyQuaternion final : public TransformManagerPropertyHandler<Quaternion>
 {
 public:
+  enum
+  {
+    TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
+  };
+  TransformManagerData* GetTxManagerData()
+  {
+    return reinterpret_cast<TransformManagerData*>(
+      reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
+  }
+  const TransformManagerData* GetTxManagerData() const
+  {
+    return reinterpret_cast<const TransformManagerData*>(
+      reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
+  }
 
-  TransformManagerPropertyQuaternion()
-  :TransformManagerPropertyHandler()
-  {}
+  TransformManagerPropertyQuaternion() = default;
 
   Dali::Property::Type GetType() const override
   {
     return Dali::PropertyTypes::Get<Quaternion>();
   }
 
-  Quaternion& Get( BufferIndex bufferIndex ) override
+  Quaternion& Get(BufferIndex bufferIndex) override
   {
-    return mTxManager->GetQuaternionPropertyValue( mId );
+    return GetTxManagerData()->Manager()->GetQuaternionPropertyValue(GetTxManagerData()->Id());
   }
 
-  const Quaternion& Get( BufferIndex bufferIndex ) const override
+  const Quaternion& Get(BufferIndex bufferIndex) const override
   {
-    const TransformManager* txManager = mTxManager;
-    return txManager->GetQuaternionPropertyValue( mId );
+    return GetTxManagerData()->Manager()->GetQuaternionPropertyValue(GetTxManagerData()->Id());
   }
 
   void Set(BufferIndex bufferIndex, const Quaternion& value) override
   {
-    return mTxManager->SetQuaternionPropertyValue( mId, value );
+    return GetTxManagerData()->Manager()->SetQuaternionPropertyValue(GetTxManagerData()->Id(), value);
   }
 
   void Bake(BufferIndex bufferIndex, const Quaternion& value) override
   {
-    return mTxManager->BakeQuaternionPropertyValue( mId, value );
+    return GetTxManagerData()->Manager()->BakeQuaternionPropertyValue(GetTxManagerData()->Id(), value);
   }
 
   void BakeRelative(BufferIndex bufferIndex, const Quaternion& value) override
   {
-    return mTxManager->BakeRelativeQuaternionPropertyValue( mId, value );
+    return GetTxManagerData()->Manager()->BakeRelativeQuaternionPropertyValue(GetTxManagerData()->Id(), value);
   }
 
-  const Quaternion& GetQuaternion( BufferIndex bufferIndex ) const override
+  const Quaternion& GetQuaternion(BufferIndex bufferIndex) const override
   {
     return Get(bufferIndex);
   }
-
 };
 
 /**
  * A Vector3 property used as input.
  */
+template<size_t TxMgrDataOffset>
 class TransformManagerVector3Input : public PropertyInputImpl
 {
 public:
+  enum
+  {
+    TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
+  };
+  TransformManagerData* GetTxManagerData()
+  {
+    return reinterpret_cast<TransformManagerData*>(
+      reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
+  }
+  const TransformManagerData* GetTxManagerData() const
+  {
+    return reinterpret_cast<const TransformManagerData*>(
+      reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
+  }
 
   /**
    * Create an TransformManagerVector3Input
    */
-  TransformManagerVector3Input( TransformManagerProperty property, const Vector3& initialValue )
-  :mTxManager(nullptr),
-   mId(INVALID_TRANSFORM_ID),
-   mProperty(property),
-   mValue(initialValue)
-  {}
+  TransformManagerVector3Input(TransformManagerProperty property, const Vector3& initialValue)
+  : mProperty(property),
+    mValue(initialValue)
+  {
+  }
 
   /**
    * Virtual destructor.
@@ -356,20 +389,18 @@ public:
    */
   void ComputeTransformComponent() const
   {
-    const TransformManager* txManager = mTxManager;
-    if( txManager )
+    auto transformManagerData = GetTxManagerData();
+    auto id                   = transformManagerData->Id();
+    if(id != INVALID_TRANSFORM_ID)
     {
-      const Matrix& worldMatrix = txManager->GetWorldMatrix(mId);
-
-      if( mProperty == TRANSFORM_PROPERTY_WORLD_POSITION )
+      const Matrix& worldMatrix = transformManagerData->Manager()->GetWorldMatrix(id);
+      if(mProperty == TRANSFORM_PROPERTY_WORLD_POSITION)
       {
         mValue = worldMatrix.GetTranslation3();
       }
-      else if( mProperty == TRANSFORM_PROPERTY_WORLD_SCALE )
+      else if(mProperty == TRANSFORM_PROPERTY_WORLD_SCALE)
       {
-        Vector3 position;
-        Quaternion orientation;
-        worldMatrix.GetTransformComponents(position, orientation, mValue);
+        mValue = worldMatrix.GetScale();
       }
     }
   }
@@ -377,7 +408,7 @@ public:
   /**
    * @copydoc Dali::PropertyInput::GetVector3()
    */
-  const Vector3& GetVector3( BufferIndex bufferIndex ) const override
+  const Vector3& GetVector3(BufferIndex bufferIndex) const override
   {
     ComputeTransformComponent();
     return mValue;
@@ -386,7 +417,7 @@ public:
   /**
    * @copydoc Dali::PropertyInput::GetConstraintInputVector3()
    */
-  const Vector3& GetConstraintInputVector3( BufferIndex bufferIndex ) const override
+  const Vector3& GetConstraintInputVector3(BufferIndex bufferIndex) const override
   {
     ComputeTransformComponent();
     return mValue;
@@ -395,7 +426,7 @@ public:
   /**
    * @copydoc Dali::SceneGraph::PropertyInterface::Get()
    */
-  Vector3& Get( BufferIndex bufferIndex )
+  Vector3& Get(BufferIndex bufferIndex)
   {
     ComputeTransformComponent();
     return mValue;
@@ -404,7 +435,7 @@ public:
   /**
    * @copydoc Dali::SceneGraph::PropertyInterface::Get()
    */
-  const Vector3& Get( BufferIndex bufferIndex ) const
+  const Vector3& Get(BufferIndex bufferIndex) const
   {
     ComputeTransformComponent();
     return mValue;
@@ -415,24 +446,13 @@ public:
    * @param[in] bufferIndex The buffer to read.
    * @return The property value.
    */
-  const Vector3& operator[]( BufferIndex bufferIndex ) const
+  const Vector3& operator[](BufferIndex bufferIndex) const
   {
     ComputeTransformComponent();
     return mValue;
   }
 
   /**
-   * Initializes the property
-   * @param[in] transformManager Pointer to the transform manager
-   * @param[in] Id of the transformation the property is associated with
-   */
-  void Initialize( TransformManager* transformManager, TransformId id )
-  {
-    mTxManager = transformManager;
-    mId = id;
-  }
-
-  /**
    * @copydoc Dali::Internal::PropertyInputImpl::IsTransformManagerProperty()
    */
   bool IsTransformManagerProperty() const override
@@ -441,42 +461,40 @@ public:
   }
 
 private:
-
-  // Undefined
-  TransformManagerVector3Input(const TransformManagerVector3Input& property);
-
-  // Undefined
-  TransformManagerVector3Input& operator=(const TransformManagerVector3Input& rhs);
+  TransformManagerVector3Input(const TransformManagerVector3Input& property) = delete;
+  TransformManagerVector3Input& operator=(const TransformManagerVector3Input& rhs) = delete;
 
 public:
-
-  TransformManager* mTxManager;
-  TransformId mId;
   TransformManagerProperty mProperty;
-  mutable Vector3 mValue;
+  mutable Vector3          mValue;
 };
 
 /**
  * A Quaternion property used as input.
  */
-class TransformManagerQuaternionInput : public PropertyInputImpl
+template<size_t TxMgrDataOffset>
+class TransformManagerQuaternionInput final : public PropertyInputImpl
 {
 public:
-
-  /**
-   * Constructor
-   */
-  TransformManagerQuaternionInput()
-  :mTxManager(nullptr),
-   mId(INVALID_TRANSFORM_ID),
-   mValue(1.0f,0.0f,0.0f,0.0f)
+  enum
   {
+    TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
+  };
+  TransformManagerData* GetTxManagerData()
+  {
+    return reinterpret_cast<TransformManagerData*>(
+      reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
+  }
+  const TransformManagerData* GetTxManagerData() const
+  {
+    return reinterpret_cast<const TransformManagerData*>(
+      reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
   }
 
   /**
-   * Virtual destructor.
+   * Constructor
    */
-  ~TransformManagerQuaternionInput() override = default;
+  TransformManagerQuaternionInput() = default;
 
   /**
    * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
@@ -517,11 +535,12 @@ public:
    */
   void ComputeTransformComponent() const
   {
-    const TransformManager* txManager = mTxManager;
-    if( txManager )
+    auto transformManagerData = GetTxManagerData();
+    auto id                   = transformManagerData->Id();
+    if(id != INVALID_TRANSFORM_ID)
     {
-      const Matrix& worldMatrix = txManager->GetWorldMatrix(mId);
-      Vector3 position, scale;
+      const Matrix& worldMatrix = transformManagerData->Manager()->GetWorldMatrix(id);
+      Vector3       position, scale;
       worldMatrix.GetTransformComponents(position, mValue, scale);
     }
   }
@@ -529,7 +548,7 @@ public:
   /**
    * @copydoc Dali::PropertyInput::GetQuaternion()
    */
-  const Quaternion& GetQuaternion( BufferIndex bufferIndex ) const override
+  const Quaternion& GetQuaternion(BufferIndex bufferIndex) const override
   {
     ComputeTransformComponent();
     return mValue;
@@ -538,7 +557,7 @@ public:
   /**
    * @copydoc Dali::PropertyInput::GetConstraintInputQuaternion()
    */
-  const Quaternion& GetConstraintInputQuaternion( BufferIndex bufferIndex ) const override
+  const Quaternion& GetConstraintInputQuaternion(BufferIndex bufferIndex) const override
   {
     ComputeTransformComponent();
     return mValue;
@@ -547,7 +566,7 @@ public:
   /**
    * @copydoc Dali::SceneGraph::PropertyInterface::Get()
    */
-  Quaternion& Get( BufferIndex bufferIndex )
+  Quaternion& Get(BufferIndex bufferIndex)
   {
     ComputeTransformComponent();
     return mValue;
@@ -556,7 +575,7 @@ public:
   /**
    * @copydoc Dali::SceneGraph::PropertyInterface::Get()
    */
-  const Quaternion& Get( BufferIndex bufferIndex ) const
+  const Quaternion& Get(BufferIndex bufferIndex) const
   {
     ComputeTransformComponent();
     return mValue;
@@ -567,24 +586,13 @@ public:
    * @param[in] bufferIndex The buffer to read.
    * @return The property value.
    */
-  const Quaternion& operator[]( BufferIndex bufferIndex) const
+  const Quaternion& operator[](BufferIndex bufferIndex) const
   {
     ComputeTransformComponent();
     return mValue;
   }
 
   /**
-   * Initializes the property
-   * @param[in] transformManager Pointer to the transform manager
-   * @param[in] Id of the transformation the property is associated with
-   */
-  void Initialize( TransformManager* transformManager, TransformId id )
-  {
-    mTxManager = transformManager;
-    mId = id;
-  }
-
-  /**
    * @copydoc Dali::Internal::PropertyInputImpl::IsTransformManagerProperty()
    */
   bool IsTransformManagerProperty() const override
@@ -593,40 +601,39 @@ public:
   }
 
 private:
-
-  // Undefined
-  TransformManagerQuaternionInput(const TransformManagerQuaternionInput& property);
-
-  // Undefined
-  TransformManagerQuaternionInput& operator=(const TransformManagerQuaternionInput& rhs);
+  TransformManagerQuaternionInput(const TransformManagerQuaternionInput& property) = delete;
+  TransformManagerQuaternionInput& operator=(const TransformManagerQuaternionInput& rhs) = delete;
 
 public:
-
-  TransformManager* mTxManager;
-  TransformId mId;
   mutable Quaternion mValue;
 };
 
 /**
  * A Matrix property used as input.
  */
-class TransformManagerMatrixInput : public PropertyInputImpl
+template<size_t TxMgrDataOffset>
+class TransformManagerMatrixInput final : public PropertyInputImpl
 {
 public:
-
-  /**
-   * Constructor
-   */
-  TransformManagerMatrixInput()
-  :mTxManager(nullptr),
-   mId(INVALID_TRANSFORM_ID)
+  enum
   {
+    TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
+  };
+  TransformManagerData* GetTxManagerData()
+  {
+    return reinterpret_cast<TransformManagerData*>(
+      reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
+  }
+  const TransformManagerData* GetTxManagerData() const
+  {
+    return reinterpret_cast<const TransformManagerData*>(
+      reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
   }
 
   /**
-   * Virtual destructor.
+   * Constructor
    */
-  ~TransformManagerMatrixInput() override = default;
+  TransformManagerMatrixInput() = default;
 
   /**
    * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
@@ -664,46 +671,48 @@ public:
   /**
    * @copydoc Dali::PropertyInput::GetMatrix()
    */
-  const Matrix& GetMatrix( BufferIndex bufferIndex ) const override
+  const Matrix& GetMatrix(BufferIndex bufferIndex) const override
   {
-    const TransformManager* txManager = mTxManager;
-    if( txManager )
+    auto transformManagerData = GetTxManagerData();
+    auto id                   = transformManagerData->Id();
+    if(id != INVALID_TRANSFORM_ID)
     {
-      return txManager->GetWorldMatrix(mId);
+      return transformManagerData->Manager()->GetWorldMatrix(id);
     }
-
     return Matrix::IDENTITY;
   }
 
   /**
    * @copydoc Dali::PropertyInput::GetConstraintInputMatrix()
    */
-  const Matrix& GetConstraintInputMatrix( BufferIndex bufferIndex ) const override
+  const Matrix& GetConstraintInputMatrix(BufferIndex bufferIndex) const override
   {
-    const TransformManager* txManager = mTxManager;
-    if( txManager )
+    auto transformManagerData = GetTxManagerData();
+    auto id                   = transformManagerData->Id();
+    if(id != INVALID_TRANSFORM_ID)
     {
-      return txManager->GetWorldMatrix(mId);
+      return transformManagerData->Manager()->GetWorldMatrix(id);
     }
-
     return Matrix::IDENTITY;
   }
 
   /**
    * @copydoc Dali::SceneGraph::PropertyInterface::Get()
    */
-  Matrix& Get( BufferIndex bufferIndex )
+  Matrix& Get(BufferIndex bufferIndex)
   {
-    DALI_ASSERT_ALWAYS( mTxManager != nullptr );
-    return mTxManager->GetWorldMatrix(mId);
+    auto transformManagerData = GetTxManagerData();
+    auto id                   = transformManagerData->Id();
+    DALI_ASSERT_ALWAYS(id != INVALID_TRANSFORM_ID);
+    return transformManagerData->Manager()->GetWorldMatrix(id);
   }
 
   /**
    * @copydoc Dali::SceneGraph::PropertyInterface::Get()
    */
-  const Matrix& Get( BufferIndex bufferIndex ) const
+  const Matrix& Get(BufferIndex bufferIndex) const
   {
-    return GetMatrix( bufferIndex );
+    return GetMatrix(bufferIndex);
   }
 
   /**
@@ -711,15 +720,9 @@ public:
    * @param[in] bufferIndex The buffer to read.
    * @return The property value.
    */
-  const Matrix& operator[]( BufferIndex bufferIndex ) const
-  {
-    return GetMatrix( bufferIndex );
-  }
-
-  void Initialize( TransformManager* transformManager, TransformId id )
+  const Matrix& operator[](BufferIndex bufferIndex) const
   {
-    mTxManager = transformManager;
-    mId = id;
+    return GetMatrix(bufferIndex);
   }
 
   /**
@@ -731,22 +734,12 @@ public:
   }
 
 private:
-
-  // Undefined
-  TransformManagerMatrixInput(const TransformManagerMatrixInput& property);
-
-  // Undefined
-  TransformManagerMatrixInput& operator=(const TransformManagerMatrixInput& rhs);
-
-public:
-
-  TransformManager* mTxManager;
-  TransformId mId;
+  TransformManagerMatrixInput(const TransformManagerMatrixInput& property) = delete;
+  TransformManagerMatrixInput& operator=(const TransformManagerMatrixInput& rhs) = delete;
 };
 
+} // namespace SceneGraph
+} // namespace Internal
+} // namespace Dali
 
-} //namespace SceneGraph
-} //namespace Internal
-} //namespace Dali
-
-#endif // TRANSFORM_MANAGER_PROPERTY_H_
+#endif // DALI_INTERNAL_UPDATE_TRANSFORM_MANAGER_PROPERTY_H