Invert Y when the camera renders on Framebuffer and y invert is true. 94/321494/1
authorSeungho Baek <sbsh.baek@samsung.com>
Mon, 24 Mar 2025 05:44:53 +0000 (14:44 +0900)
committerSeungho Baek <sbsh.baek@samsung.com>
Mon, 24 Mar 2025 05:44:53 +0000 (14:44 +0900)
 - When scene is drawn on window (with viewport), DALi draws scene on window directly so picking ray and result is always fit.
 - When scene is drawn on FBO, DALi cannot know how the result is drawn by app, so picking ray is always on space that has (0, -1, 0) as UP.

Change-Id: I441356c5b128711ca864a9cd2d51e166f297d245
Signed-off-by: Seungho Baek <sbsh.baek@samsung.com>
dali/internal/event/actors/camera-actor-impl.cpp
dali/internal/event/actors/camera-actor-impl.h
dali/internal/event/events/hit-test-algorithm-impl.cpp

index 1ac12e64f7596f28fd9ac0eb2b8837c36b1a666d..f69a87d87c53f90ffe5c56bdfff971d4216d76bf 100644 (file)
@@ -563,7 +563,8 @@ void CameraActor::ApplyDefaultProjection()
 bool CameraActor::BuildPickingRay(const Vector2&  screenCoordinates,
                                   const Viewport& viewport,
                                   Vector4&        rayOrigin,
-                                  Vector4&        rayDirection)
+                                  Vector4&        rayDirection,
+                                  bool            isDrawnOnFramebuffer)
 {
   bool success = true;
   if(mProjectionMode == Dali::Camera::PERSPECTIVE_PROJECTION)
@@ -584,7 +585,7 @@ bool CameraActor::BuildPickingRay(const Vector2&  screenCoordinates,
     // Compute the ray's director vector.
     rayDirection.x = near.x - rayOrigin.x;
     rayDirection.y = near.y - rayOrigin.y;
-    rayDirection.y = (mInvertYAxis) ? -rayDirection.y : rayDirection.y;
+    rayDirection.y = (isDrawnOnFramebuffer && mInvertYAxis) ? -rayDirection.y : rayDirection.y;
     rayDirection.z = near.z - rayOrigin.z;
     rayDirection.Normalize();
     rayDirection.w = 1.f;
@@ -608,10 +609,11 @@ bool CameraActor::BuildPickingRay(const Vector2&  screenCoordinates,
 bool CameraActor::BuildPickingRay(const Vector2& screenCoordinates,
                                   const Vector2& screenSize,
                                   Vector4&       rayOrigin,
-                                  Vector4&       rayDirection)
+                                  Vector4&       rayDirection,
+                                  bool           isDrawnOnFramebuffer)
 {
   Viewport viewport(0, 0, screenSize.x, screenSize.y);
-  return BuildPickingRay(screenCoordinates, viewport, rayOrigin, rayDirection);
+  return BuildPickingRay(screenCoordinates, viewport, rayOrigin, rayDirection, isDrawnOnFramebuffer);
 }
 
 const Matrix& CameraActor::GetViewMatrix() const
index d226b1021b98835b2146a5706e1ca7b0674e1a51..56d614baddba4b026e18abdc33c3ebfbfa9a7dc5 100644 (file)
@@ -179,9 +179,21 @@ public:
    * @param [in] viewport to use
    * @param [out] rayOrigin for the picking ray
    * @param [out] rayDirection for the picking ray
+   * @param [in] isDrawnOnFramebuffer to notify this camera is currently used for Framebuffer or not.
    * @return true if the building was successful, false if its not possible (camera is not valid for hit testing)
    */
-  bool BuildPickingRay(const Vector2& screenCoordinates, const Viewport& viewport, Vector4& rayOrigin, Vector4& rayDirection);
+  bool BuildPickingRay(const Vector2& screenCoordinates, const Viewport& viewport, Vector4& rayOrigin, Vector4& rayDirection, bool isDrawnOnFramebuffer = false);
+
+  /**
+   * Build a picking ray with this camera and given screen coordinates (Not considers viewport.)
+   * @param [in] screenCoordinates the ray passed through
+   * @param [in] screenSize screen Size.
+   * @param [out] rayOrigin for the picking ray
+   * @param [out] rayDirection for the picking ray
+   * @param [in] isDrawnOnFramebuffer to notify this camera is currently used for Framebuffer or not.
+   * @return true if the building was successful, false if its not possible (camera is not valid for hit testing)
+   */
+  bool BuildPickingRay(const Vector2& screenCoordinates, const Vector2& screenSize, Vector4& rayOrigin, Vector4& rayDirection, bool isDrawnOnFramebuffer = false);
 
   /**
    * Build a picking ray with this camera and given screen coordinates (Not considers viewport.)
index 35ab6e1ec809a4569771aa511ad3bd2d4b67d777..e9b427e6386c2ea53c95271dac10252a25dd5f8e 100644 (file)
@@ -571,7 +571,7 @@ bool HitTestRenderTask(std::vector<std::shared_ptr<HitResult>>& hitResultList,
   }
 
   Ray ray;
-  if(!renderTask.GetCameraActor()->BuildPickingRay(screenCoordinates, screenSize, ray.origin, ray.direction))
+  if(!renderTask.GetCameraActor()->BuildPickingRay(screenCoordinates, screenSize, ray.origin, ray.direction, !!renderTask.GetFrameBuffer()))
   {
     return false;
   }