X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Fcommon%2Fstage-impl.cpp;h=990fb527ce37b32573d2fa266a69d577405d793d;hb=3bcb54791a6777e77f02612a1f7916e83ef1c86f;hp=7e49d72a9478a78021e495a0adcbcef4897db95a;hpb=7c6f8ed43521c52d6cc46a7e3e3e40069514f818;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/common/stage-impl.cpp b/dali/internal/event/common/stage-impl.cpp index 7e49d72..990fb52 100644 --- a/dali/internal/event/common/stage-impl.cpp +++ b/dali/internal/event/common/stage-impl.cpp @@ -20,6 +20,7 @@ // EXTERNAL INCLUDES #include +#include // INTERNAL INCLUDES #include @@ -35,6 +36,7 @@ #include #include #include +#include #include #ifdef DYNAMICS_SUPPORT @@ -44,9 +46,6 @@ #include #endif -using namespace std; -using namespace boost; - using Dali::Internal::SceneGraph::Node; namespace Dali @@ -60,6 +59,24 @@ namespace const float DEFAULT_STEREO_BASE( 65.0f ); +// Signals + +const char* const SIGNAL_KEY_EVENT = "key-event"; +const char* const SIGNAL_EVENT_PROCESSING_FINISHED = "event-processing-finished"; +const char* const SIGNAL_TOUCHED = "touched"; +const char* const SIGNAL_CONTEXT_LOST = "context-lost"; +const char* const SIGNAL_CONTEXT_REGAINED = "context-regained"; +const char* const SIGNAL_SCENE_CREATED = "scene-created"; + +TypeRegistration mType( typeid(Dali::Stage), typeid(Dali::BaseHandle), NULL ); + +SignalConnectorType signalConnector1( mType, SIGNAL_KEY_EVENT, &Stage::DoConnectSignal ); +SignalConnectorType signalConnector2( mType, SIGNAL_EVENT_PROCESSING_FINISHED, &Stage::DoConnectSignal ); +SignalConnectorType signalConnector3( mType, SIGNAL_TOUCHED, &Stage::DoConnectSignal ); +SignalConnectorType signalConnector4( mType, SIGNAL_CONTEXT_LOST, &Stage::DoConnectSignal ); +SignalConnectorType signalConnector5( mType, SIGNAL_CONTEXT_REGAINED, &Stage::DoConnectSignal ); +SignalConnectorType signalConnector6( mType, SIGNAL_SCENE_CREATED, &Stage::DoConnectSignal ); + } // unnamed namespace StagePtr Stage::New( AnimationPlaylist& playlist, @@ -75,17 +92,17 @@ void Stage::Initialize() mObjectRegistry = ObjectRegistry::New(); // Create the ordered list of layers - mLayerList = LayerList::New( *this, false/*not system-level*/ ); + mLayerList = LayerList::New( mUpdateManager, false/*not system-level*/ ); // The stage owns the default layer - mRootLayer = Layer::NewRoot( *this, *mLayerList, mUpdateManager, false/*not system-level*/ ); + mRootLayer = Layer::NewRoot( *mLayerList, mUpdateManager, false/*not system-level*/ ); mRootLayer->SetName("RootLayer"); // Create the default camera actor first; this is needed by the RenderTaskList CreateDefaultCameraActor(); // Create the list of render-tasks - mRenderTaskList = RenderTaskList::New( mUpdateManager, *this, false/*not system-level*/ ); + mRenderTaskList = RenderTaskList::New( *this, *this, false/*not system-level*/ ); // Create the default render-task Dali::RenderTask defaultRenderTask = mRenderTaskList->CreateTask(); @@ -112,7 +129,14 @@ void Stage::Uninitialize() StagePtr Stage::GetCurrent() { - return ThreadLocalStorage::Get().GetCurrentStage(); + StagePtr stage( NULL ); + // no checking in this version + ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal(); + if( tls ) + { + stage = tls->GetCurrentStage(); + } + return stage; } bool Stage::IsInstalled() @@ -125,19 +149,19 @@ ObjectRegistry& Stage::GetObjectRegistry() return *mObjectRegistry; } -Layer& Stage::GetRootActor() +void Stage::RegisterObject( Dali::BaseObject* object ) { - return *mRootLayer; + mObjectRegistry->RegisterObject( object ); } -SceneGraph::UpdateManager& Stage::GetUpdateManager() +void Stage::UnregisterObject( Dali::BaseObject* object ) { - return mUpdateManager; + mObjectRegistry->UnregisterObject( object ); } -EventToUpdate& Stage::GetUpdateInterface() +Layer& Stage::GetRootActor() { - return mUpdateManager.GetEventToUpdate(); + return *mRootLayer; } AnimationPlaylist& Stage::GetAnimationPlaylist() @@ -263,28 +287,26 @@ void Stage::SetViewMode( ViewMode viewMode ) { DALI_LOG_INFO( Debug::Filter::gActor, Debug::Concise, "View mode changed from %d to %d\n", mViewMode, viewMode); - const float stereoBase( ( (mStereoBase / 25.4f) * GetDpi().x ) * 0.5f ); - if( mViewMode == MONO ) { - mDefaultCamera->SetRotation( Degree( 180.0f ), Vector3::YAXIS ); + mDefaultCamera->SetOrientation( Degree( 180.0f ), Vector3::YAXIS ); mRenderTaskList->GetTask(0).SetSourceActor( Dali::Actor() ); + //Create camera and RenderTask for left eye mLeftCamera = CameraActor::New( Size::ZERO ); mLeftCamera->SetParentOrigin( ParentOrigin::CENTER ); - mLeftCamera->SetPerspectiveProjection( mSize, stereoBase ); - mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) ); mDefaultCamera->Add( *mLeftCamera.Get() ); mLeftRenderTask = mRenderTaskList->CreateTask(); mLeftRenderTask.SetCameraActor( Dali::CameraActor( mLeftCamera.Get() ) ); mLeftCamera->SetType( Dali::Camera::FREE_LOOK ); + //Create camera and RenderTask for right eye mRightCamera = CameraActor::New( Size::ZERO ); mRightCamera->SetParentOrigin( ParentOrigin::CENTER ); - mRightCamera->SetPerspectiveProjection( mSize, -stereoBase ); - mRightCamera->SetPosition( Vector3( -stereoBase, 0.0f, 0.0f ) ); mDefaultCamera->Add( *mRightCamera.Get() ); mRightRenderTask = mRenderTaskList->CreateTask(); + mRightRenderTask.SetClearColor( Vector4( 1.0f,0.0f,0.0f,1.0f)); + mRightRenderTask.SetCameraActor( Dali::CameraActor( mRightCamera.Get() ) ); mRightCamera->SetType( Dali::Camera::FREE_LOOK ); } @@ -306,21 +328,57 @@ void Stage::SetViewMode( ViewMode viewMode ) mRightRenderTask.Reset(); mRightCamera.Reset(); - mDefaultCamera->SetRotation( Degree( 0.0f ), Vector3::YAXIS ); + mDefaultCamera->SetOrientation( Degree( 0.0f ), Vector3::YAXIS ); mDefaultCamera->SetType( Dali::Camera::LOOK_AT_TARGET ); mRenderTaskList->GetTask(0).SetSourceActor( Dali::Layer(mRootLayer.Get()) ); + break; } case STEREO_HORIZONTAL: { - mLeftRenderTask.SetViewport( Viewport(0, 0, mSize.width, mSize.height * 0.5f ) ); - mRightRenderTask.SetViewport( Viewport(0, mSize.height * 0.5f, mSize.width, mSize.height * 0.5f) ); + //Stereo mode with horizontal split is for landscape mode. That's the reason for the cameras being rotated + //Top camera renders the scene as seen from the right eye and bottom camera as seen from left. + + //Calculate separation in pixels along vertical axis ( mStereoBase is defined in millimetres ) + const float stereoBase( ( (mStereoBase / 25.4f) * GetDpi().y ) * 0.5f ); + + //Calculate aspect ratio + float aspect = mSize.width / (mSize.height * 0.5f); + + mLeftCamera->SetPerspectiveProjection( mSize, Vector2( 0.0f,stereoBase) ); + mLeftCamera->SetAspectRatio( aspect ); + mLeftCamera->SetOrientation( Degree(-90.0f), Vector3::ZAXIS ); + mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) ); + mLeftRenderTask.SetViewport( Viewport(0, mSize.height * 0.5f, mSize.width, mSize.height * 0.5f) ); + + mRightCamera->SetPerspectiveProjection( mSize, Vector2( 0.0, -stereoBase) ); + mRightCamera->SetAspectRatio( aspect ); + mRightCamera->SetOrientation( Degree(-90.0f), Vector3::ZAXIS ); + mRightCamera->SetPosition( Vector3(-stereoBase, 0.0f, 0.0f ) ); + mRightRenderTask.SetViewport( Viewport(0, 0, mSize.width, mSize.height * 0.5f ) ); + break; } case STEREO_VERTICAL: { + //Calculate separation in pixels along horizontal axis + const float stereoBase( ( (mStereoBase / 25.4f) * GetDpi().x ) * 0.5f ); + + //Recalculate fov based on viewport size + const float fov = 2.0f * std::atan( mSize.y / (2.0f * std::max( mSize.x*0.5f, mSize.y )) ); + + mLeftCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(stereoBase,0.0f) ); + mLeftCamera->SetFieldOfView( fov ); + mLeftCamera->SetOrientation( Degree(0.0f), Vector3::ZAXIS ); + mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) ); mLeftRenderTask.SetViewport( Viewport(0, 0, mSize.width * 0.5f, mSize.height ) ); + + mRightCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(-stereoBase,0.0f) ); + mRightCamera->SetFieldOfView( fov ); + mRightCamera->SetOrientation( Degree(0.0f), Vector3::ZAXIS ); + mRightCamera->SetPosition( Vector3( -stereoBase, 0.0f, 0.0f ) ); mRightRenderTask.SetViewport( Viewport(mSize.width * 0.5f, 0, mSize.width * 0.5f, mSize.height ) ); + break; } case STEREO_INTERLACED: @@ -343,13 +401,40 @@ void Stage::SetStereoBase( float stereoBase ) DALI_LOG_INFO( Debug::Filter::gActor, Debug::Concise, "old( %.2f) new(%.2f)", mStereoBase, stereoBase ); mStereoBase = stereoBase; - if( mViewMode != MONO ) + switch( mViewMode ) { - stereoBase *= 0.5f; - mLeftCamera->SetX( stereoBase ); - mLeftCamera->SetPerspectiveProjection( mSize, stereoBase ); - mRightCamera->SetX( -stereoBase ); - mRightCamera->SetPerspectiveProjection( mSize, -stereoBase ); + case STEREO_HORIZONTAL: + { + stereoBase = mStereoBase / 25.4f * GetDpi().y * 0.5f; + float aspect = mSize.width / (mSize.height * 0.5f); + + mLeftCamera->SetPerspectiveProjection( mSize, Vector2( 0.0, stereoBase) ); + mLeftCamera->SetAspectRatio( aspect ); + mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) ); + + mRightCamera->SetPerspectiveProjection( mSize, Vector2( 0.0, -stereoBase) ); + mRightCamera->SetAspectRatio( aspect ); + mRightCamera->SetPosition( Vector3(-stereoBase, 0.0f, 0.0f ) ); + + break; + } + case STEREO_VERTICAL: + { + stereoBase = mStereoBase / 25.4f * GetDpi().x * 0.5f; + const float fov = 2.0f * std::atan( mSize.y / (2.0f * std::max( mSize.x*0.5f, mSize.y )) ); + + mLeftCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(stereoBase,0.0f) ); + mLeftCamera->SetFieldOfView( fov ); + mLeftCamera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) ); + + mRightCamera->SetPerspectiveProjection( Size( mSize.x * 0.5f, mSize.y ), Vector2(-stereoBase,0.0f) ); + mRightCamera->SetFieldOfView( fov ); + mRightCamera->SetPosition( Vector3(-stereoBase, 0.0f, 0.0f ) ); + + break; + } + default: + break; } } } @@ -430,36 +515,105 @@ void Stage::KeepRendering( float durationSeconds ) KeepRenderingMessage( mUpdateManager, durationSeconds ); } +bool Stage::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ) +{ + bool connected( true ); + Stage* stage = dynamic_cast(object); + + if( 0 == strcmp( signalName.c_str(), SIGNAL_KEY_EVENT ) ) + { + stage->KeyEventSignal().Connect( tracker, functor ); + } + else if( 0 == strcmp( signalName.c_str(), SIGNAL_EVENT_PROCESSING_FINISHED ) ) + { + stage->EventProcessingFinishedSignal().Connect( tracker, functor ); + } + else if( 0 == strcmp( signalName.c_str(), SIGNAL_TOUCHED ) ) + { + stage->TouchedSignal().Connect( tracker, functor ); + } + else if( 0 == strcmp( signalName.c_str(), SIGNAL_CONTEXT_LOST ) ) + { + stage->ContextLostSignal().Connect( tracker, functor ); + } + else if( 0 == strcmp( signalName.c_str(), SIGNAL_CONTEXT_REGAINED ) ) + { + stage->ContextRegainedSignal().Connect( tracker, functor ); + } + else if( 0 == strcmp( signalName.c_str(), SIGNAL_SCENE_CREATED ) ) + { + stage->SceneCreatedSignal().Connect( tracker, functor ); + } + else + { + // signalName does not match any signal + connected = false; + } + + return connected; +} + void Stage::EmitKeyEventSignal(const KeyEvent& event) { // Emit the key event signal when no actor in the stage has gained the key input focus - mKeyEventSignalV2.Emit( event ); + mKeyEventSignal.Emit( event ); } void Stage::EmitEventProcessingFinishedSignal() { - mEventProcessingFinishedSignalV2.Emit(); + mEventProcessingFinishedSignal.Emit(); } void Stage::EmitTouchedSignal( const TouchEvent& touch ) { - mTouchedSignalV2.Emit( touch ); + mTouchedSignal.Emit( touch ); +} + + +void Stage::EmitSceneCreatedSignal() +{ + mSceneCreatedSignal.Emit(); +} + +Dali::Stage::KeyEventSignalType& Stage::KeyEventSignal() +{ + return mKeyEventSignal; +} + +Dali::Stage::EventProcessingFinishedSignalType& Stage::EventProcessingFinishedSignal() +{ + return mEventProcessingFinishedSignal; +} + +Dali::Stage::TouchedSignalType& Stage::TouchedSignal() +{ + return mTouchedSignal; +} + +Dali::Stage::ContextStatusSignal& Stage::ContextLostSignal() +{ + return mContextLostSignal; +} + +Dali::Stage::ContextStatusSignal& Stage::ContextRegainedSignal() +{ + return mContextRegainedSignal; } -Dali::Stage::KeyEventSignalV2& Stage::KeyEventSignal() +Dali::Stage::SceneCreatedSignalType& Stage::SceneCreatedSignal() { - return mKeyEventSignalV2; + return mSceneCreatedSignal; } -Dali::Stage::EventProcessingFinishedSignalV2& Stage::EventProcessingFinishedSignal() +void Stage::NotifyContextLost() { - return mEventProcessingFinishedSignalV2; + mContextLostSignal.Emit(); } -Dali::Stage::TouchedSignalV2& Stage::TouchedSignal() +void Stage::NotifyContextRegained() { - return mTouchedSignalV2; + mContextRegainedSignal.Emit(); } Stage::Stage( AnimationPlaylist& playlist, @@ -481,6 +635,21 @@ Stage::Stage( AnimationPlaylist& playlist, { } +SceneGraph::UpdateManager& Stage::GetUpdateManager() +{ + return mUpdateManager; +} + +unsigned int* Stage::ReserveMessageSlot( std::size_t size, bool updateScene ) +{ + return mUpdateManager.ReserveMessageSlot( size, updateScene ); +} + +BufferIndex Stage::GetEventBufferIndex() const +{ + return mUpdateManager.GetEventBufferIndex(); +} + Stage::~Stage() { delete mSystemOverlay;