LineSegment.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "anki/collision/LineSegment.h"
  2. #include "anki/collision/Plane.h"
  3. #include "anki/collision/Aabb.h"
  4. #include <algorithm>
  5. namespace anki {
  6. //==============================================================================
  7. float LineSegment::testPlane(const Plane& p) const
  8. {
  9. const LineSegment& ls = *this;
  10. const Vec3& p0 = ls.getOrigin();
  11. Vec3 p1 = ls.getOrigin() + ls.getDirection();
  12. float dist0 = p.test(p0);
  13. float dist1 = p.test(p1);
  14. if(dist0 > 0.0)
  15. {
  16. if(dist1 > 0.0)
  17. {
  18. return std::min(dist0, dist1);
  19. }
  20. else
  21. {
  22. return 0.0;
  23. }
  24. }
  25. else
  26. {
  27. if(dist1 < 0.0)
  28. {
  29. return std::max(dist0, dist1);
  30. }
  31. else
  32. {
  33. return 0.0;
  34. }
  35. }
  36. }
  37. //==============================================================================
  38. LineSegment LineSegment::getTransformed(const Transform& transform) const
  39. {
  40. LineSegment out;
  41. out.origin = origin.getTransformed(transform);
  42. out.dir = transform.getRotation() * (dir * transform.getScale());
  43. return out;
  44. }
  45. //==============================================================================
  46. void LineSegment::getAabb(Aabb& aabb) const
  47. {
  48. Vec3 min = origin;
  49. Vec3 max = origin + dir;
  50. for(uint i = 0; i < 3; ++i)
  51. {
  52. if(max[i] < min[i])
  53. {
  54. float tmp = max[i];
  55. max[i] = min[i];
  56. min[i] = tmp;
  57. }
  58. }
  59. aabb.setMin(min);
  60. aabb.setMax(max);
  61. }
  62. } // end namespace