CmORect.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "CmORect.h"
  2. namespace CamelotFramework
  3. {
  4. ORect::ORect()
  5. { }
  6. ORect::ORect(const Rect& rect)
  7. {
  8. mOrigin = Vector2((float)rect.x, (float)rect.y);
  9. mSides[0] = Vector2((float)rect.width, 0.0f);
  10. mSides[1] = Vector2(0.0f, (float)rect.height);
  11. mSideLengths[0] = mSides[0].normalize();
  12. mSideLengths[1] = mSides[1].normalize();
  13. }
  14. void ORect::applyTransform(const Matrix4& tfrm)
  15. {
  16. Vector3 oldOrigin = Vector3(mOrigin.x, mOrigin.y, 0);
  17. Vector3 oldCornerA = oldOrigin + Vector3(mSides[0].x, mSides[0].y, 0.0f);
  18. Vector3 newCornerA = tfrm * oldCornerA;
  19. Vector3 oldCornerB = oldOrigin + Vector3(mSides[1].x, mSides[1].y, 0.0f);
  20. Vector3 newCornerB = tfrm * oldCornerB;
  21. Vector3 newOrigin = tfrm * oldOrigin;
  22. mOrigin.x = newOrigin.x;
  23. mOrigin.y = newOrigin.y;
  24. mSides[0].x = newCornerA.x - newOrigin.x;
  25. mSides[0].y = newCornerA.y - newOrigin.y;
  26. mSides[1].x = newCornerB.x - newOrigin.x;
  27. mSides[1].y = newCornerB.y - newOrigin.y;
  28. mSideLengths[0] = mSides[0].normalize();
  29. mSideLengths[1] = mSides[1].normalize();
  30. }
  31. bool ORect::contains(const Vector2& point)
  32. {
  33. Vector2 localPoint = point - mOrigin;
  34. float t1 = localPoint.x * mSides[0].x + localPoint.y * mSides[0].y;
  35. float t2 = localPoint.x * mSides[1].x + localPoint.y * mSides[1].y;
  36. if(t1 >= 0.0f && t1 <= mSideLengths[0] && t2 >= 0.0f && t1 <= mSideLengths[1])
  37. return true;
  38. return false;
  39. }
  40. Vector2 ORect::getMin() const
  41. {
  42. Vector2 result;
  43. result.x = std::min(std::min(mOrigin.x, mOrigin.x + mSides[0].x), mOrigin.x + mSides[1].x);
  44. result.y = std::min(std::min(mOrigin.y, mOrigin.y + mSides[0].y), mOrigin.y + mSides[1].y);
  45. return result;
  46. }
  47. Vector2 ORect::getMax() const
  48. {
  49. Vector2 result;
  50. result.x = std::max(std::max(mOrigin.x, mOrigin.x + mSides[0].x), mOrigin.x + mSides[1].x);
  51. result.y = std::max(std::max(mOrigin.y, mOrigin.y + mSides[0].y), mOrigin.y + mSides[1].y);
  52. return result;
  53. }
  54. }