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