X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Factors%2Factor-impl.cpp;h=614c6e40f272caa7382a1aecd32027dd87db8b70;hb=926d6ac76f0f1a7858e19e330e71431e4741e1ce;hp=9cd7f4129d4ad350bc297e36debcfce8082dc05b;hpb=87791e64cbdb8a3edb9f5fdd823fb34deadb083a;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/actors/actor-impl.cpp b/dali/internal/event/actors/actor-impl.cpp index 9cd7f41..614c6e4 100644 --- a/dali/internal/event/actors/actor-impl.cpp +++ b/dali/internal/event/actors/actor-impl.cpp @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -54,13 +53,6 @@ #include #include -#ifdef DALI_DYNAMICS_SUPPORT -#include -#include -#include -#include -#endif - using Dali::Internal::SceneGraph::Node; using Dali::Internal::SceneGraph::AnimatableProperty; using Dali::Internal::SceneGraph::PropertyBase; @@ -174,28 +166,6 @@ struct Actor::RelayoutData bool insideRelayout :1; ///< Locking flag to prevent recursive relayouts on size set }; -#ifdef DALI_DYNAMICS_SUPPORT - -// Encapsulate actor related dynamics data -struct DynamicsData -{ - DynamicsData( Actor* slotOwner ) - : slotDelegate( slotOwner ) - { - } - - typedef std::map JointContainer; - typedef std::vector ReferencedJointContainer; - - DynamicsBodyPtr body; - JointContainer joints; - ReferencedJointContainer referencedJoints; - - SlotDelegate< Actor > slotDelegate; -}; - -#endif // DALI_DYNAMICS_SUPPORT - namespace // unnamed namespace { @@ -207,67 +177,67 @@ namespace // unnamed namespace * Name Type writable animatable constraint-input enum for index-checking */ DALI_PROPERTY_TABLE_BEGIN -DALI_PROPERTY( "parent-origin", VECTOR3, true, false, true, Dali::Actor::Property::PARENT_ORIGIN ) -DALI_PROPERTY( "parent-origin-x", FLOAT, true, false, true, Dali::Actor::Property::PARENT_ORIGIN_X ) -DALI_PROPERTY( "parent-origin-y", FLOAT, true, false, true, Dali::Actor::Property::PARENT_ORIGIN_Y ) -DALI_PROPERTY( "parent-origin-z", FLOAT, true, false, true, Dali::Actor::Property::PARENT_ORIGIN_Z ) -DALI_PROPERTY( "anchor-point", VECTOR3, true, false, true, Dali::Actor::Property::ANCHOR_POINT ) -DALI_PROPERTY( "anchor-point-x", FLOAT, true, false, true, Dali::Actor::Property::ANCHOR_POINT_X ) -DALI_PROPERTY( "anchor-point-y", FLOAT, true, false, true, Dali::Actor::Property::ANCHOR_POINT_Y ) -DALI_PROPERTY( "anchor-point-z", FLOAT, true, false, true, Dali::Actor::Property::ANCHOR_POINT_Z ) +DALI_PROPERTY( "parentOrigin", VECTOR3, true, false, true, Dali::Actor::Property::PARENT_ORIGIN ) +DALI_PROPERTY( "parentOriginX", FLOAT, true, false, true, Dali::Actor::Property::PARENT_ORIGIN_X ) +DALI_PROPERTY( "parentOriginY", FLOAT, true, false, true, Dali::Actor::Property::PARENT_ORIGIN_Y ) +DALI_PROPERTY( "parentOriginZ", FLOAT, true, false, true, Dali::Actor::Property::PARENT_ORIGIN_Z ) +DALI_PROPERTY( "anchorPoint", VECTOR3, true, false, true, Dali::Actor::Property::ANCHOR_POINT ) +DALI_PROPERTY( "anchorPointX", FLOAT, true, false, true, Dali::Actor::Property::ANCHOR_POINT_X ) +DALI_PROPERTY( "anchorPointY", FLOAT, true, false, true, Dali::Actor::Property::ANCHOR_POINT_Y ) +DALI_PROPERTY( "anchorPointZ", FLOAT, true, false, true, Dali::Actor::Property::ANCHOR_POINT_Z ) DALI_PROPERTY( "size", VECTOR3, true, true, true, Dali::Actor::Property::SIZE ) -DALI_PROPERTY( "size-width", FLOAT, true, true, true, Dali::Actor::Property::SIZE_WIDTH ) -DALI_PROPERTY( "size-height", FLOAT, true, true, true, Dali::Actor::Property::SIZE_HEIGHT ) -DALI_PROPERTY( "size-depth", FLOAT, true, true, true, Dali::Actor::Property::SIZE_DEPTH ) +DALI_PROPERTY( "sizeWidth", FLOAT, true, true, true, Dali::Actor::Property::SIZE_WIDTH ) +DALI_PROPERTY( "sizeHeight", FLOAT, true, true, true, Dali::Actor::Property::SIZE_HEIGHT ) +DALI_PROPERTY( "sizeDepth", FLOAT, true, true, true, Dali::Actor::Property::SIZE_DEPTH ) DALI_PROPERTY( "position", VECTOR3, true, true, true, Dali::Actor::Property::POSITION ) -DALI_PROPERTY( "position-x", FLOAT, true, true, true, Dali::Actor::Property::POSITION_X ) -DALI_PROPERTY( "position-y", FLOAT, true, true, true, Dali::Actor::Property::POSITION_Y ) -DALI_PROPERTY( "position-z", FLOAT, true, true, true, Dali::Actor::Property::POSITION_Z ) -DALI_PROPERTY( "world-position", VECTOR3, false, false, true, Dali::Actor::Property::WORLD_POSITION ) -DALI_PROPERTY( "world-position-x", FLOAT, false, false, true, Dali::Actor::Property::WORLD_POSITION_X ) -DALI_PROPERTY( "world-position-y", FLOAT, false, false, true, Dali::Actor::Property::WORLD_POSITION_Y ) -DALI_PROPERTY( "world-position-z", FLOAT, false, false, true, Dali::Actor::Property::WORLD_POSITION_Z ) +DALI_PROPERTY( "positionX", FLOAT, true, true, true, Dali::Actor::Property::POSITION_X ) +DALI_PROPERTY( "positionY", FLOAT, true, true, true, Dali::Actor::Property::POSITION_Y ) +DALI_PROPERTY( "positionZ", FLOAT, true, true, true, Dali::Actor::Property::POSITION_Z ) +DALI_PROPERTY( "worldPosition", VECTOR3, false, false, true, Dali::Actor::Property::WORLD_POSITION ) +DALI_PROPERTY( "worldPositionX", FLOAT, false, false, true, Dali::Actor::Property::WORLD_POSITION_X ) +DALI_PROPERTY( "worldPositionY", FLOAT, false, false, true, Dali::Actor::Property::WORLD_POSITION_Y ) +DALI_PROPERTY( "worldPositionZ", FLOAT, false, false, true, Dali::Actor::Property::WORLD_POSITION_Z ) DALI_PROPERTY( "orientation", ROTATION, true, true, true, Dali::Actor::Property::ORIENTATION ) -DALI_PROPERTY( "world-orientation", ROTATION, false, false, true, Dali::Actor::Property::WORLD_ORIENTATION ) +DALI_PROPERTY( "worldOrientation", ROTATION, false, false, true, Dali::Actor::Property::WORLD_ORIENTATION ) DALI_PROPERTY( "scale", VECTOR3, true, true, true, Dali::Actor::Property::SCALE ) -DALI_PROPERTY( "scale-x", FLOAT, true, true, true, Dali::Actor::Property::SCALE_X ) -DALI_PROPERTY( "scale-y", FLOAT, true, true, true, Dali::Actor::Property::SCALE_Y ) -DALI_PROPERTY( "scale-z", FLOAT, true, true, true, Dali::Actor::Property::SCALE_Z ) -DALI_PROPERTY( "world-scale", VECTOR3, false, false, true, Dali::Actor::Property::WORLD_SCALE ) +DALI_PROPERTY( "scaleX", FLOAT, true, true, true, Dali::Actor::Property::SCALE_X ) +DALI_PROPERTY( "scaleY", FLOAT, true, true, true, Dali::Actor::Property::SCALE_Y ) +DALI_PROPERTY( "scaleZ", FLOAT, true, true, true, Dali::Actor::Property::SCALE_Z ) +DALI_PROPERTY( "worldScale", VECTOR3, false, false, true, Dali::Actor::Property::WORLD_SCALE ) DALI_PROPERTY( "visible", BOOLEAN, true, true, true, Dali::Actor::Property::VISIBLE ) DALI_PROPERTY( "color", VECTOR4, true, true, true, Dali::Actor::Property::COLOR ) -DALI_PROPERTY( "color-red", FLOAT, true, true, true, Dali::Actor::Property::COLOR_RED ) -DALI_PROPERTY( "color-green", FLOAT, true, true, true, Dali::Actor::Property::COLOR_GREEN ) -DALI_PROPERTY( "color-blue", FLOAT, true, true, true, Dali::Actor::Property::COLOR_BLUE ) -DALI_PROPERTY( "color-alpha", FLOAT, true, true, true, Dali::Actor::Property::COLOR_ALPHA ) -DALI_PROPERTY( "world-color", VECTOR4, false, false, true, Dali::Actor::Property::WORLD_COLOR ) -DALI_PROPERTY( "world-matrix", MATRIX, false, false, true, Dali::Actor::Property::WORLD_MATRIX ) +DALI_PROPERTY( "colorRed", FLOAT, true, true, true, Dali::Actor::Property::COLOR_RED ) +DALI_PROPERTY( "colorGreen", FLOAT, true, true, true, Dali::Actor::Property::COLOR_GREEN ) +DALI_PROPERTY( "colorBlue", FLOAT, true, true, true, Dali::Actor::Property::COLOR_BLUE ) +DALI_PROPERTY( "colorAlpha", FLOAT, true, true, true, Dali::Actor::Property::COLOR_ALPHA ) +DALI_PROPERTY( "worldColor", VECTOR4, false, false, true, Dali::Actor::Property::WORLD_COLOR ) +DALI_PROPERTY( "worldMatrix", MATRIX, false, false, true, Dali::Actor::Property::WORLD_MATRIX ) DALI_PROPERTY( "name", STRING, true, false, false, Dali::Actor::Property::NAME ) DALI_PROPERTY( "sensitive", BOOLEAN, true, false, false, Dali::Actor::Property::SENSITIVE ) -DALI_PROPERTY( "leave-required", BOOLEAN, true, false, false, Dali::Actor::Property::LEAVE_REQUIRED ) -DALI_PROPERTY( "inherit-orientation",BOOLEAN, true, false, false, Dali::Actor::Property::INHERIT_ORIENTATION ) -DALI_PROPERTY( "inherit-scale", BOOLEAN, true, false, false, Dali::Actor::Property::INHERIT_SCALE ) -DALI_PROPERTY( "color-mode", STRING, true, false, false, Dali::Actor::Property::COLOR_MODE ) -DALI_PROPERTY( "position-inheritance",STRING, true, false, false, Dali::Actor::Property::POSITION_INHERITANCE ) -DALI_PROPERTY( "draw-mode", STRING, true, false, false, Dali::Actor::Property::DRAW_MODE ) -DALI_PROPERTY( "size-mode-factor", VECTOR3, true, false, false, Dali::Actor::Property::SIZE_MODE_FACTOR ) -DALI_PROPERTY( "width-resize-policy",STRING, true, false, false, Dali::Actor::Property::WIDTH_RESIZE_POLICY ) -DALI_PROPERTY( "height-resize-policy",STRING, true, false, false, Dali::Actor::Property::HEIGHT_RESIZE_POLICY ) -DALI_PROPERTY( "size-scale-policy", STRING, true, false, false, Dali::Actor::Property::SIZE_SCALE_POLICY ) -DALI_PROPERTY( "width-for-height", BOOLEAN, true, false, false, Dali::Actor::Property::WIDTH_FOR_HEIGHT ) -DALI_PROPERTY( "height-for-width", BOOLEAN, true, false, false, Dali::Actor::Property::HEIGHT_FOR_WIDTH ) +DALI_PROPERTY( "leaveRequired", BOOLEAN, true, false, false, Dali::Actor::Property::LEAVE_REQUIRED ) +DALI_PROPERTY( "inheritOrientation", BOOLEAN, true, false, false, Dali::Actor::Property::INHERIT_ORIENTATION ) +DALI_PROPERTY( "inheritScale", BOOLEAN, true, false, false, Dali::Actor::Property::INHERIT_SCALE ) +DALI_PROPERTY( "colorMode", STRING, true, false, false, Dali::Actor::Property::COLOR_MODE ) +DALI_PROPERTY( "positionInheritance", STRING, true, false, false, Dali::Actor::Property::POSITION_INHERITANCE ) +DALI_PROPERTY( "drawMode", STRING, true, false, false, Dali::Actor::Property::DRAW_MODE ) +DALI_PROPERTY( "sizeModeFactor", VECTOR3, true, false, false, Dali::Actor::Property::SIZE_MODE_FACTOR ) +DALI_PROPERTY( "widthResizePolicy", STRING, true, false, false, Dali::Actor::Property::WIDTH_RESIZE_POLICY ) +DALI_PROPERTY( "heightResizePolicy", STRING, true, false, false, Dali::Actor::Property::HEIGHT_RESIZE_POLICY ) +DALI_PROPERTY( "sizeScalePolicy", STRING, true, false, false, Dali::Actor::Property::SIZE_SCALE_POLICY ) +DALI_PROPERTY( "widthForHeight", BOOLEAN, true, false, false, Dali::Actor::Property::WIDTH_FOR_HEIGHT ) +DALI_PROPERTY( "heightForWidth", BOOLEAN, true, false, false, Dali::Actor::Property::HEIGHT_FOR_WIDTH ) DALI_PROPERTY( "padding", VECTOR4, true, false, false, Dali::Actor::Property::PADDING ) -DALI_PROPERTY( "minimum-size", VECTOR2, true, false, false, Dali::Actor::Property::MINIMUM_SIZE ) -DALI_PROPERTY( "maximum-size", VECTOR2, true, false, false, Dali::Actor::Property::MAXIMUM_SIZE ) +DALI_PROPERTY( "minimumSize", VECTOR2, true, false, false, Dali::Actor::Property::MINIMUM_SIZE ) +DALI_PROPERTY( "maximumSize", VECTOR2, true, false, false, Dali::Actor::Property::MAXIMUM_SIZE ) DALI_PROPERTY_TABLE_END( DEFAULT_ACTOR_PROPERTY_START_INDEX ) // Signals const char* const SIGNAL_TOUCHED = "touched"; const char* const SIGNAL_HOVERED = "hovered"; -const char* const SIGNAL_WHEEL_EVENT = "wheel-event"; -const char* const SIGNAL_ON_STAGE = "on-stage"; -const char* const SIGNAL_OFF_STAGE = "off-stage"; +const char* const SIGNAL_WHEEL_EVENT = "wheelEvent"; +const char* const SIGNAL_ON_STAGE = "onStage"; +const char* const SIGNAL_OFF_STAGE = "offStage"; // Actions @@ -454,63 +424,6 @@ void Actor::Add( Actor& child ) } } -void Actor::Insert( unsigned int index, Actor& child ) -{ - DALI_ASSERT_ALWAYS( this != &child && "Cannot add actor to itself" ); - DALI_ASSERT_ALWAYS( !child.IsRoot() && "Cannot add root actor" ); - - if( !mChildren ) - { - mChildren = new ActorContainer; - } - - Actor* const oldParent( child.mParent ); - - // since an explicit position has been given, always insert, even if already a child - if( oldParent ) - { - oldParent->Remove( child ); // This causes OnChildRemove callback - - // Old parent may need to readjust to missing child - if( oldParent->RelayoutDependentOnChildren() ) - { - oldParent->RelayoutRequest(); - } - } - - // Guard against Add() during previous OnChildRemove callback - if( !child.mParent ) - { - // Do this first, since user callbacks from within SetParent() may need to remove child - if( index < GetChildCount() ) - { - ActorIter it = mChildren->begin(); - std::advance( it, index ); - mChildren->insert( it, ActorPtr( &child ) ); - } - else - { - mChildren->push_back( ActorPtr( &child ) ); - } - // SetParent asserts that child can be added - child.SetParent( this, index ); - - // Notification for derived classes - OnChildAdd( child ); - - // Only put in a relayout request if there is a suitable dependency - if( RelayoutDependentOnChildren() ) - { - RelayoutRequest(); - } - - if( child.RelayoutDependentOnParent() ) - { - child.RelayoutRequest(); - } - } -} - void Actor::Remove( Actor& child ) { if( (this == &child) || (!mChildren) ) @@ -1163,23 +1076,19 @@ void Actor::SetSize( float width, float height, float depth ) void Actor::SetSize( const Vector2& size ) { - SetSize( Vector3( size.width, size.height, CalculateSizeZ( size ) ) ); + SetSize( Vector3( size.width, size.height, 0.f ) ); } void Actor::SetSizeInternal( const Vector2& size ) { - SetSizeInternal( Vector3( size.width, size.height, CalculateSizeZ( size ) ) ); -} - -float Actor::CalculateSizeZ( const Vector2& size ) const -{ - return std::min( size.width, size.height ); + SetSizeInternal( Vector3( size.width, size.height, 0.f ) ); } void Actor::SetSize( const Vector3& size ) { if( IsRelayoutEnabled() && !mRelayoutData->insideRelayout ) { + // TODO we cannot just ignore the given Z but that means rewrite the size negotiation!! SetPreferredSize( size.GetVectorXY() ); } else @@ -1445,437 +1354,85 @@ bool Actor::RelayoutRequired( Dimension::Type dimension ) const unsigned int Actor::AddRenderer( Renderer& renderer ) { - //TODO: MESH_REWORK : Add support for multiple renderers - if ( ! mAttachment ) + if( !mRenderers ) { - mAttachment = RendererAttachment::New( GetEventThreadServices(), *mNode, renderer ); + mRenderers = new RendererContainer; } - return 0; -} - -unsigned int Actor::GetRendererCount() const -{ - //TODO: MESH_REWORK : Add support for multiple renderers - RendererAttachment* attachment = dynamic_cast(mAttachment.Get()); - return attachment ? 1u : 0u; -} + unsigned int index = mRenderers->size(); + RendererPtr rendererPtr = RendererPtr( &renderer ); + mRenderers->push_back( rendererPtr ); + AddRendererMessage( GetEventThreadServices(), *mNode, renderer.GetRendererSceneObject() ); -Renderer& Actor::GetRendererAt( unsigned int index ) -{ - //TODO: MESH_REWORK : Add support for multiple renderers - DALI_ASSERT_DEBUG( index == 0 && "Only one renderer is supported." ); - - //TODO: MESH_REWORK : Temporary code - RendererAttachment* attachment = dynamic_cast(mAttachment.Get()); - DALI_ASSERT_ALWAYS( attachment && "Actor doesn't have a renderer" ); - - return attachment->GetRenderer(); -} - -void Actor::RemoveRenderer( Renderer& renderer ) -{ - //TODO: MESH_REWORK : Add support for multiple renderers - mAttachment = NULL; -} - -void Actor::RemoveRenderer( unsigned int index ) -{ - //TODO: MESH_REWORK : Add support for multiple renderers - mAttachment = NULL; -} - - -#ifdef DALI_DYNAMICS_SUPPORT - -//--------------- Dynamics --------------- - -void Actor::DisableDynamics() -{ - if( NULL != mDynamicsData ) - { - DALI_LOG_INFO(Debug::Filter::gDynamics, Debug::Verbose, "%s- (\"%s\")\n", __PRETTY_FUNCTION__, mName.c_str()); - - // ensure dynamics object are disconnected from scene - DisconnectDynamics(); - - // delete joint owned by this actor - while( !mDynamicsData->joints.empty() ) - { - RemoveDynamicsJoint( mDynamicsData->joints.begin()->second ); - } - - // delete other joints referencing this actor - while( !mDynamicsData->referencedJoints.empty() ) - { - DynamicsJointPtr joint( *(mDynamicsData->referencedJoints.begin()) ); - ActorPtr jointOwner( joint->GetActor( true ) ); - if( jointOwner ) - { - jointOwner->RemoveDynamicsJoint( joint ); - } - else - { - mDynamicsData->referencedJoints.erase( mDynamicsData->referencedJoints.begin() ); - } - } - // delete the DynamicsBody object - mDynamicsData->body.Reset(); - - // Discard Dynamics data structure - delete mDynamicsData; - mDynamicsData = NULL; - } -} - -DynamicsBodyPtr Actor::GetDynamicsBody() const -{ - DynamicsBodyPtr body; - - if( NULL != mDynamicsData ) - { - body = mDynamicsData->body; - } - - return body; -} - -DynamicsBodyPtr Actor::EnableDynamics(DynamicsBodyConfigPtr bodyConfig) -{ - DALI_LOG_INFO(Debug::Filter::gDynamics, Debug::Verbose, "%s- (\"%s\")\n", __PRETTY_FUNCTION__, mName.c_str()); - - if( NULL == mDynamicsData ) - { - mDynamicsData = new DynamicsData( this ); - } - - if( !mDynamicsData->body ) + if( mIsOnStage) { - mDynamicsData->body = new DynamicsBody(mName, bodyConfig, *this, *(const_cast(mNode)) ); - - if( OnStage() ) - { - DynamicsWorldPtr world( DynamicsWorld::Get() ); - if( world ) - { - if( mParent == world->GetRootActor().Get() ) - { - mDynamicsData->body->Connect( GetEventThreadServices() ); - } - } - } + rendererPtr->Connect(); } - return mDynamicsData->body; -} - -DynamicsJointPtr Actor::AddDynamicsJoint( ActorPtr attachedActor, const Vector3& offset ) -{ - DALI_ASSERT_ALWAYS( attachedActor && "'attachedActor' must be initialized!" ); - return AddDynamicsJoint( attachedActor, offset, ( GetCurrentPosition() + offset ) - attachedActor->GetCurrentPosition() ); -} - -DynamicsJointPtr Actor::AddDynamicsJoint( ActorPtr attachedActor, const Vector3& offsetA, const Vector3& offsetB ) -{ - DALI_ASSERT_ALWAYS( attachedActor && "'attachedActor' must be initialized!" ); - DALI_ASSERT_ALWAYS( this != attachedActor.Get() && "Cannot create a joint to oneself!" ); - - DynamicsJointPtr joint; - - DynamicsWorldPtr world( DynamicsWorld::Get() ); - - if( world ) - { - if( NULL != mDynamicsData ) - { - DynamicsData::JointContainer::iterator it( mDynamicsData->joints.find( attachedActor.Get() ) ); - - if( mDynamicsData->joints.end() != it ) - { - // use existing joint - joint = it->second; - } - - if( !joint ) - { - DynamicsBodyPtr bodyA( GetDynamicsBody() ); - DynamicsBodyPtr bodyB( attachedActor->GetDynamicsBody() ); - - if( !bodyA ) - { - bodyA = EnableDynamics( new DynamicsBodyConfig ); - } - - if( !bodyB ) - { - bodyB = attachedActor->EnableDynamics( new DynamicsBodyConfig ); - } - - joint = new DynamicsJoint(world, bodyA, bodyB, offsetA, offsetB); - mDynamicsData->joints[ attachedActor.Get() ] = joint; - - if( OnStage() && attachedActor->OnStage() ) - { - joint->Connect( GetEventThreadServices() ); - } - - attachedActor->ReferenceJoint( joint ); - - attachedActor->OnStageSignal().Connect( mDynamicsData->slotDelegate, &Actor::AttachedActorOnStage ); - attachedActor->OffStageSignal().Connect( mDynamicsData->slotDelegate, &Actor::AttachedActorOffStage ); - } - } - } - return joint; -} - -const int Actor::GetNumberOfJoints() const -{ - return static_cast( NULL != mDynamicsData ? mDynamicsData->joints.size() : 0 ); + return index; } -DynamicsJointPtr Actor::GetDynamicsJointByIndex( const int index ) const +unsigned int Actor::GetRendererCount() const { - DynamicsJointPtr joint; - - if( NULL != mDynamicsData ) + unsigned int rendererCount(0); + if( mRenderers ) { - if( index >= 0 && index < static_cast(mDynamicsData->joints.size()) ) - { - DynamicsData::JointContainer::const_iterator it( mDynamicsData->joints.begin() ); - - for( int i = 0; i < index; ++i ) - { - ++it; - } - - joint = it->second; - } + rendererCount = mRenderers->size(); } - return joint; + return rendererCount; } -DynamicsJointPtr Actor::GetDynamicsJoint( ActorPtr attachedActor ) const +RendererPtr Actor::GetRendererAt( unsigned int index ) { - DynamicsJointPtr joint; - - if( NULL != mDynamicsData ) + RendererPtr renderer; + if( index < GetRendererCount() ) { - DynamicsData::JointContainer::const_iterator it( mDynamicsData->joints.find( attachedActor.Get() ) ); - - if( mDynamicsData->joints.end() != it ) - { - // use existing joint - joint = it->second; - } + renderer = ( *mRenderers )[ index ]; } - return joint; + return renderer; } -void Actor::RemoveDynamicsJoint( DynamicsJointPtr joint ) +void Actor::RemoveRenderer( Renderer& renderer ) { - if( NULL != mDynamicsData ) + if( mRenderers ) { - DynamicsData::JointContainer::iterator it( mDynamicsData->joints.begin() ); - DynamicsData::JointContainer::iterator endIt( mDynamicsData->joints.end() ); - - for(; it != endIt; ++it ) + RendererIter end = mRenderers->end(); + for( RendererIter iter = mRenderers->begin(); iter != end; ++iter ) { - if( it->second == joint.Get() ) + if( (*iter).Get() == &renderer ) { - ActorPtr attachedActor( it->first ); - - if( OnStage() && attachedActor && attachedActor->OnStage() ) - { - joint->Disconnect( GetEventThreadServices() ); - } - - if( attachedActor ) - { - attachedActor->ReleaseJoint( joint ); - attachedActor->OnStageSignal().Disconnect( mDynamicsData->slotDelegate, &Actor::AttachedActorOnStage ); - attachedActor->OffStageSignal().Disconnect( mDynamicsData->slotDelegate, &Actor::AttachedActorOffStage ); - } - - mDynamicsData->joints.erase(it); + mRenderers->erase( iter ); + RemoveRendererMessage( GetEventThreadServices(), *mNode, renderer.GetRendererSceneObject() ); break; } } } } -void Actor::ReferenceJoint( DynamicsJointPtr joint ) -{ - DALI_ASSERT_DEBUG( NULL != mDynamicsData && "Dynamics not enabled on this actor!" ); - - if( NULL != mDynamicsData ) - { - mDynamicsData->referencedJoints.push_back(joint); - } -} - -void Actor::ReleaseJoint( DynamicsJointPtr joint ) -{ - DALI_ASSERT_DEBUG( NULL != mDynamicsData && "Dynamics not enabled on this actor!" ); - - if( NULL != mDynamicsData ) - { - DynamicsData::ReferencedJointContainer::iterator it( std::find( mDynamicsData->referencedJoints.begin(), mDynamicsData->referencedJoints.end(), joint ) ); - - if( it != mDynamicsData->referencedJoints.end() ) - { - mDynamicsData->referencedJoints.erase( it ); - } - } -} - -void Actor::SetDynamicsRoot(bool flag) -{ - if( mIsDynamicsRoot != flag ) - { - mIsDynamicsRoot = flag; - - if( OnStage() && mChildren ) - { - // walk the children connecting or disconnecting any dynamics enabled child from the dynamics simulation - ActorIter end = mChildren->end(); - for( ActorIter iter = mChildren->begin(); iter != end; ++iter ) - { - ActorPtr child = (*iter); - - if( child->GetDynamicsBody() ) - { - if( mIsDynamicsRoot ) - { - child->ConnectDynamics(); - } - else - { - child->DisconnectDynamics(); - } - } - } - } - } -} - -bool Actor::IsDynamicsRoot() const -{ - return mIsDynamicsRoot; -} - -void Actor::AttachedActorOnStage( Dali::Actor actor ) -{ - DALI_LOG_INFO(Debug::Filter::gDynamics, Debug::Verbose, "%s\n", __PRETTY_FUNCTION__); - - if( OnStage() ) - { - ActorPtr attachedActor( &GetImplementation(actor) ); - - DALI_ASSERT_DEBUG( NULL != mDynamicsData && "Dynamics not enabled on this actor!" ); - if( NULL != mDynamicsData ) - { - DynamicsData::JointContainer::iterator it( mDynamicsData->joints.find( attachedActor.Get() ) ); - if( mDynamicsData->joints.end() != it ) - { - DynamicsJointPtr joint( it->second ); - joint->Connect( GetEventThreadServices() ); - } - } - } -} - -void Actor::AttachedActorOffStage( Dali::Actor actor ) -{ - DALI_LOG_INFO(Debug::Filter::gDynamics, Debug::Verbose, "%s\n", __PRETTY_FUNCTION__); - - if( OnStage() ) - { - ActorPtr attachedActor( &GetImplementation(actor) ); - - DALI_ASSERT_DEBUG( NULL != mDynamicsData && "Dynamics not enabled on this actor!" ); - if( NULL != mDynamicsData ) - { - DynamicsData::JointContainer::iterator it( mDynamicsData->joints.find( attachedActor.Get() ) ); - if( mDynamicsData->joints.end() != it ) - { - DynamicsJointPtr joint( it->second ); - joint->Disconnect( GetEventThreadServices() ); - } - } - } -} - -void Actor::ConnectDynamics() -{ - if( NULL != mDynamicsData && mDynamicsData->body ) - { - if( OnStage() && mParent && mParent->IsDynamicsRoot() ) - { - mDynamicsData->body->Connect( GetEventThreadServices() ); - - // Connect all joints where attachedActor is also on stage - if( !mDynamicsData->joints.empty() ) - { - DynamicsData::JointContainer::iterator it( mDynamicsData->joints.begin() ); - DynamicsData::JointContainer::iterator endIt( mDynamicsData->joints.end() ); - - for(; it != endIt; ++it ) - { - Actor* attachedActor( it->first ); - if( NULL != attachedActor && attachedActor->OnStage() ) - { - DynamicsJointPtr joint( it->second ); - - joint->Connect( GetEventThreadServices() ); - } - } - } - } - } -} - -void Actor::DisconnectDynamics() +void Actor::RemoveRenderer( unsigned int index ) { - if( NULL != mDynamicsData && mDynamicsData->body ) + if( index < GetRendererCount() ) { - if( OnStage() ) - { - mDynamicsData->body->Disconnect( GetEventThreadServices() ); - - // Disconnect all joints - if( !mDynamicsData->joints.empty() ) - { - DynamicsData::JointContainer::iterator it( mDynamicsData->joints.begin() ); - DynamicsData::JointContainer::iterator endIt( mDynamicsData->joints.end() ); - - for(; it != endIt; ++it ) - { - DynamicsJointPtr joint( it->second ); - - joint->Disconnect( GetEventThreadServices() ); - } - } - } + RendererPtr renderer = ( *mRenderers )[ index ]; + RemoveRendererMessage( GetEventThreadServices(), *mNode, renderer.Get()->GetRendererSceneObject() ); + mRenderers->erase( mRenderers->begin()+index ); } } -#endif // DALI_DYNAMICS_SUPPORT - void Actor::SetOverlay( bool enable ) { - // Setting STENCIL will override OVERLAY + // Setting STENCIL will override OVERLAY_2D if( DrawMode::STENCIL != mDrawMode ) { - SetDrawMode( enable ? DrawMode::OVERLAY : DrawMode::NORMAL ); + SetDrawMode( enable ? DrawMode::OVERLAY_2D : DrawMode::NORMAL ); } } bool Actor::IsOverlay() const { - return ( DrawMode::OVERLAY == mDrawMode ); + return ( DrawMode::OVERLAY_2D == mDrawMode ); } void Actor::SetDrawMode( DrawMode::Type drawMode ) @@ -1919,7 +1476,7 @@ bool Actor::ScreenToLocal( float& localX, float& localY, float screenX, float sc return false; } -bool Actor::ScreenToLocal( RenderTask& renderTask, float& localX, float& localY, float screenX, float screenY ) const +bool Actor::ScreenToLocal( const RenderTask& renderTask, float& localX, float& localY, float screenX, float screenY ) const { bool retval = false; // only valid when on-stage @@ -2096,12 +1653,11 @@ bool Actor::RayActorTest( const Vector4& rayOrigin, const Vector4& rayDir, Vecto if( OnStage() && NULL != mNode ) { - BufferIndex bufferIndex( GetEventThreadServices().GetEventBufferIndex() ); - // Transforms the ray to the local reference system. - // Calculate the inverse of Model matrix Matrix invModelMatrix( false/*don't init*/); + + BufferIndex bufferIndex( GetEventThreadServices().GetEventBufferIndex() ); // need to use the components as world matrix is only updated for actors that need it invModelMatrix.SetInverseTransformComponents( mNode->GetWorldScale( bufferIndex ), mNode->GetWorldOrientation( bufferIndex ), mNode->GetWorldPosition( bufferIndex ) ); @@ -2311,24 +1867,20 @@ bool Actor::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tra Actor::Actor( DerivedType derivedType ) : mParent( NULL ), mChildren( NULL ), + mRenderers( NULL ), mNode( NULL ), mParentOrigin( NULL ), mAnchorPoint( NULL ), mRelayoutData( NULL ), -#ifdef DALI_DYNAMICS_SUPPORT - mDynamicsData( NULL ), -#endif mGestureData( NULL ), mAttachment(), mTargetSize( 0.0f, 0.0f, 0.0f ), mName(), mId( ++mActorCounter ), // actor ID is initialised to start from 1, and 0 is reserved - mDepth( 0 ), + mDepth( 0u ), mIsRoot( ROOT_LAYER == derivedType ), - mIsRenderable( RENDERABLE == derivedType ), mIsLayer( LAYER == derivedType || ROOT_LAYER == derivedType ), mIsOnStage( false ), - mIsDynamicsRoot( false ), mSensitive( true ), mLeaveRequired( false ), mKeyboardFocusable( false ), @@ -2371,6 +1923,7 @@ Actor::~Actor() } } delete mChildren; + delete mRenderers; // Guard to allow handle destruction after Core has been destroyed if( EventThreadServices::IsCoreRunning() ) @@ -2384,11 +1937,6 @@ Actor::~Actor() GetEventThreadServices().UnregisterObject( this ); } -#ifdef DALI_DYNAMICS_SUPPORT - // Cleanup dynamics - delete mDynamicsData; -#endif - // Cleanup optional gesture data delete mGestureData; @@ -2403,15 +1951,14 @@ Actor::~Actor() } } -void Actor::ConnectToStage( unsigned int parentDepth, int index ) +void Actor::ConnectToStage( unsigned int parentDepth ) { - // This container is used instead of walking the Actor hierachy. - // It protects us when the Actor hierachy is modified during OnStageConnectionExternal callbacks. + // This container is used instead of walking the Actor hierarchy. + // It protects us when the Actor hierarchy is modified during OnStageConnectionExternal callbacks. ActorContainer connectionList; - - // This stage is atomic i.e. not interrupted by user callbacks - RecursiveConnectToStage( connectionList, parentDepth+1, index ); + // This stage is atomic i.e. not interrupted by user callbacks. + RecursiveConnectToStage( connectionList, parentDepth + 1 ); // Notify applications about the newly connected actors. const ActorIter endIter = connectionList.end(); @@ -2423,14 +1970,14 @@ void Actor::ConnectToStage( unsigned int parentDepth, int index ) RelayoutRequest(); } -void Actor::RecursiveConnectToStage( ActorContainer& connectionList, unsigned int depth, int index ) +void Actor::RecursiveConnectToStage( ActorContainer& connectionList, unsigned int depth ) { DALI_ASSERT_ALWAYS( !OnStage() ); mIsOnStage = true; mDepth = depth; - ConnectToSceneGraph( index ); + ConnectToSceneGraph(); // Notification for internal derived classes OnStageConnectionInternal(); @@ -2453,16 +2000,16 @@ void Actor::RecursiveConnectToStage( ActorContainer& connectionList, unsigned in * This method is called when the Actor is connected to the Stage. * The parent must have added its Node to the scene-graph. * The child must connect its Node to the parent's Node. - * This is resursive; the child calls ConnectToStage() for its children. + * This is recursive; the child calls ConnectToStage() for its children. */ -void Actor::ConnectToSceneGraph( int index ) +void Actor::ConnectToSceneGraph() { DALI_ASSERT_DEBUG( mNode != NULL); DALI_ASSERT_DEBUG( mParent != NULL); DALI_ASSERT_DEBUG( mParent->mNode != NULL ); if( NULL != mNode ) { // Reparent Node in next Update - ConnectNodeMessage( GetEventThreadServices().GetUpdateManager(), *(mParent->mNode), *mNode, index ); + ConnectNodeMessage( GetEventThreadServices().GetUpdateManager(), *(mParent->mNode), *mNode ); } // Notify attachment @@ -2471,13 +2018,11 @@ void Actor::ConnectToSceneGraph( int index ) mAttachment->Connect(); } -#ifdef DALI_DYNAMICS_SUPPORT - // Notify dynamics - if( NULL != mDynamicsData ) + unsigned int rendererCount( GetRendererCount() ); + for( unsigned int i(0); iConnect(); } -#endif // Request relayout on all actors that are added to the scenegraph RelayoutRequest(); @@ -2566,13 +2111,11 @@ void Actor::DisconnectFromSceneGraph() mAttachment->Disconnect(); } -#ifdef DALI_DYNAMICS_SUPPORT - // Notify dynamics - if( NULL != mDynamicsData ) + unsigned int rendererCount( GetRendererCount() ); + for( unsigned int i(0); iDisconnect(); } -#endif } void Actor::NotifyStageDisconnection() @@ -2603,10 +2146,9 @@ bool Actor::IsNodeConnected() const { bool connected( false ); - if( OnStage() && - NULL != mNode ) + if( OnStage() && ( NULL != mNode ) ) { - if( mNode->IsRoot() || mNode->GetParent() ) + if( IsRoot() || mNode->GetParent() ) { connected = true; } @@ -3002,7 +2544,7 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr // TODO: This method needs to be removed void Actor::SetSceneGraphProperty( Property::Index index, const PropertyMetadata& entry, const Property::Value& value ) { - switch( entry.type ) + switch( entry.GetType() ) { case Property::BOOLEAN: { @@ -3026,17 +2568,6 @@ void Actor::SetSceneGraphProperty( Property::Index index, const PropertyMetadata break; } - case Property::UNSIGNED_INTEGER: - { - const AnimatableProperty< unsigned int >* property = dynamic_cast< const AnimatableProperty< unsigned int >* >( entry.GetSceneGraphProperty() ); - DALI_ASSERT_DEBUG( NULL != property ); - - // property is being used in a separate thread; queue a message to set the property - SceneGraph::NodePropertyMessage::Send( GetEventThreadServices(), mNode, property, &AnimatableProperty::Bake, value.Get() ); - - break; - } - case Property::FLOAT: { const AnimatableProperty< float >* property = dynamic_cast< const AnimatableProperty< float >* >( entry.GetSceneGraphProperty() ); @@ -3867,7 +3398,7 @@ int Actor::GetPropertyComponentIndex( Property::Index index ) const return componentIndex; } -void Actor::SetParent( Actor* parent, int index ) +void Actor::SetParent( Actor* parent ) { if( parent ) { @@ -3879,7 +3410,7 @@ void Actor::SetParent( Actor* parent, int index ) parent->OnStage() ) { // Instruct each actor to create a corresponding node in the scene graph - ConnectToStage( parent->GetDepth(), index ); + ConnectToStage( parent->GetHierarchyDepth() ); } } else // parent being set to NULL @@ -4539,7 +4070,7 @@ Vector2 Actor::GetPreferredSize() const { if ( mRelayoutData ) { - return mRelayoutData->preferredSize; + return Vector2( mRelayoutData->preferredSize ); } return GetDefaultPreferredSize();