doom3-bfg/neo/ui/Rectangle.h

275 lines
5.4 KiB
C
Raw Normal View History

2012-11-26 18:58:24 +00:00
/*
===========================================================================
Doom 3 BFG Edition GPL Source Code
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
2012-11-26 18:58:24 +00:00
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
2012-11-26 18:58:24 +00:00
Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
#ifndef IDRECTANGLE_H_
#define IDRECTANGLE_H_
//
// simple rectangle
//
extern void RotateVector( idVec3& v, idVec3 origin, float a, float c, float s );
class idRectangle
{
2012-11-26 18:58:24 +00:00
public:
float x; // horiz position
float y; // vert position
float w; // width
float h; // height;
idRectangle()
{
x = y = w = h = 0.0;
}
idRectangle( float ix, float iy, float iw, float ih )
{
x = ix;
y = iy;
w = iw;
h = ih;
}
float Bottom() const
{
return y + h;
}
float Right() const
{
return x + w;
}
void Offset( float x, float y )
{
2012-11-26 18:58:24 +00:00
this->x += x;
this->y += y;
}
bool Contains( float xt, float yt )
{
if( w == 0.0 && h == 0.0 )
{
2012-11-26 18:58:24 +00:00
return false;
}
if( xt >= x && xt <= Right() && yt >= y && yt <= Bottom() )
{
2012-11-26 18:58:24 +00:00
return true;
}
return false;
}
void Empty()
{
x = y = w = h = 0.0;
};
void ClipAgainst( idRectangle r, bool sizeOnly )
{
if( !sizeOnly )
{
if( x < r.x )
{
2012-11-26 18:58:24 +00:00
w -= r.x - x;
x = r.x;
}
if( y < r.y )
{
2012-11-26 18:58:24 +00:00
h -= r.y - y;
y = r.y;
}
}
if( x + w > r.x + r.w )
{
w = ( r.x + r.w ) - x;
2012-11-26 18:58:24 +00:00
}
if( y + h > r.y + r.h )
{
h = ( r.y + r.h ) - y;
2012-11-26 18:58:24 +00:00
}
}
void Rotate( float a, idRectangle& out )
{
2012-11-26 18:58:24 +00:00
idVec3 p1, p2, p3, p4, p5;
float c, s;
idVec3 center;
center.Set( ( x + w ) / 2.0, ( y + h ) / 2.0, 0 );
p1.Set( x, y, 0 );
p2.Set( Right(), y, 0 );
p4.Set( x, Bottom(), 0 );
if( a )
{
2012-11-26 18:58:24 +00:00
s = sin( DEG2RAD( a ) );
c = cos( DEG2RAD( a ) );
}
else
{
2012-11-26 18:58:24 +00:00
s = c = 0;
}
RotateVector( p1, center, a, c, s );
RotateVector( p2, center, a, c, s );
RotateVector( p4, center, a, c, s );
2012-11-26 18:58:24 +00:00
out.x = p1.x;
out.y = p1.y;
out.w = ( p2 - p1 ).Length();
out.h = ( p4 - p1 ).Length();
2012-11-26 18:58:24 +00:00
}
idRectangle& operator+=( const idRectangle& a );
idRectangle& operator-=( const idRectangle& a );
idRectangle& operator/=( const idRectangle& a );
idRectangle& operator/=( const float a );
idRectangle& operator*=( const float a );
idRectangle& operator=( const idVec4 v );
int operator==( const idRectangle& a ) const;
float& operator[]( const int index );
char* String() const;
2012-11-26 18:58:24 +00:00
const idVec4& ToVec4() const;
2012-11-26 18:58:24 +00:00
};
ID_INLINE const idVec4& idRectangle::ToVec4() const
{
return *reinterpret_cast<const idVec4*>( &x );
2012-11-26 18:58:24 +00:00
}
ID_INLINE idRectangle& idRectangle::operator+=( const idRectangle& a )
{
2012-11-26 18:58:24 +00:00
x += a.x;
y += a.y;
w += a.w;
h += a.h;
2012-11-26 18:58:24 +00:00
return *this;
}
ID_INLINE idRectangle& idRectangle::operator/=( const idRectangle& a )
{
2012-11-26 18:58:24 +00:00
x /= a.x;
y /= a.y;
w /= a.w;
h /= a.h;
2012-11-26 18:58:24 +00:00
return *this;
}
ID_INLINE idRectangle& idRectangle::operator/=( const float a )
{
2012-11-26 18:58:24 +00:00
float inva = 1.0f / a;
x *= inva;
y *= inva;
w *= inva;
h *= inva;
2012-11-26 18:58:24 +00:00
return *this;
}
ID_INLINE idRectangle& idRectangle::operator-=( const idRectangle& a )
{
2012-11-26 18:58:24 +00:00
x -= a.x;
y -= a.y;
w -= a.w;
h -= a.h;
2012-11-26 18:58:24 +00:00
return *this;
}
ID_INLINE idRectangle& idRectangle::operator*=( const float a )
{
2012-11-26 18:58:24 +00:00
x *= a;
y *= a;
w *= a;
h *= a;
2012-11-26 18:58:24 +00:00
return *this;
}
ID_INLINE idRectangle& idRectangle::operator=( const idVec4 v )
{
2012-11-26 18:58:24 +00:00
x = v.x;
y = v.y;
w = v.z;
h = v.w;
return *this;
}
ID_INLINE int idRectangle::operator==( const idRectangle& a ) const
{
return ( x == a.x && y == a.y && w == a.w && a.h );
2012-11-26 18:58:24 +00:00
}
ID_INLINE float& idRectangle::operator[]( int index )
{
2012-11-26 18:58:24 +00:00
return ( &x )[ index ];
}
class idRegion
{
2012-11-26 18:58:24 +00:00
public:
idRegion() { };
void Empty()
{
2012-11-26 18:58:24 +00:00
rects.Clear();
}
bool Contains( float xt, float yt )
{
2012-11-26 18:58:24 +00:00
int c = rects.Num();
for( int i = 0; i < c; i++ )
{
if( rects[i].Contains( xt, yt ) )
{
2012-11-26 18:58:24 +00:00
return true;
}
}
return false;
}
void AddRect( float x, float y, float w, float h )
{
rects.Append( idRectangle( x, y, w, h ) );
2012-11-26 18:58:24 +00:00
}
int GetRectCount()
{
2012-11-26 18:58:24 +00:00
return rects.Num();
}
idRectangle* GetRect( int index )
{
if( index >= 0 && index < rects.Num() )
{
2012-11-26 18:58:24 +00:00
return &rects[index];
}
return NULL;
}
2012-11-26 18:58:24 +00:00
protected:
idList<idRectangle, TAG_OLD_UI> rects;
};
#endif