[Tizen] Fix viewport size when off-screen actor hittest 63/297763/2
authorEunki, Hong <eunkiki.hong@samsung.com>
Thu, 24 Aug 2023 04:17:39 +0000 (13:17 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Thu, 24 Aug 2023 04:23:13 +0000 (13:23 +0900)
This reverts commit 12d804c899eb642e2975d2232f54a3f72aa376db.

Change-Id: Ie76f1f653664c19d8bc4641c6c063776e13e4959

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..8c7ca54 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,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<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;