1 /****************************************************************************
2 **
3 ** BillardGL.cpp   Stefan Disch, Tobias Nopper, Martina Welte 2001
4 **
5 ****************************************************************************/
6 
7 
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <GL/glut.h>
11 #include <math.h>
12 #include <string.h>
13 
14 #include "Textfeld.h"
15 #include "Schild.h"
16 #include "Tisch.h"
17 #include "Kamera.h"
18 #include "Kugel.h"
19 #include "Anzeige.h"
20 #include "Menu.h"
21 #include "Beleuchtung.h"
22 
23 #include "Namen.h"
24 #include "LA.h"
25 #include "bmp.h"
26 #include "Zeit.h"
27 #include "Physik.h"
28 #include "SpielfeldAufbau.h"
29 #include "Benutzerschnittstelle.h"
30 #include "KommandoZeilenParameter.h"
31 #include "Handling.h"
32 #include "Schiedsrichter.h"
33 #include "kugeltabellen.h"
34 #include "LadeScreen.h"
35 
36 #include "BillardGL.h"
37 
38 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
39 
40 //Tabellen
41 GLfloat Bewegungstabelle[2000][16][3];
42 GLint   Soundtabelle[1000];
43 
44 //Objekte
45 class Kugel   Kugel[16];
46 class Tisch   Tisch;
47 class Anzeige Anzeige;
48 class Kamera  Kamera;
49 class Menu Menu;
50 class Schiedsrichter Schiedsrichter;
51 class Beleuchtung Beleuchtung;
52 
53 //Sonstige Variablen
54 GLint   MouseLookLast_x;
55 GLint   MouseLookLast_y;
56 
57 GLint   Stossdauer=1999;
58 GLint   Startzeit;
59 GLint   Frames=0;
60 GLint   FrameZeitpunkt;
61 GLint   LetztesFrameZeitpunkt=-1;
62 
63 GLint   AusholStartzeit;
64 GLfloat AusholStaerke=0;
65 GLfloat MaxAusholStaerke=100;
66 
67 GLint   DelayAusgleich;
68 GLint   Faktor;
69 
70 GLint   AllerersterStoss=1;
71 
72 GLint   FullScreen;
73 GLint   Hintergrundfarbe=0;
74 
75 GLint   KugelnVersenkt[16];
76 GLint   KugelnImSpiel[16];
77 
78 GLint   xnor=0;
79 GLint   MausTasteAbgefangen=0;
80 
81 //State-Maschin'
82 GLint   StateMaschin=START;
83 GLint   Spiel=ACHTBALL;
84 GLint   SpielModus=TRAININGSSPIEL;
85 
86 // Schiedsrichter
87 GLint SchiedsrichterEntscheidung=0;
88 GLint AufnahmeWechsel=0;
89 //GLint SpielerAmStoss=0;
90 GLint Foul=0;
91 GLint LageVerbesserungKopffeld=1;
92 GLint LageVerbesserung=0;
93 GLint NeuAufbauenOderWeiterspielen=0;
94 GLint NeuAufbauenOderAchtEinsetzen=0;
95 GLint Spieler1Gewonnen=0;
96 GLint Spieler2Gewonnen=0;
97 
98 //Tasten
99 GLint Taste_Pfeil_Oben=0;
100 GLint Taste_Pfeil_Unten=0;
101 GLint Taste_Pfeil_Rechts=0;
102 GLint Taste_Pfeil_Links=0;
103 GLint Taste_Shift=0;
104 GLint Taste_Strg=0;
105 GLint Taste_Bild_Auf=0;
106 GLint Taste_Bild_Ab=0;
107 GLint Taste_Pos1=0;
108 GLint Taste_Ende=0;
109 
110 
111 //GLint   KameraFahrt=0;
112 
113 
114 //Betrachtungsweise
115 GLint PolygonMode_mode=GL_FILL;
116 GLint PolygonMode_view=GL_FRONT;
117 
118 int value;
119 
120 GLint Texturgroesse,AnzeigeTexturgroesse,TischTexturgroesse;
121 GLint KugelAufloesung;
122 GLint InvertX,InvertY,Schatten,ZBufferLoeschen;
123 GLint TexMMM;
124 GLfloat MouseSpeed,Epsilon;
125 GLint PhysikFrequenz=400;
126 GLfloat ReibungsFaktor,BandenFaktor,KollisionsFaktor;
127 GLint Farbtiefe, Reflektionen;
128 GLint BildschirmAufloesung;
129 GLint Sprache;
130 
131 GLint LadeFortschritt=0;
132 GLuint dreizehntextur;
133 GLuint logotextur;
134 
135 char Spieler1[10];
136 char Spieler2[10];
137 char NetzwerkSpieler[10];
138 char NetzwerkGegner[10];
139 
140 int OriginalFenster=0,AktuellesFenster=0;
141 
142 GLint ZeigeFPS;
143 GLint AmbientesLicht;
144 GLint TischLampen;
145 GLint GrueneLampe;
146 
147 GLfloat EffektLautstaerke=.5;
148 GLfloat MusikLautstaerke=.5;
149 
150 //KugelTabellen
151 
152 GLfloat *ball_vertices[30];
153 GLfloat *ball_texcoord[30];
154 GLint *ball_indices[30];
155 
updateGL()156 void updateGL()
157 {
158   if (ZBufferLoeschen) {glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);}
159 
160   Kamera.male();                        // Kamera-Postion und -Parameter setzen
161 
162   Beleuchtung.male();
163 
164   Tisch.maleFlaeche();                  // Tischflaeche zeichen
165 
166   glDisable(GL_DEPTH_TEST);
167 
168   Tisch.maleLinien();
169 
170   for (int Kugelnr=0;Kugelnr<16;Kugelnr++) {
171     Kugel[Kugelnr].maleSchatten();      // Schatten zeichen
172   }
173 
174   glEnable(GL_DEPTH_TEST);
175 
176   Tisch.maleBanden();
177 
178   GLfloat Abstand=0;
179   GLint Aufloesung=1;
180 
181   for (int Kugelnr2=0;Kugelnr2<16;Kugelnr2++) {
182     GLfloat x=Kugel[Kugelnr2].Pos_xCM()-Kamera.Pos_x;
183     GLfloat y=Kugel[Kugelnr2].Pos_yCM()-Kamera.Pos_y;
184     GLfloat z=Kamera.Pos_z;
185     Abstand=sqrt(x*x+y*y+z*z);
186     Aufloesung=(GLint(400/Abstand));//300
187     if (Aufloesung<3) Aufloesung=3;
188     Aufloesung=(Aufloesung/2)*2+1;
189     if (Aufloesung>KugelAufloesung) Aufloesung=KugelAufloesung;
190     Kugel[Kugelnr2].male(Aufloesung);              // Kugeln zeichen
191   }
192 
193   glDisable(GL_DEPTH_TEST);
194   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
195   glDisable(GL_LIGHTING);
196 
197   Menu.male();
198 
199   if (StateMaschin!=START) {
200     Anzeige.male();                       // Anzeige zeichnen
201   }
202   glEnable(GL_DEPTH_TEST);
203 
204   glutSwapBuffers();
205 }
206 
207 /* -------------------- timerEvent -------------------- */
timerEvent()208 void timerEvent() {
209 
210   //egal+=egal;
211 
212   //glutTimerFunc(20,timerEvent,0);
213 
214   FrameZeitpunkt=Zeit();              // Framezeit bestimmen
215 
216                                             // Faktor= Zeit seit letztem Frame
217   Faktor=FrameZeitpunkt-LetztesFrameZeitpunkt;
218 
219 
220   if (DelayAusgleich) {
221     Faktor=1;
222     DelayAusgleich=0;
223   }
224 
225   if (Faktor) {
226 
227     if (ZeigeFPS) {
228       if ((FrameZeitpunkt%200)<(LetztesFrameZeitpunkt%200)) {
229 	Menu.SetzeFPS(Frames/2);
230 	Frames=0;
231       } else Frames++;
232     }
233 
234     Menu.Update(Faktor);
235 
236     switch (StateMaschin) {
237 
238     case START: StartHandling();break;
239 
240     case BETRACHTEN: BetrachtenHandling();break;
241 
242     case ZIELEN: ZielenHandling();break;
243 
244     case AUSHOLEN: AusholenHandling();break;
245 
246     case STOSS: StossHandling();break;
247 
248     case WEISSNEU: WeissneuHandling();break;
249 
250     case SCHIEDSRICHTER: SchiedsrichterHandling();break;
251 
252     }
253 
254     Kamera.Fahrt(Faktor);
255 
256     LetztesFrameZeitpunkt=FrameZeitpunkt;
257 
258     glutPostWindowRedisplay(AktuellesFenster);
259   }
260 }
261 
262 
main(int argc,char ** argv)263 int main(int argc, char **argv)
264 {
265   //char string[10];
266 
267   KommandoZeilenParameter(argc,argv);
268 
269   for (int i=0;i<16;i++) {
270     KugelnImSpiel[i]=1;
271     KugelnVersenkt[i]=0;
272   }
273   KugelnImSpiel[0]=0;
274 
275   //GLUT initialisieren, Fenster setzen
276   glutInit(&argc, argv);
277   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
278   if (FullScreen) {
279     char temp[20];
280     sprintf(temp,"%ix%i:%i",BildschirmAufloesung,(BildschirmAufloesung*3)/4,Farbtiefe);
281     glutGameModeString(temp);
282     if (!glutGameModeGet(GLUT_GAME_MODE_POSSIBLE))
283       printf ("  No Game Mode possible!\n\n");
284     glutEnterGameMode();
285     glutFullScreen();
286   } else {
287     glutInitWindowSize (BildschirmAufloesung,(BildschirmAufloesung*3)/4);
288     glutInitWindowPosition (0, 0);
289     glutCreateWindow ("BillardGL 1.7");
290   }
291 
292   glClearColor(0,0,0,0);
293 
294 
295   glutIdleFunc(LSidle);
296 
297   //Callback zum Zeichnen der GL-Funktion
298   glutDisplayFunc(LSupdateGL);
299 
300   AktuellesFenster=glutGetWindow();
301 
302   //  CreateMenu();
303 
304   //  timerEvent(0);
305 
306   glutMainLoop();
307 
308   return EXIT_SUCCESS;
309 }
310 
311 /* -------------------- Stoss -------------------- */
Stoss(GLfloat Stoss_x,GLfloat Stoss_y)312 void Stoss(GLfloat Stoss_x, GLfloat Stoss_y) {
313 
314   Schiedsrichter.NeuerStoss();
315   SchiedsrichterEntscheidung=-1;
316 
317   Physik(Stoss_x, Stoss_y);               // Physik-Simulation
318 
319   Startzeit=Zeit();                       // Startzeit bestimmen
320 
321 }
322 
Sichtbar(int vis)323 void Sichtbar (int vis) {
324   if (vis == GLUT_VISIBLE) {
325     glutIdleFunc(timerEvent);
326   }
327 }
328 
329