namespace IPDF
{
- struct Rect
+ template <class T = IPDF::Real>
+ struct TRect
{
- Real x; Real y; Real w; Real h;
- //Rect() = default; // Needed so we can fread/fwrite this struct
- Rect(Real _x=0, Real _y=0, Real _w=1, Real _h=1) : x(_x), y(_y), w(_w), h(_h) {}
+ T x; T y; T w; T h;
+ //TRect() = default; // Needed so we can fread/fwrite this struct
+ TRect(T _x=0, T _y=0, T _w=1, T _h=1) : x(_x), y(_y), w(_w), h(_h) {}
+ template <class B> TRect(const TRect<B> & cpy) : x(T(cpy.x)), y(T(cpy.y)), w(T(cpy.w)), h(T(cpy.h)) {}
+
std::string Str() const
{
std::stringstream s;
// float conversion needed because it is fucking impossible to get ostreams working with template classes
- s << "{" << Float(x) << ", " << Float(y) << ", " << Float(x + w) << ", " << Float(y + h) << " (w: " << Float(w) <<", h: " << Float(h) <<")}";
+ s << "{" << x << ", " << y << ", " << (x + w) << ", " << (y + h) << " (w: " << w <<", h: " << h <<")}";
return s.str();
}
- inline bool PointIn(Real pt_x, Real pt_y) const
+ inline bool PointIn(T pt_x, T pt_y) const
{
if (pt_x <= x) return false;
if (pt_y <= y) return false;
return true;
}
- inline bool Intersects(const Rect& other) const
+ inline bool Intersects(const TRect& other) const
{
if (x + w < other.x) return false;
if (y + h < other.y) return false;
if (y > other.y + other.h) return false;
return true;
}
+
+ template <class B> TRect<B> Convert() const {return TRect<B>(B(x), B(y), B(w), B(h));}
+
+ template <class B> TRect<T> & operator=(const TRect<B> & equ)
+ {
+ x = T(equ.x);
+ y = T(equ.y);
+ w = T(equ.w);
+ h = T(equ.h);
+ return *this;
+ }
};
- inline Rect TransformRectCoordinates(const Rect& view, const Rect& r)
+
+
+ template <class T = IPDF::Real>
+ inline TRect<T> TransformRectCoordinates(const TRect<T> & view, const TRect<T> & r)
{
- Rect out;
- Real w = (view.w == Real(0))?Real(1):view.w;
- Real h = (view.h == Real(0))?Real(1):view.h;
+ TRect<T> out;
+ T w = (view.w == T(0))?T(1):view.w;
+ T h = (view.h == T(0))?T(1):view.h;
out.x = (r.x - view.x) / w; //r.x = out.x *w + view.x
out.y = (r.y - view.y) / h; // r.y = out.y*h + view.y
out.w = r.w / w; // r.w = out.w * w
return out;
}
- inline Vec2 TransformPointCoordinates(const Rect& view, const Vec2& v)
+
+ template <class T = IPDF::Real>
+ inline Vec2 TransformPointCoordinates(const TRect<T> & view, const Vec2& v)
{
Vec2 out;
out.x = (v.x - view.x) / view.w;
out.y = (v.y - view.y) / view.h;
return out;
}
-
+
+ typedef TRect<Real> Rect;
+
}