1 /* $Id: FieldView.cpp,v 1.20 2002/12/24 14:56:15 nan Exp $ */
2
3 // Copyright (C) 2000, 2001, 2002 $B?@Fn(B $B5H9((B(Kanna Yoshihiro)
4 //
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; either version 2 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
19 #include "ttinc.h"
20 #include "FieldView.h"
21 #include "LoadImage.h"
22 #include "RCFile.h"
23 #include "Control.h"
24 #include "Event.h"
25
26 extern RCFile *theRC;
27
FieldView()28 FieldView::FieldView() {
29 }
30
~FieldView()31 FieldView::~FieldView() {
32 }
33
34 bool
Init()35 FieldView::Init() {
36 int i;
37 // Set texture
38 ImageData image;
39
40 image.LoadFile( "images/Floor.jpg" );
41
42 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
43 glGenTextures( 1, &m_floor );
44 glBindTexture( GL_TEXTURE_2D, m_floor );
45 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
46 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
47 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
48 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
49 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
50
51 glTexImage2D(GL_TEXTURE_2D, 0, 3, image.GetWidth(), image.GetHeight(),
52 0, GL_RGBA, GL_UNSIGNED_BYTE, image.GetImage() );
53
54 static char pname[][30] = {"images/Left.jpg", "images/Front.jpg",
55 "images/Right.jpg", "images/Back.jpg" };
56 static char tutorialname[][30] = {"images/EasyTutorial",
57 "images/NormalTutorial",
58 "images/HardTutorial",
59 "" };
60
61 glGenTextures( 4, m_wall );
62 for ( i = 0 ; i < 4 ; i++ ) {
63 image.LoadFile( &(pname[i][0]) );
64
65 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
66 glBindTexture( GL_TEXTURE_2D, m_wall[i] );
67 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
68 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
69 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
70 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
71 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
72
73 glTexImage2D(GL_TEXTURE_2D, 0, 3, image.GetWidth(), image.GetHeight(),
74 0, GL_RGBA, GL_UNSIGNED_BYTE, image.GetImage() );
75 }
76
77 glGenTextures( 4, m_tutorial );
78
79 char filename[256];
80
81 for ( i = 0 ; i < 3 ; i++ ) {
82 sprintf( filename, _("%s.ppm"), &(tutorialname[i][0]) );
83 image.LoadPPM( filename );
84 for ( int j = 0 ; j < image.GetWidth() ; j++ ) {
85 for ( int k = 0 ; k < image.GetHeight() ; k++ ) {
86 if ( image.GetPixel( j, k, 0 ) >= 5 )
87 image.SetPixel( j, k, 3 , 255 );
88 else
89 image.SetPixel( j, k, 3 , 0 );
90 }
91 }
92
93 glBindTexture( GL_TEXTURE_2D, m_tutorial[i] );
94 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
95 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
96 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
97 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
98 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
99
100 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
101 image.GetWidth(), image.GetHeight(),
102 0, GL_RGBA, GL_UNSIGNED_BYTE,
103 image.GetImage() );
104 }
105
106 m_offset = glGenLists(1);
107
108 glNewList( m_offset, GL_COMPILE );
109
110 if (theRC->gmode == GMODE_SIMPLE) {
111 glBegin(GL_LINE_LOOP); // Draw floor
112 glNormal3f( 0.0F, 0.0F, 1.0F );
113 glVertex3f( -AREAXSIZE, AREAYSIZE, 0.0F );
114 glVertex3f( -AREAXSIZE, -AREAYSIZE, 0.0F );
115 glVertex3f( AREAXSIZE, -AREAYSIZE, 0.0F );
116 glVertex3f( AREAXSIZE, AREAYSIZE, 0.0F );
117 glEnd();
118 } else {
119 glBindTexture( GL_TEXTURE_2D, m_floor );
120 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
121 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
122 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
123 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
124
125 glBegin(GL_QUADS); // Draw floor
126 glNormal3f( 0.0F, 0.0F, 1.0F );
127 glTexCoord2f(0.0F, 0.0F); glVertex3f( -AREAXSIZE*2, AREAYSIZE*2, 0.0F );
128 glTexCoord2f(4.0F, 0.0F); glVertex3f( -AREAXSIZE*2, -AREAYSIZE*2, 0.0F );
129 glTexCoord2f(4.0F, 4.0F); glVertex3f( AREAXSIZE*2, -AREAYSIZE*2, 0.0F );
130 glTexCoord2f(0.0F, 4.0F); glVertex3f( AREAXSIZE*2, AREAYSIZE*2, 0.0F );
131 glEnd();
132 }
133
134 glEndList();
135
136 return true;
137 }
138
139 bool
Redraw()140 FieldView::Redraw() {
141 if ( theRC->isTexture )
142 glEnable(GL_TEXTURE_2D);
143
144 if ( theRC->gmode != GMODE_SIMPLE )
145 glColor4f(0.8F, 0.8F, 0.8F, 0.0F);
146 else
147 glColor4f(0.6F, 0.4F, 0.2F, 0.0F);
148
149 glCallList( m_offset );
150
151 if ( theRC->gmode == GMODE_SIMPLE ) {
152 glBegin(GL_LINE_LOOP); // Draw wall
153 glNormal3f( 1.0F, 0.0F, 0.0F );
154 glVertex3f( -AREAXSIZE, AREAYSIZE, 0.0F );
155 glVertex3f( -AREAXSIZE, -AREAYSIZE, 0.0F );
156 glVertex3f( -AREAXSIZE, -AREAYSIZE, AREAZSIZE);
157 glVertex3f( -AREAXSIZE, AREAYSIZE, AREAZSIZE);
158 glEnd();
159
160 glBegin(GL_LINE_LOOP);
161 glNormal3f( 0.0F, 1.0F, 0.0F );
162 glVertex3f( -AREAXSIZE, -AREAYSIZE, 0.0F );
163 glVertex3f( AREAXSIZE, -AREAYSIZE, 0.0F );
164 glVertex3f( AREAXSIZE, -AREAYSIZE, AREAZSIZE);
165 glVertex3f( -AREAXSIZE, -AREAYSIZE, AREAZSIZE);
166 glEnd();
167
168 glBegin(GL_LINE_LOOP);
169 glNormal3f( -1.0F, 0.0F, 0.0F );
170 glVertex3f( AREAXSIZE, -AREAYSIZE, 0.0F );
171 glVertex3f( AREAXSIZE, AREAYSIZE, 0.0F );
172 glVertex3f( AREAXSIZE, AREAYSIZE, AREAZSIZE);
173 glVertex3f( AREAXSIZE, -AREAYSIZE, AREAZSIZE);
174 glEnd();
175
176 glBegin(GL_LINE_LOOP);
177 glNormal3f( 0.0F, -1.0F, 0.0F );
178 glVertex3f( AREAXSIZE, AREAYSIZE, 0.0F );
179 glVertex3f( -AREAXSIZE, AREAYSIZE, 0.0F );
180 glVertex3f( -AREAXSIZE, AREAYSIZE, AREAZSIZE);
181 glVertex3f( AREAXSIZE, AREAYSIZE, AREAZSIZE);
182 glEnd();
183 } else {
184 glBindTexture( GL_TEXTURE_2D, m_wall[0] );
185 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
186 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
187 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
188 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
189 glBegin(GL_QUADS); // Draw wall
190 glNormal3f( 1.0F, 0.0F, 0.0F );
191 glTexCoord2f(0.0F, 1.0F); glVertex3f( -AREAXSIZE, AREAYSIZE, 0.0F );
192 glTexCoord2f(1.0F, 1.0F); glVertex3f( -AREAXSIZE, -AREAYSIZE, 0.0F );
193 glTexCoord2f(1.0F, 0.0F); glVertex3f( -AREAXSIZE, -AREAYSIZE, AREAZSIZE);
194 glTexCoord2f(0.0F, 0.0F); glVertex3f( -AREAXSIZE, AREAYSIZE, AREAZSIZE);
195 glEnd();
196
197 glBindTexture( GL_TEXTURE_2D, m_wall[1] );
198 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
199 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
200 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
201 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
202 glBegin(GL_QUADS);
203 glNormal3f( 0.0F, 1.0F, 0.0F );
204 glTexCoord2f(0.0F, 1.0F); glVertex3f( -AREAXSIZE, -AREAYSIZE, 0.0F );
205 glTexCoord2f(1.0F, 1.0F); glVertex3f( AREAXSIZE, -AREAYSIZE, 0.0F );
206 glTexCoord2f(1.0F, 0.0F); glVertex3f( AREAXSIZE, -AREAYSIZE, AREAZSIZE);
207 glTexCoord2f(0.0F, 0.0F); glVertex3f( -AREAXSIZE, -AREAYSIZE, AREAZSIZE);
208 glEnd();
209
210 glBindTexture( GL_TEXTURE_2D, m_wall[2] );
211 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
212 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
213 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
214 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
215 glBegin(GL_QUADS);
216 glNormal3f( -1.0F, 0.0F, 0.0F );
217 glTexCoord2f(0.0F, 1.0F); glVertex3f( AREAXSIZE, -AREAYSIZE, 0.0F );
218 glTexCoord2f(1.0F, 1.0F); glVertex3f( AREAXSIZE, AREAYSIZE, 0.0F );
219 glTexCoord2f(1.0F, 0.0F); glVertex3f( AREAXSIZE, AREAYSIZE, AREAZSIZE);
220 glTexCoord2f(0.0F, 0.0F); glVertex3f( AREAXSIZE, -AREAYSIZE, AREAZSIZE);
221 glEnd();
222
223 glBindTexture( GL_TEXTURE_2D, m_wall[3] );
224 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
225 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
226 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
227 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
228 glBegin(GL_QUADS);
229 glNormal3f( 0.0F, -1.0F, 0.0F );
230 glTexCoord2f(0.0F, 1.0F); glVertex3f( AREAXSIZE, AREAYSIZE, 0.0F );
231 glTexCoord2f(1.0F, 1.0F); glVertex3f( -AREAXSIZE, AREAYSIZE, 0.0F );
232 glTexCoord2f(1.0F, 0.0F); glVertex3f( -AREAXSIZE, AREAYSIZE, AREAZSIZE);
233 glTexCoord2f(0.0F, 0.0F); glVertex3f( AREAXSIZE, AREAYSIZE, AREAZSIZE);
234 glEnd();
235
236 if ( theRC->isTexture )
237 glDisable(GL_TEXTURE_2D);
238
239 glColor4f(0.1F, 0.1F, 0.1F, 0.0F);
240 glBegin(GL_QUADS); // Draw ceiling
241 glNormal3f( 0.0F, 0.0F, -1.0F );
242 glVertex3f( AREAXSIZE*2, AREAYSIZE*2, AREAZSIZE);
243 glVertex3f( -AREAXSIZE*2, AREAYSIZE*2, AREAZSIZE);
244 glVertex3f( -AREAXSIZE*2, -AREAYSIZE*2, AREAZSIZE);
245 glVertex3f( AREAXSIZE*2, -AREAYSIZE*2, AREAZSIZE);
246 glEnd();
247
248 glColor4f(0.0F, 0.2F, 0.0F, 0.0F);
249 static GLfloat mat_board[] = { 0.0F, 0.2F, 0.0F, 0.0F };
250 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_board);
251
252 glBegin(GL_QUADS); // Draw ball stopper
253 glNormal3f( 1.0F, 0.0F, 0.0F );
254 glVertex3f( -AREAXSIZE/2, -AREAYSIZE/2, 0.0F );
255 glVertex3f( -AREAXSIZE/2, AREAYSIZE/2, 0.0F );
256 glVertex3f( -AREAXSIZE/2, AREAYSIZE/2, TABLEHEIGHT );
257 glVertex3f( -AREAXSIZE/2, -AREAYSIZE/2, TABLEHEIGHT );
258
259 glNormal3f( -1.0F, 0.0F, 0.0F );
260 glVertex3f( AREAXSIZE/2, -AREAYSIZE/2, 0.0F );
261 glVertex3f( AREAXSIZE/2, AREAYSIZE/2, 0.0F );
262 glVertex3f( AREAXSIZE/2, AREAYSIZE/2, TABLEHEIGHT );
263 glVertex3f( AREAXSIZE/2, -AREAYSIZE/2, TABLEHEIGHT );
264 /*
265 glNormal3f( 0.0F, -1.0F, 0.0F );
266 glVertex3f( -AREAXSIZE/2, AREAYSIZE/2, 0.0F );
267 glVertex3f( AREAXSIZE/2, AREAYSIZE/2, 0.0F );
268 glVertex3f( AREAXSIZE/2, AREAYSIZE/2, TABLEHEIGHT );
269 glVertex3f( -AREAXSIZE/2, AREAYSIZE/2, TABLEHEIGHT );
270 */
271 glNormal3f( 0.0F, 1.0F, 0.0F );
272 glVertex3f( AREAXSIZE/2, -AREAYSIZE/2, 0.0F );
273 glVertex3f( -AREAXSIZE/2, -AREAYSIZE/2, 0.0F );
274 glVertex3f( -AREAXSIZE/2, -AREAYSIZE/2, TABLEHEIGHT );
275 glVertex3f( AREAXSIZE/2, -AREAYSIZE/2, TABLEHEIGHT );
276 glEnd();
277
278 // Show tutorial on ball stopper
279 if ( Control::TheControl()->IsPlaying()
280 && theRC->gameLevel <= LEVEL_HARD ) {
281 int rotation;
282
283 if ( Event::m_lastTime.time % 5 == 4 ) {
284 rotation = (Event::m_lastTime.time%40)/5*32
285 + Event::m_lastTime.millitm/30;
286 } else{
287 rotation = (Event::m_lastTime.time%40)/5*32;
288 }
289
290 if ( theRC->isTexture )
291 glEnable(GL_TEXTURE_2D);
292 glBindTexture( GL_TEXTURE_2D, m_tutorial[theRC->gameLevel] );
293 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
294 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
295 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
296 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
297 glBegin(GL_QUADS);
298 glNormal3f( 0.0F, -1.0F, 0.0F );
299 glTexCoord2f(0.0F, (rotation+32)/256.0F);
300 glVertex3f( -AREAXSIZE/2, AREAYSIZE/2, 0.0F );
301 glTexCoord2f(1.0F, (rotation+32)/256.0F);
302 glVertex3f( AREAXSIZE/2, AREAYSIZE/2, 0.0F );
303 glTexCoord2f(1.0F, rotation/256.0F);
304 glVertex3f( AREAXSIZE/2, AREAYSIZE/2, TABLEHEIGHT );
305 glTexCoord2f(0.0F, rotation/256.0F);
306 glVertex3f( -AREAXSIZE/2, AREAYSIZE/2, TABLEHEIGHT );
307 glEnd();
308
309 if ( theRC->isTexture )
310 glDisable(GL_TEXTURE_2D);
311 } else {
312 glBegin(GL_QUADS);
313 glNormal3f( 0.0F, -1.0F, 0.0F );
314 glVertex3f( -AREAXSIZE/2, AREAYSIZE/2, 0.0F );
315 glVertex3f( AREAXSIZE/2, AREAYSIZE/2, 0.0F );
316 glVertex3f( AREAXSIZE/2, AREAYSIZE/2, TABLEHEIGHT );
317 glVertex3f( -AREAXSIZE/2, AREAYSIZE/2, TABLEHEIGHT );
318 glEnd();
319 }
320 }
321
322 glColor4f(0.4F, 0.4F, 0.4F, 0.0F);
323 static GLfloat mat_leg[] = { 0.0F, 0.4F, 0.0F, 0.0F };
324 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_leg);
325
326 glBegin(GL_QUADS); // Draw table legs
327 glVertex3f(-TABLEWIDTH/2+0.1F, -TABLELENGTH/2+0.1F, 0.0F);
328 glVertex3f(-TABLEWIDTH/2+0.1F, -TABLELENGTH/2+0.1F, TABLEHEIGHT-TABLETHICK);
329 glVertex3f(-TABLEWIDTH/2+0.1F, -TABLELENGTH/2+0.13F, TABLEHEIGHT-TABLETHICK);
330 glVertex3f(-TABLEWIDTH/2+0.1F, -TABLELENGTH/2+0.13F, 0.0F);
331
332 glVertex3f(-TABLEWIDTH/2+0.1F, -TABLELENGTH/2+0.13F, 0.0F);
333 glVertex3f(-TABLEWIDTH/2+0.1F, -TABLELENGTH/2+0.13F, TABLEHEIGHT-TABLETHICK);
334 glVertex3f(-TABLEWIDTH/2+0.13F,-TABLELENGTH/2+0.13F, TABLEHEIGHT-TABLETHICK);
335 glVertex3f(-TABLEWIDTH/2+0.13F,-TABLELENGTH/2+0.13F, 0.0F);
336
337 glVertex3f(-TABLEWIDTH/2+0.13F, -TABLELENGTH/2+0.1F, 0.0F);
338 glVertex3f(-TABLEWIDTH/2+0.13F, -TABLELENGTH/2+0.1F, TABLEHEIGHT-TABLETHICK);
339 glVertex3f(-TABLEWIDTH/2+0.13F,-TABLELENGTH/2+0.13F, TABLEHEIGHT-TABLETHICK);
340 glVertex3f(-TABLEWIDTH/2+0.13F,-TABLELENGTH/2+0.13F, 0.0F);
341
342 glVertex3f(-TABLEWIDTH/2+0.1F, -TABLELENGTH/2+0.1F, 0.0F);
343 glVertex3f(-TABLEWIDTH/2+0.1F, -TABLELENGTH/2+0.1F, TABLEHEIGHT-TABLETHICK);
344 glVertex3f(-TABLEWIDTH/2+0.13F,-TABLELENGTH/2+0.1F, TABLEHEIGHT-TABLETHICK);
345 glVertex3f(-TABLEWIDTH/2+0.13F,-TABLELENGTH/2+0.1F, 0.0F);
346
347
348 glVertex3f(-TABLEWIDTH/2+0.1F, TABLELENGTH/2-0.1F, 0.0F);
349 glVertex3f(-TABLEWIDTH/2+0.1F, TABLELENGTH/2-0.1F, TABLEHEIGHT-TABLETHICK);
350 glVertex3f(-TABLEWIDTH/2+0.1F, TABLELENGTH/2-0.13F, TABLEHEIGHT-TABLETHICK);
351 glVertex3f(-TABLEWIDTH/2+0.1F, TABLELENGTH/2-0.13F, 0.0F);
352
353 glVertex3f(-TABLEWIDTH/2+0.1F, TABLELENGTH/2-0.13F, 0.0F);
354 glVertex3f(-TABLEWIDTH/2+0.1F, TABLELENGTH/2-0.13F, TABLEHEIGHT-TABLETHICK);
355 glVertex3f(-TABLEWIDTH/2+0.13F, TABLELENGTH/2-0.13F, TABLEHEIGHT-TABLETHICK);
356 glVertex3f(-TABLEWIDTH/2+0.13F, TABLELENGTH/2-0.13F, 0.0F);
357
358 glVertex3f(-TABLEWIDTH/2+0.13F, TABLELENGTH/2-0.1F, 0.0F);
359 glVertex3f(-TABLEWIDTH/2+0.13F, TABLELENGTH/2-0.1F, TABLEHEIGHT-TABLETHICK);
360 glVertex3f(-TABLEWIDTH/2+0.13F, TABLELENGTH/2-0.13F, TABLEHEIGHT-TABLETHICK);
361 glVertex3f(-TABLEWIDTH/2+0.13F, TABLELENGTH/2-0.13F, 0.0F);
362
363 glVertex3f(-TABLEWIDTH/2+0.1F, TABLELENGTH/2-0.1F, 0.0F);
364 glVertex3f(-TABLEWIDTH/2+0.1F, TABLELENGTH/2-0.1F, TABLEHEIGHT-TABLETHICK);
365 glVertex3f(-TABLEWIDTH/2+0.13F, TABLELENGTH/2-0.1F, TABLEHEIGHT-TABLETHICK);
366 glVertex3f(-TABLEWIDTH/2+0.13F, TABLELENGTH/2-0.1F, 0.0F);
367
368
369 glVertex3f( TABLEWIDTH/2-0.1F,-TABLELENGTH/2+0.1F, 0.0F);
370 glVertex3f( TABLEWIDTH/2-0.1F,-TABLELENGTH/2+0.1F, TABLEHEIGHT-TABLETHICK);
371 glVertex3f( TABLEWIDTH/2-0.1F,-TABLELENGTH/2+0.13F, TABLEHEIGHT-TABLETHICK);
372 glVertex3f( TABLEWIDTH/2-0.1F,-TABLELENGTH/2+0.13F, 0.0F);
373
374 glVertex3f( TABLEWIDTH/2-0.1F,-TABLELENGTH/2+0.13F, 0.0F);
375 glVertex3f( TABLEWIDTH/2-0.1F,-TABLELENGTH/2+0.13F, TABLEHEIGHT-TABLETHICK);
376 glVertex3f( TABLEWIDTH/2-0.13F,-TABLELENGTH/2+0.13F, TABLEHEIGHT-TABLETHICK);
377 glVertex3f( TABLEWIDTH/2-0.13F,-TABLELENGTH/2+0.13F, 0.0F);
378
379 glVertex3f( TABLEWIDTH/2-0.13F,-TABLELENGTH/2+0.1F, 0.0F);
380 glVertex3f( TABLEWIDTH/2-0.13F,-TABLELENGTH/2+0.1F, TABLEHEIGHT-TABLETHICK);
381 glVertex3f( TABLEWIDTH/2-0.13F,-TABLELENGTH/2+0.13F, TABLEHEIGHT-TABLETHICK);
382 glVertex3f( TABLEWIDTH/2-0.13F,-TABLELENGTH/2+0.13F, 0.0F);
383
384 glVertex3f( TABLEWIDTH/2-0.1F,-TABLELENGTH/2+0.1F, 0.0F);
385 glVertex3f( TABLEWIDTH/2-0.1F,-TABLELENGTH/2+0.1F, TABLEHEIGHT-TABLETHICK);
386 glVertex3f( TABLEWIDTH/2-0.13F,-TABLELENGTH/2+0.1F, TABLEHEIGHT-TABLETHICK);
387 glVertex3f( TABLEWIDTH/2-0.13F,-TABLELENGTH/2+0.1F, 0.0F);
388
389
390 glVertex3f( TABLEWIDTH/2-0.1F, TABLELENGTH/2-0.1F, 0.0F);
391 glVertex3f( TABLEWIDTH/2-0.1F, TABLELENGTH/2-0.1F, TABLEHEIGHT-TABLETHICK);
392 glVertex3f( TABLEWIDTH/2-0.1F, TABLELENGTH/2-0.13F, TABLEHEIGHT-TABLETHICK);
393 glVertex3f( TABLEWIDTH/2-0.1F, TABLELENGTH/2-0.13F, 0.0F);
394
395 glVertex3f( TABLEWIDTH/2-0.1F, TABLELENGTH/2-0.13F, 0.0F);
396 glVertex3f( TABLEWIDTH/2-0.1F, TABLELENGTH/2-0.13F, TABLEHEIGHT-TABLETHICK);
397 glVertex3f( TABLEWIDTH/2-0.13F, TABLELENGTH/2-0.13F, TABLEHEIGHT-TABLETHICK);
398 glVertex3f( TABLEWIDTH/2-0.13F, TABLELENGTH/2-0.13F, 0.0F);
399
400 glVertex3f( TABLEWIDTH/2-0.13F, TABLELENGTH/2-0.1F, 0.0F);
401 glVertex3f( TABLEWIDTH/2-0.13F, TABLELENGTH/2-0.1F, TABLEHEIGHT-TABLETHICK);
402 glVertex3f( TABLEWIDTH/2-0.13F, TABLELENGTH/2-0.13F, TABLEHEIGHT-TABLETHICK);
403 glVertex3f( TABLEWIDTH/2-0.13F, TABLELENGTH/2-0.13F, 0.0F);
404
405 glVertex3f( TABLEWIDTH/2-0.1F, TABLELENGTH/2-0.1F, 0.0F);
406 glVertex3f( TABLEWIDTH/2-0.1F, TABLELENGTH/2-0.1F, TABLEHEIGHT-TABLETHICK);
407 glVertex3f( TABLEWIDTH/2-0.13F, TABLELENGTH/2-0.1F, TABLEHEIGHT-TABLETHICK);
408 glVertex3f( TABLEWIDTH/2-0.13F, TABLELENGTH/2-0.1F, 0.0F);
409 glEnd();
410
411 return true;
412 }
413
414 // Draw transparent object
415 bool
RedrawAlpha()416 FieldView::RedrawAlpha() {
417 glColor4f(0.0F, 0.0F, 0.3F, 0.7F);
418 static GLfloat mat_table[] = { 0.0F, 0.0F, 0.3F, 1.0F };
419 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_table);
420
421 glBlendFunc(GL_ONE, GL_SRC_ALPHA);
422 glDepthMask(0);
423 glBegin(GL_QUADS); // Draw table
424 if ( theRC->gmode != GMODE_SIMPLE ) {
425 glNormal3f( 0.0F, 0.0F, -1.0 );
426 glVertex3f( -TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
427 glVertex3f( -TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
428 glVertex3f( TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
429 glVertex3f( TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
430
431 glNormal3f( 1.0, 0.0F, 0.0F );
432 glVertex3f( TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT );
433 glVertex3f( TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT );
434 glVertex3f( TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
435 glVertex3f( TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
436
437 glNormal3f( -1.0, 0.0F, 0.0F );
438 glVertex3f( -TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT );
439 glVertex3f( -TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT );
440 glVertex3f( -TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
441 glVertex3f( -TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
442
443 glNormal3f( 0.0F, 1.0, 0.0F );
444 glVertex3f( -TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT );
445 glVertex3f( -TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
446 glVertex3f( TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
447 glVertex3f( TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT );
448
449 glNormal3f( 0.0F, -1.0, 0.0F );
450 glVertex3f( -TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT );
451 glVertex3f( -TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
452 glVertex3f( TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT-TABLETHICK );
453 glVertex3f( TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT );
454 }
455
456 glNormal3f( 0.0F, 0.0F, 1.0 );
457 glVertex3f( -TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT );
458 glVertex3f( -TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT );
459 glVertex3f( TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT );
460 glVertex3f( TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT );
461 glEnd();
462 glDepthMask(1);
463
464 static GLfloat mat_default[] = { 0.0F, 0.0F, 0.0F, 1.0F };
465 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_default);
466
467 glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
468
469 glBegin(GL_QUADS); // Draw white line
470 glNormal3f( 0.0F, 0.0F, 1.0F );
471 glVertex3f( -TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT );
472 glVertex3f( -TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT );
473 glVertex3f( -TABLEWIDTH/2+0.02F, -TABLELENGTH/2+0.02F, TABLEHEIGHT );
474 glVertex3f( -TABLEWIDTH/2+0.02F, TABLELENGTH/2-0.02F, TABLEHEIGHT );
475
476 glNormal3f( 0.0F, 0.0F, 1.0F );
477 glVertex3f( -TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT );
478 glVertex3f( TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT );
479 glVertex3f( TABLEWIDTH/2-0.02F, -TABLELENGTH/2+0.02F, TABLEHEIGHT );
480 glVertex3f( -TABLEWIDTH/2+0.02F, -TABLELENGTH/2+0.02F, TABLEHEIGHT );
481
482 glNormal3f( 0.0F, 0.0F, 1.0F );
483 glVertex3f( TABLEWIDTH/2, -TABLELENGTH/2, TABLEHEIGHT );
484 glVertex3f( TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT );
485 glVertex3f( TABLEWIDTH/2-0.02F, TABLELENGTH/2-0.02F, TABLEHEIGHT );
486 glVertex3f( TABLEWIDTH/2-0.02F, -TABLELENGTH/2+0.02F, TABLEHEIGHT );
487
488 glNormal3f( 0.0F, 0.0F, 1.0F );
489 glVertex3f( TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT );
490 glVertex3f( -TABLEWIDTH/2, TABLELENGTH/2, TABLEHEIGHT );
491 glVertex3f( -TABLEWIDTH/2+0.02F, TABLELENGTH/2-0.02F, TABLEHEIGHT );
492 glVertex3f( TABLEWIDTH/2-0.02F, TABLELENGTH/2-0.02F, TABLEHEIGHT );
493 glEnd();
494
495 glBegin(GL_LINES);
496 glVertex3f( 0.0F, -TABLELENGTH/2, TABLEHEIGHT );
497 glVertex3f( 0.0F, TABLELENGTH/2, TABLEHEIGHT );
498 glEnd();
499
500 glColor4f(0.0F, 0.2F, 0.0F, 0.9F);
501
502 static GLfloat mat_net[] = { 0.0F, 0.2F, 0.0F, 1.0F };
503 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_net);
504 glBegin(GL_QUADS); // Draw net
505 glNormal3f( 0.0F, 1.0F, 0.0F );
506 glVertex3f( -TABLEWIDTH/2-NETHEIGHT, 0.0F, TABLEHEIGHT );
507 glVertex3f( -TABLEWIDTH/2-NETHEIGHT, 0.0F, TABLEHEIGHT+NETHEIGHT-0.01F );
508 glVertex3f( TABLEWIDTH/2+NETHEIGHT, 0.0F, TABLEHEIGHT+NETHEIGHT-0.01F );
509 glVertex3f( TABLEWIDTH/2+NETHEIGHT, 0.0F, TABLEHEIGHT );
510 glEnd();
511 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_default);
512
513 glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
514
515 glBegin(GL_QUADS);
516 glNormal3f( 0.0F, 1.0F, 0.0F );
517 glVertex3f( -TABLEWIDTH/2-NETHEIGHT, 0.0F, TABLEHEIGHT+NETHEIGHT );
518 glVertex3f( -TABLEWIDTH/2-NETHEIGHT, 0.0F, TABLEHEIGHT+NETHEIGHT-0.01F );
519 glVertex3f( TABLEWIDTH/2+NETHEIGHT, 0.0F, TABLEHEIGHT+NETHEIGHT-0.01F );
520 glVertex3f( TABLEWIDTH/2+NETHEIGHT, 0.0F, TABLEHEIGHT+NETHEIGHT );
521 glEnd();
522 glColor4f( 0.2F, 1.0F, 0.2F, 1.0F ); // Why? But my RIVA128 need it.
523
524 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
525
526 return true;
527 }
528