Refactor Node class and TransformManagerproperty* class to optimize Object Size. 15/251315/3
authorSubhransu Mohanty <sub.mohanty@samsung.com>
Tue, 12 Jan 2021 04:35:27 +0000 (13:35 +0900)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Mon, 25 Jan 2021 10:10:58 +0000 (10:10 +0000)
Introduced TransformManagerData and keep a pointer instead of keeping
{TxManager, TxId} pair. hence reducing 8bytes per member.

Also templated  TransformManagerPropertyVector3 based on TransformManagerProperty to
avoid storing the Property type in the class object.

This patch reduced the Node size from 976 byte to 896 byte, saving 80 bytes per object.

Change-Id: Ib608dfe73c12861277379208a8506904eedfc6e9

dali/internal/update/manager/transform-manager-property.h
dali/internal/update/manager/transform-manager.h
dali/internal/update/manager/update-proxy-impl.cpp
dali/internal/update/nodes/node.cpp
dali/internal/update/nodes/node.h

index 609cac7..5b8f7c4 100644 (file)
@@ -34,10 +34,7 @@ struct TransformManagerPropertyHandler : public AnimatablePropertyBase
   /**
    * Constructor
    */
-  TransformManagerPropertyHandler()
-  :mTxManager(nullptr),
-   mId( INVALID_TRANSFORM_ID )
-  {}
+  TransformManagerPropertyHandler() = default;
 
   /**
    * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
@@ -138,10 +135,10 @@ struct TransformManagerPropertyHandler : public AnimatablePropertyBase
    * @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 )
+  void Initialize( TransformManagerData* data)
   {
-    mTxManager = transformManager;
-    mId = id;
+    DALI_ASSERT_ALWAYS( data != nullptr && data->Manager() != nullptr);
+    mTxManagerData = data;
   }
 
   /**
@@ -152,17 +149,14 @@ struct TransformManagerPropertyHandler : public AnimatablePropertyBase
     return true;
   }
 
-  TransformManager* mTxManager;
-  TransformId mId;
+  TransformManagerData* mTxManagerData{nullptr};
 };
 
-struct TransformManagerPropertyVector3 : public TransformManagerPropertyHandler<Vector3>
+template<TransformManagerProperty PropertyT>
+struct TransformManagerPropertyVector3 final : public TransformManagerPropertyHandler<Vector3>
 {
 
-  TransformManagerPropertyVector3(TransformManagerProperty property)
-  :TransformManagerPropertyHandler(),
-   mProperty( property )
-  {}
+  TransformManagerPropertyVector3() = default;
 
   Dali::Property::Type GetType() const override
   {
@@ -171,13 +165,12 @@ struct TransformManagerPropertyVector3 : public TransformManagerPropertyHandler<
 
   Vector3& Get( BufferIndex bufferIndex ) override
   {
-    return mTxManager->GetVector3PropertyValue( mId, mProperty );
+    return mTxManagerData->Manager()->GetVector3PropertyValue( mTxManagerData->Id(), PropertyT );
   }
 
   const Vector3& Get( BufferIndex bufferIndex ) const override
   {
-    const TransformManager* txManager = mTxManager;
-    return txManager->GetVector3PropertyValue( mId, mProperty );
+    return mTxManagerData->Manager()->GetVector3PropertyValue( mTxManagerData->Id(), PropertyT );
   }
 
   const Vector3& GetVector3( BufferIndex bufferIndex ) const override
@@ -187,75 +180,70 @@ struct TransformManagerPropertyVector3 : public TransformManagerPropertyHandler<
 
   const float& GetFloatComponent( uint32_t component ) const override
   {
-    const TransformManager* txManager = mTxManager;
-    return txManager->GetVector3PropertyComponentValue( mId, mProperty, component );
+    return mTxManagerData->Manager()->GetVector3PropertyComponentValue( mTxManagerData->Id(), PropertyT, component );
   }
 
   void Set(BufferIndex bufferIndex, const Vector3& value) override
   {
-    mTxManager->SetVector3PropertyValue( mId, mProperty, value );
+    mTxManagerData->Manager()->SetVector3PropertyValue( mTxManagerData->Id(), PropertyT, value );
   }
 
   void SetComponent(BufferIndex bufferIndex, float value, uint32_t component)
   {
-    mTxManager->SetVector3PropertyComponentValue( mId, mProperty, value, component);
+    mTxManagerData->Manager()->SetVector3PropertyComponentValue( mTxManagerData->Id(), PropertyT, value, component);
   }
 
   void BakeComponent(BufferIndex bufferIndex, float value, uint32_t component)
   {
-    mTxManager->BakeVector3PropertyComponentValue( mId, mProperty, value, component);
+    mTxManagerData->Manager()->BakeVector3PropertyComponentValue( mTxManagerData->Id(), PropertyT, value, component);
   }
 
   void Bake(BufferIndex bufferIndex, const Vector3& value) override
   {
-    mTxManager->BakeVector3PropertyValue(mId, mProperty, value );
+    mTxManagerData->Manager()->BakeVector3PropertyValue(mTxManagerData->Id(), PropertyT, value );
   }
 
   void BakeX(BufferIndex bufferIndex, float value) override
   {
-    mTxManager->BakeXVector3PropertyValue(mId, mProperty, value );
+    mTxManagerData->Manager()->BakeXVector3PropertyValue(mTxManagerData->Id(), PropertyT, value );
   }
 
   void BakeY(BufferIndex bufferIndex, float value) override
   {
-    mTxManager->BakeYVector3PropertyValue(mId, mProperty, value );
+    mTxManagerData->Manager()->BakeYVector3PropertyValue(mTxManagerData->Id(), PropertyT, value );
   }
 
   void BakeZ(BufferIndex bufferIndex, float value) override
   {
-    mTxManager->BakeZVector3PropertyValue(mId, mProperty, value );
+    mTxManagerData->Manager()->BakeZVector3PropertyValue(mTxManagerData->Id(), PropertyT, value );
   }
 
   void SetFloatComponent( float value, uint32_t component) override
   {
-    mTxManager->SetVector3PropertyComponentValue( mId, mProperty, value, component);
+    mTxManagerData->Manager()->SetVector3PropertyComponentValue( mTxManagerData->Id(), PropertyT, value, component);
   }
 
   void BakeFloatComponent( float value, uint32_t component ) override
   {
-    mTxManager->BakeVector3PropertyComponentValue( mId, mProperty, value, component);
+    mTxManagerData->Manager()->BakeVector3PropertyComponentValue( mTxManagerData->Id(), PropertyT, value, component);
   }
 
   void BakeRelative(BufferIndex bufferIndex, const Vector3& value) override
   {
-    mTxManager->BakeRelativeVector3PropertyValue(mId, mProperty, value );
+    mTxManagerData->Manager()->BakeRelativeVector3PropertyValue(mTxManagerData->Id(), PropertyT, value );
   }
 
   void BakeRelativeMultiply(BufferIndex bufferIndex, const Vector3& value) override
   {
-    mTxManager->BakeMultiplyVector3PropertyValue(mId, mProperty, value );
+    mTxManagerData->Manager()->BakeMultiplyVector3PropertyValue(mTxManagerData->Id(), PropertyT, value );
   }
-
-  TransformManagerProperty mProperty;
 };
 
-class TransformManagerPropertyQuaternion : public TransformManagerPropertyHandler<Quaternion>
+class TransformManagerPropertyQuaternion final : public TransformManagerPropertyHandler<Quaternion>
 {
 public:
 
-  TransformManagerPropertyQuaternion()
-  :TransformManagerPropertyHandler()
-  {}
+  TransformManagerPropertyQuaternion() = default;
 
   Dali::Property::Type GetType() const override
   {
@@ -264,28 +252,27 @@ public:
 
   Quaternion& Get( BufferIndex bufferIndex ) override
   {
-    return mTxManager->GetQuaternionPropertyValue( mId );
+    return mTxManagerData->Manager()->GetQuaternionPropertyValue( mTxManagerData->Id() );
   }
 
   const Quaternion& Get( BufferIndex bufferIndex ) const override
   {
-    const TransformManager* txManager = mTxManager;
-    return txManager->GetQuaternionPropertyValue( mId );
+    return mTxManagerData->Manager()->GetQuaternionPropertyValue( mTxManagerData->Id() );
   }
 
   void Set(BufferIndex bufferIndex, const Quaternion& value) override
   {
-    return mTxManager->SetQuaternionPropertyValue( mId, value );
+    return mTxManagerData->Manager()->SetQuaternionPropertyValue( mTxManagerData->Id(), value );
   }
 
   void Bake(BufferIndex bufferIndex, const Quaternion& value) override
   {
-    return mTxManager->BakeQuaternionPropertyValue( mId, value );
+    return mTxManagerData->Manager()->BakeQuaternionPropertyValue( mTxManagerData->Id(), value );
   }
 
   void BakeRelative(BufferIndex bufferIndex, const Quaternion& value) override
   {
-    return mTxManager->BakeRelativeQuaternionPropertyValue( mId, value );
+    return mTxManagerData->Manager()->BakeRelativeQuaternionPropertyValue( mTxManagerData->Id(), value );
   }
 
   const Quaternion& GetQuaternion( BufferIndex bufferIndex ) const override
@@ -306,9 +293,7 @@ public:
    * Create an TransformManagerVector3Input
    */
   TransformManagerVector3Input( TransformManagerProperty property, const Vector3& initialValue )
-  :mTxManager(nullptr),
-   mId(INVALID_TRANSFORM_ID),
-   mProperty(property),
+  :mProperty(property),
    mValue(initialValue)
   {}
 
@@ -356,10 +341,9 @@ public:
    */
   void ComputeTransformComponent() const
   {
-    const TransformManager* txManager = mTxManager;
-    if( txManager )
+    if( mTxManagerData )
     {
-      const Matrix& worldMatrix = txManager->GetWorldMatrix(mId);
+      const Matrix& worldMatrix = mTxManagerData->Manager()->GetWorldMatrix(mTxManagerData->Id());
 
       if( mProperty == TRANSFORM_PROPERTY_WORLD_POSITION )
       {
@@ -426,10 +410,10 @@ public:
    * @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 )
+  void Initialize( TransformManagerData* data)
   {
-    mTxManager = transformManager;
-    mId = id;
+    DALI_ASSERT_ALWAYS( data != nullptr && data->Manager() != nullptr);
+    mTxManagerData = data;
   }
 
   /**
@@ -450,8 +434,7 @@ private:
 
 public:
 
-  TransformManager* mTxManager;
-  TransformId mId;
+  TransformManagerData* mTxManagerData{nullptr};
   TransformManagerProperty mProperty;
   mutable Vector3 mValue;
 };
@@ -459,24 +442,14 @@ public:
 /**
  * A Quaternion property used as input.
  */
-class TransformManagerQuaternionInput : public PropertyInputImpl
+class TransformManagerQuaternionInput final : public PropertyInputImpl
 {
 public:
 
   /**
    * Constructor
    */
-  TransformManagerQuaternionInput()
-  :mTxManager(nullptr),
-   mId(INVALID_TRANSFORM_ID),
-   mValue(1.0f,0.0f,0.0f,0.0f)
-  {
-  }
-
-  /**
-   * Virtual destructor.
-   */
-  ~TransformManagerQuaternionInput() override = default;
+  TransformManagerQuaternionInput() = default;
 
   /**
    * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
@@ -517,10 +490,9 @@ public:
    */
   void ComputeTransformComponent() const
   {
-    const TransformManager* txManager = mTxManager;
-    if( txManager )
+    if( mTxManagerData )
     {
-      const Matrix& worldMatrix = txManager->GetWorldMatrix(mId);
+      const Matrix& worldMatrix = mTxManagerData->Manager()->GetWorldMatrix(mTxManagerData->Id());
       Vector3 position, scale;
       worldMatrix.GetTransformComponents(position, mValue, scale);
     }
@@ -578,10 +550,10 @@ public:
    * @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 )
+  void Initialize( TransformManagerData* data)
   {
-    mTxManager = transformManager;
-    mId = id;
+    DALI_ASSERT_ALWAYS( data != nullptr && data->Manager() != nullptr);
+    mTxManagerData = data;
   }
 
   /**
@@ -602,31 +574,22 @@ private:
 
 public:
 
-  TransformManager* mTxManager;
-  TransformId mId;
+  TransformManagerData* mTxManagerData{nullptr};
   mutable Quaternion mValue;
 };
 
 /**
  * A Matrix property used as input.
  */
-class TransformManagerMatrixInput : public PropertyInputImpl
+class TransformManagerMatrixInput final: public PropertyInputImpl
 {
 public:
 
   /**
    * Constructor
    */
-  TransformManagerMatrixInput()
-  :mTxManager(nullptr),
-   mId(INVALID_TRANSFORM_ID)
-  {
-  }
+  TransformManagerMatrixInput() = default;
 
-  /**
-   * Virtual destructor.
-   */
-  ~TransformManagerMatrixInput() override = default;
 
   /**
    * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
@@ -666,10 +629,9 @@ public:
    */
   const Matrix& GetMatrix( BufferIndex bufferIndex ) const override
   {
-    const TransformManager* txManager = mTxManager;
-    if( txManager )
+    if( mTxManagerData )
     {
-      return txManager->GetWorldMatrix(mId);
+      return mTxManagerData->Manager()->GetWorldMatrix(mTxManagerData->Id());
     }
 
     return Matrix::IDENTITY;
@@ -680,10 +642,9 @@ public:
    */
   const Matrix& GetConstraintInputMatrix( BufferIndex bufferIndex ) const override
   {
-    const TransformManager* txManager = mTxManager;
-    if( txManager )
+    if( mTxManagerData )
     {
-      return txManager->GetWorldMatrix(mId);
+      return mTxManagerData->Manager()->GetWorldMatrix(mTxManagerData->Id());
     }
 
     return Matrix::IDENTITY;
@@ -694,8 +655,8 @@ public:
    */
   Matrix& Get( BufferIndex bufferIndex )
   {
-    DALI_ASSERT_ALWAYS( mTxManager != nullptr );
-    return mTxManager->GetWorldMatrix(mId);
+    DALI_ASSERT_ALWAYS( mTxManagerData != nullptr );
+    return mTxManagerData->Manager()->GetWorldMatrix(mTxManagerData->Id());
   }
 
   /**
@@ -716,10 +677,10 @@ public:
     return GetMatrix( bufferIndex );
   }
 
-  void Initialize( TransformManager* transformManager, TransformId id )
+  void Initialize( TransformManagerData* data)
   {
-    mTxManager = transformManager;
-    mId = id;
+    DALI_ASSERT_ALWAYS( data != nullptr && data->Manager() != nullptr);
+    mTxManagerData = data;
   }
 
   /**
@@ -740,8 +701,7 @@ private:
 
 public:
 
-  TransformManager* mTxManager;
-  TransformId mId;
+  TransformManagerData* mTxManagerData{nullptr};
 };
 
 
index 068c39f..84c56a1 100644 (file)
@@ -95,6 +95,19 @@ enum TransformManagerProperty
 using TransformId                             = uint32_t; // 4,294,967,295 transforms supported
 static const TransformId INVALID_TRANSFORM_ID = -1;
 
+class TransformManager;
+
+struct TransformManagerData
+{
+
+  TransformManager* Manager() const { return mManager; }
+
+  TransformId Id() const { return mId; }
+
+  TransformManager* mManager{nullptr};
+  TransformId       mId{INVALID_TRANSFORM_ID};
+};
+
 } //SceneGraph
 } //Internal
 
index dc6bc77..5ce46d4 100644 (file)
@@ -75,7 +75,7 @@ bool UpdateProxy::GetPosition( uint32_t id, Vector3& position ) const
   if( node )
   {
     const SceneGraph::TransformManager& transformManager = mTransformManager; // To ensure we call the const getter
-    position = transformManager.GetVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_POSITION );
+    position = transformManager.GetVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_POSITION );
     success = true;
   }
   return success;
@@ -87,7 +87,7 @@ bool UpdateProxy::SetPosition( uint32_t id, const Vector3& position )
   SceneGraph::Node* node = GetNodeWithId( id );
   if( node )
   {
-    mTransformManager.SetVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_POSITION, position );
+    mTransformManager.SetVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_POSITION, position );
     success = true;
   }
   return success;
@@ -99,7 +99,7 @@ bool UpdateProxy::BakePosition( uint32_t id, const Vector3& position )
   SceneGraph::Node* node = GetNodeWithId( id );
   if( node )
   {
-    mTransformManager.BakeVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_POSITION, position );
+    mTransformManager.BakeVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_POSITION, position );
     success = true;
   }
   return success;
@@ -112,7 +112,7 @@ bool UpdateProxy::GetSize( uint32_t id, Vector3& size ) const
   if( node )
   {
     const SceneGraph::TransformManager& transformManager = mTransformManager; // To ensure we call the const getter
-    size = transformManager.GetVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_SIZE );
+    size = transformManager.GetVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_SIZE );
     success = true;
   }
   return success;
@@ -124,7 +124,7 @@ bool UpdateProxy::SetSize( uint32_t id, const Vector3& size )
   SceneGraph::Node* node = GetNodeWithId( id );
   if( node )
   {
-    mTransformManager.SetVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_SIZE, size );
+    mTransformManager.SetVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_SIZE, size );
     success = true;
   }
   return success;
@@ -136,7 +136,7 @@ bool UpdateProxy::BakeSize( uint32_t id, const Vector3& size )
   SceneGraph::Node* node = GetNodeWithId( id );
   if( node )
   {
-    mTransformManager.BakeVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_SIZE, size );
+    mTransformManager.BakeVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_SIZE, size );
     success = true;
   }
   return success;
@@ -149,8 +149,8 @@ bool UpdateProxy::GetPositionAndSize( uint32_t id, Vector3& position, Vector3& s
   if( node )
   {
     const SceneGraph::TransformManager& transformManager = mTransformManager; // To ensure we call the const getter
-    position = transformManager.GetVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_POSITION );
-    size = transformManager.GetVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_SIZE );
+    position = transformManager.GetVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_POSITION );
+    size = transformManager.GetVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_SIZE );
     success = true;
   }
   return success;
@@ -163,7 +163,7 @@ bool UpdateProxy::GetScale( uint32_t id, Vector3& scale ) const
   if( node )
   {
     const SceneGraph::TransformManager& transformManager = mTransformManager; // To ensure we call the const getter
-    scale = transformManager.GetVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_SCALE );
+    scale = transformManager.GetVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_SCALE );
     success = true;
   }
 
@@ -176,7 +176,7 @@ bool UpdateProxy::SetScale( uint32_t id, const Vector3& scale )
   SceneGraph::Node* node = GetNodeWithId( id );
   if( node )
   {
-    mTransformManager.SetVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_SCALE, scale );
+    mTransformManager.SetVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_SCALE, scale );
     success = true;
   }
   return success;
@@ -188,7 +188,7 @@ bool UpdateProxy::BakeScale( uint32_t id, const Vector3& scale )
   SceneGraph::Node* node = GetNodeWithId( id );
   if( node )
   {
-    mTransformManager.BakeVector3PropertyValue( node->mTransformId, SceneGraph::TRANSFORM_PROPERTY_SCALE, scale );
+    mTransformManager.BakeVector3PropertyValue( node->GetTransformId(), SceneGraph::TRANSFORM_PROPERTY_SCALE, scale );
     success = true;
   }
   return success;
index 86b4864..6864526 100644 (file)
@@ -79,14 +79,7 @@ void Node::Delete( Node* node )
 }
 
 Node::Node()
-: mTransformManager( nullptr ),
-  mTransformId( INVALID_TRANSFORM_ID ),
-  mParentOrigin( TRANSFORM_PROPERTY_PARENT_ORIGIN ),
-  mAnchorPoint( TRANSFORM_PROPERTY_ANCHOR_POINT ),
-  mSize( TRANSFORM_PROPERTY_SIZE ),                                               // Zero initialized by default
-  mPosition( TRANSFORM_PROPERTY_POSITION ),                                       // Zero initialized by default
-  mOrientation(),                                                                 // Initialized to identity by default
-  mScale( TRANSFORM_PROPERTY_SCALE ),
+: mOrientation(),                                                                 // Initialized to identity by default
   mVisible( true ),
   mCulled( false ),
   mColor( Color::WHITE ),
@@ -119,14 +112,13 @@ Node::Node()
 #ifdef DEBUG_ENABLED
   gNodeCount++;
 #endif
-
 }
 
 Node::~Node()
 {
-  if( mTransformId != INVALID_TRANSFORM_ID )
+  if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
   {
-    mTransformManager->RemoveTransform(mTransformId);
+    mTransformManagerData.Manager()->RemoveTransform(mTransformManagerData.Id());
   }
 
 #ifdef DEBUG_ENABLED
@@ -148,25 +140,25 @@ uint32_t Node::GetId() const
 void Node::CreateTransform( SceneGraph::TransformManager* transformManager )
 {
   //Create a new transform
-  mTransformManager = transformManager;
-  mTransformId = transformManager->CreateTransform();
+  mTransformManagerData.mManager = transformManager;
+  mTransformManagerData.mId = transformManager->CreateTransform();
 
   //Initialize all the animatable properties
-  mPosition.Initialize( transformManager, mTransformId );
-  mScale.Initialize( transformManager, mTransformId );
-  mOrientation.Initialize( transformManager, mTransformId );
-  mSize.Initialize( transformManager, mTransformId );
-  mParentOrigin.Initialize( transformManager, mTransformId );
-  mAnchorPoint.Initialize( transformManager, mTransformId );
+  mPosition.Initialize( &mTransformManagerData );
+  mScale.Initialize( &mTransformManagerData );
+  mOrientation.Initialize( &mTransformManagerData );
+  mSize.Initialize( &mTransformManagerData );
+  mParentOrigin.Initialize( &mTransformManagerData );
+  mAnchorPoint.Initialize( &mTransformManagerData );
 
   //Initialize all the input properties
-  mWorldPosition.Initialize( transformManager, mTransformId );
-  mWorldScale.Initialize( transformManager, mTransformId );
-  mWorldOrientation.Initialize( transformManager, mTransformId );
-  mWorldMatrix.Initialize( transformManager, mTransformId );
+  mWorldPosition.Initialize( &mTransformManagerData );
+  mWorldScale.Initialize( &mTransformManagerData );
+  mWorldOrientation.Initialize( &mTransformManagerData );
+  mWorldMatrix.Initialize( &mTransformManagerData);
 
   //Set whether the position should use the anchor point
-  transformManager->SetPositionUsesAnchorPoint( mTransformId, mPositionUsesAnchorPoint );
+  transformManager->SetPositionUsesAnchorPoint( mTransformManagerData.Id(), mPositionUsesAnchorPoint );
 }
 
 void Node::SetRoot(bool isRoot)
@@ -347,9 +339,9 @@ void Node::SetParent( Node& parentNode )
 
   mParent = &parentNode;
 
-  if( mTransformId != INVALID_TRANSFORM_ID )
+  if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
   {
-    mTransformManager->SetParent( mTransformId, parentNode.GetTransformId() );
+    mTransformManagerData.Manager()->SetParent( mTransformManagerData.Id(), parentNode.GetTransformId() );
   }
 }
 
@@ -373,9 +365,9 @@ void Node::RecursiveDisconnectFromSceneGraph( BufferIndex updateBufferIndex )
   // Remove all child pointers
   mChildren.Clear();
 
-  if( mTransformId != INVALID_TRANSFORM_ID )
+  if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
   {
-    mTransformManager->SetParent( mTransformId, INVALID_TRANSFORM_ID );
+    mTransformManagerData.Manager()->SetParent( mTransformManagerData.Id(), INVALID_TRANSFORM_ID );
   }
 }
 
index 77bd5ac..27f8fbd 100644 (file)
@@ -396,7 +396,7 @@ public:
    */
   const Vector3& GetPosition(BufferIndex bufferIndex) const
   {
-    if( mTransformId != INVALID_TRANSFORM_ID )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
     {
       return mPosition.Get(bufferIndex);
     }
@@ -419,9 +419,9 @@ public:
    */
   void SetInheritPosition(bool inherit)
   {
-    if( mTransformId != INVALID_TRANSFORM_ID )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
     {
-      mTransformManager->SetInheritPosition( mTransformId, inherit );
+      mTransformManagerData.Manager()->SetInheritPosition( mTransformManagerData.Id(), inherit );
     }
   }
 
@@ -432,7 +432,7 @@ public:
    */
   const Quaternion& GetOrientation(BufferIndex bufferIndex) const
   {
-    if( mTransformId != INVALID_TRANSFORM_ID )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
     {
       return mOrientation.Get(0);
     }
@@ -456,9 +456,9 @@ public:
    */
   void SetInheritOrientation(bool inherit)
   {
-    if( mTransformId != INVALID_TRANSFORM_ID )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
     {
-      mTransformManager->SetInheritOrientation(mTransformId, inherit );
+      mTransformManagerData.Manager()->SetInheritOrientation(mTransformManagerData.Id(), inherit );
     }
   }
 
@@ -469,7 +469,7 @@ public:
    */
   const Vector3& GetScale(BufferIndex bufferIndex) const
   {
-    if( mTransformId != INVALID_TRANSFORM_ID )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
     {
       return mScale.Get(0);
     }
@@ -494,9 +494,9 @@ public:
    */
   void SetInheritScale( bool inherit )
   {
-    if( mTransformId != INVALID_TRANSFORM_ID )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
     {
-      mTransformManager->SetInheritScale(mTransformId, inherit );
+      mTransformManagerData.Manager()->SetInheritScale(mTransformManagerData.Id(), inherit );
     }
   }
 
@@ -620,7 +620,7 @@ public:
    */
   const Vector3& GetSize(BufferIndex bufferIndex) const
   {
-    if( mTransformId != INVALID_TRANSFORM_ID )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
     {
       return mSize.Get(0);
     }
@@ -634,7 +634,7 @@ public:
    */
   const Vector3& GetUpdateSizeHint() const
   {
-    if( mTransformId != INVALID_TRANSFORM_ID )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
     {
       return mUpdateSizeHint.Get(0);
     }
@@ -648,9 +648,9 @@ public:
    */
   const Vector4& GetBoundingSphere() const
   {
-    if( mTransformId != INVALID_TRANSFORM_ID )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
     {
-      return mTransformManager->GetBoundingSphere( mTransformId );
+      return mTransformManagerData.Manager()->GetBoundingSphere( mTransformManagerData.Id() );
     }
 
     return Vector4::ZERO;
@@ -663,9 +663,9 @@ public:
    */
   void GetWorldMatrixAndSize( Matrix& worldMatrix, Vector3& size ) const
   {
-    if( mTransformId != INVALID_TRANSFORM_ID )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID )
     {
-      mTransformManager->GetWorldMatrixAndSize( mTransformId, worldMatrix, size );
+      mTransformManagerData.Manager()->GetWorldMatrixAndSize( mTransformManagerData.Id(), worldMatrix, size );
     }
   }
 
@@ -675,8 +675,8 @@ public:
    */
   bool IsLocalMatrixDirty() const
   {
-    return (mTransformId != INVALID_TRANSFORM_ID) &&
-           (mTransformManager->IsLocalMatrixDirty( mTransformId ));
+    return (mTransformManagerData.Id() != INVALID_TRANSFORM_ID) &&
+           (mTransformManagerData.Manager()->IsLocalMatrixDirty( mTransformManagerData.Id() ));
   }
 
   /**
@@ -731,7 +731,7 @@ public:
    */
   TransformId GetTransformId() const
   {
-    return mTransformId;
+    return mTransformManagerData.Id();
   }
 
   /**
@@ -767,10 +767,10 @@ public:
    */
   void SetPositionUsesAnchorPoint( bool positionUsesAnchorPoint )
   {
-    if( mTransformId != INVALID_TRANSFORM_ID && mPositionUsesAnchorPoint != positionUsesAnchorPoint )
+    if( mTransformManagerData.Id() != INVALID_TRANSFORM_ID && mPositionUsesAnchorPoint != positionUsesAnchorPoint )
     {
       mPositionUsesAnchorPoint = positionUsesAnchorPoint;
-      mTransformManager->SetPositionUsesAnchorPoint( mTransformId, mPositionUsesAnchorPoint );
+      mTransformManagerData.Manager()->SetPositionUsesAnchorPoint( mTransformManagerData.Id(), mPositionUsesAnchorPoint );
     }
   }
 
@@ -902,15 +902,20 @@ private:
   void RecursiveDisconnectFromSceneGraph( BufferIndex updateBufferIndex );
 
 public: // Default properties
-
-  TransformManager*                  mTransformManager;
-  TransformId                        mTransformId;
-  TransformManagerPropertyVector3    mParentOrigin;           ///< Local transform; the position is relative to this. Sets the Transform flag dirty when changed
-  TransformManagerPropertyVector3    mAnchorPoint;            ///< Local transform; local center of rotation. Sets the Transform flag dirty when changed
-  TransformManagerPropertyVector3    mSize;                   ///< Size is provided for layouting
-  TransformManagerPropertyVector3    mPosition;               ///< Local transform; distance between parent-origin & anchor-point
+  using TransformManagerParentsOrigin = TransformManagerPropertyVector3<TRANSFORM_PROPERTY_PARENT_ORIGIN>;
+  using TransformManagerAnchorPoint = TransformManagerPropertyVector3<TRANSFORM_PROPERTY_ANCHOR_POINT>;
+  using TransformManagerSize = TransformManagerPropertyVector3<TRANSFORM_PROPERTY_SIZE>;
+  using TransformManagerPosition = TransformManagerPropertyVector3<TRANSFORM_PROPERTY_POSITION>;
+  using TransformManagerScale = TransformManagerPropertyVector3<TRANSFORM_PROPERTY_SCALE>;
+
+
+  TransformManagerData               mTransformManagerData;
+  TransformManagerParentsOrigin      mParentOrigin;           ///< Local transform; the position is relative to this. Sets the Transform flag dirty when changed
+  TransformManagerAnchorPoint        mAnchorPoint;            ///< Local transform; local center of rotation. Sets the Transform flag dirty when changed
+  TransformManagerSize               mSize;                   ///< Size is provided for layouting
+  TransformManagerPosition           mPosition;               ///< Local transform; distance between parent-origin & anchor-point
+  TransformManagerScale              mScale;                  ///< Local transform; scale relative to parent node
   TransformManagerPropertyQuaternion mOrientation;            ///< Local transform; rotation relative to parent node
-  TransformManagerPropertyVector3    mScale;                  ///< Local transform; scale relative to parent node
 
   AnimatableProperty<bool>           mVisible;                ///< Visibility can be inherited from the Node hierachy
   AnimatableProperty<bool>           mCulled;                 ///< True if the node is culled. This is not animatable. It is just double-buffered.