[dali_2.3.33] Merge branch 'devel/master'
[platform/core/uifw/dali-core.git] / dali / devel-api / events / hit-test-algorithm.cpp
1 /*
2  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/devel-api/events/hit-test-algorithm.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/internal/event/actors/camera-actor-impl.h>
23 #include <dali/internal/event/common/scene-impl.h>
24 #include <dali/internal/event/common/stage-impl.h>
25 #include <dali/internal/event/events/hit-test-algorithm-impl.h>
26 #include <dali/internal/event/render-tasks/render-task-impl.h>
27
28 namespace Dali
29 {
30 namespace HitTestAlgorithm
31 {
32 bool HitTest(Stage stage, const Vector2& screenCoordinates, Results& results, HitTestFunction func, const Integration::Scene::TouchPropagationType propagationType)
33 {
34   Internal::Stage& stageImpl = GetImplementation(stage);
35   return Internal::HitTestAlgorithm::HitTest(stageImpl.GetSize(), stageImpl.GetRenderTaskList(), stageImpl.GetLayerList(), screenCoordinates, results, func, propagationType);
36 }
37
38 bool BuildPickingRay(RenderTask renderTask, const Vector2& screenCoordinates, Vector3& origin, Vector3& direction)
39 {
40   Internal::RenderTask& renderTaskImpl             = GetImplementation(renderTask);
41   Vector2               convertedScreenCoordinates = screenCoordinates;
42
43   if(!renderTaskImpl.IsHittable(convertedScreenCoordinates))
44   {
45     return false;
46   }
47
48   Viewport viewport;
49   renderTaskImpl.GetHittableViewport(viewport);
50   if(convertedScreenCoordinates.x < static_cast<float>(viewport.x) ||
51      convertedScreenCoordinates.x > static_cast<float>(viewport.x + viewport.width) ||
52      convertedScreenCoordinates.y < static_cast<float>(viewport.y) ||
53      convertedScreenCoordinates.y > static_cast<float>(viewport.y + viewport.height))
54   {
55     // The screen coordinate is outside the viewport of render task. The viewport clips all layers.
56     return false;
57   }
58   DALI_ASSERT_ALWAYS(renderTaskImpl.GetCameraActor());
59
60   Internal::CameraActor& cameraActorImpl = *renderTaskImpl.GetCameraActor();
61   Vector4                rayOrigin;
62   Vector4                rayDirection;
63   bool                   success = cameraActorImpl.BuildPickingRay(convertedScreenCoordinates, viewport, rayOrigin, rayDirection);
64   if(success)
65   {
66     origin    = Vector3(rayOrigin.x, rayOrigin.y, rayOrigin.z);
67     direction = Vector3(rayDirection.x, rayDirection.y, rayDirection.z);
68   }
69   return success;
70 }
71
72 } // namespace HitTestAlgorithm
73
74 } // namespace Dali