BsConvexVolume.cpp 1.3 KB

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