Moved Gesture::State and -::Type to gesture-enumerations.h.
[platform/core/uifw/dali-core.git] / dali / internal / event / actors / actor-impl.cpp
index 7b0394a..478f973 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 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.
@@ -27,7 +27,7 @@
 #include <dali/devel-api/actors/layer-devel.h>
 #include <dali/public-api/common/dali-common.h>
 #include <dali/public-api/common/constants.h>
-#include <dali/public-api/events/touch-data.h>
+#include <dali/public-api/events/touch-event.h>
 #include <dali/public-api/math/vector2.h>
 #include <dali/public-api/math/vector3.h>
 #include <dali/public-api/math/radian.h>
@@ -42,6 +42,8 @@
 #include <dali/internal/event/common/property-helper.h>
 #include <dali/internal/event/common/stage-impl.h>
 #include <dali/internal/event/common/type-info-impl.h>
+#include <dali/internal/event/common/scene-impl.h>
+#include <dali/internal/event/common/thread-local-storage.h>
 #include <dali/internal/event/animation/constraint-impl.h>
 #include <dali/internal/event/common/projection.h>
 #include <dali/internal/event/size-negotiation/relayout-controller-impl.h>
@@ -191,13 +193,12 @@ DALI_PROPERTY( "sensitive",                 BOOLEAN,  true,  false, false, Dali:
 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( "colorMode",                 INTEGER,  true,  false, false, Dali::Actor::Property::COLOR_MODE )
+DALI_PROPERTY( "drawMode",                  INTEGER,  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( "sizeScalePolicy",           INTEGER,  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 )
@@ -207,22 +208,29 @@ DALI_PROPERTY( "inheritPosition",           BOOLEAN,  true,  false, false, Dali:
 DALI_PROPERTY( "clippingMode",              STRING,   true,  false, false, Dali::Actor::Property::CLIPPING_MODE )
 DALI_PROPERTY( "layoutDirection",           STRING,   true,  false, false, Dali::Actor::Property::LAYOUT_DIRECTION )
 DALI_PROPERTY( "inheritLayoutDirection",    BOOLEAN,  true,  false, false, Dali::Actor::Property::INHERIT_LAYOUT_DIRECTION )
+DALI_PROPERTY( "opacity",                   FLOAT,    true,  true,  true,  Dali::Actor::Property::OPACITY )
+DALI_PROPERTY( "screenPosition",            VECTOR2,  false, false, false, Dali::Actor::Property::SCREEN_POSITION )
+DALI_PROPERTY( "positionUsesAnchorPoint",   BOOLEAN,  true,  false, false, Dali::Actor::Property::POSITION_USES_ANCHOR_POINT )
+DALI_PROPERTY( "culled",                    BOOLEAN,  false, false, true,  Dali::Actor::Property::CULLED )
+DALI_PROPERTY( "id",                        INTEGER,  false, false, false, Dali::Actor::Property::ID )
+DALI_PROPERTY( "hierarchyDepth",            INTEGER,  false, false, false, Dali::Actor::Property::HIERARCHY_DEPTH )
+DALI_PROPERTY( "isRoot",                    BOOLEAN,  false, false, false, Dali::Actor::Property::IS_ROOT )
+DALI_PROPERTY( "isLayer",                   BOOLEAN,  false, false, false, Dali::Actor::Property::IS_LAYER )
+DALI_PROPERTY( "connectedToScene",          BOOLEAN,  false, false, false, Dali::Actor::Property::CONNECTED_TO_SCENE )
+DALI_PROPERTY( "keyboardFocusable",         BOOLEAN,  true,  false, false, Dali::Actor::Property::KEYBOARD_FOCUSABLE )
 DALI_PROPERTY( "siblingOrder",              INTEGER,  true,  false, false, Dali::DevelActor::Property::SIBLING_ORDER )
-DALI_PROPERTY( "opacity",                   FLOAT,    true,  true,  true,  Dali::DevelActor::Property::OPACITY )
-DALI_PROPERTY( "screenPosition",            VECTOR2,  false, false, false, Dali::DevelActor::Property::SCREEN_POSITION )
-DALI_PROPERTY( "positionUsesAnchorPoint",   BOOLEAN,  true,  false, false, Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT )
-DALI_PROPERTY( "culled",                    BOOLEAN,  false, false, true, Dali::DevelActor::Property::CULLED )
+DALI_PROPERTY( "updateSizeHint",            VECTOR2,  true,  false, false, Dali::DevelActor::Property::UPDATE_SIZE_HINT )
+DALI_PROPERTY( "captureAllTouchAfterStart", BOOLEAN,  true,  false, false, Dali::DevelActor::Property::CAPTURE_ALL_TOUCH_AFTER_START )
 DALI_PROPERTY_TABLE_END( DEFAULT_ACTOR_PROPERTY_START_INDEX, ActorDefaultProperties )
 
 // Signals
 
-const char* const SIGNAL_TOUCHED = "touched";
 const char* const SIGNAL_HOVERED = "hovered";
 const char* const SIGNAL_WHEEL_EVENT = "wheelEvent";
-const char* const SIGNAL_ON_STAGE = "onStage";
-const char* const SIGNAL_OFF_STAGE = "offStage";
+const char* const SIGNAL_ON_SCENE = "onScene";
+const char* const SIGNAL_OFF_SCENE = "offScene";
 const char* const SIGNAL_ON_RELAYOUT = "onRelayout";
-const char* const SIGNAL_TOUCH = "touch";
+const char* const SIGNAL_TOUCHED = "touched";
 const char* const SIGNAL_VISIBILITY_CHANGED = "visibilityChanged";
 const char* const SIGNAL_LAYOUT_DIRECTION_CHANGED = "layoutDirectionChanged";
 const char* const SIGNAL_CHILD_ADDED = "childAdded";
@@ -240,13 +248,12 @@ BaseHandle CreateActor()
 
 TypeRegistration mType( typeid(Dali::Actor), typeid(Dali::Handle), CreateActor, ActorDefaultProperties );
 
-SignalConnectorType signalConnector1( mType, SIGNAL_TOUCHED, &Actor::DoConnectSignal );
 SignalConnectorType signalConnector2( mType, SIGNAL_HOVERED, &Actor::DoConnectSignal );
 SignalConnectorType signalConnector3( mType, SIGNAL_WHEEL_EVENT, &Actor::DoConnectSignal );
-SignalConnectorType signalConnector4( mType, SIGNAL_ON_STAGE, &Actor::DoConnectSignal );
-SignalConnectorType signalConnector5( mType, SIGNAL_OFF_STAGE, &Actor::DoConnectSignal );
+SignalConnectorType signalConnector4( mType, SIGNAL_ON_SCENE, &Actor::DoConnectSignal );
+SignalConnectorType signalConnector5( mType, SIGNAL_OFF_SCENE, &Actor::DoConnectSignal );
 SignalConnectorType signalConnector6( mType, SIGNAL_ON_RELAYOUT, &Actor::DoConnectSignal );
-SignalConnectorType signalConnector7( mType, SIGNAL_TOUCH, &Actor::DoConnectSignal );
+SignalConnectorType signalConnector7( mType, SIGNAL_TOUCHED, &Actor::DoConnectSignal );
 SignalConnectorType signalConnector8( mType, SIGNAL_VISIBILITY_CHANGED, &Actor::DoConnectSignal );
 SignalConnectorType signalConnector9( mType, SIGNAL_LAYOUT_DIRECTION_CHANGED, &Actor::DoConnectSignal );
 SignalConnectorType signalConnector10( mType, SIGNAL_CHILD_ADDED, &Actor::DoConnectSignal );
@@ -280,17 +287,9 @@ DALI_ENUM_TO_STRING( USE_OWN_MULTIPLY_PARENT_COLOR )
 DALI_ENUM_TO_STRING( USE_OWN_MULTIPLY_PARENT_ALPHA )
 DALI_ENUM_TO_STRING_TABLE_END( COLOR_MODE )
 
-DALI_ENUM_TO_STRING_TABLE_BEGIN( POSITION_INHERITANCE_MODE )
-DALI_ENUM_TO_STRING( INHERIT_PARENT_POSITION )
-DALI_ENUM_TO_STRING( USE_PARENT_POSITION )
-DALI_ENUM_TO_STRING( USE_PARENT_POSITION_PLUS_LOCAL_POSITION )
-DALI_ENUM_TO_STRING( DONT_INHERIT_POSITION )
-DALI_ENUM_TO_STRING_TABLE_END( POSITION_INHERITANCE_MODE )
-
 DALI_ENUM_TO_STRING_TABLE_BEGIN( DRAW_MODE )
 DALI_ENUM_TO_STRING_WITH_SCOPE( DrawMode, NORMAL )
 DALI_ENUM_TO_STRING_WITH_SCOPE( DrawMode, OVERLAY_2D )
-DALI_ENUM_TO_STRING_WITH_SCOPE( DrawMode, STENCIL )
 DALI_ENUM_TO_STRING_TABLE_END( DRAW_MODE )
 
 DALI_ENUM_TO_STRING_TABLE_BEGIN( RESIZE_POLICY )
@@ -420,7 +419,11 @@ const SceneGraph::Node* Actor::CreateNode()
   // create node. Nodes are owned by the update manager
   SceneGraph::Node* node = SceneGraph::Node::New();
   OwnerPointer< SceneGraph::Node > transferOwnership( node );
-  AddNodeMessage( Stage::GetCurrent()->GetUpdateManager(), transferOwnership );
+  Internal::ThreadLocalStorage* tls = Internal::ThreadLocalStorage::GetInternal();
+
+  DALI_ASSERT_ALWAYS( tls && "ThreadLocalStorage is null" );
+
+  AddNodeMessage( tls->GetUpdateManager(), transferOwnership );
 
   return node;
 }
@@ -443,9 +446,9 @@ uint32_t Actor::GetId() const
   return GetNode().GetId();
 }
 
-bool Actor::OnStage() const
+bool Actor::OnScene() const
 {
-  return mIsOnStage;
+  return mIsOnScene;
 }
 
 Dali::Layer Actor::GetLayer()
@@ -800,39 +803,24 @@ const Vector3& Actor::GetCurrentWorldPosition() const
 
 const Vector2 Actor::GetCurrentScreenPosition() const
 {
-  StagePtr stage = Stage::GetCurrent();
-  if( stage && OnStage() )
+  if( mScene && OnScene() )
   {
     Vector3 worldPosition =  GetNode().GetWorldPosition( GetEventThreadServices().GetEventBufferIndex() );
-    Vector3 cameraPosition = stage->GetDefaultCameraActor().GetNode().GetWorldPosition( GetEventThreadServices().GetEventBufferIndex() );
+    Vector3 cameraPosition = mScene->GetDefaultCameraActor().GetNode().GetWorldPosition( GetEventThreadServices().GetEventBufferIndex() );
     worldPosition -= cameraPosition;
 
     Vector3 actorSize = GetCurrentSize() * GetCurrentWorldScale();
-    Vector2 halfStageSize( stage->GetSize() * 0.5f ); // World position origin is center of stage
+    Vector2 halfSceneSize( mScene->GetSize() * 0.5f ); // World position origin is center of scene
     Vector3 halfActorSize( actorSize * 0.5f );
     Vector3 anchorPointOffSet = halfActorSize - actorSize * ( mPositionUsesAnchorPoint ? GetCurrentAnchorPoint() : AnchorPoint::TOP_LEFT );
 
-    return Vector2( halfStageSize.width + worldPosition.x - anchorPointOffSet.x,
-                    halfStageSize.height + worldPosition.y - anchorPointOffSet.y );
+    return Vector2( halfSceneSize.width + worldPosition.x - anchorPointOffSet.x,
+                    halfSceneSize.height + worldPosition.y - anchorPointOffSet.y );
   }
 
   return Vector2::ZERO;
 }
 
-void Actor::SetPositionInheritanceMode( PositionInheritanceMode mode )
-{
-  // this flag is not animatable so keep the value
-  mPositionInheritanceMode = mode;
-  // node is being used in a separate thread; queue a message to set the value
-  SetInheritPositionMessage( GetEventThreadServices(), GetNode(), mode == INHERIT_PARENT_POSITION );
-}
-
-PositionInheritanceMode Actor::GetPositionInheritanceMode() const
-{
-  // Cached for event-thread access
-  return mPositionInheritanceMode;
-}
-
 void Actor::SetInheritPosition( bool inherit )
 {
   if( mInheritPosition != inherit )
@@ -1174,6 +1162,8 @@ void Actor::SetWidth( float width )
     SceneGraph::NodeTransformComponentMessage<Vector3>::Send( GetEventThreadServices(), &GetNode(), &GetNode().mSize, &SceneGraph::TransformManagerPropertyHandler<Vector3>::BakeX, width );
   }
 
+  mUseAnimatedSize &= ~AnimatedSizeFlag::WIDTH;
+
   RelayoutRequest();
 }
 
@@ -1192,6 +1182,8 @@ void Actor::SetHeight( float height )
     SceneGraph::NodeTransformComponentMessage<Vector3>::Send( GetEventThreadServices(), &GetNode(), &GetNode().mSize, &SceneGraph::TransformManagerPropertyHandler<Vector3>::BakeY, height );
   }
 
+  mUseAnimatedSize &= ~AnimatedSizeFlag::HEIGHT;
+
   RelayoutRequest();
 }
 
@@ -1199,6 +1191,8 @@ void Actor::SetDepth( float depth )
 {
   mTargetSize.depth = depth;
 
+  mUseAnimatedSize &= ~AnimatedSizeFlag::DEPTH;
+
   // node is being used in a separate thread; queue a message to set the value & base value
   SceneGraph::NodeTransformComponentMessage<Vector3>::Send( GetEventThreadServices(), &GetNode(), &GetNode().mSize, &SceneGraph::TransformManagerPropertyHandler<Vector3>::BakeZ, depth );
 }
@@ -1207,14 +1201,35 @@ Vector3 Actor::GetTargetSize() const
 {
   Vector3 size = mTargetSize;
 
-  // Should return preferred size if size is fixed as set by SetSize
-  if( GetResizePolicy( Dimension::WIDTH ) == ResizePolicy::FIXED )
+  if( mUseAnimatedSize & AnimatedSizeFlag::WIDTH )
+  {
+    // Should return animated size if size is animated
+    size.width = mAnimatedSize.width;
+  }
+  else
+  {
+    // Should return preferred size if size is fixed as set by SetSize
+    if( GetResizePolicy( Dimension::WIDTH ) == ResizePolicy::FIXED )
+    {
+      size.width = GetPreferredSize().width;
+    }
+  }
+
+  if( mUseAnimatedSize & AnimatedSizeFlag::HEIGHT )
   {
-    size.width = GetPreferredSize().width;
+    size.height = mAnimatedSize.height;
   }
-  if( GetResizePolicy( Dimension::HEIGHT ) == ResizePolicy::FIXED )
+  else
   {
-    size.height = GetPreferredSize().height;
+    if( GetResizePolicy( Dimension::HEIGHT ) == ResizePolicy::FIXED )
+    {
+      size.height = GetPreferredSize().height;
+    }
+  }
+
+  if( mUseAnimatedSize & AnimatedSizeFlag::DEPTH )
+  {
+    size.depth = mAnimatedSize.depth;
   }
 
   return size;
@@ -1334,6 +1349,9 @@ void Actor::SetSizeScalePolicy( SizeScalePolicy::Type policy )
   EnsureRelayoutData();
 
   mRelayoutData->sizeSetPolicy = policy;
+
+  // Trigger relayout on this control
+  RelayoutRequest();
 }
 
 SizeScalePolicy::Type Actor::GetSizeScalePolicy() const
@@ -1508,11 +1526,9 @@ void Actor::SetDrawMode( DrawMode::Type drawMode )
 {
   // this flag is not animatable so keep the value
   mDrawMode = drawMode;
-  if( drawMode != DrawMode::STENCIL )
-  {
-    // node is being used in a separate thread; queue a message to set the value
-    SetDrawModeMessage( GetEventThreadServices(), GetNode(), drawMode );
-  }
+
+  // node is being used in a separate thread; queue a message to set the value
+  SetDrawModeMessage( GetEventThreadServices(), GetNode(), drawMode );
 }
 
 DrawMode::Type Actor::GetDrawMode() const
@@ -1523,10 +1539,9 @@ DrawMode::Type Actor::GetDrawMode() const
 bool Actor::ScreenToLocal( float& localX, float& localY, float screenX, float screenY ) const
 {
   // only valid when on-stage
-  StagePtr stage = Stage::GetCurrent();
-  if( stage && OnStage() )
+  if( mScene && OnScene() )
   {
-    const RenderTaskList& taskList = stage->GetRenderTaskList();
+    const RenderTaskList& taskList = mScene->GetRenderTaskList();
 
     Vector2 converted( screenX, screenY );
 
@@ -1549,7 +1564,7 @@ bool Actor::ScreenToLocal( const RenderTask& renderTask, float& localX, float& l
 {
   bool retval = false;
   // only valid when on-stage
-  if( OnStage() )
+  if( OnScene() )
   {
     CameraActor* camera = renderTask.GetCameraActor();
     if( camera )
@@ -1571,7 +1586,7 @@ bool Actor::ScreenToLocal( const RenderTask& renderTask, float& localX, float& l
 bool Actor::ScreenToLocal( const Matrix& viewMatrix, const Matrix& projectionMatrix, const Viewport& viewport, float& localX, float& localY, float screenX, float screenY ) const
 {
   // Early-out if not on stage
-  if( !OnStage() )
+  if( !OnScene() )
   {
     return false;
   }
@@ -1682,7 +1697,7 @@ bool Actor::RaySphereTest( const Vector4& rayOrigin, const Vector4& rayDir ) con
    */
 
   // Early-out if not on stage
-  if( !OnStage() )
+  if( !OnScene() )
   {
     return false;
   }
@@ -1715,7 +1730,7 @@ bool Actor::RayActorTest( const Vector4& rayOrigin, const Vector4& rayDir, Vecto
 {
   bool hit = false;
 
-  if( OnStage() )
+  if( OnScene() )
   {
     // Transforms the ray to the local reference system.
     // Calculate the inverse of Model matrix
@@ -1773,7 +1788,7 @@ bool Actor::IsKeyboardFocusable() const
 
 bool Actor::GetTouchRequired() const
 {
-  return !mTouchedSignal.Empty() || !mTouchSignal.Empty() || mDerivedRequiresTouch;
+  return !mTouchedSignal.Empty() || mDerivedRequiresTouch;
 }
 
 bool Actor::GetHoverRequired() const
@@ -1802,37 +1817,25 @@ ActorGestureData& Actor::GetGestureData()
   return *mGestureData;
 }
 
-bool Actor::IsGestureRequred( Gesture::Type type ) const
+bool Actor::IsGestureRequired( GestureType::Value type ) const
 {
-  return mGestureData && mGestureData->IsGestureRequred( type );
+  return mGestureData && mGestureData->IsGestureRequired( type );
 }
 
-bool Actor::EmitTouchEventSignal( const TouchEvent& event, const Dali::TouchData& touch )
+bool Actor::EmitTouchEventSignal( const Dali::TouchEvent& touch )
 {
   bool consumed = false;
 
-  if( !mTouchSignal.Empty() )
-  {
-    Dali::Actor handle( this );
-    consumed = mTouchSignal.Emit( handle, touch );
-  }
-
   if( !mTouchedSignal.Empty() )
   {
     Dali::Actor handle( this );
-    consumed |= mTouchedSignal.Emit( handle, event );
-  }
-
-  if( !consumed )
-  {
-    // Notification for derived classes
-    consumed = OnTouchEvent( event ); // TODO
+    consumed = mTouchedSignal.Emit( handle, touch );
   }
 
   return consumed;
 }
 
-bool Actor::EmitHoverEventSignal( const HoverEvent& event )
+bool Actor::EmitHoverEventSignal( const Dali::HoverEvent& event )
 {
   bool consumed = false;
 
@@ -1851,7 +1854,7 @@ bool Actor::EmitHoverEventSignal( const HoverEvent& event )
   return consumed;
 }
 
-bool Actor::EmitWheelEventSignal( const WheelEvent& event )
+bool Actor::EmitWheelEventSignal( const Dali::WheelEvent& event )
 {
   bool consumed = false;
 
@@ -1906,16 +1909,11 @@ void Actor::EmitChildRemovedSignal( Actor& child )
   }
 }
 
-Dali::Actor::TouchSignalType& Actor::TouchedSignal()
+Dali::Actor::TouchEventSignalType& Actor::TouchedSignal()
 {
   return mTouchedSignal;
 }
 
-Dali::Actor::TouchDataSignalType& Actor::TouchSignal()
-{
-  return mTouchSignal;
-}
-
 Dali::Actor::HoverSignalType& Actor::HoveredSignal()
 {
   return mHoveredSignal;
@@ -1926,14 +1924,14 @@ Dali::Actor::WheelEventSignalType& Actor::WheelEventSignal()
   return mWheelEventSignal;
 }
 
-Dali::Actor::OnStageSignalType& Actor::OnStageSignal()
+Dali::Actor::OnSceneSignalType& Actor::OnSceneSignal()
 {
-  return mOnStageSignal;
+  return mOnSceneSignal;
 }
 
-Dali::Actor::OffStageSignalType& Actor::OffStageSignal()
+Dali::Actor::OffSceneSignalType& Actor::OffSceneSignal()
 {
-  return mOffStageSignal;
+  return mOffSceneSignal;
 }
 
 Dali::Actor::OnRelayoutSignalType& Actor::OnRelayoutSignal()
@@ -1971,11 +1969,7 @@ bool Actor::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tra
   bool connected( true );
   Actor* actor = static_cast< Actor* >( object ); // TypeRegistry guarantees that this is the correct type.
 
-  if( 0 == signalName.compare( SIGNAL_TOUCHED ) )
-  {
-    actor->TouchedSignal().Connect( tracker, functor );
-  }
-  else if( 0 == signalName.compare( SIGNAL_HOVERED ) )
+  if( 0 == signalName.compare( SIGNAL_HOVERED ) )
   {
     actor->HoveredSignal().Connect( tracker, functor );
   }
@@ -1983,21 +1977,21 @@ bool Actor::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tra
   {
     actor->WheelEventSignal().Connect( tracker, functor );
   }
-  else if( 0 == signalName.compare( SIGNAL_ON_STAGE ) )
+  else if( 0 == signalName.compare( SIGNAL_ON_SCENE ) )
   {
-    actor->OnStageSignal().Connect( tracker, functor );
+    actor->OnSceneSignal().Connect( tracker, functor );
   }
-  else if( 0 == signalName.compare( SIGNAL_OFF_STAGE ) )
+  else if( 0 == signalName.compare( SIGNAL_OFF_SCENE ) )
   {
-    actor->OffStageSignal().Connect( tracker, functor );
+    actor->OffSceneSignal().Connect( tracker, functor );
   }
   else if( 0 == signalName.compare( SIGNAL_ON_RELAYOUT ) )
   {
     actor->OnRelayoutSignal().Connect( tracker, functor );
   }
-  else if( 0 == signalName.compare( SIGNAL_TOUCH ) )
+  else if( 0 == signalName.compare( SIGNAL_TOUCHED ) )
   {
-    actor->TouchSignal().Connect( tracker, functor );
+    actor->TouchedSignal().Connect( tracker, functor );
   }
   else if( 0 == signalName.compare( SIGNAL_VISIBILITY_CHANGED ) )
   {
@@ -2026,6 +2020,7 @@ bool Actor::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tra
 
 Actor::Actor( DerivedType derivedType, const SceneGraph::Node& node )
 : Object( &node ),
+  mScene( nullptr ),
   mParent( NULL ),
   mChildren( NULL ),
   mRenderers( NULL ),
@@ -2034,11 +2029,10 @@ Actor::Actor( DerivedType derivedType, const SceneGraph::Node& node )
   mRelayoutData( NULL ),
   mGestureData( NULL ),
   mTouchedSignal(),
-  mTouchSignal(),
   mHoveredSignal(),
   mWheelEventSignal(),
-  mOnStageSignal(),
-  mOffStageSignal(),
+  mOnSceneSignal(),
+  mOffSceneSignal(),
   mOnRelayoutSignal(),
   mVisibilityChangedSignal(),
   mLayoutDirectionChangedSignal(),
@@ -2050,19 +2044,21 @@ Actor::Actor( DerivedType derivedType, const SceneGraph::Node& node )
   mTargetSize( Vector3::ZERO ),
   mTargetPosition( Vector3::ZERO ),
   mTargetScale( Vector3::ONE ),
+  mAnimatedSize( Vector3::ZERO ),
   mName(),
   mSortedDepth( 0u ),
   mDepth( 0u ),
+  mUseAnimatedSize( AnimatedSizeFlag::CLEAR ),
   mIsRoot( ROOT_LAYER == derivedType ),
   mIsLayer( LAYER == derivedType || ROOT_LAYER == derivedType ),
-  mIsOnStage( false ),
+  mIsOnScene( false ),
   mSensitive( true ),
   mLeaveRequired( false ),
   mKeyboardFocusable( false ),
   mDerivedRequiresTouch( false ),
   mDerivedRequiresHover( false ),
   mDerivedRequiresWheelEvent( false ),
-  mOnStageSignalled( false ),
+  mOnSceneSignalled( false ),
   mInsideOnSizeSet( false ),
   mInheritPosition( true ),
   mInheritOrientation( true ),
@@ -2070,9 +2066,9 @@ Actor::Actor( DerivedType derivedType, const SceneGraph::Node& node )
   mPositionUsesAnchorPoint( true ),
   mVisible( true ),
   mInheritLayoutDirection( true ),
+  mCaptureAllTouchAfterStart( false ),
   mLayoutDirection( LayoutDirection::LEFT_TO_RIGHT ),
   mDrawMode( DrawMode::NORMAL ),
-  mPositionInheritanceMode( Node::DEFAULT_POSITION_INHERITANCE_MODE ),
   mColorMode( Node::DEFAULT_COLOR_MODE ),
   mClippingMode( ClippingMode::DISABLED )
 {
@@ -2103,9 +2099,13 @@ Actor::~Actor()
   // Guard to allow handle destruction after Core has been destroyed
   if( EventThreadServices::IsCoreRunning() )
   {
-    DestroyNodeMessage( GetEventThreadServices().GetUpdateManager(), GetNode() );
+    // Root layer will destroy its node in its own destructor
+    if ( !mIsRoot )
+    {
+      DestroyNodeMessage( GetEventThreadServices().GetUpdateManager(), GetNode() );
 
-    GetEventThreadServices().UnregisterObject( this );
+      GetEventThreadServices().UnregisterObject( this );
+    }
   }
 
   // Cleanup optional gesture data
@@ -2119,20 +2119,19 @@ Actor::~Actor()
   delete mRelayoutData;
 }
 
-void Actor::ConnectToStage( uint32_t parentDepth )
+void Actor::ConnectToScene( uint32_t parentDepth )
 {
   // This container is used instead of walking the Actor hierarchy.
-  // It protects us when the Actor hierarchy is modified during OnStageConnectionExternal callbacks.
+  // It protects us when the Actor hierarchy is modified during OnSceneConnectionExternal callbacks.
   ActorContainer connectionList;
 
-  StagePtr stage = Stage::GetCurrent();
-  if( stage )
+  if( mScene )
   {
-    stage->RequestRebuildDepthTree();
+    mScene->RequestRebuildDepthTree();
   }
 
   // This stage is atomic i.e. not interrupted by user callbacks.
-  RecursiveConnectToStage( connectionList, parentDepth + 1 );
+  RecursiveConnectToScene( connectionList, parentDepth + 1 );
 
   // Notify applications about the newly connected actors.
   const ActorIter endIter = connectionList.end();
@@ -2144,17 +2143,17 @@ void Actor::ConnectToStage( uint32_t parentDepth )
   RelayoutRequest();
 }
 
-void Actor::RecursiveConnectToStage( ActorContainer& connectionList, uint32_t depth )
+void Actor::RecursiveConnectToScene( ActorContainer& connectionList, uint32_t depth )
 {
-  DALI_ASSERT_ALWAYS( !OnStage() );
+  DALI_ASSERT_ALWAYS( !OnScene() );
 
-  mIsOnStage = true;
+  mIsOnScene = true;
   mDepth = static_cast< uint16_t >( depth ); // overflow ignored, not expected in practice
 
   ConnectToSceneGraph();
 
   // Notification for internal derived classes
-  OnStageConnectionInternal();
+  OnSceneConnectionInternal();
 
   // This stage is atomic; avoid emitting callbacks until all Actors are connected
   connectionList.push_back( ActorPtr( this ) );
@@ -2165,7 +2164,8 @@ void Actor::RecursiveConnectToStage( ActorContainer& connectionList, uint32_t de
     ActorConstIter endIter = mChildren->end();
     for( ActorIter iter = mChildren->begin(); iter != endIter; ++iter )
     {
-      (*iter)->RecursiveConnectToStage( connectionList, depth + 1 );
+      (*iter)->SetScene( *mScene );
+      (*iter)->RecursiveConnectToScene( connectionList, depth + 1 );
     }
   }
 }
@@ -2174,7 +2174,7 @@ void Actor::RecursiveConnectToStage( ActorContainer& connectionList, uint32_t de
  * 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 recursive; the child calls ConnectToStage() for its children.
+ * This is recursive; the child calls ConnectToScene() for its children.
  */
 void Actor::ConnectToSceneGraph()
 {
@@ -2193,22 +2193,22 @@ void Actor::ConnectToSceneGraph()
 void Actor::NotifyStageConnection()
 {
   // Actors can be removed (in a callback), before the on-stage stage is reported.
-  // The actor may also have been reparented, in which case mOnStageSignalled will be true.
-  if( OnStage() && !mOnStageSignalled )
+  // The actor may also have been reparented, in which case mOnSceneSignalled will be true.
+  if( OnScene() && !mOnSceneSignalled )
   {
     // Notification for external (CustomActor) derived classes
-    OnStageConnectionExternal( mDepth );
+    OnSceneConnectionExternal( mDepth );
 
-    if( !mOnStageSignal.Empty() )
+    if( !mOnSceneSignal.Empty() )
     {
       Dali::Actor handle( this );
-      mOnStageSignal.Emit( handle );
+      mOnSceneSignal.Emit( handle );
     }
 
     // Guard against Remove during callbacks
-    if( OnStage() )
+    if( OnScene() )
     {
-      mOnStageSignalled = true; // signal required next time Actor is removed
+      mOnSceneSignalled = true; // signal required next time Actor is removed
     }
   }
 }
@@ -2216,13 +2216,12 @@ void Actor::NotifyStageConnection()
 void Actor::DisconnectFromStage()
 {
   // This container is used instead of walking the Actor hierachy.
-  // It protects us when the Actor hierachy is modified during OnStageDisconnectionExternal callbacks.
+  // It protects us when the Actor hierachy is modified during OnSceneDisconnectionExternal callbacks.
   ActorContainer disconnectionList;
 
-  StagePtr stage = Stage::GetCurrent();
-  if( stage )
+  if( mScene )
   {
-    stage->RequestRebuildDepthTree();
+    mScene->RequestRebuildDepthTree();
   }
 
   // This stage is atomic i.e. not interrupted by user callbacks
@@ -2238,8 +2237,8 @@ void Actor::DisconnectFromStage()
 
 void Actor::RecursiveDisconnectFromStage( ActorContainer& disconnectionList )
 {
-  // need to change state first so that internals relying on IsOnStage() inside OnStageDisconnectionInternal() get the correct value
-  mIsOnStage = false;
+  // need to change state first so that internals relying on IsOnScene() inside OnSceneDisconnectionInternal() get the correct value
+  mIsOnScene = false;
 
   // Recursively disconnect children
   if( mChildren )
@@ -2255,7 +2254,7 @@ void Actor::RecursiveDisconnectFromStage( ActorContainer& disconnectionList )
   disconnectionList.push_back( ActorPtr( this ) );
 
   // Notification for internal derived classes
-  OnStageDisconnectionInternal();
+  OnSceneDisconnectionInternal();
 
   DisconnectFromSceneGraph();
 }
@@ -2273,23 +2272,23 @@ void Actor::DisconnectFromSceneGraph()
 void Actor::NotifyStageDisconnection()
 {
   // Actors can be added (in a callback), before the off-stage state is reported.
-  // Also if the actor was added & removed before mOnStageSignalled was set, then we don't notify here.
+  // Also if the actor was added & removed before mOnSceneSignalled was set, then we don't notify here.
   // only do this step if there is a stage, i.e. Core is not being shut down
-  if ( EventThreadServices::IsCoreRunning() && !OnStage() && mOnStageSignalled )
+  if ( EventThreadServices::IsCoreRunning() && !OnScene() && mOnSceneSignalled )
   {
     // Notification for external (CustomeActor) derived classes
-    OnStageDisconnectionExternal();
+    OnSceneDisconnectionExternal();
 
-    if( !mOffStageSignal.Empty() )
+    if( !mOffSceneSignal.Empty() )
     {
       Dali::Actor handle( this );
-      mOffStageSignal.Emit( handle );
+      mOffSceneSignal.Emit( handle );
     }
 
     // Guard against Add during callbacks
-    if( !OnStage() )
+    if( !OnScene() )
     {
-      mOnStageSignalled = false; // signal required next time Actor is added
+      mOnSceneSignalled = false; // signal required next time Actor is added
     }
   }
 }
@@ -2298,7 +2297,7 @@ bool Actor::IsNodeConnected() const
 {
   bool connected( false );
 
-  if( OnStage() )
+  if( OnScene() )
   {
     if( IsRoot() || GetNode().GetParent() )
     {
@@ -2429,7 +2428,15 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr
 
     case Dali::Actor::Property::SIZE:
     {
-      SetSize( property.Get< Vector3 >() );
+      Property::Type type = property.GetType();
+      if( type == Property::VECTOR2 )
+      {
+        SetSize( property.Get< Vector2 >() );
+      }
+      else if ( type == Property::VECTOR3 )
+      {
+        SetSize( property.Get< Vector3 >() );
+      }
       break;
     }
 
@@ -2453,7 +2460,16 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr
 
     case Dali::Actor::Property::POSITION:
     {
-      SetPosition( property.Get< Vector3 >() );
+      Property::Type type = property.GetType();
+      if( type == Property::VECTOR2 )
+      {
+        Vector2 position = property.Get< Vector2 >();
+        SetPosition( Vector3( position.x, position.y, 0.0f ) );
+      }
+      else if ( type == Property::VECTOR3 )
+      {
+        SetPosition( property.Get< Vector3 >() );
+      }
       break;
     }
 
@@ -2483,7 +2499,16 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr
 
     case Dali::Actor::Property::SCALE:
     {
-      SetScale( property.Get< Vector3 >() );
+      Property::Type type = property.GetType();
+      if( type == Property::FLOAT )
+      {
+        float scale = property.Get< float >();
+        SetScale( scale, scale, scale );
+      }
+      else if ( type == Property::VECTOR3 )
+      {
+        SetScale( property.Get< Vector3 >() );
+      }
       break;
     }
 
@@ -2513,7 +2538,16 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr
 
     case Dali::Actor::Property::COLOR:
     {
-      SetColor( property.Get< Vector4 >() );
+      Property::Type type = property.GetType();
+      if( type == Property::VECTOR3 )
+      {
+        Vector3 color = property.Get< Vector3 >();
+        SetColor( Vector4( color.r, color.g, color.b, 1.0f ) );
+      }
+      else if( type == Property::VECTOR4 )
+      {
+        SetColor( property.Get< Vector4 >() );
+      }
       break;
     }
 
@@ -2536,7 +2570,7 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr
     }
 
     case Dali::Actor::Property::COLOR_ALPHA:
-    case Dali::DevelActor::Property::OPACITY:
+    case Dali::Actor::Property::OPACITY:
     {
       float value;
       if( property.Get( value ) )
@@ -2592,16 +2626,6 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr
       break;
     }
 
-    case Dali::Actor::Property::POSITION_INHERITANCE:
-    {
-      PositionInheritanceMode mode = mPositionInheritanceMode;
-      if( Scripting::GetEnumerationProperty< PositionInheritanceMode >( property, POSITION_INHERITANCE_MODE_TABLE, POSITION_INHERITANCE_MODE_TABLE_COUNT, mode ) )
-      {
-        SetPositionInheritanceMode( mode );
-      }
-      break;
-    }
-
     case Dali::Actor::Property::DRAW_MODE:
     {
       DrawMode::Type mode = mDrawMode;
@@ -2641,7 +2665,7 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr
     case Dali::Actor::Property::SIZE_SCALE_POLICY:
     {
       SizeScalePolicy::Type type = GetSizeScalePolicy();
-      if( Scripting::GetEnumeration< SizeScalePolicy::Type >( property.Get< std::string >().c_str(), SIZE_SCALE_POLICY_TABLE, SIZE_SCALE_POLICY_TABLE_COUNT, type ) )
+      if( Scripting::GetEnumerationProperty< SizeScalePolicy::Type >( property, SIZE_SCALE_POLICY_TABLE, SIZE_SCALE_POLICY_TABLE_COUNT, type ) )
       {
         SetSizeScalePolicy( type );
       }
@@ -2712,7 +2736,7 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr
       break;
     }
 
-    case Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT:
+    case Dali::Actor::Property::POSITION_USES_ANCHOR_POINT:
     {
       bool value = false;
       if( property.Get( value ) && value != mPositionUsesAnchorPoint )
@@ -2745,6 +2769,32 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr
       break;
     }
 
+    case Dali::Actor::Property::KEYBOARD_FOCUSABLE:
+    {
+      bool value = false;
+      if( property.Get( value ) )
+      {
+        SetKeyboardFocusable( value );
+      }
+      break;
+    }
+
+    case Dali::DevelActor::Property::UPDATE_SIZE_HINT:
+    {
+      SetUpdateSizeHint( property.Get< Vector2 >() );
+      break;
+    }
+
+    case Dali::DevelActor::Property::CAPTURE_ALL_TOUCH_AFTER_START:
+    {
+      bool boolValue = false;
+      if ( property.Get( boolValue ) )
+      {
+        mCaptureAllTouchAfterStart = boolValue;
+      }
+      break;
+    }
+
     default:
     {
       // this can happen in the case of a non-animatable default property so just do nothing
@@ -2948,6 +2998,9 @@ void Actor::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::In
         {
           if( value.Get( mTargetSize ) )
           {
+            mAnimatedSize = mTargetSize;
+            mUseAnimatedSize = AnimatedSizeFlag::WIDTH | AnimatedSizeFlag::HEIGHT | AnimatedSizeFlag::DEPTH;
+
             // Notify deriving classes
             OnSizeAnimation( animation, mTargetSize );
           }
@@ -2958,6 +3011,9 @@ void Actor::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::In
         {
           if( value.Get( mTargetSize.width ) )
           {
+            mAnimatedSize.width = mTargetSize.width;
+            mUseAnimatedSize |= AnimatedSizeFlag::WIDTH;
+
             // Notify deriving classes
             OnSizeAnimation( animation, mTargetSize );
           }
@@ -2968,6 +3024,9 @@ void Actor::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::In
         {
           if( value.Get( mTargetSize.height ) )
           {
+            mAnimatedSize.height = mTargetSize.height;
+            mUseAnimatedSize |= AnimatedSizeFlag::HEIGHT;
+
             // Notify deriving classes
             OnSizeAnimation( animation, mTargetSize );
           }
@@ -2978,6 +3037,9 @@ void Actor::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::In
         {
           if( value.Get( mTargetSize.depth ) )
           {
+            mAnimatedSize.depth = mTargetSize.depth;
+            mUseAnimatedSize |= AnimatedSizeFlag::DEPTH;
+
             // Notify deriving classes
             OnSizeAnimation( animation, mTargetSize );
           }
@@ -3069,7 +3131,7 @@ void Actor::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::In
         }
 
         case Dali::Actor::Property::COLOR_ALPHA:
-        case Dali::DevelActor::Property::OPACITY:
+        case Dali::Actor::Property::OPACITY:
         {
           value.Get( mTargetColor.a );
           break;
@@ -3092,6 +3154,9 @@ void Actor::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::In
         {
           if( AdjustValue< Vector3 >( mTargetSize, value ) )
           {
+            mAnimatedSize = mTargetSize;
+            mUseAnimatedSize = AnimatedSizeFlag::WIDTH | AnimatedSizeFlag::HEIGHT | AnimatedSizeFlag::DEPTH;
+
             // Notify deriving classes
             OnSizeAnimation( animation, mTargetSize );
           }
@@ -3102,6 +3167,9 @@ void Actor::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::In
         {
           if( AdjustValue< float >( mTargetSize.width, value ) )
           {
+            mAnimatedSize.width = mTargetSize.width;
+            mUseAnimatedSize |= AnimatedSizeFlag::WIDTH;
+
             // Notify deriving classes
             OnSizeAnimation( animation, mTargetSize );
           }
@@ -3112,6 +3180,9 @@ void Actor::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::In
         {
           if( AdjustValue< float >( mTargetSize.height, value ) )
           {
+            mAnimatedSize.height = mTargetSize.height;
+            mUseAnimatedSize |= AnimatedSizeFlag::HEIGHT;
+
             // Notify deriving classes
             OnSizeAnimation( animation, mTargetSize );
           }
@@ -3122,6 +3193,9 @@ void Actor::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::In
         {
           if( AdjustValue< float >( mTargetSize.depth, value ) )
           {
+            mAnimatedSize.depth = mTargetSize.depth;
+            mUseAnimatedSize |= AnimatedSizeFlag::DEPTH;
+
             // Notify deriving classes
             OnSizeAnimation( animation, mTargetSize );
           }
@@ -3222,7 +3296,7 @@ void Actor::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::In
         }
 
         case Dali::Actor::Property::COLOR_ALPHA:
-        case Dali::DevelActor::Property::OPACITY:
+        case Dali::Actor::Property::OPACITY:
         {
           AdjustValue< float >( mTargetColor.a, value );
           break;
@@ -3284,7 +3358,7 @@ const PropertyBase* Actor::GetSceneObjectAnimatableProperty( Property::Index ind
     case Dali::Actor::Property::COLOR_GREEN: // FALLTHROUGH
     case Dali::Actor::Property::COLOR_BLUE:  // FALLTHROUGH
     case Dali::Actor::Property::COLOR_ALPHA: // FALLTHROUGH
-    case Dali::DevelActor::Property::OPACITY:
+    case Dali::Actor::Property::OPACITY:
     {
       property = &GetNode().mColor;
       break;
@@ -3353,7 +3427,7 @@ const PropertyInputImpl* Actor::GetSceneObjectInputProperty( Property::Index ind
       property = &GetNode().mWorldMatrix;
       break;
     }
-    case Dali::DevelActor::Property::CULLED:
+    case Dali::Actor::Property::CULLED:
     {
       property = &GetNode().mCulled;
       break;
@@ -3416,7 +3490,7 @@ int32_t Actor::GetPropertyComponentIndex( Property::Index index ) const
     }
 
     case Dali::Actor::Property::COLOR_ALPHA:
-    case Dali::DevelActor::Property::OPACITY:
+    case Dali::Actor::Property::OPACITY:
     {
       componentIndex = 3;
       break;
@@ -3445,11 +3519,13 @@ void Actor::SetParent( Actor* parent )
 
     mParent = parent;
 
+    mScene = parent->mScene;
+
     if ( EventThreadServices::IsCoreRunning() && // Don't emit signals or send messages during Core destruction
-         parent->OnStage() )
+         parent->OnScene() )
     {
       // Instruct each actor to create a corresponding node in the scene graph
-      ConnectToStage( parent->GetHierarchyDepth() );
+      ConnectToScene( parent->GetHierarchyDepth() );
     }
 
     // Resolve the name and index for the child properties if any
@@ -3462,7 +3538,7 @@ void Actor::SetParent( Actor* parent )
     mParent = NULL;
 
     if ( EventThreadServices::IsCoreRunning() && // Don't emit signals or send messages during Core destruction
-         OnStage() )
+         OnScene() )
     {
       // Disconnect the Node & its children from the scene-graph.
       DisconnectNodeMessage( GetEventThreadServices().GetUpdateManager(), GetNode() );
@@ -3470,6 +3546,8 @@ void Actor::SetParent( Actor* parent )
       // Instruct each actor to discard pointers to the scene-graph
       DisconnectFromStage();
     }
+
+    mScene = nullptr;
   }
 }
 
@@ -3495,6 +3573,15 @@ bool Actor::DoAction( BaseObject* object, const std::string& actionName, const P
   return done;
 }
 
+Rect<> Actor::CalculateScreenExtents( ) const
+{
+  auto screenPosition = GetCurrentScreenPosition();
+  Vector3 size = GetCurrentSize() * GetCurrentWorldScale();
+  Vector3 anchorPointOffSet = size * ( mPositionUsesAnchorPoint ? GetCurrentAnchorPoint() : AnchorPoint::TOP_LEFT );
+  Vector2 position = Vector2( screenPosition.x - anchorPointOffSet.x, screenPosition.y - anchorPointOffSet.y );
+  return { position.x, position.y, size.x, size.y };
+}
+
 bool Actor::GetCachedPropertyValue( Property::Index index, Property::Value& value ) const
 {
   bool valueSet = true;
@@ -3658,7 +3745,7 @@ bool Actor::GetCachedPropertyValue( Property::Index index, Property::Value& valu
     }
 
     case Dali::Actor::Property::COLOR_ALPHA:
-    case Dali::DevelActor::Property::OPACITY:
+    case Dali::Actor::Property::OPACITY:
     {
       value = mTargetColor.a;
       break;
@@ -3702,19 +3789,13 @@ bool Actor::GetCachedPropertyValue( Property::Index index, Property::Value& valu
 
     case Dali::Actor::Property::COLOR_MODE:
     {
-      value = Scripting::GetLinearEnumerationName< ColorMode >( GetColorMode(), COLOR_MODE_TABLE, COLOR_MODE_TABLE_COUNT );
-      break;
-    }
-
-    case Dali::Actor::Property::POSITION_INHERITANCE:
-    {
-      value = Scripting::GetLinearEnumerationName< PositionInheritanceMode >( GetPositionInheritanceMode(), POSITION_INHERITANCE_MODE_TABLE, POSITION_INHERITANCE_MODE_TABLE_COUNT );
+      value = GetColorMode();
       break;
     }
 
     case Dali::Actor::Property::DRAW_MODE:
     {
-      value = Scripting::GetEnumerationName< DrawMode::Type >( GetDrawMode(), DRAW_MODE_TABLE, DRAW_MODE_TABLE_COUNT );
+      value = GetDrawMode();
       break;
     }
 
@@ -3738,7 +3819,7 @@ bool Actor::GetCachedPropertyValue( Property::Index index, Property::Value& valu
 
     case Dali::Actor::Property::SIZE_SCALE_POLICY:
     {
-      value = Scripting::GetLinearEnumerationName< SizeScalePolicy::Type >( GetSizeScalePolicy(), SIZE_SCALE_POLICY_TABLE, SIZE_SCALE_POLICY_TABLE_COUNT );
+      value = GetSizeScalePolicy();
       break;
     }
 
@@ -3786,13 +3867,13 @@ bool Actor::GetCachedPropertyValue( Property::Index index, Property::Value& valu
       break;
     }
 
-    case Dali::DevelActor::Property::SCREEN_POSITION:
+    case Dali::Actor::Property::SCREEN_POSITION:
     {
       value = GetCurrentScreenPosition();
       break;
     }
 
-    case Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT:
+    case Dali::Actor::Property::POSITION_USES_ANCHOR_POINT:
     {
       value = mPositionUsesAnchorPoint;
       break;
@@ -3810,6 +3891,48 @@ bool Actor::GetCachedPropertyValue( Property::Index index, Property::Value& valu
       break;
     }
 
+    case Dali::Actor::Property::ID:
+    {
+      value = static_cast<int>( GetId() );
+      break;
+    }
+
+    case Dali::Actor::Property::HIERARCHY_DEPTH:
+    {
+      value = GetHierarchyDepth();
+      break;
+    }
+
+    case Dali::Actor::Property::IS_ROOT:
+    {
+      value = IsRoot();
+      break;
+    }
+
+    case Dali::Actor::Property::IS_LAYER:
+    {
+      value = IsLayer();
+      break;
+    }
+
+    case Dali::Actor::Property::CONNECTED_TO_SCENE:
+    {
+      value = OnScene();
+      break;
+    }
+
+    case Dali::Actor::Property::KEYBOARD_FOCUSABLE:
+    {
+      value = IsKeyboardFocusable();
+      break;
+    }
+
+    case Dali::DevelActor::Property::CAPTURE_ALL_TOUCH_AFTER_START:
+    {
+      value = mCaptureAllTouchAfterStart;
+      break;
+    }
+
     default:
     {
       // Must be a scene-graph only property
@@ -3966,7 +4089,7 @@ bool Actor::GetCurrentPropertyValue( Property::Index index, Property::Value& val
     }
 
     case Dali::Actor::Property::COLOR_ALPHA:
-    case Dali::DevelActor::Property::OPACITY:
+    case Dali::Actor::Property::OPACITY:
     {
       value = GetCurrentColor().a;
       break;
@@ -3990,12 +4113,18 @@ bool Actor::GetCurrentPropertyValue( Property::Index index, Property::Value& val
       break;
     }
 
-    case DevelActor::Property::CULLED:
+    case Dali::Actor::Property::CULLED:
     {
       value = GetNode().IsCulled( GetEventThreadServices().GetEventBufferIndex() );
       break;
     }
 
+    case Dali::DevelActor::Property::UPDATE_SIZE_HINT:
+    {
+      value = GetUpdateSizeHint();
+      break;
+    }
+
     default:
     {
       // Must be an event-side only property
@@ -4210,12 +4339,12 @@ float Actor::CalculateChildSizeBase( const Dali::Actor& child, Dimension::Type d
 
     case ResizePolicy::SIZE_RELATIVE_TO_PARENT:
     {
-      return GetLatestSize( dimension ) * GetDimensionValue( child.GetSizeModeFactor(), dimension );
+      return GetLatestSize( dimension ) * GetDimensionValue( child.GetProperty< Vector3 >( Dali::Actor::Property::SIZE_MODE_FACTOR ), dimension );
     }
 
     case ResizePolicy::SIZE_FIXED_OFFSET_FROM_PARENT:
     {
-      return GetLatestSize( dimension ) + GetDimensionValue( child.GetSizeModeFactor(), dimension );
+      return GetLatestSize( dimension ) + GetDimensionValue( child.GetProperty< Vector3 >( Dali::Actor::Property::SIZE_MODE_FACTOR ), dimension );
     }
 
     default:
@@ -4658,18 +4787,24 @@ void Actor::SetPreferredSize( const Vector2& size )
 {
   EnsureRelayoutData();
 
-  if( size.width > 0.0f )
+  // If valid width or height, then set the resize policy to FIXED
+  // A 0 width or height may also be required so if the resize policy has not been changed, i.e. is still set to DEFAULT,
+  // then change to FIXED as well
+
+  if( size.width > 0.0f || GetResizePolicy( Dimension::WIDTH ) == ResizePolicy::DEFAULT )
   {
     SetResizePolicy( ResizePolicy::FIXED, Dimension::WIDTH );
   }
 
-  if( size.height > 0.0f )
+  if( size.height > 0.0f || GetResizePolicy( Dimension::HEIGHT ) == ResizePolicy::DEFAULT )
   {
     SetResizePolicy( ResizePolicy::FIXED, Dimension::HEIGHT );
   }
 
   mRelayoutData->preferredSize = size;
 
+  mUseAnimatedSize = AnimatedSizeFlag::CLEAR;
+
   RelayoutRequest();
 }
 
@@ -4821,12 +4956,11 @@ uint32_t Actor::GetSiblingOrder() const
 
 void Actor::RequestRebuildDepthTree()
 {
-  if( mIsOnStage )
+  if( mIsOnScene )
   {
-    StagePtr stage = Stage::GetCurrent();
-    if( stage )
+    if( mScene )
     {
-      stage->RequestRebuildDepthTree();
+      mScene->RequestRebuildDepthTree();
     }
   }
 }
@@ -5010,6 +5144,16 @@ void Actor::LowerBelow( Internal::Actor& target )
   }
 }
 
+void Actor::SetScene( Scene& scene )
+{
+  mScene = &scene;
+}
+
+Scene& Actor::GetScene() const
+{
+  return *mScene;
+}
+
 void Actor::SetInheritLayoutDirection( bool inherit )
 {
   if( mInheritLayoutDirection != inherit )
@@ -5050,6 +5194,19 @@ void Actor::InheritLayoutDirectionRecursively( ActorPtr actor, Dali::LayoutDirec
   }
 }
 
+void Actor::SetUpdateSizeHint( const Vector2& updateSizeHint )
+{
+  // node is being used in a separate thread; queue a message to set the value & base value
+  SceneGraph::NodePropertyMessage<Vector3>::Send( GetEventThreadServices(), &GetNode(), &GetNode().mUpdateSizeHint, &AnimatableProperty<Vector3>::Bake, Vector3(updateSizeHint.width, updateSizeHint.height, 0.f ) );
+}
+
+Vector2 Actor::GetUpdateSizeHint() const
+{
+  // node is being used in a separate thread, the value from the previous update is the same, set by user
+  Vector3 updateSizeHint = GetNode().GetUpdateSizeHint();
+  return Vector2( updateSizeHint.width, updateSizeHint.height );
+}
+
 } // namespace Internal
 
 } // namespace Dali