1 #ifndef DALI_SCENE3D_INTERNAL_NAVIGATION_MESH_H
2 #define DALI_SCENE3D_INTERNAL_NAVIGATION_MESH_H
5 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 #include <dali/public-api/actors/actor.h>
22 #include <dali/public-api/common/vector-wrapper.h>
23 #include <dali/public-api/math/matrix.h>
24 #include <dali/public-api/math/vector3.h>
25 #include <dali/public-api/math/vector4.h>
32 #include <dali-scene3d/internal/algorithm/navigation-mesh-header.h>
33 #include <dali-scene3d/public-api/algorithm/navigation-mesh.h>
34 #include <dali-scene3d/public-api/algorithm/path-finder.h>
36 namespace Dali::Scene3D::Loader
38 class NavigationMeshFactory;
41 namespace Dali::Scene3D::Internal::Algorithm
45 // Make each to change each index value's type here.
46 using VertexIndex = Dali::Scene3D::Algorithm::VertexIndex;
47 using EdgeIndex = Dali::Scene3D::Algorithm::EdgeIndex;
48 using FaceIndex = Dali::Scene3D::Algorithm::FaceIndex;
51 * @class NavigationMesh
56 using Face = Dali::Scene3D::Algorithm::NavigationMesh::Face;
57 using Edge = Dali::Scene3D::Algorithm::NavigationMesh::Edge;
58 using Vertex = Dali::Scene3D::Algorithm::NavigationMesh::Vertex;
61 friend class Scene3D::Loader::NavigationMeshFactory;
66 NavigationMesh(const std::vector<uint8_t>& buffer);
72 ~NavigationMesh() = default;
75 * Result of Ray/Polygon intersection
77 struct IntersectResult
86 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetFaceCount()
88 [[nodiscard]] uint32_t GetFaceCount() const;
91 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetEdgeCount()
93 [[nodiscard]] uint32_t GetEdgeCount() const;
96 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetVertexCount()
98 [[nodiscard]] uint32_t GetVertexCount() const;
101 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::FindFloorForFace()
103 bool FindFloorForFace(const Dali::Vector3& position, FaceIndex faceIndex, bool dontCheckNeighbours, Dali::Vector3& outPosition);
106 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::FindFloor()
108 bool FindFloor(const Dali::Vector3& position, Dali::Vector3& outPosition);
111 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::FindFloor()
113 bool FindFloor(const Dali::Vector3& position, Dali::Vector3& outPosition, FaceIndex& faceIndex);
116 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetFace()
118 [[nodiscard]] const Face* GetFace(FaceIndex index) const;
121 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetEdge()
123 [[nodiscard]] const Edge* GetEdge(EdgeIndex index) const;
126 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetVertex()
128 [[nodiscard]] const Vertex* GetVertex(VertexIndex index) const;
131 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::SetSceneTransform()
133 void SetTransform(const Dali::Matrix& transform);
136 * Tests intersection between navigation ray and face
138 IntersectResult NavigationRayFaceIntersection(NavigationRay& ray, const Face& face) const;
141 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::PointSceneToLocal()
143 Dali::Vector3 PointSceneToLocal(const Dali::Vector3& point) const;
146 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::PointLocalToScene()
148 Dali::Vector3 PointLocalToScene(const Dali::Vector3& point) const;
151 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetGravityVector()
153 [[nodiscard]] Dali::Vector3 GetGravityVector() const;
156 std::vector<uint8_t> mBuffer; //< Data buffer
157 NavigationMeshHeader_V10 mHeader; //< Navigation mesh header
158 FaceIndex mCurrentFace; //< Current face (last floor position)
159 Dali::Matrix mTransform; //< Transform matrix
160 Dali::Matrix mTransformInverse; //< Inverse of the transform matrix
163 inline Internal::Algorithm::NavigationMesh& GetImplementation(Dali::Scene3D::Algorithm::NavigationMesh& navigationMesh)
165 return *navigationMesh.mImpl;
168 } // namespace Dali::Scene3D::Internal::Algorithm
170 #endif // DALI_SCENE3D_INTERNAL_NAVIGATION_MESH_H