2 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali/devel-api/events/hit-test-algorithm.h>
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>
30 namespace HitTestAlgorithm
32 bool HitTest(Stage stage, const Vector2& screenCoordinates, Results& results, HitTestFunction func, const Integration::Scene::TouchPropagationType propagationType)
34 Internal::Stage& stageImpl = GetImplementation(stage);
35 return Internal::HitTestAlgorithm::HitTest(stageImpl.GetSize(), stageImpl.GetRenderTaskList(), stageImpl.GetLayerList(), screenCoordinates, results, func, propagationType);
38 bool BuildPickingRay(RenderTask renderTask, const Vector2& screenCoordinates, Vector3& origin, Vector3& direction)
40 Internal::RenderTask& renderTaskImpl = GetImplementation(renderTask);
41 Vector2 convertedScreenCoordinates = screenCoordinates;
43 if(!renderTaskImpl.IsHittable(convertedScreenCoordinates))
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))
55 // The screen coordinate is outside the viewport of render task. The viewport clips all layers.
58 DALI_ASSERT_ALWAYS(renderTaskImpl.GetCameraActor());
60 Internal::CameraActor& cameraActorImpl = *renderTaskImpl.GetCameraActor();
63 bool success = cameraActorImpl.BuildPickingRay(convertedScreenCoordinates, viewport, rayOrigin, rayDirection);
66 origin = Vector3(rayOrigin.x, rayOrigin.y, rayOrigin.z);
67 direction = Vector3(rayDirection.x, rayDirection.y, rayDirection.z);
72 } // namespace HitTestAlgorithm