Fix a crash of the RenderTask
[platform/core/uifw/dali-core.git] / dali / internal / event / render-tasks / render-task-impl.cpp
index 0bc361f..99b74c7 100644 (file)
@@ -29,6 +29,7 @@
 #include <dali/internal/event/actors/camera-actor-impl.h>
 #include <dali/internal/event/common/property-helper.h>
 #include <dali/internal/event/common/stage-impl.h>
+#include <dali/internal/event/common/scene-impl.h>
 #include <dali/internal/event/common/projection.h>
 #include <dali/internal/event/images/frame-buffer-image-impl.h>
 #include <dali/internal/update/nodes/node.h>
@@ -93,10 +94,10 @@ RenderTaskPtr RenderTask::New( Actor* sourceActor, CameraActor* cameraActor, Ren
 
 void RenderTask::SetSourceActor( Actor* actor )
 {
-  mSourceActor = actor;
-  if ( mSourceActor )
+  mSourceActor.SetActor( actor );
+  if ( actor )
   {
-    SetSourceNodeMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), &mSourceActor->GetNode() );
+    SetSourceNodeMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), &actor->GetNode() );
   }
   else
   {
@@ -109,7 +110,7 @@ void RenderTask::SetSourceActor( Actor* actor )
 
 Actor* RenderTask::GetSourceActor() const
 {
-  return mSourceActor;
+  return mSourceActor.GetActor();
 }
 
 void RenderTask::SetExclusive( bool exclusive )
@@ -142,10 +143,10 @@ bool RenderTask::GetInputEnabled() const
 
 void RenderTask::SetCameraActor( CameraActor* cameraActor )
 {
-  mCameraActor = cameraActor;
-  if( mCameraActor )
+  mCameraActor.SetActor( cameraActor );
+  if( cameraActor )
   {
-    SetCameraMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), &mCameraActor->GetNode(), mCameraActor->GetCamera() );
+    SetCameraMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), &cameraActor->GetNode(), cameraActor->GetCamera() );
   }
   else
   {
@@ -158,7 +159,11 @@ void RenderTask::SetCameraActor( CameraActor* cameraActor )
 
 CameraActor* RenderTask::GetCameraActor() const
 {
-  return mCameraActor;
+  if( mCameraActor.GetActor() )
+  {
+    return static_cast< CameraActor* >( mCameraActor.GetActor() );
+  }
+  return nullptr;
 }
 
 void RenderTask::SetTargetFrameBuffer( FrameBufferImagePtr image )
@@ -263,6 +268,13 @@ void RenderTask::GetViewport( Viewport& viewPort ) const
       if ( stage )
       {
         Vector2 size( stage->GetSize() );
+        Actor* sourceActor = mSourceActor.GetActor();
+        if ( sourceActor && sourceActor->OnStage() )
+        {
+          Scene& scene = sourceActor->GetScene();
+          size = scene.GetSize();
+        }
+
         viewPort.x = viewPort.y = 0;
         viewPort.width = static_cast<int32_t>( size.width ); // truncated
         viewPort.height = static_cast<int32_t>( size.height ); // truncated
@@ -401,19 +413,27 @@ bool RenderTask::TranslateCoordinates( Vector2& screenCoords ) const
     Internal::Actor* inputMappingActor = &GetImplementation( mappingActor );
     CameraActor* localCamera = GetCameraActor();
     StagePtr stage = Stage::GetCurrent();
-    if( stage )
+    if ( stage )
     {
-      CameraActor& defaultCamera = stage->GetDefaultCameraActor();
+      Vector2 size( stage->GetSize() );
+      CameraActor* defaultCamera( &stage->GetDefaultCameraActor() );
+      Actor* sourceActor = mSourceActor.GetActor();
+      if ( sourceActor && sourceActor->OnStage() )
+      {
+        Scene& scene = sourceActor->GetScene();
+        size = scene.GetSize();
+        defaultCamera = &scene.GetDefaultCameraActor();
+      }
+
       if( localCamera )
       {
         Viewport viewport;
-        Vector2 size( stage->GetSize() );
         viewport.x = viewport.y = 0;
         viewport.width = static_cast<int32_t>( size.width ); // truncated
         viewport.height = static_cast<int32_t>( size.height ); // truncated
 
         float localX, localY;
-        inside = inputMappingActor->ScreenToLocal(defaultCamera.GetViewMatrix(), defaultCamera.GetProjectionMatrix(), viewport, localX, localY, screenCoords.x, screenCoords.y);
+        inside = inputMappingActor->ScreenToLocal(defaultCamera->GetViewMatrix(), defaultCamera->GetProjectionMatrix(), viewport, localX, localY, screenCoords.x, screenCoords.y);
         Vector3 actorSize = inputMappingActor->GetCurrentSize();
         if( inside && localX >= 0.f && localX <= actorSize.x && localY >= 0.f && localY <= actorSize.y)
         {
@@ -750,8 +770,8 @@ bool RenderTask::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface
 
 RenderTask::RenderTask( const SceneGraph::RenderTask* sceneObject, RenderTaskList& renderTaskList )
 : Object( sceneObject ),
-  mSourceActor( nullptr ),
-  mCameraActor( nullptr ),
+  mSourceActor(),
+  mCameraActor(),
   mInputMappingActor(),
   mRenderTaskList( renderTaskList ),
   mClearColor( Dali::RenderTask::DEFAULT_CLEAR_COLOR ),