#pragma once

#include "BsPrerequisitesUtil.h"

namespace BansheeEngine
{
	/**
	 * @brief	Represents a 2D rectangle using real values.
	 * 			Rectangle is represented with an origin in top left and width/height.
	 */
	class BS_UTILITY_EXPORT Rect2
	{
	public:
		Rect2();
		Rect2(float _x, float _y, float _width, float _height);

		float x, y, width, height;

		/**
		 * @brief	Returns true if the rectangle contains the provided point.
		 */
		bool contains(const Vector2& point) const;

		/**
		 * @brief	Returns true if the rectangle overlaps the provided rectangle.
		 * 			Also returns true if the rectangles are contained within each other completely
		 * 			(no intersecting edges).
		 */
		bool overlaps(const Rect2& other) const;

		/**
		 * @brief	Extends this rectangle so that the provided rectangle is
		 * 			completely contained within it.
		 */
		void encapsulate(const Rect2& other);

		/**
		 * @brief	Clips current rectangle so that it does not overlap
		 * 			the provided rectangle.
		 */
		void clip(const Rect2& clipRect);

		/**
		 * @brief	Transforms the bounds by the given matrix.
		 * 			Resulting value is an axis aligned rectangle encompassing the transformed points.
		 * 			
		 * @note	Since the resulting value is an AA rectangle of the original transformed rectangle, the bounds
		 * 			will be larger than needed. Oriented rectangle would provide a much tighter fit.
		 */
		void transform(const Matrix4& matrix);

		inline bool operator== (const Rect2& rhs) const
		{
			return x == rhs.x && y == rhs.y && width == rhs.width && height == rhs.height;
		}

		inline bool operator!= (const Rect2& rhs) const
		{
			return !(*this == rhs);
		}

		static const Rect2 EMPTY;
	};

	BS_ALLOW_MEMCPY_SERIALIZATION(Rect2);
}