diff --git a/src/DrawingProgram/DrawingProgramCache.cpp b/src/DrawingProgram/DrawingProgramCache.cpp index 6e487f4..a101db3 100644 --- a/src/DrawingProgram/DrawingProgramCache.cpp +++ b/src/DrawingProgram/DrawingProgramCache.cpp @@ -85,25 +85,29 @@ void DrawingProgramCache::traverse_bvh_collision_check(const SCollision::Collide traverse_bvh_collision_check_recursive(bvhRoot, checkAgainstWorld, checkAgainstCam); } -void DrawingProgramCache::traverse_bvh_collision_check_recursive_tiny(const std::shared_ptr& bvhNode, bool collided) { +void DrawingProgramCache::traverse_bvh_collision_check_recursive_tiny(const std::shared_ptr& bvhNode) { if(bvhNode) { for(auto& c : bvhNode->components) - c->obj->globalCollisionCheck = collided; + c->obj->globalCollisionCheck = true; for(auto& p : bvhNode->children) - traverse_bvh_collision_check_recursive_tiny(p, collided); + traverse_bvh_collision_check_recursive_tiny(p); } } void DrawingProgramCache::traverse_bvh_collision_check_recursive(const std::shared_ptr& bvhNode, const SCollision::ColliderCollection& checkAgainstWorld, const SCollision::ColliderCollection& checkAgainstCam) { if(bvhNode) { - auto& camCoords = drawP.world.drawData.cam.c; - if((camCoords.inverseScale >> DRAWCOMP_COLLIDE_MIN_SHIFT_TINY) >= bvhNode->coords.inverseScale) - traverse_bvh_collision_check_recursive_tiny(bvhNode, SCollision::collide(checkAgainstCam, camCoords.to_space(bvhNode->bounds.min))); - else { - for(auto& c : bvhNode->components) - c->obj->globalCollisionCheck = c->obj->collides_with(drawP.world.drawData.cam.c, checkAgainstWorld, checkAgainstCam, drawP.colliderAllocated); - for(auto& p : bvhNode->children) - traverse_bvh_collision_check_recursive(p, checkAgainstWorld, checkAgainstCam); + if(SCollision::collide(checkAgainstWorld.bounds, bvhNode->bounds)) { + auto& camCoords = drawP.world.drawData.cam.c; + if((camCoords.inverseScale >> DRAWCOMP_COLLIDE_MIN_SHIFT_TINY) >= bvhNode->coords.inverseScale) { + if(SCollision::collide(checkAgainstCam, camCoords.to_space(bvhNode->bounds.min))) + traverse_bvh_collision_check_recursive_tiny(bvhNode); + } + else { + for(auto& c : bvhNode->components) + c->obj->globalCollisionCheck = c->obj->collides_with(drawP.world.drawData.cam.c, checkAgainstWorld, checkAgainstCam, drawP.colliderAllocated); + for(auto& p : bvhNode->children) + traverse_bvh_collision_check_recursive(p, checkAgainstWorld, checkAgainstCam); + } } } } diff --git a/src/DrawingProgram/DrawingProgramCache.hpp b/src/DrawingProgram/DrawingProgramCache.hpp index 220b259..2a1501c 100644 --- a/src/DrawingProgram/DrawingProgramCache.hpp +++ b/src/DrawingProgram/DrawingProgramCache.hpp @@ -47,7 +47,7 @@ class DrawingProgramCache { void invalidate_cache_before_pos(uint64_t placementToInvalidateAt); private: void traverse_bvh_collision_check_recursive(const std::shared_ptr& bvhNode, const SCollision::ColliderCollection& checkAgainstWorld, const SCollision::ColliderCollection& checkAgainstCam); - void traverse_bvh_collision_check_recursive_tiny(const std::shared_ptr& bvhNode, bool collided); + void traverse_bvh_collision_check_recursive_tiny(const std::shared_ptr& bvhNode); void build_bvh_node_coords_and_resolution(BVHNode& node); void refresh_draw_cache(const std::shared_ptr& bvhNode, const DrawData& drawData);