BsConvexVolume.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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.x * plane.normal.x;
  18. dist += center.y * plane.normal.y;
  19. dist += center.z * plane.normal.z;
  20. dist = dist - plane.d;
  21. float pushOut = absExtents.x * Math::abs(plane.normal.x);
  22. pushOut += absExtents.y * Math::abs(plane.normal.y);
  23. pushOut += absExtents.z * Math::abs(plane.normal.z);
  24. if (dist > pushOut)
  25. return false;
  26. }
  27. return true;
  28. }
  29. bool ConvexVolume::intersects(const Sphere& sphere) const
  30. {
  31. Vector3 center = sphere.getCenter();
  32. float radius = sphere.getRadius();
  33. for (auto& plane : mPlanes)
  34. {
  35. float dist = center.x * plane.normal.x;
  36. dist += center.y * plane.normal.y;
  37. dist += center.z * plane.normal.z;
  38. dist = dist - plane.d;
  39. if (dist > radius)
  40. return false;
  41. }
  42. return true;
  43. }
  44. }