Merge "Allow multiple renderers per Actor and sharing renderers between actors" into...
[platform/core/uifw/dali-core.git] / dali / internal / event / render-tasks / render-task-impl.cpp
index eea053c..a64d4ea 100644 (file)
@@ -18,6 +18,9 @@
 // CLASS HEADER
 #include <dali/internal/event/render-tasks/render-task-impl.h>
 
+// EXTERNAL INCLUDES
+#include <cstring> // for strcmp
+
 // INTERNAL INCLUDES
 #include <dali/public-api/common/dali-common.h>
 #include <dali/public-api/object/type-registry.h>
@@ -28,6 +31,7 @@
 #include <dali/internal/event/common/stage-impl.h>
 #include <dali/internal/event/images/frame-buffer-image-impl.h>
 #include <dali/internal/update/nodes/node.h>
+#include <dali/internal/event/render-tasks/render-task-list-impl.h>
 #include <dali/internal/update/render-tasks/scene-graph-render-task.h>
 
 #if defined(DEBUG_ENABLED)
@@ -74,6 +78,11 @@ RenderTask* RenderTask::New( bool isSystemLevel )
 
 void RenderTask::SetSourceActor( Actor* actor )
 {
+  const Stage* stage = Stage::GetCurrent();
+  if ( stage )
+  {
+    stage->GetRenderTaskList().SetExclusive( this, mExclusive );
+  }
   mSourceConnector.SetActor( actor );
 }
 
@@ -88,6 +97,12 @@ void RenderTask::SetExclusive( bool exclusive )
   {
     mExclusive = exclusive;
 
+    const Stage* stage = Stage::GetCurrent();
+    if ( stage )
+    {
+      stage->GetRenderTaskList().SetExclusive( this, exclusive );
+    }
+
     if ( mSceneObject )
     {
       // mSceneObject is being used in a separate thread; queue a message to set the value
@@ -221,10 +236,14 @@ void RenderTask::GetViewport( Viewport& viewPort ) const
     }
     else
     {
-      Vector2 size( Stage::GetCurrent()->GetSize() );
-      viewPort.x = viewPort.y = 0;
-      viewPort.width = size.width;
-      viewPort.height = size.height;
+      Internal::Stage* stage = Internal::Stage::GetCurrent();
+      if ( stage )
+      {
+        Vector2 size( stage->GetSize() );
+        viewPort.x = viewPort.y = 0;
+        viewPort.width = size.width;
+        viewPort.height = size.height;
+      }
     }
   }
   else
@@ -352,32 +371,35 @@ bool RenderTask::TranslateCoordinates( Vector2& screenCoords ) const
   {
     CameraActor* localCamera = GetCameraActor();
     StagePtr stage = Stage::GetCurrent();
-    CameraActor& defaultCamera = stage->GetDefaultCameraActor();
-    if( localCamera )
+    if( stage )
     {
-      Viewport viewport;
-      Vector2 size( stage->GetSize() );
-      viewport.x = viewport.y = 0;
-      viewport.width = size.width;
-      viewport.height = size.height;
-
-      float localX, localY;
-      inside = mMappingConnector.mActor->ScreenToLocal(defaultCamera.GetViewMatrix(), defaultCamera.GetProjectionMatrix(), viewport, localX, localY, screenCoords.x, screenCoords.y);
-      Vector3 actorSize = mMappingConnector.mActor->GetCurrentSize();
-      if( inside && localX >= 0.f && localX <= actorSize.x && localY >= 0.f && localY <= actorSize.y)
+      CameraActor& defaultCamera = stage->GetDefaultCameraActor();
+      if( localCamera )
       {
-        screenCoords.x = localX;
-        screenCoords.y = localY;
+        Viewport viewport;
+        Vector2 size( stage->GetSize() );
+        viewport.x = viewport.y = 0;
+        viewport.width = size.width;
+        viewport.height = size.height;
+
+        float localX, localY;
+        inside = mMappingConnector.mActor->ScreenToLocal(defaultCamera.GetViewMatrix(), defaultCamera.GetProjectionMatrix(), viewport, localX, localY, screenCoords.x, screenCoords.y);
+        Vector3 actorSize = mMappingConnector.mActor->GetCurrentSize();
+        if( inside && localX >= 0.f && localX <= actorSize.x && localY >= 0.f && localY <= actorSize.y)
+        {
+          screenCoords.x = localX;
+          screenCoords.y = localY;
+        }
+        else
+        {
+          inside = false;
+        }
       }
       else
       {
         inside = false;
       }
     }
-    else
-    {
-      inside = false;
-    }
   }
   else if ( mFrameBufferImage && mScreenToFrameBufferFunction )
   {
@@ -450,11 +472,11 @@ unsigned int RenderTask::GetDefaultPropertyCount() const
 
 void RenderTask::GetDefaultPropertyIndices( Property::IndexContainer& indices ) const
 {
-  indices.reserve( DEFAULT_PROPERTY_COUNT );
+  indices.Reserve( DEFAULT_PROPERTY_COUNT );
 
   for ( int i = 0; i < DEFAULT_PROPERTY_COUNT; ++i )
   {
-    indices.push_back( i );
+    indices.PushBack( i );
   }
 }
 
@@ -755,6 +777,15 @@ void RenderTask::Connector::SceneObjectRemoved( Object& object )
 
 void RenderTask::Connector::ObjectDestroyed( Object& object )
 {
+  if ( SOURCE_CONNECTOR == mType )
+  {
+    const Stage* stage = Stage::GetCurrent();
+    if ( stage )
+    {
+      stage->GetRenderTaskList().SetExclusive( &mRenderTask, false );
+    }
+  }
+
   mActor = NULL;
 
   UpdateRenderTask();