| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #include "CmORect.h"
- namespace CamelotFramework
- {
- ORect::ORect()
- { }
- ORect::ORect(const Rect& rect)
- {
- mOrigin = Vector2((float)rect.x, (float)rect.y);
- mSides[0] = Vector2((float)rect.width, 0.0f);
- mSides[1] = Vector2(0.0f, (float)rect.height);
- mSideLengths[0] = mSides[0].length();
- mSideLengths[1] = mSides[1].length();
- mSides[0].normalize();
- mSides[1].normalize();
- }
- void ORect::applyTransform(const Matrix4& tfrm)
- {
- Vector3 oldOrigin = Vector3(mOrigin.x, mOrigin.y, 0);
- Vector3 oldCornerA = oldOrigin + Vector3(mSides[0].x * mSideLengths[0], mSides[0].y * mSideLengths[0], 0.0f);
- Vector3 newCornerA = tfrm * oldCornerA;
- Vector3 oldCornerB = oldOrigin + Vector3(mSides[1].x * mSideLengths[1], mSides[1].y * mSideLengths[1], 0.0f);
- Vector3 newCornerB = tfrm * oldCornerB;
- Vector3 newOrigin = tfrm * oldOrigin;
- mOrigin.x = newOrigin.x;
- mOrigin.y = newOrigin.y;
- mSides[0].x = newCornerA.x - newOrigin.x;
- mSides[0].y = newCornerA.y - newOrigin.y;
- mSides[1].x = newCornerB.x - newOrigin.x;
- mSides[1].y = newCornerB.y - newOrigin.y;
- mSideLengths[0] = mSides[0].length();
- mSideLengths[1] = mSides[1].length();
- mSides[0].normalize();
- mSides[1].normalize();
- }
- bool ORect::contains(const Vector2& point)
- {
- Vector2 localPoint = point - mOrigin;
- float t1 = localPoint.x * mSides[0].x + localPoint.y * mSides[0].y;
- float t2 = localPoint.x * mSides[1].x + localPoint.y * mSides[1].y;
- if(t1 >= 0.0f && t1 <= mSideLengths[0] && t2 >= 0.0f && t1 <= mSideLengths[1])
- return true;
- return false;
- }
- Vector2 ORect::getMin() const
- {
- Vector2 result;
- result.x = std::min(std::min(mOrigin.x, mOrigin.x + mSides[0].x), mOrigin.x + mSides[1].x);
- result.y = std::min(std::min(mOrigin.y, mOrigin.y + mSides[0].y), mOrigin.y + mSides[1].y);
- return result;
- }
- Vector2 ORect::getMax() const
- {
- Vector2 result;
- result.x = std::max(std::max(mOrigin.x, mOrigin.x + mSides[0].x), mOrigin.x + mSides[1].x);
- result.y = std::max(std::max(mOrigin.y, mOrigin.y + mSides[0].y), mOrigin.y + mSides[1].y);
- return result;
- }
- }
|