1 #ifndef DALI_SCENE3D_INTERNAL_NAVIGATION_MESH_H
2 #define DALI_SCENE3D_INTERNAL_NAVIGATION_MESH_H
5 * Copyright (c) 2024 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
43 // Internal Navigation ray structure
46 Dali::Vector3 origin; // Origin of ray
47 Dali::Vector3 direction; // Direction of ray
50 // Make each to change each index value's type here.
51 using VertexIndex = Dali::Scene3D::Algorithm::VertexIndex;
52 using EdgeIndex = Dali::Scene3D::Algorithm::EdgeIndex;
53 using FaceIndex = Dali::Scene3D::Algorithm::FaceIndex;
56 * @class NavigationMesh
61 using Face = Dali::Scene3D::Algorithm::NavigationMesh::Face;
62 using Edge = Dali::Scene3D::Algorithm::NavigationMesh::Edge;
63 using Vertex = Dali::Scene3D::Algorithm::NavigationMesh::Vertex;
66 friend class Scene3D::Loader::NavigationMeshFactory;
71 NavigationMesh(const std::vector<uint8_t>& buffer);
77 ~NavigationMesh() = default;
80 * Result of Ray/Polygon intersection
82 struct IntersectResult
91 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetFaceCount()
93 [[nodiscard]] uint32_t GetFaceCount() const;
96 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetEdgeCount()
98 [[nodiscard]] uint32_t GetEdgeCount() const;
101 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetVertexCount()
103 [[nodiscard]] uint32_t GetVertexCount() const;
106 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::FindFloorForFace()
108 bool FindFloorForFace(const Dali::Vector3& position, FaceIndex faceIndex, bool dontCheckNeighbours, Dali::Vector3& outPosition);
111 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::FindFloor()
113 bool FindFloor(const Dali::Vector3& position, Dali::Vector3& outPosition);
116 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::FindFloor()
118 bool FindFloor(const Dali::Vector3& position, Dali::Vector3& outPosition, FaceIndex& outFaceIndex);
121 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetFace()
123 [[nodiscard]] const Face* GetFace(FaceIndex index) const;
126 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetEdge()
128 [[nodiscard]] const Edge* GetEdge(EdgeIndex index) const;
131 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetVertex()
133 [[nodiscard]] const Vertex* GetVertex(VertexIndex index) const;
136 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::SetSceneTransform()
138 void SetTransform(const Dali::Matrix& transform);
141 * Tests intersection between navigation ray and face
143 IntersectResult NavigationRayFaceIntersection(NavigationRay& ray, const Face& face) const;
146 * @brief Test ray against the mesh and returns intersection result
147 * @param[in] rayOrig Input ray to test collision
149 * @return Valid IntersectResult structure
151 IntersectResult RayCastIntersect(NavigationRay& rayOrig) const;
154 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::PointSceneToLocal()
156 Dali::Vector3 PointSceneToLocal(const Dali::Vector3& point) const;
159 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::PointLocalToScene()
161 Dali::Vector3 PointLocalToScene(const Dali::Vector3& point) const;
164 * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetGravityVector()
166 [[nodiscard]] Dali::Vector3 GetGravityVector() const;
169 * @brief Returns binary data of the mesh
170 * @return Reference to the binary buffer
172 [[nodiscard]] const std::vector<uint8_t>& GetData() const
178 std::vector<uint8_t> mBuffer; //< Data buffer
179 NavigationMeshHeader_V10 mHeader; //< Navigation mesh header
180 FaceIndex mCurrentFace; //< Current face (last floor position)
181 Dali::Matrix mTransform; //< Transform matrix
182 Dali::Matrix mTransformInverse; //< Inverse of the transform matrix
185 inline Internal::Algorithm::NavigationMesh& GetImplementation(Dali::Scene3D::Algorithm::NavigationMesh& navigationMesh)
187 return *navigationMesh.mImpl;
190 inline const Internal::Algorithm::NavigationMesh& GetImplementation(const Dali::Scene3D::Algorithm::NavigationMesh& navigationMesh)
192 return *navigationMesh.mImpl;
195 } // namespace Dali::Scene3D::Internal::Algorithm
197 #endif // DALI_SCENE3D_INTERNAL_NAVIGATION_MESH_H