From 2fe9e8f29e36e9e5e1c4685e8deaa8235b31799d Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Thu, 24 Aug 2023 13:17:39 +0900 Subject: [PATCH] [Tizen] Fix viewport size when off-screen actor hittest This reverts commit 12d804c899eb642e2975d2232f54a3f72aa376db. Change-Id: Ie76f1f653664c19d8bc4641c6c063776e13e4959 --- .../event/events/hit-test-algorithm-impl.cpp | 3 ++- .../event/render-tasks/render-task-impl.cpp | 27 +++++++++++++++++++++- .../internal/event/render-tasks/render-task-impl.h | 19 ++++++++++----- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/dali/internal/event/events/hit-test-algorithm-impl.cpp b/dali/internal/event/events/hit-test-algorithm-impl.cpp index 5409ed0..77adf67 100644 --- a/dali/internal/event/events/hit-test-algorithm-impl.cpp +++ b/dali/internal/event/events/hit-test-algorithm-impl.cpp @@ -446,7 +446,8 @@ bool HitTestRenderTask(const RenderTaskList::ExclusivesContainer& exclusives, if(renderTask.IsHittable(screenCoordinates)) { Viewport viewport; - renderTask.GetViewport(viewport); + renderTask.GetHittableViewport(viewport); + if(screenCoordinates.x < static_cast(viewport.x) || screenCoordinates.x > static_cast(viewport.x + viewport.width) || screenCoordinates.y < static_cast(viewport.y) || diff --git a/dali/internal/event/render-tasks/render-task-impl.cpp b/dali/internal/event/render-tasks/render-task-impl.cpp index 72c1b49..8c7ca54 100644 --- a/dali/internal/event/render-tasks/render-task-impl.cpp +++ b/dali/internal/event/render-tasks/render-task-impl.cpp @@ -437,7 +437,7 @@ bool RenderTask::TranslateCoordinates(Vector2& screenCoords) const float localX, localY; inside = inputMappingActor->ScreenToLocal(defaultCamera->GetViewMatrix(), defaultCamera->GetProjectionMatrix(), viewport, localX, localY, screenCoords.x, screenCoords.y); - Vector3 actorSize = inputMappingActor->GetCurrentSize(); + Vector3 actorSize = inputMappingActor->GetCurrentSize() * inputMappingActor->GetCurrentWorldScale(); if(inside && localX >= 0.f && localX <= actorSize.x && localY >= 0.f && localY <= actorSize.y) { screenCoords.x = localX; @@ -461,6 +461,31 @@ bool RenderTask::TranslateCoordinates(Vector2& screenCoords) const return inside; } +void RenderTask::GetHittableViewport(Viewport& viewPort) const +{ + if(GetInputEnabled()) + { + if(mFrameBuffer) + { + auto mappingActor = GetScreenToFrameBufferMappingActor(); + if(mappingActor) + { + Actor& inputMappingActor = GetImplementation(mappingActor); + + Vector3 actorSize = inputMappingActor.GetCurrentSize() * inputMappingActor.GetCurrentWorldScale(); + + viewPort.x = viewPort.y = 0; + viewPort.width = static_cast(actorSize.x + 0.5f); // rounded + viewPort.height = static_cast(actorSize.y + 0.5f); // rounded + } + } + else + { + GetViewport(viewPort); + } + } +} + bool RenderTask::WorldToViewport(const Vector3& position, float& viewportX, float& viewportY) const { CameraActor* cam = GetCameraActor(); diff --git a/dali/internal/event/render-tasks/render-task-impl.h b/dali/internal/event/render-tasks/render-task-impl.h index f5dd2a3..cb665d2 100644 --- a/dali/internal/event/render-tasks/render-task-impl.h +++ b/dali/internal/event/render-tasks/render-task-impl.h @@ -244,6 +244,13 @@ public: bool TranslateCoordinates(Vector2& screenCoords) const; /** + * @brief Get Viewport when we need to be used with translated screen coordinated when render task is offscreen. + * It will be used when we hit-test. + * @param[out] viewPort instance to copy the values into + */ + void GetHittableViewport(Viewport& viewPort) const; + + /** * @copydoc Dali::RenderTask::WorldToViewport() */ bool WorldToViewport(const Vector3& position, float& viewportX, float& viewportY) const; @@ -353,8 +360,8 @@ protected: ~RenderTask() override; private: // not copyable - RenderTask() = delete; - RenderTask(const RenderTask&) = delete; + RenderTask() = delete; + RenderTask(const RenderTask&) = delete; RenderTask& operator=(const RenderTask&) = delete; private: @@ -364,12 +371,12 @@ private: WeakHandle mInputMappingActor; /// used to mapping screen to frame buffer coordinate, not kept alive by rendertask RenderTaskList& mRenderTaskList; ///< The render task list - Vector4 mClearColor; ///< Optional clear color + Vector4 mClearColor; ///< Optional clear color - Vector2 mViewportPosition; ///< The cached viewport position - Vector2 mViewportSize; ///< The cached viewport size + Vector2 mViewportPosition; ///< The cached viewport position + Vector2 mViewportSize; ///< The cached viewport size - uint32_t mRefreshRate; ///< Determines how often the task is processed. + uint32_t mRefreshRate; ///< Determines how often the task is processed. uint32_t mRefreshOnceCounter; -- 2.7.4