* limitations under the License.
*/
-// INTERNAL INCLUDES
-#include <dali-scene3d/public-api/algorithm/navigation-mesh.h>
-#include <dali-scene3d/public-api/algorithm/path-finder.h>
-
-// INTERNAL EXTERNAL
+// EXTERNAL EXTERNAL
#include <dali/public-api/actors/actor.h>
+#include <dali/public-api/common/vector-wrapper.h>
#include <dali/public-api/math/matrix.h>
#include <dali/public-api/math/vector3.h>
#include <dali/public-api/math/vector4.h>
#include <cinttypes>
#include <cstdio>
#include <mutex>
-#include <vector>
-#include "navigation-mesh-header.h"
+
+// INTERNAL INCLUDES
+#include <dali-scene3d/internal/algorithm/navigation-mesh-header.h>
+#include <dali-scene3d/public-api/algorithm/navigation-mesh.h>
+#include <dali-scene3d/public-api/algorithm/path-finder.h>
namespace Dali::Scene3D::Loader
{
namespace Dali::Scene3D::Internal::Algorithm
{
+// Internal Navigation ray structure
+struct NavigationRay
+{
+ Dali::Vector3 origin; // Origin of ray
+ Dali::Vector3 direction; // Direction of ray
+};
-class NavigationRay;
+// Make each to change each index value's type here.
+using VertexIndex = Dali::Scene3D::Algorithm::VertexIndex;
+using EdgeIndex = Dali::Scene3D::Algorithm::EdgeIndex;
+using FaceIndex = Dali::Scene3D::Algorithm::FaceIndex;
/**
* @class NavigationMesh
using Vertex = Dali::Scene3D::Algorithm::NavigationMesh::Vertex;
private:
-
friend class Scene3D::Loader::NavigationMeshFactory;
/**
NavigationMesh(const std::vector<uint8_t>& buffer);
public:
-
/**
* Destructor
*/
{
Dali::Vector3 point;
float distance;
- uint16_t faceIndex;
+ FaceIndex faceIndex;
bool result;
};
[[nodiscard]] uint32_t GetVertexCount() const;
/**
- * Looks for floor only within the face
- * @param[in] position Position to be projected onto the face
- * @param[in] faceIndex Face index
- * @param[in] dontCheckNeighbours states whether to traverse onto neighbouring faces
- * @param[out] outPosition Output position
- *
- * @return true if success
+ * @copydoc Dali::Scene3D::Algorithm::NavigationMesh::FindFloorForFace()
*/
- bool FindFloorForFace(const Dali::Vector3& position, uint32_t faceIndex, bool dontCheckNeighbours, Dali::Vector3& outPosition);
+ bool FindFloorForFace(const Dali::Vector3& position, FaceIndex faceIndex, bool dontCheckNeighbours, Dali::Vector3& outPosition);
/**
* @copydoc Dali::Scene3D::Algorithm::NavigationMesh::FindFloor()
/**
* @copydoc Dali::Scene3D::Algorithm::NavigationMesh::FindFloor()
*/
- bool FindFloor(const Dali::Vector3& position, Dali::Vector3& outPosition, uint32_t& faceIndex);
+ bool FindFloor(const Dali::Vector3& position, Dali::Vector3& outPosition, FaceIndex& faceIndex);
/**
* @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetFace()
*/
- [[nodiscard]] const Face* GetFace(int index) const;
+ [[nodiscard]] const Face* GetFace(FaceIndex index) const;
/**
* @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetEdge()
*/
- [[nodiscard]] const Edge* GetEdge(int index) const;
+ [[nodiscard]] const Edge* GetEdge(EdgeIndex index) const;
/**
* @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetVertex()
*/
- [[nodiscard]] const Vertex* GetVertex(int index) const;
+ [[nodiscard]] const Vertex* GetVertex(VertexIndex index) const;
/**
* @copydoc Dali::Scene3D::Algorithm::NavigationMesh::SetSceneTransform()
/**
* Tests intersection between navigation ray and face
*/
- IntersectResult NavigationRayFaceIntersection(NavigationRay& ray, const Face& face);
+ IntersectResult NavigationRayFaceIntersection(NavigationRay& ray, const Face& face) const;
+
+ /**
+ * @brief Test ray against the mesh and returns intersection result
+ * @param[in] rayOrig Input ray to test collision
+ *
+ * @return Valid IntersectResult structure
+ */
+ IntersectResult RayCastIntersect(NavigationRay& rayOrig) const;
/**
* @copydoc Dali::Scene3D::Algorithm::NavigationMesh::PointSceneToLocal()
*/
- Dali::Vector3 PointSceneToLocal(const Dali::Vector3& point);
+ Dali::Vector3 PointSceneToLocal(const Dali::Vector3& point) const;
/**
* @copydoc Dali::Scene3D::Algorithm::NavigationMesh::PointLocalToScene()
*/
- Dali::Vector3 PointLocalToScene(const Dali::Vector3& point);
+ Dali::Vector3 PointLocalToScene(const Dali::Vector3& point) const;
/**
* @copydoc Dali::Scene3D::Algorithm::NavigationMesh::GetGravityVector()
*/
[[nodiscard]] Dali::Vector3 GetGravityVector() const;
+ /**
+ * @brief Returns binary data of the mesh
+ * @return Reference to the binary buffer
+ */
+ [[nodiscard]] const std::vector<uint8_t>& GetData() const
+ {
+ return mBuffer;
+ }
+
private:
- std::vector<uint8_t> mBuffer; //< Data buffer
- NavigationMeshHeader_V10 mHeader; //< Navigation mesh header
- uint16_t mCurrentFace; //< Current face (last floor position)
- Dali::Matrix mTransform; //< Transform matrix
- Dali::Matrix mTransformInverse; //< Inverse of the transform matrix
+ std::vector<uint8_t> mBuffer; //< Data buffer
+ NavigationMeshHeader_V10 mHeader; //< Navigation mesh header
+ FaceIndex mCurrentFace; //< Current face (last floor position)
+ Dali::Matrix mTransform; //< Transform matrix
+ Dali::Matrix mTransformInverse; //< Inverse of the transform matrix
};
inline Internal::Algorithm::NavigationMesh& GetImplementation(Dali::Scene3D::Algorithm::NavigationMesh& navigationMesh)
return *navigationMesh.mImpl;
}
+inline const Internal::Algorithm::NavigationMesh& GetImplementation(const Dali::Scene3D::Algorithm::NavigationMesh& navigationMesh)
+{
+ return *navigationMesh.mImpl;
+}
+
} // namespace Dali::Scene3D::Internal::Algorithm
#endif // DALI_SCENE3D_INTERNAL_NAVIGATION_MESH_H