Merge "Add BuildPickingRay to devel api" into devel/master
[platform/core/uifw/dali-core.git] / dali / devel-api / events / hit-test-algorithm.cpp
index 5f0ba26..e9e3e7f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 #include <dali/devel-api/events/hit-test-algorithm.h>
 
 // INTERNAL INCLUDES
+#include <dali/internal/event/actors/camera-actor-impl.h>
 #include <dali/internal/event/common/scene-impl.h>
 #include <dali/internal/event/common/stage-impl.h>
 #include <dali/internal/event/events/hit-test-algorithm-impl.h>
@@ -34,6 +35,30 @@ bool HitTest(Stage stage, const Vector2& screenCoordinates, Results& results, Hi
   return Internal::HitTestAlgorithm::HitTest(stageImpl.GetSize(), stageImpl.GetRenderTaskList(), stageImpl.GetLayerList(), screenCoordinates, results, func);
 }
 
+bool BuildPickingRay(RenderTask renderTask, const Vector2& screenCoordinates, Vector3& origin, Vector3& direction)
+{
+  Viewport viewport = renderTask.GetViewport();
+  if(screenCoordinates.x < static_cast<float>(viewport.x) ||
+     screenCoordinates.x > static_cast<float>(viewport.x + viewport.width) ||
+     screenCoordinates.y < static_cast<float>(viewport.y) ||
+     screenCoordinates.y > static_cast<float>(viewport.y + viewport.height))
+  {
+    // The screen coordinate is outside the viewport of render task. The viewport clips all layers.
+    return false;
+  }
+  CameraActor            cameraActor     = renderTask.GetCameraActor();
+  Internal::CameraActor& cameraActorImpl = GetImplementation(cameraActor);
+  Vector4                rayOrigin;
+  Vector4                rayDirection;
+  bool                   success = cameraActorImpl.BuildPickingRay(screenCoordinates, viewport, rayOrigin, rayDirection);
+  if(success)
+  {
+    origin    = Vector3(rayOrigin.x, rayOrigin.y, rayOrigin.z);
+    direction = Vector3(rayDirection.x, rayDirection.y, rayDirection.z);
+  }
+  return success;
+}
+
 } // namespace HitTestAlgorithm
 
 } // namespace Dali