Reorder node's children only required case.
[platform/core/uifw/dali-core.git] / dali / internal / update / manager / scene-graph-frame-callback.cpp
index faf6c73..1f8aa62 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 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.
 
 namespace Dali
 {
-
 namespace Internal
 {
-
 namespace SceneGraph
 {
-
-FrameCallback* FrameCallback::New( FrameCallbackInterface& frameCallbackInterface )
+FrameCallback* FrameCallback::New(FrameCallbackInterface& frameCallbackInterface)
 {
-  return new FrameCallback( &frameCallbackInterface );
+  return new FrameCallback(&frameCallbackInterface);
 }
 
 FrameCallback::~FrameCallback()
 {
-  if( mUpdateProxy )
+  if(mUpdateProxy)
   {
-    mUpdateProxy->GetRootNode().RemoveObserver( *this );
+    mUpdateProxy->GetRootNode().RemoveObserver(*this);
+    mUpdateProxy->AddNodeResetters();
   }
 
-  {
-    Mutex::ScopedLock lock( mMutex );
-    if( mFrameCallbackInterface )
-    {
-      FrameCallbackInterface::Impl::Get( *mFrameCallbackInterface ).DisconnectFromSceneGraphObject();
-    }
-  }
+  Invalidate();
 }
 
-void FrameCallback::ConnectToSceneGraph( UpdateManager& updateManager, TransformManager& transformManager, Node& rootNode )
+void FrameCallback::ConnectToSceneGraph(UpdateManager& updateManager, TransformManager& transformManager, Node& rootNode)
 {
-  mUpdateProxy = std::unique_ptr< UpdateProxy >( new UpdateProxy( updateManager, transformManager, rootNode ) );
-  rootNode.AddObserver( *this );
+  mUpdateProxy = std::unique_ptr<UpdateProxy>(new UpdateProxy(updateManager, transformManager, rootNode));
+  rootNode.AddObserver(*this);
 }
 
-bool FrameCallback::Update( BufferIndex bufferIndex, float elapsedSeconds, bool nodeHierarchyChanged )
+bool FrameCallback::Update(BufferIndex bufferIndex, float elapsedSeconds, bool nodeHierarchyChanged)
 {
   bool continueCalling = false;
-  if( mUpdateProxy )
+  if(mUpdateProxy)
   {
-    mUpdateProxy->SetCurrentBufferIndex( bufferIndex );
+    mUpdateProxy->SetCurrentBufferIndex(bufferIndex);
 
-    if( nodeHierarchyChanged )
+    if(nodeHierarchyChanged)
     {
       mUpdateProxy->NodeHierarchyChanged();
     }
 
-    Mutex::ScopedLock lock( mMutex );
-    if( mFrameCallbackInterface )
+    Mutex::ScopedLock lock(mMutex);
+    if(mFrameCallbackInterface && mValid)
     {
-      Dali::UpdateProxy updateProxy( *mUpdateProxy );
-      mFrameCallbackInterface->Update( updateProxy, elapsedSeconds );
+      Dali::UpdateProxy updateProxy(*mUpdateProxy);
+      mFrameCallbackInterface->Update(updateProxy, elapsedSeconds);
       continueCalling = true;
     }
   }
@@ -85,26 +77,29 @@ bool FrameCallback::Update( BufferIndex bufferIndex, float elapsedSeconds, bool
 
 void FrameCallback::Invalidate()
 {
-  Mutex::ScopedLock lock( mMutex );
-  if( mFrameCallbackInterface )
+  Mutex::ScopedLock lock(mMutex);
+  if(mFrameCallbackInterface && mValid)
   {
-    FrameCallbackInterface::Impl::Get( *mFrameCallbackInterface ).DisconnectFromSceneGraphObject();
-    mFrameCallbackInterface = nullptr;
+    FrameCallbackInterface::Impl::Get(*mFrameCallbackInterface).DisconnectFromSceneGraphObject();
+    mValid = false;
+    // Do not set mFrameCallbackInterface to nullptr as it is used for comparison checks by the comparison operator
   }
 }
 
-void FrameCallback::PropertyOwnerDestroyed( PropertyOwner& owner )
+void FrameCallback::PropertyOwnerDestroyed(PropertyOwner& owner)
 {
+  mUpdateProxy.reset(); // Root node is being destroyed so no point keeping the update-proxy either
+
   Invalidate();
 }
 
-FrameCallback::FrameCallback( FrameCallbackInterface* frameCallbackInterface )
+FrameCallback::FrameCallback(FrameCallbackInterface* frameCallbackInterface)
 : mMutex(),
-  mFrameCallbackInterface( frameCallbackInterface )
+  mFrameCallbackInterface(frameCallbackInterface)
 {
-  if( frameCallbackInterface )
+  if(frameCallbackInterface)
   {
-    FrameCallbackInterface::Impl::Get( *mFrameCallbackInterface ).ConnectToSceneGraphObject( *this );
+    FrameCallbackInterface::Impl::Get(*mFrameCallbackInterface).ConnectToSceneGraphObject(*this);
   }
 }