99
1010namespace inexor ::vulkan_renderer::world {
1111
12+ OctreeCollisionSolver::OctreeCollisionSolver (const std::vector<std::shared_ptr<world::Cube>> &worlds)
13+ : m_worlds(worlds) {
14+ assert (!worlds.empty ());
15+ std::scoped_lock lock (m_collision_solver_mutex);
16+ m_collision_candidates.reserve (worlds.size ());
17+ }
18+
1219std::vector<RayCubeCollision<Cube>>
13- OctreeCollisionSolver::find_all_ray_octree_collisions (const std::vector<std::shared_ptr<world::Cube>> &worlds,
14- const glm::vec3 position, const glm::vec3 direction,
20+ OctreeCollisionSolver::find_all_ray_octree_collisions (const glm::vec3 position, const glm::vec3 direction,
1521 bool find_only_one_collision) {
16- if (worlds.empty ()) {
17- return {};
18- }
19-
2022 std::vector<RayCubeCollision<Cube>> found_collisions;
2123
22- found_collisions.reserve (worlds .size ());
24+ found_collisions.reserve (m_worlds .size ());
2325
2426 // We need a critical section because we are modifying m_collision_candidates.
2527 {
2628 std::scoped_lock lock (m_collision_solver_mutex);
2729
28- // TODO: Optimize this! Avoid memory re-allocation if possible and benchmark it.
30+ // We must delete the entry from previous calls of this method so we can call emplace_back.
31+ // This will not change the capacity of the vector which was set in the constructor.
2932 m_collision_candidates.clear ();
30- m_collision_candidates.reserve (worlds.size ());
3133
32- for (const auto &world : worlds ) {
34+ for (const auto &world : m_worlds ) {
3335 if (is_bounding_box_and_bounding_sphere_hit (world, position, direction)) {
3436 m_collision_candidates.emplace_back (std::make_pair (world, glm::distance2 (position, direction)));
3537 }
@@ -60,10 +62,9 @@ OctreeCollisionSolver::find_all_ray_octree_collisions(const std::vector<std::sha
6062 return std::move (found_collisions);
6163}
6264
63- std::optional<RayCubeCollision<Cube>>
64- OctreeCollisionSolver::find_ray_octree_collision (const std::vector<std::shared_ptr<world::Cube>> &worlds,
65- const glm::vec3 position, const glm::vec3 direction) {
66- const auto result = find_all_ray_octree_collisions (worlds, position, direction, true );
65+ std::optional<RayCubeCollision<Cube>> OctreeCollisionSolver::find_ray_octree_collision (const glm::vec3 position,
66+ const glm::vec3 direction) {
67+ const auto result = find_all_ray_octree_collisions (position, direction, true );
6768
6869 if (!result.empty ()) {
6970 return result[0 ];
@@ -72,10 +73,9 @@ OctreeCollisionSolver::find_ray_octree_collision(const std::vector<std::shared_p
7273 return std::nullopt ;
7374}
7475
75- std::vector<RayCubeCollision<Cube>>
76- OctreeCollisionSolver::find_all_ray_octree_collisions (const std::vector<std::shared_ptr<world::Cube>> &worlds,
77- const glm::vec3 position, const glm::vec3 direction) {
78- return find_all_ray_octree_collisions (worlds, position, direction, false );
76+ std::vector<RayCubeCollision<Cube>> OctreeCollisionSolver::find_all_ray_octree_collisions (const glm::vec3 position,
77+ const glm::vec3 direction) {
78+ return find_all_ray_octree_collisions (position, direction, false );
7979}
8080
8181} // namespace inexor::vulkan_renderer::world
0 commit comments