CmORect.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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].length();
  12. mSideLengths[1] = mSides[1].length();
  13. mSides[0].normalize();
  14. mSides[1].normalize();
  15. }
  16. void ORect::applyTransform(const Matrix4& tfrm)
  17. {
  18. Vector3 oldOrigin = Vector3(mOrigin.x, mOrigin.y, 0);
  19. Vector3 oldCornerA = oldOrigin + Vector3(mSides[0].x * mSideLengths[0], mSides[0].y * mSideLengths[0], 0.0f);
  20. Vector3 newCornerA = tfrm * oldCornerA;
  21. Vector3 oldCornerB = oldOrigin + Vector3(mSides[1].x * mSideLengths[1], mSides[1].y * mSideLengths[1], 0.0f);
  22. Vector3 newCornerB = tfrm * oldCornerB;
  23. Vector3 newOrigin = tfrm * oldOrigin;
  24. mOrigin.x = newOrigin.x;
  25. mOrigin.y = newOrigin.y;
  26. mSides[0].x = newCornerA.x - newOrigin.x;
  27. mSides[0].y = newCornerA.y - newOrigin.y;
  28. mSides[1].x = newCornerB.x - newOrigin.x;
  29. mSides[1].y = newCornerB.y - newOrigin.y;
  30. mSideLengths[0] = mSides[0].length();
  31. mSideLengths[1] = mSides[1].length();
  32. mSides[0].normalize();
  33. mSides[1].normalize();
  34. }
  35. bool ORect::contains(const Vector2& point)
  36. {
  37. Vector2 localPoint = point - mOrigin;
  38. float t1 = localPoint.x * mSides[0].x + localPoint.y * mSides[0].y;
  39. float t2 = localPoint.x * mSides[1].x + localPoint.y * mSides[1].y;
  40. if(t1 >= 0.0f && t1 <= mSideLengths[0] && t2 >= 0.0f && t1 <= mSideLengths[1])
  41. return true;
  42. return false;
  43. }
  44. Vector2 ORect::getMin() const
  45. {
  46. Vector2 result;
  47. result.x = std::min(std::min(mOrigin.x, mOrigin.x + mSides[0].x), mOrigin.x + mSides[1].x);
  48. result.y = std::min(std::min(mOrigin.y, mOrigin.y + mSides[0].y), mOrigin.y + mSides[1].y);
  49. return result;
  50. }
  51. Vector2 ORect::getMax() const
  52. {
  53. Vector2 result;
  54. result.x = std::max(std::max(mOrigin.x, mOrigin.x + mSides[0].x), mOrigin.x + mSides[1].x);
  55. result.y = std::max(std::max(mOrigin.y, mOrigin.y + mSides[0].y), mOrigin.y + mSides[1].y);
  56. return result;
  57. }
  58. }