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