[Tizen] Fix viewport size when off-screen actor hittest
authorEunki, Hong <eunkiki.hong@samsung.com>
Tue, 22 Aug 2023 02:37:11 +0000 (11:37 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Thu, 24 Aug 2023 04:16:44 +0000 (13:16 +0900)
There was some miss-conversion of screen coordinate
when we use offscreen rendering.

Since hit-test algorithm use converted-screen-coordinate
by inputMappingActor, we also need to use inputMappingActor
when we use viewport value.

Change-Id: I2b1995a1b8e47b600239dcfb6e0380124e484f2f
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali/internal/event/events/hit-test-algorithm-impl.cpp
dali/internal/event/render-tasks/render-task-impl.cpp
dali/internal/event/render-tasks/render-task-impl.h

index 5409ed0..77adf67 100644 (file)
@@ -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<float>(viewport.x) ||
        screenCoordinates.x > static_cast<float>(viewport.x + viewport.width) ||
        screenCoordinates.y < static_cast<float>(viewport.y) ||
index 72c1b49..1204209 100644 (file)
@@ -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,34 @@ bool RenderTask::TranslateCoordinates(Vector2& screenCoords) const
   return inside;
 }
 
+void RenderTask::GetHittableViewport(Viewport& viewPort) const
+{
+  if(GetRenderTaskSceneObject())
+  {
+    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<int32_t>(actorSize.x + 0.5f); // rounded
+          viewPort.height         = static_cast<int32_t>(actorSize.y + 0.5f); // rounded
+        }
+      }
+      else
+      {
+        GetViewport(viewPort);
+      }
+    }
+  }
+}
+
 bool RenderTask::WorldToViewport(const Vector3& position, float& viewportX, float& viewportY) const
 {
   CameraActor* cam = GetCameraActor();
index f5dd2a3..cb665d2 100644 (file)
@@ -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<Dali::Actor> 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;