22
33#include " math.h"
44
5+ #include < chrono>
56#include < cstddef>
7+ #include < inttypes.h>
8+ #include < iostream>
69#include < limits>
710#include < vector>
811
912namespace core
1013{
1114
12- ClosestPointQuery::ClosestPointQuery (const Mesh& mesh)
13- : m_mesh(mesh)
14- {}
15+ ClosestPointQuery::ClosestPointQuery (const MeshPointCloud& mesh_point_cloud)
16+ : m_mesh_point_cloud(mesh_point_cloud)
17+ {
18+ // Start a timer to know how long it takes to build the query object.
19+ auto timer_start = std::chrono::high_resolution_clock::now ();
20+
21+ auto timer_stop = std::chrono::high_resolution_clock::now ();
22+ auto process_time = std::chrono::duration_cast<std::chrono::milliseconds>(timer_stop - timer_start).count ();
23+
24+ std::printf (" Generated mesh query tree in %" PRId64 " ms." , process_time);
25+ }
1526
1627bool ClosestPointQuery::get_closest_point (
1728 const glm::vec3& query_point,
@@ -20,11 +31,7 @@ bool ClosestPointQuery::get_closest_point(
2031{
2132 assert (max_distance > 0 .0f );
2233
23- const std::vector<Mesh::Vertex>& vertices = m_mesh.get_vertices ();
24- const std::size_t vertex_count = vertices.size ();
25- const std::vector<unsigned int >& triangles = m_mesh.get_triangles ();
26- assert (triangles.size () % 3 == 0 );
27- const std::size_t triangle_count = triangles.size () / 3 ;
34+ const std::size_t triangle_count = m_mesh_point_cloud.kdtree_get_point_count () / 3 ;
2835
2936 // => Naive implementation.
3037 // 1. Go through each triangle
@@ -36,13 +43,9 @@ bool ClosestPointQuery::get_closest_point(
3643
3744 for (std::size_t triangle_index = 0 ; triangle_index < triangle_count; ++triangle_index)
3845 {
39- const std::size_t v1_index = triangles[triangle_index * 3 ];
40- const std::size_t v2_index = triangles[triangle_index * 3 + 1 ];
41- const std::size_t v3_index = triangles[triangle_index * 3 + 2 ];
42-
43- const glm::vec3& v1 = vertices[v1_index].pos ;
44- const glm::vec3& v2 = vertices[v2_index].pos ;
45- const glm::vec3& v3 = vertices[v3_index].pos ;
46+ const glm::vec3& v1 = m_mesh_point_cloud.kdtree_get_pt (triangle_index * 3 );
47+ const glm::vec3& v2 = m_mesh_point_cloud.kdtree_get_pt (triangle_index * 3 + 1 );
48+ const glm::vec3& v3 = m_mesh_point_cloud.kdtree_get_pt (triangle_index * 3 + 2 );
4649
4750 bool success = false ;
4851 const glm::vec3 p = closest_point_in_triangle (
0 commit comments