/*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 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.
#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>
-#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)
} // Unnamed namespace
-RenderTaskPtr RenderTask::New( Actor* sourceActor, CameraActor* cameraActor, SceneGraph::RenderTaskList& parentSceneObject )
+RenderTaskPtr RenderTask::New( Actor* sourceActor, CameraActor* cameraActor, RenderTaskList& renderTaskList )
{
// create scene object first so it's guaranteed to exist for the event side
auto sceneObject = SceneGraph::RenderTask::New();
- OwnerPointer< SceneGraph::RenderTask > transferOwnership( sceneObject );
+
// pass the pointer to base for message passing
- RenderTaskPtr task( new RenderTask( sceneObject ) );
+ RenderTaskPtr task( new RenderTask( sceneObject, renderTaskList ) );
+
// transfer scene object ownership to update manager
+ const SceneGraph::RenderTaskList& parentSceneObject = renderTaskList.GetSceneObject();
+ OwnerPointer< SceneGraph::RenderTask > transferOwnership( sceneObject );
AddTaskMessage( task->GetEventThreadServices(), parentSceneObject, transferOwnership );
// Set the default source & camera actors
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
{
SetSourceNodeMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), nullptr );
}
+
// set the actor on exclusive container for hit testing
- const Stage* stage = Stage::GetCurrent();
- if ( stage )
- {
- stage->GetRenderTaskList().SetExclusive( this, mExclusive );
- }
+ mRenderTaskList.SetExclusive( this, mExclusive );
}
Actor* RenderTask::GetSourceActor() const
{
- return mSourceActor;
+ return mSourceActor.GetActor();
}
void RenderTask::SetExclusive( bool exclusive )
{
mExclusive = exclusive;
- const Stage* stage = Stage::GetCurrent();
- if ( stage )
- {
- stage->GetRenderTaskList().SetExclusive( this, exclusive );
- }
+ mRenderTaskList.SetExclusive( this, exclusive );
// scene object is being used in a separate thread; queue a message to set the value
SetExclusiveMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), mExclusive );
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
{
SetCameraMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), nullptr, nullptr );
}
+
+ // set the actor on exclusive container for hit testing
+ mRenderTaskList.SetExclusive( this, mExclusive );
}
CameraActor* RenderTask::GetCameraActor() const
{
- return mCameraActor;
+ if( mCameraActor.GetActor() )
+ {
+ return static_cast< CameraActor* >( mCameraActor.GetActor() );
+ }
+ return nullptr;
}
void RenderTask::SetTargetFrameBuffer( FrameBufferImagePtr image )
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
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)
{
return *static_cast<const SceneGraph::RenderTask*>( mUpdateObject );
}
+RenderTaskList& RenderTask::GetRenderTaskList() const
+{
+ return mRenderTaskList;
+}
+
/********************************************************************************
******************************** PROPERTY METHODS **************************
********************************************************************************/
switch ( index )
{
-
case Dali::RenderTask::Property::VIEWPORT_POSITION:
{
value = mViewportPosition;
switch ( index )
{
-
case Dali::RenderTask::Property::VIEWPORT_POSITION:
{
value = GetCurrentViewportPosition();
return connected;
}
-RenderTask::RenderTask( const SceneGraph::RenderTask* sceneObject )
+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 ),
mViewportPosition( Vector2::ZERO ),
mViewportSize( Vector2::ZERO ),