From baa3db913d3673803552606df4629180ea280826 Mon Sep 17 00:00:00 2001 From: seungho Date: Fri, 5 Aug 2022 16:24:29 +0900 Subject: [PATCH] Unify the way to handle on/off screen render task hit test Change-Id: I72e3eedb85f4697b64e617a39e7371027517c1c2 Signed-off-by: seungho --- .../src/dali/utc-Dali-HitTestAlgorithm.cpp | 55 ++++++++++++++++++++++ .../event/events/hit-test-algorithm-impl.cpp | 19 ++------ 2 files changed, 59 insertions(+), 15 deletions(-) diff --git a/automated-tests/src/dali/utc-Dali-HitTestAlgorithm.cpp b/automated-tests/src/dali/utc-Dali-HitTestAlgorithm.cpp index cea3e03..e62406a 100644 --- a/automated-tests/src/dali/utc-Dali-HitTestAlgorithm.cpp +++ b/automated-tests/src/dali/utc-Dali-HitTestAlgorithm.cpp @@ -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 diff --git a/dali/internal/event/events/hit-test-algorithm-impl.cpp b/dali/internal/event/events/hit-test-algorithm-impl.cpp index 6a589c1..cbd8940 100644 --- a/dali/internal/event/events/hit-test-algorithm-impl.cpp +++ b/dali/internal/event/events/hit-test-algorithm-impl.cpp @@ -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; -- 2.7.4