/*
- * 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.
#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>
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