X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Frender-tasks%2Frender-task-impl.cpp;h=a64d4eaad524d6d996e3c48e6422f4f9bab5216e;hb=4bd2fbea750e7dc85627868d8d276cc416b01b5a;hp=791ab34b3514fc69fcc735100fd4b253eba32da9;hpb=e75977609b4c0d587abdcc632eb1fe66bc0b1c47;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/render-tasks/render-task-impl.cpp b/dali/internal/event/render-tasks/render-task-impl.cpp index 791ab34..a64d4ea 100644 --- a/dali/internal/event/render-tasks/render-task-impl.cpp +++ b/dali/internal/event/render-tasks/render-task-impl.cpp @@ -1,32 +1,38 @@ -// -// Copyright (c) 2014 Samsung Electronics Co., Ltd. -// -// Licensed under the Flora License, Version 1.0 (the License); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://floralicense.org/license/ -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an AS IS BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// +/* + * Copyright (c) 2014 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ // CLASS HEADER #include +// EXTERNAL INCLUDES +#include // for strcmp + // INTERNAL INCLUDES #include -#include +#include +#include #include #include +#include #include -#include #include -#include #include +#include +#include #if defined(DEBUG_ENABLED) namespace @@ -38,44 +44,45 @@ Debug::Filter* gLogRender = Debug::Filter::New(Debug::Concise, false, "LOG_RENDE namespace Dali { -const Property::Index RenderTask::VIEWPORT_POSITION = 0; -const Property::Index RenderTask::VIEWPORT_SIZE = 1; -const Property::Index RenderTask::CLEAR_COLOR = 2; - namespace Internal { namespace // For internal properties { -const std::string DEFAULT_PROPERTY_NAMES[] = -{ - "viewport-position", - "viewport-size", - "clear-color" -}; -const int DEFAULT_PROPERTY_COUNT = sizeof( DEFAULT_PROPERTY_NAMES ) / sizeof( std::string ); +// Properties -const Property::Type DEFAULT_PROPERTY_TYPES[DEFAULT_PROPERTY_COUNT] = -{ - Property::VECTOR2, // viewport-position - Property::VECTOR2, // viewport-size - Property::VECTOR4, // clear-color -}; +// Name Type writable animatable constraint-input enum for index-checking +DALI_PROPERTY_TABLE_BEGIN +DALI_PROPERTY( "viewport-position", VECTOR2, true, true, true, Dali::RenderTask::Property::VIEWPORT_POSITION ) +DALI_PROPERTY( "viewport-size", VECTOR2, true, true, true, Dali::RenderTask::Property::VIEWPORT_SIZE ) +DALI_PROPERTY( "clear-color", VECTOR4, true, true, true, Dali::RenderTask::Property::CLEAR_COLOR ) +DALI_PROPERTY_TABLE_END( DEFAULT_OBJECT_PROPERTY_START_INDEX ) + +// Signals + +const char* const SIGNAL_FINISHED = "finished"; -}// unnamed namespace +TypeRegistration mType( typeid( Dali::RenderTask ), typeid( Dali::BaseHandle ), NULL ); -RenderTask::DefaultPropertyLookup* RenderTask::sDefaultPropertyLookup = NULL; +SignalConnectorType signalConnector1( mType, SIGNAL_FINISHED, &RenderTask::DoConnectSignal ); + +} // Unnamed namespace RenderTask* RenderTask::New( bool isSystemLevel ) { - RenderTask* task( new RenderTask( ThreadLocalStorage::Get().GetEventToUpdate(), isSystemLevel ) ); + RenderTask* task( new RenderTask( isSystemLevel ) ); return task; } void RenderTask::SetSourceActor( Actor* actor ) { + const Stage* stage = Stage::GetCurrent(); + if ( stage ) + { + stage->GetRenderTaskList().SetExclusive( this, mExclusive ); + } mSourceConnector.SetActor( actor ); } @@ -90,10 +97,16 @@ 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 - SetExclusiveMessage( mEventToUpdate, *mSceneObject, mExclusive ); + SetExclusiveMessage( GetEventThreadServices(), *mSceneObject, mExclusive ); } } } @@ -148,7 +161,7 @@ void RenderTask::SetTargetFrameBuffer( Dali::FrameBufferImage image ) } // mSceneObject is being used in a separate thread; queue a message to set the value - SetFrameBufferIdMessage( mEventToUpdate, *mSceneObject, resourceId ); + SetFrameBufferIdMessage( GetEventThreadServices(), *mSceneObject, resourceId ); } else { @@ -185,26 +198,22 @@ Actor* RenderTask::GetScreenToFrameBufferMappingActor() const void RenderTask::SetViewportPosition(const Vector2& value) { - StagePtr stage = Stage::GetCurrent(); - BakeViewportPositionMessage( stage->GetUpdateInterface(), *mSceneObject, value ); + BakeViewportPositionMessage( GetEventThreadServices(), *mSceneObject, value ); } Vector2 RenderTask::GetCurrentViewportPosition() const { - StagePtr stage = Stage::GetCurrent(); - return mSceneObject->GetViewportPosition(stage->GetEventBufferIndex()); + return mSceneObject->GetViewportPosition( GetEventThreadServices().GetEventBufferIndex() ); } void RenderTask::SetViewportSize(const Vector2& value) { - StagePtr stage = Stage::GetCurrent(); - BakeViewportSizeMessage( stage->GetUpdateInterface(), *mSceneObject, value ); + BakeViewportSizeMessage( GetEventThreadServices(), *mSceneObject, value ); } Vector2 RenderTask::GetCurrentViewportSize() const { - StagePtr stage = Stage::GetCurrent(); - return mSceneObject->GetViewportSize(stage->GetEventBufferIndex()); + return mSceneObject->GetViewportSize( GetEventThreadServices().GetEventBufferIndex() ); } void RenderTask::SetViewport( const Viewport& viewport ) @@ -215,7 +224,7 @@ void RenderTask::SetViewport( const Viewport& viewport ) void RenderTask::GetViewport( Viewport& viewPort ) const { - BufferIndex bufferIndex = Stage::GetCurrent()->GetEventBufferIndex(); + BufferIndex bufferIndex = GetEventThreadServices().GetEventBufferIndex(); if(!mSceneObject->GetViewportEnabled( bufferIndex )) { @@ -227,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 @@ -253,16 +266,14 @@ void RenderTask::SetClearColor( const Vector4& color ) if ( mSceneObject ) { // mSceneObject is being used in a separate thread; queue a message to set the value - StagePtr stage = Stage::GetCurrent(); - BakeClearColorMessage( stage->GetUpdateInterface(), *mSceneObject, color ); + BakeClearColorMessage( GetEventThreadServices(), *mSceneObject, color ); } } } const Vector4& RenderTask::GetClearColor() const { - StagePtr stage = Stage::GetCurrent(); - return mSceneObject->GetClearColor(stage->GetEventBufferIndex()); + return mSceneObject->GetClearColor( GetEventThreadServices().GetEventBufferIndex() ); } void RenderTask::SetClearEnabled( bool enabled ) @@ -274,7 +285,7 @@ void RenderTask::SetClearEnabled( bool enabled ) if ( mSceneObject ) { // mSceneObject is being used in a separate thread; queue a message to set the value - SetClearEnabledMessage( mEventToUpdate, *mSceneObject, mClearEnabled ); + SetClearEnabledMessage( GetEventThreadServices(), *mSceneObject, mClearEnabled ); } } } @@ -284,6 +295,25 @@ bool RenderTask::GetClearEnabled() const return mClearEnabled; } +void RenderTask::SetCullMode( bool mode ) +{ + if ( mCullMode != mode ) + { + mCullMode = mode; + + if ( mSceneObject ) + { + // mSceneObject is being used in a separate thread; queue a message to set the value + SetCullModeMessage( GetEventThreadServices(), *mSceneObject, mCullMode ); + } + } +} + +bool RenderTask::GetCullMode() const +{ + return mCullMode; +} + void RenderTask::SetRefreshRate( unsigned int refreshRate ) { DALI_LOG_TRACE_METHOD_FMT(gLogRender, "this:%p rate:%d\n", this, refreshRate); @@ -296,7 +326,7 @@ void RenderTask::SetRefreshRate( unsigned int refreshRate ) if ( mSceneObject ) { // mSceneObject is being used in a separate thread; queue a message to set the value - SetRefreshRateMessage( mEventToUpdate, *mSceneObject, refreshRate ); + SetRefreshRateMessage( GetEventThreadServices(), *mSceneObject, refreshRate ); } } @@ -341,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 ) { @@ -398,13 +431,14 @@ SceneGraph::RenderTask* RenderTask::CreateSceneObject() } // mSceneObject is being used in a separate thread; queue a message to set the value - SetFrameBufferIdMessage( mEventToUpdate, *mSceneObject, resourceId ); + SetFrameBufferIdMessage( GetEventThreadServices(), *mSceneObject, resourceId ); // Send messages to set other properties that may have changed since last time we were on stage - SetExclusiveMessage( mEventToUpdate, *mSceneObject, mExclusive ); - SetClearColorMessage( mEventToUpdate, *mSceneObject, mClearColor ); - SetClearEnabledMessage( mEventToUpdate, *mSceneObject, mClearEnabled ); - SetRefreshRateMessage( mEventToUpdate, *mSceneObject, mRefreshRate ); + SetExclusiveMessage( GetEventThreadServices(), *mSceneObject, mExclusive ); + SetClearColorMessage( GetEventThreadServices(), *mSceneObject, mClearColor ); + SetClearEnabledMessage( GetEventThreadServices(), *mSceneObject, mClearEnabled ); + SetCullModeMessage( GetEventThreadServices(), *mSceneObject, mCullMode ); + SetRefreshRateMessage( GetEventThreadServices(), *mSceneObject, mRefreshRate ); // Caller takes ownership return mSceneObject; @@ -428,16 +462,9 @@ void RenderTask::DiscardSceneObject() } /******************************************************************************** - ******************************************************************************** ******************************** PROPERTY METHODS ************************** - ******************************************************************************** ********************************************************************************/ -bool RenderTask::IsSceneObjectRemovable() const -{ - return false; // The scene object is permanently "on stage" whilst this object is alive -} - unsigned int RenderTask::GetDefaultPropertyCount() const { return DEFAULT_PROPERTY_COUNT; @@ -445,25 +472,23 @@ 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 ); } } -const std::string& RenderTask::GetDefaultPropertyName( Property::Index index ) const +const char* RenderTask::GetDefaultPropertyName( Property::Index index ) const { if( index < DEFAULT_PROPERTY_COUNT ) { - return DEFAULT_PROPERTY_NAMES[index]; + return DEFAULT_PROPERTY_DETAILS[index].name; } else { - // index out of range..return empty string - static const std::string INVALID_PROPERTY_NAME; - return INVALID_PROPERTY_NAME; + return NULL; } } @@ -471,85 +496,72 @@ Property::Index RenderTask::GetDefaultPropertyIndex(const std::string& name) con { Property::Index index = Property::INVALID_INDEX; - // Lazy initialization of static sDefaultPropertyLookup - if (!sDefaultPropertyLookup) + // Look for name in default properties + for( int i = 0; i < DEFAULT_PROPERTY_COUNT; ++i ) { - sDefaultPropertyLookup = new DefaultPropertyLookup(); - - for (int i=0; ifind( name ); - if ( sDefaultPropertyLookup->end() != result ) - { - index = result->second; - } return index; } bool RenderTask::IsDefaultPropertyWritable(Property::Index index) const { - return true; + return DEFAULT_PROPERTY_DETAILS[ index ].writable; } bool RenderTask::IsDefaultPropertyAnimatable(Property::Index index) const { - return true; + return DEFAULT_PROPERTY_DETAILS[ index ].animatable; +} + +bool RenderTask::IsDefaultPropertyAConstraintInput( Property::Index index ) const +{ + return DEFAULT_PROPERTY_DETAILS[ index ].constraintInput; } Property::Type RenderTask::GetDefaultPropertyType(Property::Index index) const { if( index < DEFAULT_PROPERTY_COUNT ) { - return DEFAULT_PROPERTY_TYPES[index]; - } - else - { - // index out of range...return Property::NONE - return Property::NONE; + return DEFAULT_PROPERTY_DETAILS[index].type; } + + // index out of range...return Property::NONE + return Property::NONE; } void RenderTask::SetDefaultProperty( Property::Index index, const Property::Value& property ) { switch ( index ) { - case Dali::RenderTask::VIEWPORT_POSITION: + case Dali::RenderTask::Property::VIEWPORT_POSITION: { SetViewportPosition( property.Get() ); break; } - case Dali::RenderTask::VIEWPORT_SIZE: + case Dali::RenderTask::Property::VIEWPORT_SIZE: { SetViewportSize( property.Get() ); break; } - case Dali::RenderTask::CLEAR_COLOR: + case Dali::RenderTask::Property::CLEAR_COLOR: { SetClearColor( property.Get() ); break; } - default: { - DALI_ASSERT_ALWAYS(false && "RenderTask property index out of range"); // should not come here + // nothing to do break; } } } -void RenderTask::SetCustomProperty( Property::Index /*index*/, const CustomProperty& /*entry*/, const Property::Value& /*value*/ ) -{ - // TODO: support them, it doesn't hurt. - DALI_ASSERT_ALWAYS( 0 && "RenderTask does not support custom properties"); -} - Property::Value RenderTask::GetDefaultProperty(Property::Index index) const { Property::Value value; @@ -557,17 +569,17 @@ Property::Value RenderTask::GetDefaultProperty(Property::Index index) const switch ( index ) { - case Dali::RenderTask::VIEWPORT_POSITION: + case Dali::RenderTask::Property::VIEWPORT_POSITION: { value = GetCurrentViewportPosition(); break; } - case Dali::RenderTask::VIEWPORT_SIZE: + case Dali::RenderTask::Property::VIEWPORT_SIZE: { value = GetCurrentViewportSize(); break; } - case Dali::RenderTask::CLEAR_COLOR: + case Dali::RenderTask::Property::CLEAR_COLOR: { value = GetClearColor(); break; @@ -583,12 +595,6 @@ Property::Value RenderTask::GetDefaultProperty(Property::Index index) const return value; } -void RenderTask::InstallSceneObjectProperty( SceneGraph::PropertyBase& newProperty, const std::string& name, unsigned int index ) -{ - // TODO: support them, it doesn't hurt. - DALI_ASSERT_ALWAYS( 0 && "RenderTask does not support custom properties" ); -} - const SceneGraph::PropertyOwner* RenderTask::GetSceneObject() const { return mSceneObject; @@ -605,15 +611,15 @@ const SceneGraph::PropertyBase* RenderTask::GetSceneObjectAnimatableProperty( Pr { switch ( index ) { - case Dali::RenderTask::VIEWPORT_POSITION: + case Dali::RenderTask::Property::VIEWPORT_POSITION: property = &mSceneObject->mViewportPosition; break; - case Dali::RenderTask::VIEWPORT_SIZE: + case Dali::RenderTask::Property::VIEWPORT_SIZE: property = &mSceneObject->mViewportSize; break; - case Dali::RenderTask::CLEAR_COLOR: + case Dali::RenderTask::Property::CLEAR_COLOR: property = &mSceneObject->mClearColor; break; @@ -632,15 +638,15 @@ const PropertyInputImpl* RenderTask::GetSceneObjectInputProperty( Property::Inde { switch ( index ) { - case Dali::RenderTask::VIEWPORT_POSITION: + case Dali::RenderTask::Property::VIEWPORT_POSITION: property = &mSceneObject->mViewportPosition; break; - case Dali::RenderTask::VIEWPORT_SIZE: + case Dali::RenderTask::Property::VIEWPORT_SIZE: property = &mSceneObject->mViewportSize; break; - case Dali::RenderTask::CLEAR_COLOR: + case Dali::RenderTask::Property::CLEAR_COLOR: property = &mSceneObject->mViewportSize; break; @@ -672,16 +678,16 @@ void RenderTask::EmitSignalFinish() { DALI_LOG_INFO(gLogRender, Debug::General, "RenderTask::EmitSignalFinish(this:%p)\n", this); - if( !mSignalFinishedV2.Empty() ) + if( !mSignalFinished.Empty() ) { Dali::RenderTask handle( this ); - mSignalFinishedV2.Emit(handle ); + mSignalFinished.Emit(handle ); } } -Dali::RenderTask::RenderTaskSignalV2& RenderTask::FinishedSignal() +Dali::RenderTask::RenderTaskSignalType& RenderTask::FinishedSignal() { - return mSignalFinishedV2; + return mSignalFinished; } bool RenderTask::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ) @@ -689,7 +695,7 @@ bool RenderTask::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface bool connected( true ); RenderTask* renderTask = dynamic_cast(object); - if ( Dali::RenderTask::SIGNAL_FINISHED == signalName ) + if ( 0 == strcmp( signalName.c_str(), SIGNAL_FINISHED ) ) { renderTask->FinishedSignal().Connect( tracker, functor ); } @@ -702,9 +708,8 @@ bool RenderTask::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface return connected; } -RenderTask::RenderTask( EventToUpdate& eventToUpdate, bool isSystemLevel ) -: mEventToUpdate( eventToUpdate ), - mSceneObject( NULL ), +RenderTask::RenderTask( bool isSystemLevel ) +: mSceneObject( NULL ), mSourceConnector( Connector::SOURCE_CONNECTOR, *this ), mCameraConnector( Connector::CAMERA_CONNECTOR, *this ), mMappingConnector( Connector::MAPPING_CONNECTOR, *this ), @@ -715,6 +720,7 @@ RenderTask::RenderTask( EventToUpdate& eventToUpdate, bool isSystemLevel ) mExclusive( Dali::RenderTask::DEFAULT_EXCLUSIVE ), mInputEnabled( Dali::RenderTask::DEFAULT_INPUT_ENABLED ), mClearEnabled( Dali::RenderTask::DEFAULT_CLEAR_ENABLED ), + mCullMode( Dali::RenderTask::DEFAULT_CULL_MODE ), mIsSystemLevel( isSystemLevel ) { DALI_LOG_INFO(gLogRender, Debug::General, "RenderTask::RenderTask(this:%p)\n", this); @@ -759,18 +765,27 @@ void RenderTask::Connector::SetActor( Actor* actor ) } } -void RenderTask::Connector::SceneObjectAdded( ProxyObject& proxy ) +void RenderTask::Connector::SceneObjectAdded( Object& object ) { UpdateRenderTask(); } -void RenderTask::Connector::SceneObjectRemoved( ProxyObject& proxy ) +void RenderTask::Connector::SceneObjectRemoved( Object& object ) { UpdateRenderTask(); } -void RenderTask::Connector::ProxyDestroyed( ProxyObject& proxy ) +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(); @@ -798,11 +813,11 @@ void RenderTask::Connector::UpdateRenderTask() //the mapping node is not used in the scene graph if ( SOURCE_CONNECTOR == mType ) { - SetSourceNodeMessage( mRenderTask.mEventToUpdate, *(mRenderTask.mSceneObject), node ); + SetSourceNodeMessage( mRenderTask.GetEventThreadServices(), *(mRenderTask.mSceneObject), node ); } else if( CAMERA_CONNECTOR == mType ) { - SetCameraNodeMessage( mRenderTask.mEventToUpdate, *(mRenderTask.mSceneObject), node ); + SetCameraNodeMessage( mRenderTask.GetEventThreadServices(), *(mRenderTask.mSceneObject), node ); } } }