1 #include <GL/glut.h>
2 #include <math.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 
6 #include "LA.h"
7 #include "bmp.h"
8 #include "createTexture.h"
9 #include "Schild.h"
10 
11 #ifndef M_PI
12 #define M_PI 3.14159265358979323846
13 #endif
14 
15 
Schild()16 Schild::Schild() {
17   SchildIndex=0;
18   SchildTyp=0;
19   Aspekt=0;
20   ax=ay=bx=by=0.0;
21   Alpha=0.0;
22   soll_ax=soll_ay=soll_bx=soll_by=0.0;
23   soll_Alpha=0.0;
24   alt_ax=alt_ay=alt_bx=alt_by=0.0;
25   alt_Alpha=0.0;
26   InAnimation=0;
27   Signal=0;
28   Zeit=0;
29   Textur=0;
30   //
31 }
32 
Initialisiere(GLint TexGr,char Name[],char AlphaName[])33 void Schild::Initialisiere(GLint TexGr,
34 			   char Name[],
35 			   char AlphaName[]){
36   FMatrix texr,texg,texb,texa;     // Matrix-Bilder, in die die Textur kommt
37   if (!SchildIndex) {
38     SchildIndex=glGenLists(1);
39   }
40   if (!Textur)
41 	glGenTextures(1,&Textur);
42   char DateiName[60];
43   sprintf(DateiName,"Texturen/%i/%s.bmp",TexGr,Name);
44   loadBMP(texr,texg,texb,DateiName);
45   sprintf(DateiName,"Texturen/%i/%s.bmp",TexGr,AlphaName);
46   loadBMP(texa,texa,texa,DateiName);
47   glBindTexture(GL_TEXTURE_2D,Textur);
48   createTextureAlpha2(texr,texg,texb,texa);
49 
50   glNewList(SchildIndex,GL_COMPILE_AND_EXECUTE);
51   glBindTexture(GL_TEXTURE_2D,Textur);
52   glEnable(GL_TEXTURE_2D);
53   glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
54   glBegin(GL_QUADS);
55   glTexCoord2f(0.0,0.0);glVertex2f(0.0,0.0);
56   glTexCoord2f(1.0,0.0);glVertex2f(1.0,0.0);
57   glTexCoord2f(1.0,1.0);glVertex2f(1.0,1.0);
58   glTexCoord2f(0.0,1.0);glVertex2f(0.0,1.0);
59   glEnd();
60   glDisable(GL_TEXTURE_2D);
61   glEndList();
62 
63   Aspekt=(texr.nch+1.0)/(texr.nrh+1.0);
64 
65   texr.free_FMatrix();
66   texg.free_FMatrix();
67   texb.free_FMatrix();
68   texa.free_FMatrix();
69 
70   ax=alt_ax=soll_ax=0;
71   ay=alt_ay=soll_ay=0;
72   bx=alt_bx=soll_bx=0;
73   by=alt_by=soll_by=0;
74 
75   Alpha=alt_Alpha=soll_Alpha=AUSGEBLENDET;
76   InAnimation=0;
77 
78   SchildTyp=1;
79 
80 }
81 
Initialisiere(GLint TexGr,char Name[])82 void Schild::Initialisiere(GLint TexGr,
83 			   char Name[]){
84   FMatrix texr,texg,texb;     // Matrix-Bilder, in die die Textur kommt
85   if (!SchildIndex) {
86     SchildIndex=glGenLists(1);
87   }
88   if (!Textur)
89 	glGenTextures(1,&Textur);
90   char DateiName[60];
91   sprintf(DateiName,"Texturen/%i/%s.bmp",TexGr,Name);
92   loadBMP(texr,texg,texb,DateiName);
93   glBindTexture(GL_TEXTURE_2D,Textur);
94   createTextureAlpha(texr,texg,texb);
95 
96   glNewList(SchildIndex,GL_COMPILE_AND_EXECUTE);
97   glBindTexture(GL_TEXTURE_2D,Textur);
98   glEnable(GL_TEXTURE_2D);
99   glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
100   glBegin(GL_QUADS);
101   glTexCoord2f(0.0,0.0);glVertex2f(0.0,0.0);
102   glTexCoord2f(1.0,0.0);glVertex2f(1.0,0.0);
103   glTexCoord2f(1.0,1.0);glVertex2f(1.0,1.0);
104   glTexCoord2f(0.0,1.0);glVertex2f(0.0,1.0);
105   glEnd();
106   glDisable(GL_TEXTURE_2D);
107   glEndList();
108 
109   Aspekt=(texr.nch+1.0)/(texr.nrh+1.0);
110 
111   texr.free_FMatrix();
112   texg.free_FMatrix();
113   texb.free_FMatrix();
114 
115   ax=0; alt_ax=0; soll_ax=0;
116   ay=0, alt_ay=0; soll_ay=0;
117   bx=0; alt_bx=0; soll_bx=0;
118   by=0; alt_by=0; soll_by=0;
119 
120   Alpha=alt_Alpha=soll_Alpha=AUSGEBLENDET;
121   InAnimation=0;
122 
123   SchildTyp=1;
124 }
125 
InitialisiereLogo()126 void Schild::InitialisiereLogo() {
127   if (!SchildIndex) {
128     SchildIndex=glGenLists(1);
129   }
130   Textur=logotextur;
131   glNewList(SchildIndex,GL_COMPILE_AND_EXECUTE);
132   glBindTexture(GL_TEXTURE_2D,Textur);
133   glEnable(GL_TEXTURE_2D);
134   glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
135   glBegin(GL_QUADS);
136   glTexCoord2f(0.0,0.0);glVertex2f(0.0,0.0);
137   glTexCoord2f(1.0,0.0);glVertex2f(1.0,0.0);
138   glTexCoord2f(1.0,1.0);glVertex2f(1.0,1.0);
139   glTexCoord2f(0.0,1.0);glVertex2f(0.0,1.0);
140   glEnd();
141   glDisable(GL_TEXTURE_2D);
142   glEndList();
143 
144   Aspekt=4;
145 
146   ax=0; alt_ax=0; soll_ax=0;
147   ay=0, alt_ay=0; soll_ay=0;
148   bx=0; alt_bx=0; soll_bx=0;
149   by=0; alt_by=0; soll_by=0;
150 
151   Alpha=alt_Alpha=soll_Alpha=AUSGEBLENDET;
152   InAnimation=0;
153 
154   SchildTyp=1;
155 }
156 
InitialisiereBuchstabe(GLint TexGr,char Name[])157 void Schild::InitialisiereBuchstabe(GLint TexGr,
158 			   char Name[]){
159   FMatrix texr,texg,texb;     // Matrix-Bilder, in die die Textur kommt
160   if (!SchildIndex) {
161     SchildIndex=glGenLists(1);
162   }
163   if (!Textur)
164 	glGenTextures(1,&Textur);
165   char DateiName[60];
166   sprintf(DateiName,"Texturen/buchstaben/%i/%s.bmp",TexGr,Name);
167   loadBMP(texr,texg,texb,DateiName);
168   glBindTexture(GL_TEXTURE_2D,Textur);
169   createTextureAlpha(texr,texg,texb);
170 
171   glNewList(SchildIndex,GL_COMPILE_AND_EXECUTE);
172   glBindTexture(GL_TEXTURE_2D,Textur);
173   glEnable(GL_TEXTURE_2D);
174   glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
175   glBegin(GL_QUADS);
176   glTexCoord2f(0.0,0.0);glVertex2f(0.0,0.0);
177   glTexCoord2f(1.0,0.0);glVertex2f(1.0,0.0);
178   glTexCoord2f(1.0,1.0);glVertex2f(1.0,1.0);
179   glTexCoord2f(0.0,1.0);glVertex2f(0.0,1.0);
180   glEnd();
181   glDisable(GL_TEXTURE_2D);
182   glEndList();
183 
184   Aspekt=(texr.nch+1.0)/(texr.nrh+1.0);
185 
186   texr.free_FMatrix();
187   texg.free_FMatrix();
188   texb.free_FMatrix();
189 
190   ax=0; alt_ax=0; soll_ax=0;
191   ay=0, alt_ay=0; soll_ay=0;
192   bx=0; alt_bx=0; soll_bx=0;
193   by=0; alt_by=0; soll_by=0;
194 
195   Alpha=alt_Alpha=soll_Alpha=AUSGEBLENDET;
196   InAnimation=0;
197 
198   SchildTyp=1;
199 }
200 
Initialisiere(GLint TexGr,char Name[],char Land)201 void Schild::Initialisiere(GLint TexGr,
202 			   char Name[],
203 			   char Land){
204   Land='c';
205   FMatrix texr,texg,texb;     // Matrix-Bilder, in die die Textur kommt
206   if (!SchildIndex) {
207     SchildIndex=glGenLists(1);
208   }
209   if (!Textur)
210 	glGenTextures(1,&Textur);
211   char DateiName[60];
212   sprintf(DateiName,"Texturen/%i/%s.bmp",TexGr,Name);
213   loadBMP(texr,texg,texb,DateiName);
214   glBindTexture(GL_TEXTURE_2D,Textur);
215   createTexture(texr,texg,texb);
216 
217   glNewList(SchildIndex,GL_COMPILE_AND_EXECUTE);
218   glBindTexture(GL_TEXTURE_2D,Textur);
219   glEnable(GL_TEXTURE_2D);
220   glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
221   glBegin(GL_QUADS);
222   glTexCoord2f(0.0,0.0);glVertex2f(0.0,0.0);
223   glTexCoord2f(1.0,0.0);glVertex2f(1.0,0.0);
224   glTexCoord2f(1.0,1.0);glVertex2f(1.0,1.0);
225   glTexCoord2f(0.0,1.0);glVertex2f(0.0,1.0);
226   glEnd();
227   glDisable(GL_TEXTURE_2D);
228   glEndList();
229 
230   Aspekt=(texr.nch+1.0)/(texr.nrh+1.0);
231 
232   texr.free_FMatrix();
233   texg.free_FMatrix();
234   texb.free_FMatrix();
235 
236   ax=0; alt_ax=0; soll_ax=0;
237   ay=0, alt_ay=0; soll_ay=0;
238   bx=0; alt_bx=0; soll_bx=0;
239   by=0; alt_by=0; soll_by=0;
240 
241   Alpha=alt_Alpha=soll_Alpha=AUSGEBLENDET;
242   InAnimation=0;
243 
244   SchildTyp=1;
245 }
246 
Initialisiere()247 void Schild::Initialisiere(){
248   if (!SchildIndex) {
249     SchildIndex=glGenLists(1);
250   }
251   glNewList(SchildIndex,GL_COMPILE_AND_EXECUTE);
252   glBegin(GL_QUADS);
253   glVertex2f(0.0,0.0);
254   glVertex2f(1.0,0.0);
255   glVertex2f(1.0,1.0);
256   glVertex2f(0.0,1.0);
257   glEnd();
258   glEndList();
259 
260   ax=alt_ax=soll_ax=8;
261   ay=alt_ay=soll_ay=6;
262   bx=alt_bx=soll_bx=8.1;
263   by=alt_by=soll_by=6.1;
264 
265   Alpha=alt_Alpha=soll_Alpha=AUSGEBLENDET;
266   //Alpha=alt_Alpha=soll_Alpha=EINGEBLENDET;
267   InAnimation=0;
268 
269   Aspekt=0.0;
270 
271   SchildTyp=3;
272 }
273 
KopieVon(Schild Vorbild)274 void Schild::KopieVon(Schild Vorbild) {
275   SchildIndex=Vorbild.SchildIndex;
276   SchildTyp=Vorbild.SchildTyp;
277   Aspekt=Vorbild.Aspekt;
278   ax=alt_ax=soll_ax=0;
279   ay=alt_ay=soll_ay=0;
280   bx=alt_bx=soll_bx=0;
281   by=alt_by=soll_by=0;
282   Alpha=alt_Alpha=soll_Alpha=AUSGEBLENDET;
283   InAnimation=0;
284   Signal=0;
285 }
286 
male()287 void Schild::male(){
288   if (Alpha) {
289     glPushMatrix();
290     glTranslatef(ax,ay,0);
291     glScalef(bx-ax,by-ay,1);
292     glColor4f(1.0,1.0,1.0,Alpha);
293     glCallList(SchildIndex);
294     glPopMatrix();
295   }
296 }
297 
Positioniere(GLfloat ax_,GLfloat ay_,GLfloat bx_,GLfloat by_)298 void Schild::Positioniere(GLfloat ax_,GLfloat ay_,GLfloat bx_,GLfloat by_) {
299   // Nur wenn neue Position
300   /*
301   if (soll_ax != ax_ ||
302       soll_ay != ay_ ||
303       soll_bx != bx_ ||
304       soll_by != by_) {
305   */
306   {
307     //printf("%f %f %f %f\n %f %f %f %f\n",
308     //ax_,ay_,bx_,by_,soll_ax,soll_ay,soll_bx,soll_by);
309 
310     // Korrigiere Aspekt
311     if (Aspekt!=0.0 && Aspekt!=(bx_-ax_)/(by_-ay_)) {
312       GLfloat cx=(ax_+bx_)*.5;
313       ax_=cx-Aspekt*(by_-ay_)*.5;
314       bx_=cx+Aspekt*(by_-ay_)*.5;
315     }
316 
317     soll_ax=ax_;
318     soll_ay=ay_;
319     soll_bx=bx_;
320     soll_by=by_;
321 
322     if (SchildTyp==3) {
323       soll_Alpha=TRANSPARENT;
324     } else {
325       soll_Alpha=EINGEBLENDET;
326     }
327 
328     if (Alpha==AUSGEBLENDET) {
329 
330       ax=((soll_ax-8)/1.5)+8;
331       ay=((soll_ay-6)/1.5)+6;
332       bx=((soll_bx-8)/1.5)+8;
333       by=((soll_by-6)/1.5)+6;
334 
335       /*
336 	ax=((24.0*rand())/RAND_MAX)-4;
337 	ay=((14.0*rand())/RAND_MAX)-1;
338 	bx=ax+2*(bx_-ax_);
339 	by=ay+2*(by_-ay_);
340       */
341     }
342 
343     Signal=0;
344 
345     StarteAnimation();
346 
347     //printf("  %f %f %f %f\n   %f %f %f %f\n",
348     //ax_,ay_,bx_,by_,soll_ax,soll_ay,soll_bx,soll_by);
349 
350   }
351 }
352 
PositioniereFix(GLfloat ax_,GLfloat ay_,GLfloat bx_,GLfloat by_)353 void Schild::PositioniereFix(GLfloat ax_,GLfloat ay_,GLfloat bx_,GLfloat by_) {
354 
355   if (Aspekt!=0.0 && Aspekt!=(bx_-ax_)/(by_-ay_)) {
356     GLfloat cx=(ax_+bx_)*.5;
357     ax_=cx-Aspekt*(by_-ay_)*.5;
358     bx_=cx+Aspekt*(by_-ay_)*.5;
359   }
360 
361   ax=soll_ax=ax_;
362   ay=soll_ay=ay_;
363   bx=soll_bx=bx_;
364   by=soll_by=by_;
365 
366   Alpha=soll_Alpha=EINGEBLENDET;
367   Signal=0;
368 
369 
370 
371 }
372 
Desaktiviere()373 void Schild::Desaktiviere() {
374   soll_Alpha=AUSGEBLENDET;
375 
376   soll_ax=((ax-8)*1.5)+8;
377   soll_ay=((ay-6)*1.5)+6;
378   soll_bx=((bx-8)*1.5)+8;
379   soll_by=((by-6)*1.5)+6;
380 
381   /*
382       soll_ax=((24.0*rand())/RAND_MAX)-4;
383       soll_ay=((14.0*rand())/RAND_MAX)-1;
384       soll_bx=soll_ax+.5*(bx-ax);
385       soll_by=soll_ay+.5*(by-ay);
386   */
387   if (soll_Alpha!=Alpha) StarteAnimation();
388 }
389 
Angewaehlt()390 void Schild::Angewaehlt() {
391   Alpha=ANGEWAEHLT;
392   soll_Alpha=EINGEBLENDET;
393   if (soll_Alpha!=Alpha) StarteAnimation();
394 }
395 
Eingeblendet()396 void Schild::Eingeblendet() {
397   soll_Alpha=EINGEBLENDET;
398   if (soll_Alpha!=Alpha) StarteAnimation();
399 }
400 
VollSichtbar()401 void Schild::VollSichtbar() {
402   soll_Alpha=VOLLSICHTBAR;
403   if (soll_Alpha!=Alpha) StarteAnimation();
404 }
405 
StarteAnimation()406 void Schild::StarteAnimation(){
407   InAnimation=1;
408   Zeit=0;
409   alt_ax=ax;
410   alt_ay=ay;
411   alt_bx=bx;
412   alt_by=by;
413   alt_Alpha=Alpha;
414 }
415 /*
416   GLint Schild::Animiere(GLint Zeit){
417   if (!InAnimation) {return 0;}
418   if (Zeit>=ANIMATIONSDAUER) {
419   ax=soll_ax;
420   ay=soll_ay;
421   bx=soll_bx;
422   by=soll_by;
423   Alpha=soll_Alpha;
424   InAnimation=0;
425   return 1;
426   } else {
427   GLfloat Faktor=(.5-.5*cos(M_PI*Zeit/ANIMATIONSDAUER));
428   ax=(soll_ax-alt_ax)*Faktor+alt_ax;
429   ay=(soll_ay-alt_ay)*Faktor+alt_ay;
430   bx=(soll_bx-alt_bx)*Faktor+alt_bx;
431   by=(soll_by-alt_by)*Faktor+alt_by;
432   Alpha=(soll_Alpha-alt_Alpha)*Faktor+alt_Alpha;
433   return 0;
434   }
435   }
436 */
Animiere(GLint Faktor)437 GLint Schild::Animiere(GLint Faktor){
438   if (!InAnimation) {return 0;}
439   Zeit+=Faktor;
440   if (Zeit>=ANIMATIONSDAUER) {
441     ax=soll_ax;
442     ay=soll_ay;
443     bx=soll_bx;
444     by=soll_by;
445     Alpha=soll_Alpha;
446     InAnimation=0;
447     return 1;
448   } else {
449     GLfloat Faktor=(.5-.5*cos(M_PI*Zeit/ANIMATIONSDAUER));
450     ax=(soll_ax-alt_ax)*Faktor+alt_ax;
451     ay=(soll_ay-alt_ay)*Faktor+alt_ay;
452     bx=(soll_bx-alt_bx)*Faktor+alt_bx;
453     by=(soll_by-alt_by)*Faktor+alt_by;
454     Alpha=(soll_Alpha-alt_Alpha)*Faktor+alt_Alpha;
455     return 0;
456   }
457 }
458 
459 
460 
Maustaste(int Taste,int Richtung,int x,int y)461 GLint Schild::Maustaste(int Taste,int Richtung,int x,int y) {
462   GLfloat xf=16.0*x/glutGet(GLUT_WINDOW_WIDTH);
463   GLfloat yf=12.0-12.0*y/glutGet(GLUT_WINDOW_HEIGHT);
464 
465   if (soll_Alpha>0.0 &&
466       Signal!=0 &&
467       ax<=xf && xf<=bx && ay<=yf && yf<=by) {
468     if (Taste==GLUT_LEFT_BUTTON) {
469       if (Richtung==GLUT_DOWN) {
470 	Angewaehlt();
471 	return -1;
472       } else {
473 	return Signal;
474       }
475     } else {
476       return -1;
477     }
478   } else {
479     return 0;
480   }
481 }
482 
SetzeSignal(GLint NeuesSignal)483 void Schild::SetzeSignal(GLint NeuesSignal) {
484   Signal=NeuesSignal;
485 }
486