diff --git a/src/DrawComponents/DrawComponent.cpp b/src/DrawComponents/DrawComponent.cpp index c1b7e7e..d55f931 100644 --- a/src/DrawComponents/DrawComponent.cpp +++ b/src/DrawComponents/DrawComponent.cpp @@ -176,7 +176,7 @@ bool DrawComponent::collides_with_cam_coords(const CoordSpaceHelper& camCoords, bool DrawComponent::collides_with(const CoordSpaceHelper& camCoords, const SCollision::ColliderCollection& checkAgainstWorld, const SCollision::ColliderCollection& checkAgainstCam, bool colliderAllocated) { if((camCoords.inverseScale << DRAWCOMP_MAX_SHIFT_BEFORE_DISAPPEAR) < coords.inverseScale) // Object is too large, just dismiss the collision return false; - else if((camCoords.inverseScale >> DRAWCOMP_MIN_SHIFT_BEFORE_DISAPPEAR) >= coords.inverseScale) { + else if((camCoords.inverseScale >> DRAWCOMP_COLLIDE_MIN_SHIFT_TINY) >= coords.inverseScale) { if(!worldAABB) return false; return SCollision::collide(checkAgainstCam, camCoords.to_space(worldAABB->min)); diff --git a/src/DrawComponents/DrawComponent.hpp b/src/DrawComponents/DrawComponent.hpp index 09f4e81..8773963 100644 --- a/src/DrawComponents/DrawComponent.hpp +++ b/src/DrawComponents/DrawComponent.hpp @@ -19,6 +19,7 @@ #define DRAWCOMP_MAX_SHIFT_BEFORE_DISAPPEAR 20 #define DRAWCOMP_MIN_SHIFT_BEFORE_DISAPPEAR 11 +#define DRAWCOMP_COLLIDE_MIN_SHIFT_TINY 9 #define DRAWCOMP_MIPMAP_LEVEL_ONE 2 #define DRAWCOMP_MIPMAP_LEVEL_TWO 5 diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index d74696e..70cd802 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -163,13 +163,7 @@ void DrawingProgram::parallel_loop_all_components(std::function& checkAgainstWorld, const SCollision::ColliderCollection& checkAgainstCam) { - for(auto& c : components.client_list()) - c->obj->globalCollisionCheck = false; - compCache.traverse_bvh_run_function(checkAgainstWorld.bounds, [&](const std::shared_ptr& node, const std::vector& comps) { - for(auto& c : comps) - c->obj->globalCollisionCheck = c->obj->collides_with(world.drawData.cam.c, checkAgainstWorld, checkAgainstCam, colliderAllocated); - return true; - }); + compCache.traverse_bvh_collision_check(checkAgainstWorld, checkAgainstCam); } void DrawingProgram::check_all_collisions(const SCollision::ColliderCollection& checkAgainst) { diff --git a/src/DrawingProgram/DrawingProgramCache.cpp b/src/DrawingProgram/DrawingProgramCache.cpp index b08034d..6e487f4 100644 --- a/src/DrawingProgram/DrawingProgramCache.cpp +++ b/src/DrawingProgram/DrawingProgramCache.cpp @@ -77,6 +77,37 @@ std::pair, std::vectorcomponents.end()}; } +void DrawingProgramCache::traverse_bvh_collision_check(const SCollision::ColliderCollection& checkAgainstWorld, const SCollision::ColliderCollection& checkAgainstCam) { + for(auto& c : drawP.components.client_list()) + c->obj->globalCollisionCheck = false; + for(auto& c : unsortedComponents) + c->obj->globalCollisionCheck = c->obj->collides_with(drawP.world.drawData.cam.c, checkAgainstWorld, checkAgainstCam, drawP.colliderAllocated); + traverse_bvh_collision_check_recursive(bvhRoot, checkAgainstWorld, checkAgainstCam); +} + +void DrawingProgramCache::traverse_bvh_collision_check_recursive_tiny(const std::shared_ptr& bvhNode, bool collided) { + if(bvhNode) { + for(auto& c : bvhNode->components) + c->obj->globalCollisionCheck = collided; + for(auto& p : bvhNode->children) + traverse_bvh_collision_check_recursive_tiny(p, collided); + } +} + +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); + } + } +} + void DrawingProgramCache::traverse_bvh_run_function(const SCollision::AABB& aabb, std::function node, const std::vector& components)> f) { f(nullptr, unsortedComponents); traverse_bvh_run_function_recursive(bvhRoot, aabb, f); diff --git a/src/DrawingProgram/DrawingProgramCache.hpp b/src/DrawingProgram/DrawingProgramCache.hpp index cb29f8d..220b259 100644 --- a/src/DrawingProgram/DrawingProgramCache.hpp +++ b/src/DrawingProgram/DrawingProgramCache.hpp @@ -37,6 +37,7 @@ class DrawingProgramCache { std::unordered_set> nodesWithCachedSurfaces; + void traverse_bvh_collision_check(const SCollision::ColliderCollection& checkAgainstWorld, const SCollision::ColliderCollection& checkAgainstCam); void traverse_bvh_run_function(const SCollision::AABB& aabb, std::function node, const std::vector& components)> f); void force_rebuild(); @@ -45,6 +46,9 @@ 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 build_bvh_node_coords_and_resolution(BVHNode& node); void refresh_draw_cache(const std::shared_ptr& bvhNode, const DrawData& drawData);