BsConvexVolume.cpp 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "BsConvexVolume.h"
  2. #include "BsAABox.h"
  3. #include "BsSphere.h"
  4. #include "BsPlane.h"
  5. namespace BansheeEngine
  6. {
  7. ConvexVolume::ConvexVolume(const Vector<Plane>& planes)
  8. :mPlanes(planes)
  9. { }
  10. bool ConvexVolume::intersects(const AABox& box) const
  11. {
  12. Vector3 center = box.getCenter();
  13. Vector3 extents = box.getHalfSize();
  14. Vector3 absExtents(Math::abs(extents.x), Math::abs(extents.y), Math::abs(extents.z));
  15. for (auto& plane : mPlanes)
  16. {
  17. float dist = center.dot(plane.normal) - plane.d;
  18. float effectiveRadius = absExtents.x * Math::abs(plane.normal.x);
  19. effectiveRadius += absExtents.y * Math::abs(plane.normal.y);
  20. effectiveRadius += absExtents.z * Math::abs(plane.normal.z);
  21. if (dist < -effectiveRadius)
  22. return false;
  23. }
  24. return true;
  25. }
  26. bool ConvexVolume::intersects(const Sphere& sphere) const
  27. {
  28. Vector3 center = sphere.getCenter();
  29. float radius = sphere.getRadius();
  30. for (auto& plane : mPlanes)
  31. {
  32. float dist = center.dot(plane.normal) - plane.d;
  33. if (dist < -radius)
  34. return false;
  35. }
  36. return true;
  37. }
  38. }