2004-05-22 01:46:16 +02:00
|
|
|
/*
|
|
|
|
COverlay
|
|
|
|
by Rich Cross, rich@0ad.wildfiregames.com
|
|
|
|
|
|
|
|
|
|
|
|
--Overview--
|
|
|
|
|
|
|
|
Class representing 2D screen overlays; includes functionality for overlay
|
|
|
|
position, color, texture and borders.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef COVERLAY_H
|
|
|
|
#define COVERLAY_H
|
|
|
|
|
2005-04-07 06:29:07 +02:00
|
|
|
#include "types.h"
|
2004-05-29 05:53:12 +02:00
|
|
|
|
2004-05-22 01:46:16 +02:00
|
|
|
struct CColor
|
|
|
|
{
|
2004-05-29 05:53:12 +02:00
|
|
|
CColor() : r(-1.f), g(-1.f), b(-1.f), a(1.f) {}
|
2004-05-22 01:46:16 +02:00
|
|
|
CColor(float cr,float cg,float cb,float ca) : r(cr), g(cg), b(cb), a(ca) {}
|
|
|
|
|
2005-01-13 01:17:31 +01:00
|
|
|
bool operator == (const CColor &color) const;
|
2004-05-29 05:53:12 +02:00
|
|
|
|
|
|
|
bool operator != (const CColor &color) const
|
|
|
|
{
|
|
|
|
return !(*this==color);
|
|
|
|
}
|
|
|
|
|
2004-12-18 14:32:00 +01:00
|
|
|
// For passing to glColor[34]fv:
|
|
|
|
const float* FloatArray() const { return &r; }
|
|
|
|
|
2004-12-28 12:16:05 +01:00
|
|
|
// For passing to CRenderer:
|
|
|
|
const u32 Int() const
|
|
|
|
{
|
|
|
|
return (((int)(a*255.0) & 0xff) << 24)
|
|
|
|
+ (((int)(b*255.0) & 0xff) << 16)
|
|
|
|
+ (((int)(g*255.0) & 0xff) << 8)
|
|
|
|
+ (((int)(r*255.0) & 0xff));
|
|
|
|
}
|
|
|
|
|
2004-05-22 01:46:16 +02:00
|
|
|
float r, g, b, a;
|
|
|
|
};
|
|
|
|
|
2004-05-30 02:46:58 +02:00
|
|
|
// yuck - MFC already defines CRect/CSize classes ...
|
|
|
|
#define CRect PS_CRect
|
|
|
|
#define CSize PS_CSize
|
|
|
|
|
2004-05-29 05:53:12 +02:00
|
|
|
class CPos;
|
|
|
|
class CSize;
|
|
|
|
|
2004-05-22 01:46:16 +02:00
|
|
|
|
2004-05-29 05:53:12 +02:00
|
|
|
/**
|
|
|
|
* @author Gustav Larsson
|
|
|
|
*
|
2005-04-07 06:29:07 +02:00
|
|
|
* Rectangle class used for screen rectangles. It's very similar to the MS
|
2004-09-02 05:05:16 +02:00
|
|
|
* CRect, but with FLOATS because it's meant to be used with OpenGL which
|
|
|
|
* takes float values.
|
|
|
|
*
|
|
|
|
* Changed to floats 2004-08-31 /GL
|
2004-05-29 05:53:12 +02:00
|
|
|
*/
|
|
|
|
class CRect
|
2004-05-22 01:46:16 +02:00
|
|
|
{
|
2004-05-29 05:53:12 +02:00
|
|
|
public:
|
|
|
|
CRect();
|
|
|
|
CRect(const CPos &pos);
|
|
|
|
CRect(const CSize &size);
|
|
|
|
CRect(const CPos &upperleft, const CPos &bottomright);
|
|
|
|
CRect(const CPos &pos, const CSize &size);
|
2004-09-02 05:05:16 +02:00
|
|
|
CRect(const float &_l, const float &_t, const float &_r, const float &_b);
|
2004-05-22 01:46:16 +02:00
|
|
|
|
2004-05-29 05:53:12 +02:00
|
|
|
// Operators
|
|
|
|
void operator = (const CRect& a);
|
|
|
|
bool operator == (const CRect& a) const;
|
|
|
|
bool operator != (const CRect& a) const;
|
|
|
|
CRect operator - (void) const;
|
|
|
|
CRect operator + (void) const;
|
|
|
|
|
|
|
|
CRect operator + (const CRect& a) const;
|
|
|
|
CRect operator + (const CPos& a) const;
|
|
|
|
CRect operator + (const CSize& a) const;
|
|
|
|
CRect operator - (const CRect& a) const;
|
|
|
|
CRect operator - (const CPos& a) const;
|
|
|
|
CRect operator - (const CSize& a) const;
|
|
|
|
|
|
|
|
void operator += (const CRect& a);
|
|
|
|
void operator += (const CPos& a);
|
|
|
|
void operator += (const CSize& a);
|
|
|
|
void operator -= (const CRect& a);
|
|
|
|
void operator -= (const CPos& a);
|
|
|
|
void operator -= (const CSize& a);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return Width of Rectangle
|
|
|
|
*/
|
2004-09-02 05:05:16 +02:00
|
|
|
float GetWidth() const;
|
2004-05-29 05:53:12 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @return Height of Rectangle
|
|
|
|
*/
|
2004-09-02 05:05:16 +02:00
|
|
|
float GetHeight() const;
|
2004-05-29 05:53:12 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get Size
|
|
|
|
*/
|
|
|
|
CSize GetSize() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get Position equivalent to top/left corner
|
|
|
|
*/
|
|
|
|
CPos TopLeft() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get Position equivalent to bottom/right corner
|
|
|
|
*/
|
|
|
|
CPos BottomRight() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get Position equivalent to the center of the rectangle
|
|
|
|
*/
|
|
|
|
CPos CenterPoint() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Evalutates if point is within the rectangle
|
|
|
|
* @param point CPos representing point
|
|
|
|
* @return true if inside.
|
|
|
|
*/
|
|
|
|
bool PointInside(const CPos &point) const;
|
|
|
|
|
2004-12-17 17:20:08 +01:00
|
|
|
CRect Scale(float x, float y) const;
|
|
|
|
|
2004-05-29 05:53:12 +02:00
|
|
|
/**
|
|
|
|
* Returning CPos representing each corner.
|
|
|
|
*/
|
|
|
|
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Dimensions
|
|
|
|
*/
|
2004-09-02 05:05:16 +02:00
|
|
|
float left, top, right, bottom;
|
2004-05-29 05:53:12 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Gustav Larsson
|
|
|
|
*
|
|
|
|
* Made to represent screen positions and delta values.
|
|
|
|
* @see CRect
|
|
|
|
* @see CSize
|
|
|
|
*/
|
|
|
|
class CPos
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CPos();
|
2004-12-21 14:37:24 +01:00
|
|
|
CPos(const CSize &pos);
|
2004-09-03 07:48:47 +02:00
|
|
|
CPos(const float &_x, const float &_y);
|
2004-05-29 05:53:12 +02:00
|
|
|
|
|
|
|
// Operators
|
|
|
|
void operator = (const CPos& a);
|
|
|
|
bool operator == (const CPos& a) const;
|
|
|
|
bool operator != (const CPos& a) const;
|
|
|
|
CPos operator - (void) const;
|
|
|
|
CPos operator + (void) const;
|
|
|
|
|
|
|
|
CPos operator + (const CPos& a) const;
|
|
|
|
CPos operator + (const CSize& a) const;
|
|
|
|
CPos operator - (const CPos& a) const;
|
|
|
|
CPos operator - (const CSize& a) const;
|
|
|
|
|
|
|
|
void operator += (const CPos& a);
|
|
|
|
void operator += (const CSize& a);
|
|
|
|
void operator -= (const CPos& a);
|
|
|
|
void operator -= (const CSize& a);
|
|
|
|
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Position
|
|
|
|
*/
|
2004-09-03 07:48:47 +02:00
|
|
|
float x, y;
|
2004-05-29 05:53:12 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Gustav Larsson
|
|
|
|
*
|
|
|
|
* Made to represent a screen size, should in philosophy
|
|
|
|
* be made of unsigned ints, but for the sake of compatibility
|
|
|
|
* with CRect and CPos it's not.
|
|
|
|
* @see CRect
|
|
|
|
* @see CPos
|
|
|
|
*/
|
|
|
|
class CSize
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CSize();
|
|
|
|
CSize(const CRect &rect);
|
|
|
|
CSize(const CPos &pos);
|
2004-09-03 07:48:47 +02:00
|
|
|
CSize(const float &_cx, const float &_cy);
|
2004-05-29 05:53:12 +02:00
|
|
|
|
|
|
|
// Operators
|
|
|
|
void operator = (const CSize& a);
|
|
|
|
bool operator == (const CSize& a) const;
|
|
|
|
bool operator != (const CSize& a) const;
|
|
|
|
CSize operator - (void) const;
|
|
|
|
CSize operator + (void) const;
|
|
|
|
|
|
|
|
CSize operator + (const CSize& a) const;
|
|
|
|
CSize operator - (const CSize& a) const;
|
2004-09-03 07:48:47 +02:00
|
|
|
CSize operator / (const float &a) const;
|
|
|
|
CSize operator * (const float &a) const;
|
2004-05-29 05:53:12 +02:00
|
|
|
|
|
|
|
void operator += (const CSize& a);
|
|
|
|
void operator -= (const CSize& a);
|
2004-09-03 07:48:47 +02:00
|
|
|
void operator /= (const float& a);
|
|
|
|
void operator *= (const float& a);
|
2004-05-29 05:53:12 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Size
|
|
|
|
*/
|
2004-09-03 07:48:47 +02:00
|
|
|
float cx, cy;
|
2004-05-22 01:46:16 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------
|
|
|
|
// Includes / Compiler directives
|
|
|
|
//--------------------------------------------------------
|
2004-05-29 22:50:03 +02:00
|
|
|
#include "Texture.h"
|
2004-05-22 01:46:16 +02:00
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------
|
|
|
|
// Macros
|
|
|
|
//--------------------------------------------------------
|
|
|
|
|
|
|
|
//--------------------------------------------------------
|
|
|
|
// Types
|
|
|
|
//--------------------------------------------------------
|
|
|
|
|
|
|
|
//--------------------------------------------------------
|
|
|
|
// Error declarations
|
|
|
|
//--------------------------------------------------------
|
|
|
|
|
|
|
|
//--------------------------------------------------------
|
|
|
|
// Declarations
|
|
|
|
//--------------------------------------------------------
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Rich Cross
|
|
|
|
*
|
|
|
|
* Overlay class definition.
|
|
|
|
*/
|
|
|
|
class COverlay
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Default constructor; creates an overlay that won't actually be renderable
|
|
|
|
*/
|
|
|
|
COverlay();
|
|
|
|
/**
|
|
|
|
* Constructor with setup for more common parameters
|
|
|
|
*/
|
|
|
|
COverlay(const CRect& rect,int z,const CColor& color,const char* texturename="",bool hasBorder=false,
|
|
|
|
const CColor& bordercolor=CColor(0,0,0,0));
|
|
|
|
/**
|
|
|
|
* Destructor
|
|
|
|
*/
|
|
|
|
~COverlay();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get coordinates
|
|
|
|
*/
|
|
|
|
const CRect& GetRect() const { return m_Rect; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get depth
|
|
|
|
*/
|
|
|
|
int GetZ() const { return m_Z; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get texture (not const as Renderer need to modify texture to store handle)
|
|
|
|
*/
|
|
|
|
CTexture& GetTexture() { return m_Texture; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get color
|
|
|
|
*/
|
|
|
|
const CColor& GetColor() const { return m_Color; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get border flag
|
|
|
|
*/
|
|
|
|
bool HasBorder() const { return m_HasBorder; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get border color
|
|
|
|
*/
|
|
|
|
const CColor& GetBorderColor() const { return m_BorderColor; }
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
/// screen space coordinates of overlay
|
|
|
|
CRect m_Rect;
|
|
|
|
/// depth of overlay, for correctly overlapping overlays; higher z implies in-front-of behaviour
|
|
|
|
int m_Z;
|
|
|
|
/// texture to use in rendering overlay; can be a null texture
|
|
|
|
CTexture m_Texture;
|
|
|
|
/// overlay color
|
|
|
|
CColor m_Color;
|
|
|
|
// flag indicating whether to render overlay using a border
|
|
|
|
bool m_HasBorder;
|
|
|
|
/// border color
|
|
|
|
CColor m_BorderColor;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2004-06-11 04:14:18 +02:00
|
|
|
#endif
|