Hit test includes clipping actors as well as their children 64/93264/3
authorTom Robinson <tom.robinson@samsung.com>
Fri, 21 Oct 2016 11:31:06 +0000 (12:31 +0100)
committerTom Robinson <tom.robinson@samsung.com>
Fri, 21 Oct 2016 11:31:10 +0000 (12:31 +0100)
Change-Id: Id9a4917fc4a40b57a32ef8017b0ee1f8488d0fe2

automated-tests/src/dali/utc-Dali-HoverProcessing.cpp
automated-tests/src/dali/utc-Dali-TouchDataProcessing.cpp
automated-tests/src/dali/utc-Dali-TouchProcessing.cpp
dali/internal/event/events/hit-test-algorithm-impl.cpp

index fd4a7e5..93630ed 100644 (file)
@@ -1264,6 +1264,13 @@ int UtcDaliHoverClippingActor(void)
   clippingActor.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN );
   stage.Add( clippingActor );
 
+  // Add a child to the clipped region.
+  Actor clippingChild = Actor::New();
+  clippingChild.SetSize( 50.0f, 50.0f );
+  clippingChild.SetPosition( 25.0f, 25.0f );
+  clippingChild.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+  clippingActor.Add( clippingChild );
+
   // Render and notify.
   application.SendNotification();
   application.Render();
@@ -1273,9 +1280,9 @@ int UtcDaliHoverClippingActor(void)
   HoverEventFunctor functor( data );
   actor.HoveredSignal().Connect( &application, functor );
 
-  // Emit an event within clipped area.
+  // Emit an event within clipped area - no hit.
   application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) );
-  DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+  DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
   data.Reset();
 
   // Emit an event outside the clipped area but within the actor area, we should have a hit.
@@ -1283,5 +1290,12 @@ int UtcDaliHoverClippingActor(void)
   DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
   data.Reset();
 
+  clippingChild.HoveredSignal().Connect( &application, functor );
+
+  // Emit an event inside part of the child which is within the clipped area, we should have a hit.
+  application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 30.0f, 30.0f ) ) );
+  DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+  data.Reset();
+
   END_TEST;
 }
index 9b519d3..2ec12df 100644 (file)
@@ -1542,6 +1542,13 @@ int UtcDaliTouchDataClippedActor(void)
   clippingActor.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN );
   stage.Add( clippingActor );
 
+  // Add a child to the clipped region.
+  Actor clippingChild = Actor::New();
+  clippingChild.SetSize( 50.0f, 50.0f );
+  clippingChild.SetPosition( 25.0f, 25.0f );
+  clippingChild.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+  clippingActor.Add( clippingChild );
+
   // Render and notify.
   application.SendNotification();
   application.Render();
@@ -1551,9 +1558,9 @@ int UtcDaliTouchDataClippedActor(void)
   TouchDataFunctor functor( data );
   actor.TouchSignal().Connect( &application, functor );
 
-  // Emit an event within clipped area.
+  // Emit an event within clipped area - no hit.
   application.ProcessEvent( GenerateSingleTouch( PointState::DOWN, Vector2( 10.0f, 10.0f ) ) );
-  DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+  DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
   data.Reset();
 
   // Emit an event outside the clipped area but within the actor area, we should have a hit.
@@ -1561,6 +1568,13 @@ int UtcDaliTouchDataClippedActor(void)
   DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
   data.Reset();
 
+  clippingChild.TouchSignal().Connect( &application, functor );
+
+  // Emit an event inside part of the child which is within the clipped area, we should have a hit.
+  application.ProcessEvent( GenerateSingleTouch( PointState::DOWN, Vector2( 30.0f, 30.0f ) ) );
+  DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+  data.Reset();
+
   END_TEST;
 }
 
index 82d514b..6e48db1 100644 (file)
@@ -1316,6 +1316,13 @@ int UtcDaliTouchClippingActor(void)
   clippingActor.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN );
   stage.Add( clippingActor );
 
+  // Add a child to the clipped region.
+  Actor clippingChild = Actor::New();
+  clippingChild.SetSize( 50.0f, 50.0f );
+  clippingChild.SetPosition( 25.0f, 25.0f );
+  clippingChild.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+  clippingActor.Add( clippingChild );
+
   // Render and notify.
   application.SendNotification();
   application.Render();
@@ -1325,9 +1332,9 @@ int UtcDaliTouchClippingActor(void)
   TouchEventFunctor functor( data );
   actor.TouchedSignal().Connect( &application, functor );
 
-  // Emit an event within clipped area.
+  // Emit an event within clipped area - no hit.
   application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
-  DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+  DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
   data.Reset();
 
   // Emit an event outside the clipped area but within the actor area, we should have a hit.
@@ -1335,6 +1342,13 @@ int UtcDaliTouchClippingActor(void)
   DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
   data.Reset();
 
+  clippingChild.TouchedSignal().Connect( &application, functor );
+
+  // Emit an event inside part of the child which is within the clipped area, we should have a hit.
+  application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 30.0f, 30.0f ) ) );
+  DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+  data.Reset();
+
   END_TEST;
 }
 
index d27c5f2..62ad33f 100644 (file)
@@ -233,7 +233,8 @@ HitActor HitTestWithinLayer( Actor& actor,
               // Here we calculate a comparison mask by setting all the bits up to the current depth value.
               // EG. a depth of 4 (10000 binary) = a mask of 1111 binary.
               // This allows us a fast way of comparing all bits are set up to this depth.
-              unsigned int clippingDepthMask = ( 1u << clippingDepth ) - 1u;
+              // Note: If the current Actor has clipping, that is included in the depth mask too.
+              unsigned int clippingDepthMask = ( 1u << newClippingDepth ) - 1u;
 
               // The two masks must be equal to be a hit, as we are already assuming a hit
               // (for non-clipping mode) then they must be not-equal to disqualify the hit.