Unify the way to handle on/off screen render task hit test 94/279294/5
authorseungho <sbsh.baek@samsung.com>
Fri, 5 Aug 2022 07:24:29 +0000 (16:24 +0900)
committerseungho <sbsh.baek@samsung.com>
Thu, 11 Aug 2022 05:34:39 +0000 (14:34 +0900)
Change-Id: I72e3eedb85f4697b64e617a39e7371027517c1c2
Signed-off-by: seungho <sbsh.baek@samsung.com>
automated-tests/src/dali/utc-Dali-HitTestAlgorithm.cpp
dali/internal/event/events/hit-test-algorithm-impl.cpp

index cea3e03..e62406a 100644 (file)
@@ -570,3 +570,58 @@ int UtcDaliHitTestAlgorithmDoesWantedHitTest(void)
 
   END_TEST;
 }
+
+int UtcDaliHitTestAlgorithmOrder(void)
+{
+  TestApplication application;
+  tet_infoline("Testing Dali::HitTestAlgorithm between On/Off render task");
+
+  Stage   stage = Stage::GetCurrent();
+  Vector2 stageSize(stage.GetSize());
+
+  Actor blue = Actor::New();
+  blue[Dali::Actor::Property::NAME] = "Blue";
+  blue[Dali::Actor::Property::ANCHOR_POINT] = AnchorPoint::CENTER;
+  blue[Dali::Actor::Property::PARENT_ORIGIN] = ParentOrigin::CENTER;
+  blue[Dali::Actor::Property::WIDTH_RESIZE_POLICY] = ResizePolicy::FILL_TO_PARENT;
+  blue[Dali::Actor::Property::HEIGHT_RESIZE_POLICY] = ResizePolicy::FILL_TO_PARENT;
+
+  Actor green = Actor::New();
+  green[Dali::Actor::Property::NAME] = "Green";
+  green[Dali::Actor::Property::ANCHOR_POINT] = AnchorPoint::CENTER;
+  green[Dali::Actor::Property::PARENT_ORIGIN] = ParentOrigin::CENTER;
+  green[Dali::Actor::Property::WIDTH_RESIZE_POLICY] = ResizePolicy::FILL_TO_PARENT;
+  green[Dali::Actor::Property::HEIGHT_RESIZE_POLICY] = ResizePolicy::FILL_TO_PARENT;
+
+  stage.Add(blue);
+  stage.Add(green);
+
+  RenderTaskList renderTaskList = stage.GetRenderTaskList();
+  RenderTask     offRenderTask  = renderTaskList.CreateTask();
+
+  Dali::CameraActor cameraActor = Dali::CameraActor::New(stageSize);
+  cameraActor[Dali::Actor::Property::ANCHOR_POINT] = AnchorPoint::CENTER;
+  cameraActor[Dali::Actor::Property::PARENT_ORIGIN] = ParentOrigin::CENTER;
+  stage.Add(cameraActor);
+
+  offRenderTask.SetExclusive(true);
+  offRenderTask.SetInputEnabled(true);
+  offRenderTask.SetCameraActor(cameraActor);
+  offRenderTask.SetSourceActor(green);
+  offRenderTask.SetScreenToFrameBufferMappingActor(green);
+
+  Dali::Texture texture = Dali::Texture::New(TextureType::TEXTURE_2D, Pixel::RGB888, unsigned(stageSize.width), unsigned(stageSize.height));
+  FrameBuffer renderTarget         = FrameBuffer::New(stageSize.width, stageSize.height, FrameBuffer::Attachment::DEPTH);
+  renderTarget.AttachColorTexture(texture);
+  offRenderTask.SetFrameBuffer(renderTarget);
+
+  // Render and notify
+  application.SendNotification();
+  application.Render(10);
+
+  HitTestAlgorithm::Results results;
+  HitTest(stage, stageSize / 2.0f, results, &DefaultIsActorTouchableFunction);
+  DALI_TEST_CHECK(results.actor == green);
+
+  END_TEST;
+}
\ No newline at end of file
index 6a589c1..cbd8940 100644 (file)
@@ -566,7 +566,6 @@ bool HitTestRenderTask(const RenderTaskList::ExclusivesContainer& exclusives,
  * @param[in] taskList The list of render tasks
  * @param[out] results Ray information calculated by the camera
  * @param[in] hitCheck The hit testing interface object to use
- * @param[in] onScreen True to test on-screen, false to test off-screen
  * @return True if we have a hit, false otherwise
  */
 bool HitTestRenderTaskList(const Vector2&    sceneSize,
@@ -574,27 +573,21 @@ bool HitTestRenderTaskList(const Vector2&    sceneSize,
                            RenderTaskList&   taskList,
                            const Vector2&    screenCoordinates,
                            Results&          results,
-                           HitTestInterface& hitCheck,
-                           bool              onScreen)
+                           HitTestInterface& hitCheck)
 {
   RenderTaskList::RenderTaskContainer&                  tasks      = taskList.GetTasks();
   RenderTaskList::RenderTaskContainer::reverse_iterator endIter    = tasks.rend();
   const auto&                                           exclusives = taskList.GetExclusivesList();
   RayTest                                               rayTest;
 
+  // Hit test order should be reverse of draw order
   for(RenderTaskList::RenderTaskContainer::reverse_iterator iter = tasks.rbegin(); endIter != iter; ++iter)
   {
     RenderTask& renderTask            = *iter->Get();
-    const bool  isOffscreenRenderTask = renderTask.GetFrameBuffer();
-    if((onScreen && isOffscreenRenderTask) || (!onScreen && !isOffscreenRenderTask))
-    {
-      // Skip to next task
-      continue;
-    }
     if(HitTestRenderTask(exclusives, sceneSize, layers, renderTask, screenCoordinates, results, hitCheck, rayTest))
     {
       // Return true when an actor is hit (or layer in our render-task consumes the hit)
-      return true; // don't bother checking off screen tasks
+      return true;
     }
   }
 
@@ -609,7 +602,6 @@ bool HitTestRenderTaskList(const Vector2&    sceneSize,
  * @param[in] taskList The list of render tasks
  * @param[out] results Ray information calculated by the camera
  * @param[in] hitCheck The hit testing interface object to use
- * @param[in] onScreen True to test on-screen, false to test off-screen
  * @return True if we have a hit, false otherwise
  */
 bool HitTestForEachRenderTask(const Vector2&    sceneSize,
@@ -621,10 +613,7 @@ bool HitTestForEachRenderTask(const Vector2&    sceneSize,
 {
   bool result = false;
 
-  // Check on-screen tasks before off-screen ones.
-  // Hit test order should be reverse of draw order (see ProcessRenderTasks() where off-screen tasks are drawn first).
-  if(HitTestRenderTaskList(sceneSize, layers, taskList, screenCoordinates, results, hitCheck, true) ||
-     HitTestRenderTaskList(sceneSize, layers, taskList, screenCoordinates, results, hitCheck, false))
+  if(HitTestRenderTaskList(sceneSize, layers, taskList, screenCoordinates, results, hitCheck))
   {
     // Found hit.
     result = true;