diff --git a/include/vierkant/intersection.hpp b/include/vierkant/intersection.hpp index 70a731c0..d6e07bfa 100644 --- a/include/vierkant/intersection.hpp +++ b/include/vierkant/intersection.hpp @@ -7,9 +7,9 @@ #pragma once +#include #include #include -#include namespace vierkant { @@ -317,6 +317,21 @@ struct AABB return *this; } + AABB operator*(float grow_factor) const + { + AABB ret(*this); + ret *= grow_factor; + return ret; + } + + AABB &operator*=(float grow_factor) + { + auto c = center(); + min = c + (min - c) * grow_factor; + max = c + (max - c) * grow_factor; + return *this; + } + inline explicit operator bool() const { return valid(); } inline bool operator==(const AABB &aabb) const { return min == aabb.min && max == aabb.max; } diff --git a/src/physics_context.cpp b/src/physics_context.cpp index 2aaf2a81..8f959ce0 100644 --- a/src/physics_context.cpp +++ b/src/physics_context.cpp @@ -1014,6 +1014,7 @@ void PhysicsScene::remove_object(const Object3DPtr &object) { if(object) { + // remove all children vierkant::LambdaVisitor visitor; visitor.traverse(*object, [this](const auto &obj) -> bool { if(auto phy_cmp_ptr = obj.template get_component_ptr()) @@ -1022,6 +1023,10 @@ void PhysicsScene::remove_object(const Object3DPtr &object) } return true; }); + + // grow aabb by a factor, wake up other objects there + constexpr float aabb_grow_factor = 1.2f; + m_context.body_interface().activate_in_aabb(object->aabb() * aabb_grow_factor); } vierkant::Scene::remove_object(object); }