~swag/armagetronad/0.2.9-sty+ct+ap-fork

« back to all changes in this revision

Viewing changes to src/engine/eRectangle.cpp

  • Committer: luke-jr
  • Date: 2006-05-29 01:55:42 UTC
  • Revision ID: svn-v3-list-QlpoOTFBWSZTWZvbKhsAAAdRgAAQABK6798QIABURMgAAaeoNT1TxT1DQbKaeobXKiyAmlWT7Y5MkdJOtXDtB7w7DOGFBHiOBxaUIu7HQyyQSvxdyRThQkJvbKhs:7d95bf1e-0414-0410-9756-b78462a59f44:armagetronad%2Fbranches%2F0.2.8%2Farmagetronad:4612
Unify tags/branches of modules released together

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 
 
3
*************************************************************************
 
4
 
 
5
ArmageTron -- Just another Tron Lightcycle Game in 3D.
 
6
Copyright (C) 2005  by Manuel Moos (z-man@users.sf.net)
 
7
and the AA DevTeam (see the file AUTHORS(.txt) in the main source directory)
 
8
 
 
9
**************************************************************************
 
10
 
 
11
This program is free software; you can redistribute it and/or
 
12
modify it under the terms of the GNU General Public License
 
13
as published by the Free Software Foundation; either version 2
 
14
of the License, or (at your option) any later version.
 
15
 
 
16
This program is distributed in the hope that it will be useful,
 
17
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
18
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
19
GNU General Public License for more details.
 
20
 
 
21
You should have received a copy of the GNU General Public License
 
22
along with this program; if not, write to the Free Software
 
23
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
24
  
 
25
***************************************************************************
 
26
 
 
27
*/
 
28
 
 
29
#include "eRectangle.h"
 
30
#include "tError.h"
 
31
 
 
32
// ****************************************************************************
 
33
// *
 
34
// *   eRectangle
 
35
// *
 
36
// ****************************************************************************
 
37
//!
 
38
//!
 
39
// ****************************************************************************
 
40
 
 
41
eRectangle::eRectangle( void )
 
42
        : low_(1E+30, 1E+30), high_(-1E+30, -1E+30)
 
43
{
 
44
}
 
45
 
 
46
// ****************************************************************************
 
47
// *
 
48
// *   eRectangle
 
49
// *
 
50
// ****************************************************************************
 
51
//!
 
52
//!     @param  low   lowest part of the coordinates of the rectangle
 
53
//!     @param  high  highest part of the coordinates of the rectangle
 
54
//!
 
55
// ****************************************************************************
 
56
 
 
57
eRectangle::eRectangle( eCoord const & low, eCoord const & high )
 
58
        : low_(low), high_(high)
 
59
{
 
60
}
 
61
 
 
62
// ****************************************************************************
 
63
// *
 
64
// *   Clear
 
65
// *
 
66
// ****************************************************************************
 
67
//!
 
68
//!
 
69
// ****************************************************************************
 
70
 
 
71
void eRectangle::Clear( void )
 
72
{
 
73
    low_ = eCoord(1E+30, 1E+30);
 
74
    high_ = eCoord(-1E+30, -1E+30);
 
75
}
 
76
 
 
77
// ****************************************************************************
 
78
// *
 
79
// *   Include
 
80
// *
 
81
// ****************************************************************************
 
82
//!
 
83
//!        @param  point   the point to include
 
84
//!        @return reference to this for chaining
 
85
//!
 
86
// ****************************************************************************
 
87
 
 
88
eRectangle & eRectangle::Include( eCoord const & point )
 
89
{
 
90
    if (low_.x > point.x)
 
91
        low_.x = point.x;
 
92
    if (low_.y > point.y)
 
93
        low_.y = point.y;
 
94
    if (high_.x < point.x)
 
95
        high_.x = point.x;
 
96
    if (high_.y < point.y)
 
97
        high_.y = point.y;
 
98
 
 
99
    return *this;
 
100
}
 
101
 
 
102
// ****************************************************************************
 
103
// *
 
104
// *    Contains
 
105
// *
 
106
// ****************************************************************************
 
107
//!
 
108
//!             @param  point   the point to test
 
109
//!             @return true if the point lies inside
 
110
//!
 
111
// ****************************************************************************
 
112
 
 
113
bool eRectangle::Contains( eCoord const & point ) const
 
114
{
 
115
    return low_.x  <= point.x && low_.y  <= point.y &&
 
116
           high_.x >= point.x && high_.y >= point.y;
 
117
}
 
118
 
 
119
// clamp toClamp to reference in direction. Store the maximal move in max.
 
120
static inline void se_Clamp( REAL& toClamp, REAL reference, REAL direction, REAL& max )
 
121
{
 
122
    REAL move = (toClamp - reference)*direction;
 
123
    if (move > max)
 
124
        max = move;
 
125
    if (move > 0)
 
126
        toClamp = reference;
 
127
}
 
128
 
 
129
// ****************************************************************************
 
130
// *
 
131
// *    Clamp
 
132
// *
 
133
// ****************************************************************************
 
134
//!
 
135
//!             @param  point   the point to clamp
 
136
//!     @return distance the point needed to be moved
 
137
//!
 
138
// ****************************************************************************
 
139
 
 
140
REAL eRectangle::Clamp( eCoord & point ) const
 
141
{
 
142
    REAL ret = -1E+30;
 
143
    se_Clamp( point.x,  low_.x, -1, ret);
 
144
    se_Clamp( point.y,  low_.y, -1, ret);
 
145
    se_Clamp( point.x, high_.x,  1, ret);
 
146
    se_Clamp( point.y, high_.y,  1, ret);
 
147
 
 
148
    return ret;
 
149
}
 
150
 
 
151
// helper function clipping a line at one clipping line
 
152
static inline REAL se_Clip( eCoord const & start, eCoord & stop,
 
153
                            eCoord const & reference, eCoord const & normal )
 
154
{
 
155
    // calculate how far out on the other side of the reference point the stop point is
 
156
    REAL out = eCoord::F( normal, stop-reference );
 
157
    if ( out <= 0 )
 
158
        return 1; // nothing to clamp
 
159
 
 
160
    // calculate how far inside the startpoint lies
 
161
    REAL in = eCoord::F( normal, reference-start );
 
162
    if ( in < 0 )
 
163
        in = 0;
 
164
 
 
165
    // clip
 
166
    if ( out+in > 0 )
 
167
    {
 
168
        stop = (start * out + stop * in)*(1/(in+out));
 
169
        return in/(in+out);
 
170
    }
 
171
 
 
172
    return 1;
 
173
}
 
174
 
 
175
// ****************************************************************************
 
176
// *
 
177
// *    Clip
 
178
// *
 
179
// ****************************************************************************
 
180
//!
 
181
//!             @param  start   point (asserted to lie inside the rectangle) to serve as starting point
 
182
//!             @param  stop    point to clip
 
183
//!     @return         amount left of the start-stop line segment (1 for no clipping)
 
184
//!
 
185
// ****************************************************************************
 
186
 
 
187
REAL eRectangle::Clip( eCoord const & start, eCoord & stop ) const
 
188
{
 
189
    // clip in x-direction
 
190
    REAL rx = se_Clip( start, stop, low_, eCoord(-1,0) );
 
191
    if ( rx >= 1 )
 
192
    {
 
193
        rx = se_Clip( start, stop, high_, eCoord(1,0) );
 
194
    }
 
195
 
 
196
    // clip in y-direction
 
197
    REAL ry = se_Clip( start, stop, low_, eCoord(0,-1) );
 
198
    if ( ry >= 1 )
 
199
    {
 
200
        ry = se_Clip( start, stop, high_, eCoord(0,1) );
 
201
    }
 
202
 
 
203
    return rx * ry;
 
204
}
 
205
 
 
206
// ****************************************************************************
 
207
// *
 
208
// *    GetPoint
 
209
// *
 
210
// ****************************************************************************
 
211
//!
 
212
//!             @param  in      coordinates in the range of 0..1 of the point to get
 
213
//!             @return         point inside the rectangle
 
214
//!
 
215
// ****************************************************************************
 
216
 
 
217
eCoord eRectangle::GetPoint( eCoord const & in ) const
 
218
{
 
219
    eCoord diff = high_ - low_;
 
220
    return low_ + eCoord( diff.x * in.x, diff.y * in.y );
 
221
}
 
222