2
* acm : an aerial combat simulator for X
3
* Copyright (C) 1991-1997 Riley Rainey
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; version 2 dated June, 1991.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 675 Mass Ave., Cambridge, MA 02139, USA.
20
* Runway markings are designed to conform to FAA AC 150/5340-1G
27
AddSymmetricPolygons(VMatrix * RWYtoXYZ, double x, double y, int count,
28
double length, double width, double margin,
29
VPolygon ** p, int p_count);
31
#define CENTERLINE_WIDTH FEETtoMETERS(3.0)
32
#define CENTERLINE_LENGTH FEETtoMETERS(120.0)
33
#define CENTERLINE_X_OFFSET FEETtoMETERS(400.0)
34
#define CENTERLINE_GAP FEETtoMETERS(80.0)
35
#define TOUCHDOWN_ZONE_WIDTH FEETtoMETERS(6.0)
36
#define TOUCHDOWN_ZONE_LENGTH FEETtoMETERS(75.0)
37
#define TOUCHDOWN_ZONE_OFFSET FEETtoMETERS(500.0)
38
#define TOUCHDOWN_ZONE_MARGIN FEETtoMETERS(5.0)
39
#define THRESHOLD_STRIPE_WIDTH FEETtoMETERS(5.75)
40
#define THRESHOLD_STRIPE_LENGTH FEETtoMETERS(150.0)
41
#define THRESHOLD_STRIPE_X_OFFSET FEETtoMETERS(20.0)
42
#define THRESHOLD_STRIPE_Y_OFFSET FEETtoMETERS(3.0)
43
#define THRESHOLD_STRIPE_MARGIN FEETtoMETERS(5.75)
44
#define FIXED_MARKER_LENGTH FEETtoMETERS(150.0)
45
#define FIXED_MARKER_WIDTH FEETtoMETERS(30.0)
46
#define FIXED_MARKER_Y_OFFSET FEETtoMETERS(3.0)
47
#define FIXED_MARKER_X_OFFSET FEETtoMETERS(1000.0)
48
#define WHITE_PAINT "#ccc"
50
#define RUNWAY_CULL_DISTANCE 50000.0 /* fifty kilometers */
51
#define MARKING_CULL_DISTANCE 5000.0 /* five kilometers */
54
AddRunway(VMatrix * RWYtoXYZ, double length, double width, int flags,
55
VPolygon *** poly, int *poly_count)
57
VPoint tmp, vertex[8];
58
double start, stop, x, y;
63
p = (VPolygon **) Vmalloc(sizeof(VPolygon *));
66
* First, add the runway surface polygon ...
72
VTransform(&tmp, RWYtoXYZ, &vertex[0]);
73
tmp.x = -length / 2.0;
76
VTransform(&tmp, RWYtoXYZ, &vertex[1]);
77
tmp.x = -length / 2.0;
80
VTransform(&tmp, RWYtoXYZ, &vertex[2]);
84
VTransform(&tmp, RWYtoXYZ, &vertex[3]);
86
p[i] = VCreatePolygon(4, vertex,
87
VAllocDepthCueuedColor("#b7b19f", 1));
88
p[i]->flags |= PolyUseCullDistance;
89
p[i]->cullDistance = RUNWAY_CULL_DISTANCE;
93
* Now the runway centerline markings.
96
start = (0.5 * -length) + CENTERLINE_X_OFFSET - 0.5 * CENTERLINE_LENGTH;
97
stop = (0.5 * length) - CENTERLINE_X_OFFSET;
99
for (x = start; x < stop; x += CENTERLINE_LENGTH + CENTERLINE_GAP) {
100
tmp.x = x - CENTERLINE_LENGTH / 2.0;
101
tmp.y = CENTERLINE_WIDTH / 2.0;
103
VTransform(&tmp, RWYtoXYZ, &vertex[0]);
104
tmp.x = x + CENTERLINE_LENGTH / 2.0;
105
tmp.y = CENTERLINE_WIDTH / 2.0;
107
VTransform(&tmp, RWYtoXYZ, &vertex[1]);
108
tmp.x = x + CENTERLINE_LENGTH / 2.0;
109
tmp.y = -CENTERLINE_WIDTH / 2.0;
111
VTransform(&tmp, RWYtoXYZ, &vertex[2]);
112
tmp.x = x - CENTERLINE_LENGTH / 2.0;
113
tmp.y = -CENTERLINE_WIDTH / 2.0;
115
VTransform(&tmp, RWYtoXYZ, &vertex[3]);
116
p = realloc(p, sizeof(VPolygon *) * (i + 1));
117
p[i] = VCreatePolygon(4, vertex,
118
VAllocDepthCueuedColor(WHITE_PAINT, 1));
119
p[i]->flags |= PolyUseCullDistance;
120
p[i]->cullDistance = MARKING_CULL_DISTANCE;
125
* Runway threshold stripes
128
/* From the Aeronautical Information Manual */
137
else if (width >= 45.0) {
140
else if (width >= 30.0) {
143
else if (width >= 23.0) {
146
else if (width >= 18.0) {
152
x = 0.5 * length - THRESHOLD_STRIPE_X_OFFSET;
153
y = width / 2.0 - THRESHOLD_STRIPE_Y_OFFSET;
155
for (; stripes > 0; --stripes,
156
y -= THRESHOLD_STRIPE_WIDTH + THRESHOLD_STRIPE_MARGIN) {
158
p = realloc(p, sizeof(VPolygon *) * (i + 4));
163
VTransform(&tmp, RWYtoXYZ, &vertex[0]);
164
tmp.x = x - THRESHOLD_STRIPE_LENGTH;
167
VTransform(&tmp, RWYtoXYZ, &vertex[1]);
168
tmp.x = x - THRESHOLD_STRIPE_LENGTH;
169
tmp.y = y - THRESHOLD_STRIPE_WIDTH;
171
VTransform(&tmp, RWYtoXYZ, &vertex[2]);
173
tmp.y = y - THRESHOLD_STRIPE_WIDTH;
175
VTransform(&tmp, RWYtoXYZ, &vertex[3]);
176
p[i] = VCreatePolygon(4, vertex,
177
VAllocDepthCueuedColor(WHITE_PAINT, 1));
178
p[i]->flags |= PolyUseCullDistance;
179
p[i]->cullDistance = MARKING_CULL_DISTANCE;
183
* Opposite stripe on same runway end
189
VTransform(&tmp, RWYtoXYZ, &vertex[0]);
191
tmp.y = -y + THRESHOLD_STRIPE_WIDTH;
193
VTransform(&tmp, RWYtoXYZ, &vertex[1]);
194
tmp.x = x - THRESHOLD_STRIPE_LENGTH;
195
tmp.y = -y + THRESHOLD_STRIPE_WIDTH;
197
VTransform(&tmp, RWYtoXYZ, &vertex[2]);
198
tmp.x = x - THRESHOLD_STRIPE_LENGTH;
201
VTransform(&tmp, RWYtoXYZ, &vertex[3]);
202
p[i] = VCreatePolygon(4, vertex,
203
VAllocDepthCueuedColor(WHITE_PAINT, 1));
204
p[i]->flags |= PolyUseCullDistance;
205
p[i]->cullDistance = MARKING_CULL_DISTANCE;
209
* Stripe on opposite runway end
215
VTransform(&tmp, RWYtoXYZ, &vertex[0]);
217
tmp.y = y - THRESHOLD_STRIPE_WIDTH;
219
VTransform(&tmp, RWYtoXYZ, &vertex[1]);
220
tmp.x = -x + THRESHOLD_STRIPE_LENGTH;
221
tmp.y = y - THRESHOLD_STRIPE_WIDTH;
223
VTransform(&tmp, RWYtoXYZ, &vertex[2]);
224
tmp.x = -x + THRESHOLD_STRIPE_LENGTH;
227
VTransform(&tmp, RWYtoXYZ, &vertex[3]);
228
p[i] = VCreatePolygon(4, vertex,
229
VAllocDepthCueuedColor(WHITE_PAINT, 1));
230
p[i]->flags |= PolyUseCullDistance;
231
p[i]->cullDistance = MARKING_CULL_DISTANCE;
235
* Opposite stripe on opposite runway end
241
VTransform(&tmp, RWYtoXYZ, &vertex[0]);
242
tmp.x = -x + THRESHOLD_STRIPE_LENGTH;
245
VTransform(&tmp, RWYtoXYZ, &vertex[1]);
246
tmp.x = -x + THRESHOLD_STRIPE_LENGTH;
247
tmp.y = -y + THRESHOLD_STRIPE_WIDTH;
249
VTransform(&tmp, RWYtoXYZ, &vertex[2]);
251
tmp.y = -y + THRESHOLD_STRIPE_WIDTH;
253
VTransform(&tmp, RWYtoXYZ, &vertex[3]);
254
p[i] = VCreatePolygon(4, vertex,
255
VAllocDepthCueuedColor(WHITE_PAINT, 1));
256
p[i]->flags |= PolyUseCullDistance;
257
p[i]->cullDistance = MARKING_CULL_DISTANCE;
264
* Fixed distance marker
267
if (length > FEETtoMETERS(3000.0)) {
269
p = realloc(p, sizeof(VPolygon *) * (i + 4));
271
AddSymmetricPolygons(RWYtoXYZ,
272
0.5 * length - FIXED_MARKER_X_OFFSET,
273
0.5 * width - FIXED_MARKER_Y_OFFSET,
275
FIXED_MARKER_LENGTH, FIXED_MARKER_WIDTH, 0.0,
286
AddSymmetricPolygons(VMatrix * RWYtoXYZ, double x, double y, int count,
287
double length, double width, double margin,
288
VPolygon ** p, int p_count)
290
VPoint tmp, vertex[4];
292
for (; count > 0; --count, y -= width + margin) {
296
VTransform(&tmp, RWYtoXYZ, &vertex[0]);
300
VTransform(&tmp, RWYtoXYZ, &vertex[1]);
304
VTransform(&tmp, RWYtoXYZ, &vertex[2]);
308
VTransform(&tmp, RWYtoXYZ, &vertex[3]);
309
p[p_count] = VCreatePolygon(4, vertex,
310
VAllocDepthCueuedColor(WHITE_PAINT, 1));
311
p[p_count]->flags |= PolyUseCullDistance;
312
p[p_count]->cullDistance = MARKING_CULL_DISTANCE;
316
* Opposite stripe on same runway end
322
VTransform(&tmp, RWYtoXYZ, &vertex[0]);
326
VTransform(&tmp, RWYtoXYZ, &vertex[1]);
330
VTransform(&tmp, RWYtoXYZ, &vertex[2]);
334
VTransform(&tmp, RWYtoXYZ, &vertex[3]);
335
p[p_count] = VCreatePolygon(4, vertex,
336
VAllocDepthCueuedColor(WHITE_PAINT, 1));
337
p[p_count]->flags |= PolyUseCullDistance;
338
p[p_count]->cullDistance = MARKING_CULL_DISTANCE;
342
* Stripe on opposite runway end
348
VTransform(&tmp, RWYtoXYZ, &vertex[0]);
352
VTransform(&tmp, RWYtoXYZ, &vertex[1]);
356
VTransform(&tmp, RWYtoXYZ, &vertex[2]);
360
VTransform(&tmp, RWYtoXYZ, &vertex[3]);
361
p[p_count] = VCreatePolygon(4, vertex,
362
VAllocDepthCueuedColor(WHITE_PAINT, 1));
363
p[p_count]->flags |= PolyUseCullDistance;
364
p[p_count]->cullDistance = MARKING_CULL_DISTANCE;
368
* Opposite stripe on opposite runway end
374
VTransform(&tmp, RWYtoXYZ, &vertex[0]);
378
VTransform(&tmp, RWYtoXYZ, &vertex[1]);
382
VTransform(&tmp, RWYtoXYZ, &vertex[2]);
386
VTransform(&tmp, RWYtoXYZ, &vertex[3]);
387
p[p_count] = VCreatePolygon(4, vertex,
388
VAllocDepthCueuedColor(WHITE_PAINT, 1));
389
p[p_count]->flags |= PolyUseCullDistance;
390
p[p_count]->cullDistance = MARKING_CULL_DISTANCE;