[Tizen] Implement partial update
[platform/core/uifw/dali-core.git] / dali / internal / update / nodes / node.cpp
index f1faa84..9421eb0 100755 (executable)
@@ -111,11 +111,12 @@ Node::Node()
   mClippingMode( ClippingMode::DISABLED ),
   mIsRoot( false ),
   mIsLayer( false ),
-  mPositionUsesAnchorPoint( true )
+  mPositionUsesAnchorPoint( true ),
+  mPartialUpdateAvailable( false )
 {
   mUniformMapChanged[0] = 0u;
   mUniformMapChanged[1] = 0u;
-  mPropertyDirty = false;
+  mPropertyDirty = true;
 
 #ifdef DEBUG_ENABLED
   gNodeCount++;
@@ -289,13 +290,19 @@ void Node::AddRenderer( Renderer* renderer )
   SetPropertyDirty( true );
 }
 
+
 void Node::RemoveRenderer( const Renderer* renderer )
 {
+  Node *parent = mIsRoot ? NULL : GetParent();
   RendererContainer::SizeType rendererCount( mRenderer.Size() );
   for( RendererContainer::SizeType i = 0; i < rendererCount; ++i )
   {
     if( mRenderer[i] == renderer )
     {
+      if( parent != NULL )
+      {
+        parent->mPropertyDirty = true;
+      }
       SetPropertyDirty( true );
       mRenderer.Erase( mRenderer.Begin()+i);
       return;
@@ -380,29 +387,46 @@ void Node::RecursiveDisconnectFromSceneGraph( BufferIndex updateBufferIndex )
     mTransformManager->SetParent( mTransformId, INVALID_TRANSFORM_ID );
   }
 }
+void Node::SetPartialUpdateAvailable( bool value )
+{
+  mPartialUpdateAvailable = value;
+}
 
-void Node::SetPropertyDirty( bool value )
+bool Node::IsPartialUpdateAvailable() const
 {
-  mPropertyDirty = value;
+  return mPartialUpdateAvailable;
+}
 
-  const NodeIter endIter = mChildren.End();
-  for ( NodeIter iter = mChildren.Begin(); iter != endIter; ++iter )
+void Node::SetPropertyDirty( bool value )
+{
+  if( mPartialUpdateAvailable )
   {
-    Node* current = *iter;
-    current->SetPropertyDirty( value );
+    mPropertyDirty = value;
+
+    const NodeIter endIter = mChildren.End();
+    for ( NodeIter iter = mChildren.Begin(); iter != endIter; ++iter )
+    {
+      Node* current = *iter;
+      current->SetPropertyDirty( value );
+    }
   }
 }
 
 bool Node::IsPropertyDirty() const
 {
-  for( auto&& existingRenderer : mRenderer )
+  if( mPartialUpdateAvailable )
   {
-    if( existingRenderer->IsDirty() )
+    if( !mPropertyDirty )
     {
-      return true;
+      for( auto&& existingRenderer : mRenderer )
+      {
+        if( existingRenderer->IsDirty() )
+        {
+          return true;
+        }
+      }
     }
   }
-
   return mPropertyDirty;
 }