1 /*
2 * This code is released under the GNU General Public License. See COPYING for
3 * details. Copyright 2003 John Spray: spray_john@users.sourceforge.net
4 */
5
6
7 #include "Camera.h"
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
11 #include <math.h>
12 #include <SDL_opengl.h>
13 #include <SDL_ttf.h>
14 #include "Vector.h"
15 #include "Visual.h"
16 #include "LList.h"
17 #include "Player.h"
18 #include "Missile.h"
19 #include "Arena.h"
20 #include "Ufo.h"
21 #include "Mine.h"
22 #include "Obstacle.h"
23 #include "Config.h"
24
25 extern Config GLOB_conf;
26
27 #ifndef M_PI
28 #define M_PI 3.14159
29 #endif
30
31 #ifndef M_2PI
32 #define M_2PI 6.28318
33 #endif
34
Camera()35 Camera::Camera()
36 {
37 targetplayer=NULL;
38 s=0.0f;
39 v=0.0f;
40 a=0.0f;
41
42 bear=0; //RADIANS!
43 pitch=0; //RADIANS!
44 roll=0; //RADIANS
45 bearv=0;
46 pitchv=0;
47 rollv=0;
48
49 offset=10;
50
51 viewportx=0;
52 viewporty=0;
53 viewportwidth=640;
54 viewportheight=480;
55 fov=90.0f;
56 farclip=1000.0f;
57 nearclip=1.0f;
58
59 messagetimer=0.0f;
60 messagetimermax=800.0f;
61
62 movemode=CAMERA_MOVEMODE_CHASE;
63 }
64
~Camera()65 Camera::~Camera()
66 {
67 }
68
Animate()69 void Camera::Animate()
70 {
71 if(!targetplayer){
72 printf("Camera::Animate: targetplayer unset! Aborting.\n");
73 return;
74 }
75
76 Vector s_old; //use for calculating velocity
77 s_old=s;
78
79 switch(movemode){
80 case CAMERA_MOVEMODE_CHASE:
81 s.x=targetplayer->s.x-sin(targetplayer->bear+targetplayer->bearv*0.001f)*offset;
82 //s.x+=(targetplayer->s.x-sin(targetplayer->bear)*offset-s.x)*0.9f;
83 s.z=targetplayer->s.z-cos(targetplayer->bear+targetplayer->bearv*0.001f)*offset;
84 s.z+=(targetplayer->s.z-cos(targetplayer->bear)*offset-s.z)*0.9f;
85 s.y=targetplayer->s.y+offset/2;
86 pitch=-M_PI/8;
87 bear=targetplayer->bear+targetplayer->bearv*10.0f;
88
89 break;
90 case CAMERA_MOVEMODE_CLOSE:
91 s.x=targetplayer->s.x-4.0f*sin(targetplayer->bear);
92 s.z=targetplayer->s.z-4.0f*cos(targetplayer->bear);
93 s.y=targetplayer->s.y+3.0f;
94 bear=targetplayer->bear;
95 pitch=0.0f;
96 break;
97 case CAMERA_MOVEMODE_REAR:
98 s.x=targetplayer->s.x-4.0f*sin(targetplayer->bear);
99 s.z=targetplayer->s.z-4.0f*cos(targetplayer->bear);
100 s.y=targetplayer->s.y+2.0f;
101 bear=targetplayer->bear-M_PI;
102 pitch=0.0f;
103 break;
104 case CAMERA_MOVEMODE_GOD:
105 s=targetplayer->s;
106 s.x-=15.0f*sin(targetplayer->bear);
107 s.z-=15.0f*cos(targetplayer->bear);
108 s.y=30+targetplayer->v.Mag()*100.0f;
109 pitch=-M_PI/4;
110 bear=targetplayer->bear;
111 break;
112 case CAMERA_MOVEMODE_FREE:
113 bear += bearv*visual->game->dtf;
114 pitch += pitchv*visual->game->dtf;
115 roll += rollv*visual->game->dtf;
116 v+=a*visual->game->dtf;
117 s+=v*visual->game->dtf;
118 break;
119 default:
120 fprintf(stderr,"Camera::Animate: Invalid movemode %d\n",movemode);
121 break;
122 }
123
124 if(!visual->game->arena->Blocked(targetplayer->s,1.2))
125 /*this loop endless if the player is arena->Blocked itself
126 * to the same radius as we're checking the camera*/
127 while(visual->game->arena->Blocked(s,1.0f)){
128 s=targetplayer->s+(s-targetplayer->s)*0.99f;
129 }
130
131
132 //Update the vectors used for sound
133 face.x=sin(bear)*cos(pitch);
134 face.z=cos(bear)*cos(pitch);
135 face.y=sin(pitch);
136 up.y=1.0f;
137 up.z=up.x=0.0f;
138
139 if(movemode!=CAMERA_MOVEMODE_FREE)
140 v=(s-s_old)/visual->game->dtf;
141
142 }
143
Draw()144 void Camera::Draw()
145 {
146 int errornumber=0;
147
148 glClear(GL_DEPTH_BUFFER_BIT);
149 glViewport(viewportx, viewporty, viewportwidth, viewportheight);
150 glMatrixMode(GL_PROJECTION);
151 glLoadIdentity();
152 gluPerspective( fov, (float)viewportwidth/(float)viewportheight, nearclip, farclip );
153
154 glMatrixMode(GL_MODELVIEW);
155 glLoadIdentity();
156
157 glRotatef((-roll/M_PI)*180,0.0f,0.0f,1.0f);
158 glRotatef((-pitch/M_PI)*180,1.0f,0.0f,0.0f);
159 glRotatef((-bear/M_PI)*180+180,0.0f,1.0f,0.0f);
160
161 glTranslatef(-s.x,-s.y,-s.z);
162
163
164 //glEnable(GL_LIGHTING);
165 //float zero[]={0.0f,0.0f,0.0f,1.0f};
166 float white[]={1.0f,1.0f,1.0f,1.0f};
167 float ambient[]={0.7f,0.5f,0.5f,1.0f};
168 float diffuse[]={1.0f,0.0f,0.0f,1.0f};
169 float specular[]={0.0f,0.0f,0.0f,1.0f};
170 float pos[]={-1.0f,1.0f,-1.0f,0.0f};
171
172 glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
173 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);
174 glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
175
176 glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,1.0f);
177 glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,1.0f);
178 glLightfv(GL_LIGHT0,GL_POSITION,pos);
179
180 glEnable(GL_LIGHT0);
181
182 /* pos[0]=-1.0f;
183 diffuse[0]=1.0f;
184
185 glLightfv(GL_LIGHT1,GL_AMBIENT,ambient);
186 glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuse);
187 glLightfv(GL_LIGHT1,GL_SPECULAR,specular);
188
189 glLightf(GL_LIGHT1,GL_CONSTANT_ATTENUATION,1.0f);
190 glLightf(GL_LIGHT1,GL_LINEAR_ATTENUATION,1.0f);
191 glLightfv(GL_LIGHT1,GL_POSITION,pos);
192
193 glEnable(GL_LIGHT1);*/
194
195 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,white);
196 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular);
197 glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0f);
198
199
200 DrawSky();
201
202 //DrawGrid();
203
204 DrawArena(visual->game->arena);
205
206 DrawPlayer(visual->game->player);
207 if(GLOB_conf.twoplayer)
208 DrawPlayer(visual->game->player2);
209
210 LListItem<Ufo>* ufoitem=visual->game->ufolist->head;
211 while(ufoitem){
212 DrawUfo(&ufoitem->data);
213 ufoitem=ufoitem->next;
214 }
215
216 LListItem<Mine>* mineitem=visual->game->minelist->head;
217 while(mineitem){
218 DrawMine(&mineitem->data);
219 mineitem=mineitem->next;
220 }
221
222 LListItem<PowerUp>* pupitem=visual->game->poweruplist->head;
223 while(pupitem){
224 DrawPowerUp(&pupitem->data);
225 pupitem=pupitem->next;
226 }
227
228 DrawMissiles();
229
230 DrawParticles();
231
232 Draw2D();
233
234 while((errornumber=glGetError())!=GL_NO_ERROR){
235 printf("Camera::Draw: OpenGL error: %s\n",visual->HandleGlError(errornumber));
236 }
237 }
238
DrawPlayer(Player * player)239 void Camera::DrawPlayer(Player* player)
240 {
241 GLUquadricObj* quad;
242 if(!player->alive) return;
243
244 Vector vtemp1,vtemp2;
245 float ftemp;
246
247 Vector glowpos;
248 Vector glowpostail;
249
250 glBlendFunc(GL_SRC_ALPHA,GL_ONE);
251
252 glDisable(GL_LIGHTING);
253 glDisable(GL_CULL_FACE);
254 glDepthMask(GL_FALSE);
255
256 visual->UseTexture("driveparticle.png");
257 glColor4f(1.0f,1.0f,1.0f,1.0f);
258
259 glowpos=player->s;
260 glowpos.x-=sin(player->bear)*4.5f;
261 glowpos.z-=cos(player->bear)*4.5f;
262 glowpos.y-=1.0f;
263 DrawSprite(glowpos,2.5f,(player->bouncecycle/M_PI)*180.0f);
264
265 visual->UseTexture("halfdriveparticle.png");
266
267 glowpos=player->s;
268 glowpos.x-=sin(player->bear)*4.5f;
269 glowpos.z-=cos(player->bear)*4.5f;
270 glowpostail=glowpos-player->v*100.0f;
271 DrawAxisSprite(glowpos,glowpostail,2.0f);
272
273 glDepthMask(GL_TRUE);
274 glEnable(GL_CULL_FACE);
275 glEnable(GL_LIGHTING);
276
277 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
278
279
280 glPushMatrix();
281 glColor4f(1.0f,1.0f,1.0f,1.0f);
282
283 glTranslatef(player->s.x,player->s.y,player->s.z);
284
285 //we don't want the shadow to experience the player's tilt,
286 //so we render it in this ugly place
287 visual->UseTexture("shadow.png");
288 glPushMatrix();
289 //glTranslatef(sin(player->bear)*3,-player->s.y*0.99f,cos(player->bear)*3);
290 glTranslatef(0.0f,-player->s.y*0.99f,0.0f);
291 float shadowhw=3.0f;
292 shadowhw-=sin(player->bouncecycle)*0.1f;
293 glBegin(GL_QUADS);
294 glTexCoord2f(1.0f,1.0f);
295 glVertex3f(shadowhw,0.0f,shadowhw);
296 glTexCoord2f(1.0f,0.0f);
297 glVertex3f(shadowhw,0.0f,-shadowhw);
298 glTexCoord2f(0.0f,0.0f);
299 glVertex3f(-shadowhw,0.0f,-shadowhw);
300 glTexCoord2f(0.0f,1.0f);
301 glVertex3f(-shadowhw,0.0f,shadowhw);
302 glEnd();
303 glPopMatrix();
304
305 vtemp1.Set3f(sin(player->bear),0.0f,cos(player->bear));//ie player's heading vector
306 vtemp2=player->a;
307 vtemp2.Unitize();
308 ftemp=vtemp1|vtemp2;//ie the proportion of the acceleration that's parallel to the heading
309 if(ftemp<0)
310 ftemp*=-1.0f;
311
312 glRotatef((player->bear/M_PI)*180.0f,0.0f,1.0f,0.0f);
313 glRotatef((-player->strafea*0.05f*(1.0f-ftemp))*180.0f,0.0f,0.0f,1.0f);
314 //glRotatef(90.0f,0.0f,0.0f,1.0f);
315
316 visual->DrawMesh("player.mesh");
317
318 if(player->shieldeffect||(player->powerup==POWERUP_SUPERSHIELD&&player->poweruptimer>0.0f)){
319 float frac_shieldeffect=player->shieldeffect/player->maxshieldeffect;
320 glPushMatrix();
321 quad=gluNewQuadric();
322 gluQuadricNormals(quad,GL_SMOOTH);
323 gluQuadricTexture(quad,GL_TRUE);
324 glDepthMask(GL_FALSE);
325 glDisable(GL_LIGHTING);
326 visual->UseTexture("shield.png");
327 //Different behaviour for if we're here because of
328 //a powerup or a Hurt
329 if(player->shieldeffect)
330 glColor4f(1.0f,1.0f,1.0f,frac_shieldeffect);
331 else
332 glColor4f(1.0f,1.0f,1.0f,1.0f);
333
334 glScalef(1.0f,0.45f,1.0f);
335 glRotatef((player->bouncecycle/(float)M_PI)*90.0f,0.0f,0.0f,1.0f);
336 if(player->shieldeffect){
337 gluQuadricOrientation(quad,GLU_OUTSIDE);
338 gluSphere(quad,player->collideradius+player->collideradius*
339 0.25f*(1.0f-frac_shieldeffect),20,10);
340 gluQuadricOrientation(quad,GLU_INSIDE);
341 gluSphere(quad,player->collideradius+player->collideradius*
342 0.25f*(1.0f-frac_shieldeffect),20,10);
343 }
344 else{
345 gluQuadricOrientation(quad,GLU_OUTSIDE);
346 gluSphere(quad,player->collideradius,20,10);
347 gluQuadricOrientation(quad,GLU_INSIDE);
348 gluSphere(quad,player->collideradius,20,10);
349 }
350 glDepthMask(GL_TRUE);
351 glEnable(GL_LIGHTING);
352 gluDeleteQuadric(quad);
353 glPopMatrix();
354 }
355 /*
356 if(player->collideflag){
357 quad=gluNewQuadric();
358 gluQuadricOrientation(quad,GLU_OUTSIDE);
359 glDisable(GL_TEXTURE_2D);
360 glDisable(GL_LIGHTING);
361 glColor4f(0.0f,1.0f,0.0f,0.5f);
362 gluSphere(quad,player->collideradius,20,10);
363 glEnable(GL_TEXTURE_2D);
364 glEnable(GL_LIGHTING);
365 gluDeleteQuadric(quad);
366 }*/
367
368 glPopMatrix();
369
370 if(player->cannonfiring && player->cannonwait>player->cannonperiod/2.0f){
371 glDisable(GL_LIGHTING);
372 glDisable(GL_CULL_FACE);
373 glDepthMask(GL_FALSE);
374
375 Vector p1,p2;
376 p1=player->s;
377 p1.x+=sin(player->bear)*player->collideradius;
378 p1.z+=cos(player->bear)*player->collideradius;
379 p2=p1+player->tracer;
380
381 glColor4f(1.0f,1.0f,1.0f,0.35f);
382 visual->UseTexture("tracer.png");
383 DrawAxisSprite(p1,p2,0.1f);
384
385 p1=player->s;
386 p1.x+=sin(player->bear)*player->collideradius*0.5;
387 p1.z+=cos(player->bear)*player->collideradius*0.5;
388
389 p2=player->s;
390 p2.x+=sin(player->bear)*player->collideradius*1.5f;
391 p2.z+=cos(player->bear)*player->collideradius*1.5f;
392
393 visual->UseTexture("muzzleflash.png");
394 glColor4f(1.0f,1.0f,1.0f,player->cannonwait/player->cannonperiod);
395 DrawAxisSprite(p1,p2,1.0f);
396
397 glDepthMask(GL_TRUE);
398 glEnable(GL_CULL_FACE);
399 glEnable(GL_LIGHTING);
400 }
401
402 }
403
DrawGrid()404 void Camera::DrawGrid()
405 {
406 float x,y,z;
407
408 glDisable(GL_TEXTURE_2D);
409 glPointSize(5);
410 glBegin(GL_POINTS);
411 for(x=-500;x<=500;x+=10){
412 for(y=-100;y<=100;y+=10){
413 for(z=-500;z<=500;z+=10){
414 glColor4f(x,y,z,1.0f);
415 glVertex3f(x,y,z);
416 }
417 }
418 }
419 glEnd();
420 glEnable(GL_TEXTURE_2D);
421 }
422
DrawArena(Arena * arena)423 void Camera::DrawArena(Arena* arena)
424 {
425 float arenahalfwidth=arena->halfwidth;
426 float arenawallheight=arena->wallheight;
427
428 //---------------------
429 /*
430 glDisable(GL_TEXTURE_2D);
431 glDisable(GL_LIGHTING);
432 glDisable(GL_CULL_FACE);
433
434 Vector p1,p2;
435 p1.z=arenahalfwidth;
436 p1.y=5.0f;
437 p2.z=-arenahalfwidth;
438 p2.y=5.0f;
439 v=p1-p2;
440
441 Vector h=PerpLinePoint(p1,p2,s);
442
443 Vector d=h-s;
444 d.Unitize();
445 //printf("d.mag2=%f,d|v=%f,h.Mag=%f\n",d.Mag2(),d|v,h.Mag());
446
447 glColor4f(0.0f,1.0f,0.0f,1.0f);
448 glBegin(GL_LINES);
449 glVertex3f(h.x-2,h.y,h.z);
450 glVertex3f(h.x+2,h.y,h.z);
451 glVertex3f(h.x,h.y-2,h.z);
452 glVertex3f(h.x,h.y+2,h.z);
453 glVertex3f(h.x,h.y,h.z-2);
454 glVertex3f(h.x,h.y,h.z+2);
455 glEnd();
456
457
458 Vector v1,v2,v3,v4;
459
460 v1=-d*0.5f;
461 v2=d*0.5f;
462 v3=(p2-p1)+d*0.5f;
463 v4=(p2-p1)-d*0.5f;
464
465
466
467 glTranslatef(p1.x,p1.y,p1.z);
468 glRotatef(90.0f,v.x,v.y,v.z);
469 glBegin(GL_QUADS);
470 //glVertex3f(10.0f,5.0f,arenahalfwidth);
471 //glVertex3f(-10.0f,5.0f,arenahalfwidth);
472 //glVertex3f(-10.0f,5.0f,-arenahalfwidth);
473 //glVertex3f(10.0f,5.0f,-arenahalfwidth);
474 glColor4f(1.0f,0.0f,0.0f,0.5f);
475 glVertex3f(v1.x,v1.y,v1.z);
476 glColor4f(0.0f,1.0f,0.0f,0.5f);
477 glVertex3f(v2.x,v2.y,v2.z);
478 glColor4f(0.0f,0.0f,1.0f,0.5f);
479 glVertex3f(v3.x,v3.y,v3.z);
480 glColor4f(1.0f,1.0f,0.0f,0.5f);
481 glVertex3f(v4.x,v4.y,v4.z);
482 glEnd();
483 glRotatef(-90.0f,v.x,v.y,v.z);
484 glTranslatef(-p1.x,-p1.y,-p1.z);
485 glEnable(GL_CULL_FACE);
486 glEnable(GL_TEXTURE_2D);
487 glEnable(GL_LIGHTING);
488 */
489 //---------------------
490
491 glColor4f(1.0f,1.0f,1.0f,1.0f);
492
493 visual->UseTexture("arenabase.png");
494 glBegin(GL_QUADS);
495 glNormal3f(0.0f,1.0f,0.0f);
496 glTexCoord2f(arenahalfwidth/5,arenahalfwidth/5);
497 glVertex3f(arenahalfwidth,-5.0f,arenahalfwidth);
498 glTexCoord2f(arenahalfwidth/5,0.0f);
499 glVertex3f(arenahalfwidth,-5.0f,-arenahalfwidth);
500 glTexCoord2f(0.0f,0.0f);
501 glVertex3f(-arenahalfwidth,-5.0f,-arenahalfwidth);
502 glTexCoord2f(0.0f,arenahalfwidth/5);
503 glVertex3f(-arenahalfwidth,-5.0f,arenahalfwidth);
504 glEnd();
505
506 visual->UseTexture("arenawall.png");
507 glBegin(GL_QUADS);
508 glTexCoord2f(arenahalfwidth/5,arenawallheight/10);
509 glVertex3f(arenahalfwidth,-5.0f,arenahalfwidth);
510 glTexCoord2f(arenahalfwidth/5,0.0f);
511 glVertex3f(arenahalfwidth,arenawallheight,arenahalfwidth);
512 glTexCoord2f(0.0f,0.0f);
513 glVertex3f(arenahalfwidth,arenawallheight,-arenahalfwidth);
514 glTexCoord2f(0.0f,arenawallheight/10);
515 glVertex3f(arenahalfwidth,-5.0f,-arenahalfwidth);
516 glEnd();
517
518 glBegin(GL_QUADS);
519 glTexCoord2f(arenahalfwidth/5,arenawallheight/10);
520 glVertex3f(-arenahalfwidth,-5.0f,arenahalfwidth);
521 glTexCoord2f(0.0f,arenawallheight/10);
522 glVertex3f(-arenahalfwidth,-5.0f,-arenahalfwidth);
523 glTexCoord2f(0.0f,0.0f);
524 glVertex3f(-arenahalfwidth,arenawallheight,-arenahalfwidth);
525 glTexCoord2f(arenahalfwidth/5,0.0f);
526 glVertex3f(-arenahalfwidth,arenawallheight,arenahalfwidth);
527 glEnd();
528
529 glBegin(GL_QUADS);
530 glTexCoord2f(arenahalfwidth/5,arenawallheight/10);
531 glVertex3f(arenahalfwidth,-5.0f,-arenahalfwidth);
532 glTexCoord2f(arenahalfwidth/5,0.0f);
533 glVertex3f(arenahalfwidth,arenawallheight,-arenahalfwidth);
534 glTexCoord2f(0.0f,0.0f);
535 glVertex3f(-arenahalfwidth,arenawallheight,-arenahalfwidth);
536 glTexCoord2f(0.0f,arenawallheight/10);
537 glVertex3f(-arenahalfwidth,-5.0f,-arenahalfwidth);
538 glEnd();
539
540 glBegin(GL_QUADS);
541 glTexCoord2f(arenahalfwidth/5,arenawallheight/10);
542 glVertex3f(arenahalfwidth,-5.0f,arenahalfwidth);
543 glTexCoord2f(0.0f,arenawallheight/10);
544 glVertex3f(-arenahalfwidth,-5.0f,arenahalfwidth);
545 glTexCoord2f(0.0f,0.0f);
546 glVertex3f(-arenahalfwidth,arenawallheight,arenahalfwidth);
547 glTexCoord2f(arenahalfwidth/5,0.0f);
548 glVertex3f(arenahalfwidth,arenawallheight,arenahalfwidth);
549 glEnd();
550
551
552
553 visual->UseTexture("arenamesh.png");
554 glBegin(GL_QUADS);
555 glNormal3f(0.0f,1.0f,0.0f);
556 glTexCoord2f(arenahalfwidth/5,arenahalfwidth/5);
557 glVertex3f(arenahalfwidth,0.0f,arenahalfwidth);
558 glTexCoord2f(arenahalfwidth/5,0.0f);
559 glVertex3f(arenahalfwidth,0.0f,-arenahalfwidth);
560 glTexCoord2f(0.0f,0.0f);
561 glVertex3f(-arenahalfwidth,0.0f,-arenahalfwidth);
562 glTexCoord2f(0.0f,arenahalfwidth/5);
563 glVertex3f(-arenahalfwidth,0.0f,arenahalfwidth);
564 glEnd();
565
566
567 //and draw the buildings
568 LListItem<Obstacle>* obstacleitem=arena->obstaclelist.head;
569 while(obstacleitem){
570 DrawObstacle(&obstacleitem->data);
571 obstacleitem=obstacleitem->next;
572 }
573 }
574
DrawSky()575 void Camera::DrawSky(){
576 float halfwidth=5.0f;
577 float halfheight=5.0f;
578 float texy=1.0f;
579
580 glMatrixMode(GL_PROJECTION);
581 glLoadIdentity();
582 gluPerspective( fov, (float)viewportwidth/(float)viewportheight, 0.1, halfwidth+10.0f );
583
584 glMatrixMode(GL_MODELVIEW);
585
586 glPushMatrix();
587
588
589
590 glTranslatef(s.x,s.y,s.z);
591
592 glColor4f(1.0f,1.0f,1.0f,1.0f);
593
594 glDepthMask(GL_FALSE);
595 glDisable(GL_LIGHTING);
596
597 visual->UseTexture("skyfront.png");
598
599 glBegin(GL_QUADS);
600 glTexCoord2f(0.0f,0.0f);
601 glVertex3f(-halfwidth,-halfheight,halfwidth);
602 glTexCoord2f(0.0f,texy);
603 glVertex3f(-halfwidth,halfheight,halfwidth);
604 glTexCoord2f(1.0f,texy);
605 glVertex3f(halfwidth,halfheight,halfwidth);
606 glTexCoord2f(1.0f,0.0f);
607 glVertex3f(halfwidth,-halfheight,halfwidth);
608 glEnd();
609 visual->UseTexture("skyback.png");
610 glBegin(GL_QUADS);
611 glTexCoord2f(0.0f,0.0f);
612 glVertex3f(-halfwidth,-halfheight,-halfwidth);
613 glTexCoord2f(1.0f,0.0f);
614 glVertex3f(halfwidth,-halfheight,-halfwidth);
615 glTexCoord2f(1.0f,texy);
616 glVertex3f(halfwidth,halfheight,-halfwidth);
617 glTexCoord2f(0.0f,texy);
618 glVertex3f(-halfwidth,halfheight,-halfwidth);
619 glEnd();
620 visual->UseTexture("skyleft.png");
621 glBegin(GL_QUADS);
622 glTexCoord2f(0.0f,0.0f);
623 glVertex3f(halfwidth,-halfheight,-halfwidth);
624 glTexCoord2f(1.0f,0.0f);
625 glVertex3f(halfwidth,-halfheight,halfwidth);
626 glTexCoord2f(1.0f,texy);
627 glVertex3f(halfwidth,halfheight,halfwidth);
628 glTexCoord2f(0.0f,texy);
629 glVertex3f(halfwidth,halfheight,-halfwidth);
630 glEnd();
631 visual->UseTexture("skyright.png");
632 glBegin(GL_QUADS);
633 glTexCoord2f(0.0f,0.0f);
634 glVertex3f(-halfwidth,-halfheight,-halfwidth);
635 glTexCoord2f(0.0f,texy);
636 glVertex3f(-halfwidth,halfheight,-halfwidth);
637 glTexCoord2f(1.0f,texy);
638 glVertex3f(-halfwidth,halfheight,halfwidth);
639 glTexCoord2f(1.0f,0.0f);
640 glVertex3f(-halfwidth,-halfheight,halfwidth);
641 glEnd();
642 visual->UseTexture("skyup.png");
643 glBegin(GL_QUADS);
644 glTexCoord2f(0.0f,0.0f);
645 glVertex3f(-halfwidth,halfheight,-halfwidth);
646 glTexCoord2f(1.0f,00.0f);
647 glVertex3f(halfwidth,halfheight,-halfwidth);
648 glTexCoord2f(1.0f,1.0f);
649 glVertex3f(halfwidth,halfheight,halfwidth);
650 glTexCoord2f(0.0f,1.0f);
651 glVertex3f(-halfwidth,halfheight,halfwidth);
652 glEnd();
653 visual->UseTexture("skydown.png");
654 glBegin(GL_QUADS);
655 glTexCoord2f(0.0f,0.0f);
656 glVertex3f(-halfwidth,-halfheight,-halfwidth);
657 glTexCoord2f(0.0f,1.0f);
658 glVertex3f(-halfwidth,-halfheight,halfwidth);
659 glTexCoord2f(1.0f,1.0f);
660 glVertex3f(halfwidth,-halfheight,halfwidth);
661 glTexCoord2f(1.0f,0.0f);
662 glVertex3f(halfwidth,-halfheight,-halfwidth);
663 glEnd();
664
665
666 glDepthMask(GL_TRUE);
667 glEnable(GL_LIGHTING);
668
669 glPopMatrix();
670
671 glMatrixMode(GL_PROJECTION);
672 glLoadIdentity();
673 gluPerspective( fov, (float)viewportwidth/(float)viewportheight, nearclip, farclip );
674 glMatrixMode(GL_MODELVIEW);
675 }
676
677
678
679
680
DrawParticles()681 void Camera::DrawParticles(){
682 LListItem<Particle>* item;
683
684 glDepthMask(GL_FALSE);
685 glDisable(GL_LIGHTING);
686
687 item=visual->particlelist.head;
688 while(item){
689 visual->UseTexture(item->data.texfile);
690 glColor4f(1.0f,1.0f,1.0f,(float)(item->data.life)*1/(float)(item->data.startlife));
691 glBlendFunc(GL_SRC_ALPHA,item->data.blendmode);
692 glMatrixMode(GL_MODELVIEW);
693
694 if(item->data.drawmode==PARTICLE_DRAW_SIMPLE){
695 DrawSprite(item->data.s,item->data.rad,
696 ((float)item->data.life/(float)item->data.startlife)
697 *360.0f*item->data.spindir+item->data.spinoffset);
698 }
699 else if(item->data.drawmode==PARTICLE_DRAW_MOTION){
700 Vector p1;
701 Vector p2;
702 p1=item->data.s;
703 p2=item->data.s+item->data.v*40.0f;
704 DrawAxisSprite(p1,p2,item->data.rad);
705 }
706
707 item=item->next;
708 }
709
710 glDepthMask(GL_TRUE);
711 glEnable(GL_LIGHTING);
712 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
713 }
714
DrawMissiles()715 void Camera::DrawMissiles(){
716 LListItem<Missile>* item;
717 float radius=2.0f;
718 Vector p1,p2;
719
720 glDisable(GL_LIGHTING);
721 glDisable(GL_CULL_FACE);
722 glDepthMask(GL_FALSE);
723 glBlendFunc(GL_SRC_ALPHA,GL_ONE);
724 glMatrixMode(GL_MODELVIEW);
725
726 glColor4f(1.0f,1.0f,1.0f,1.0f);
727 visual->UseTexture("missiletrail.png");
728
729 item=visual->game->missilelist->head;
730 while(item){
731 p1=item->data.s-item->data.v*20.0f;
732 p2=item->data.s+item->data.v*20.0f;
733
734 DrawAxisSprite(p1,p2,radius);
735 DrawSprite(item->data.s,radius,0.0f);
736
737 item=item->next;
738 }
739
740 glEnable(GL_CULL_FACE);
741 glEnable(GL_LIGHTING);
742 glDepthMask(GL_TRUE);
743 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
744
745 }
746
747
Draw2D()748 void Camera::Draw2D(){
749 int i;
750 glDisable(GL_DEPTH_TEST);
751 glDisable(GL_LIGHTING);
752
753 float scale=(float)viewportwidth/800;
754
755 glMatrixMode(GL_PROJECTION);
756 glPushMatrix();
757 glLoadIdentity();
758 gluOrtho2D(0,viewportwidth,0,viewportheight);
759 glMatrixMode(GL_MODELVIEW);
760 glPushMatrix();
761
762 glLoadIdentity();
763
764
765 glColor4f(1.0f,1.0f,1.0f,1.0f);
766 glLineWidth(1.0f);
767
768 //countdown strip if the player's got a powerup------
769 if(targetplayer->poweruptimer){
770 glDisable(GL_TEXTURE_2D);
771 float left=0.3f,right=0.7f,width;
772 float top=0.99f,bottom=0.95f,height;
773 float powerup_frac;
774
775
776 left*=visual->game->screen->w;
777 right*=visual->game->screen->w;
778 width=right-left;
779 top*=visual->game->screen->h;
780 bottom*=visual->game->screen->h;
781 height=top-bottom;
782
783 powerup_frac=1.0f;
784
785 glBegin(GL_TRIANGLES);
786 glColor4f(0.5f,0.0f,0.0f,0.5f);
787 glVertex2f(left,top);
788 glColor4f(0.5f-powerup_frac*0.5f,powerup_frac*0.5f,0.0f,0.5f);
789 glVertex2f(left+width*powerup_frac,top-height*powerup_frac);
790 glVertex2f(left+width*powerup_frac,top);
791 glEnd();
792
793 powerup_frac=(targetplayer->poweruptimer/targetplayer->maxpoweruptimer);
794
795 glBegin(GL_TRIANGLES);
796 glColor4f(1.0f,0.0f,0.0f,0.7f);
797 glVertex2f(left,top);
798 glColor4f(1.0f-powerup_frac,powerup_frac,0.0f,0.7f);
799 glVertex2f(left+width*powerup_frac,top-height*powerup_frac);
800 glVertex2f(left+width*powerup_frac,top);
801 glEnd();
802
803 glEnable(GL_TEXTURE_2D);
804 }
805 //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
806
807
808 //draw life icons:-----------------------
809 glPushMatrix();
810 glTranslatef(20.0f*scale,20.0f*scale,0);
811 visual->UseTexture("lifeicon.png");
812
813 float iconsize=37.5f*scale;
814 float iconspacing=1.25*iconsize;
815
816 if((int)targetplayer->highlightlives%200>100)
817 glColor4f(0.0f,1.0f,0.0f,1.0f);
818 else
819 glColor4f(1.0f,1.0f,1.0f,1.0f);
820
821 glBegin(GL_QUADS);
822 for(i=0;i<targetplayer->lives;i++){
823 glTexCoord2f(0.0f,0.0f);
824 glVertex2f(0.0f,0.0f+i*iconspacing);
825 glTexCoord2f(1.0f,0.0f);
826 glVertex2f(iconsize,0.0f+i*iconspacing);
827 glTexCoord2f(1.0f,1.0f);
828 glVertex2f(iconsize,iconsize+i*iconspacing);
829 glTexCoord2f(0.0f,1.0f);
830 glVertex2f(0.0f,iconsize+i*iconspacing);
831 }
832 glEnd();
833 glPopMatrix();
834 //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
835
836 //draw health bar:------------------------------
837 float hpbarwidth=26.0f*scale;
838 float hpbarheight=160.0f*scale;
839 glPushMatrix();
840 glTranslatef(viewportwidth-20.0f*scale-hpbarwidth,20.0f*scale,0);
841 glColor4f(1-targetplayer->hp,0.0f,targetplayer->hp,0.8f);
842 glDisable(GL_TEXTURE_2D);
843 glBegin(GL_QUADS);
844 glVertex2f(0.0f,0.0f);
845 glVertex2f(hpbarwidth,0.0f);
846 glVertex2f(hpbarwidth,targetplayer->hp*hpbarheight);
847 glVertex2f(0.0f,targetplayer->hp*hpbarheight);
848 glEnd();
849 glColor4f(1.0f,1.0f,1.0f,0.4f);
850 glBegin(GL_LINES);
851 glVertex2f(0.0f,0.0f);
852 glVertex2f(hpbarwidth,0.0f);
853 glVertex2f(hpbarwidth,hpbarheight);
854 glVertex2f(0.0f,hpbarheight);
855 glVertex2f(hpbarwidth,0.0f);
856 glVertex2f(hpbarwidth,hpbarheight);
857 glVertex2f(0.0f,0.0f);
858 glVertex2f(0.0f,hpbarheight);
859 glEnd();
860 glEnable(GL_TEXTURE_2D);
861 glPopMatrix();
862 //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
863
864 SDL_Surface* text;
865 SDL_Color color = {255,255,255,0};
866 GLfloat texcoords[4];
867 int gltex;
868 char str[128];
869
870 //draw score counter:
871 if(scorefont){ //enjoy the segfault if you try and render text with an invalid font pointer
872 glPushMatrix();
873
874
875 glTranslatef(10.0f*scale,viewportheight-40.0f*scale,0.0f);
876
877 sprintf(str,"Score: %d",visual->score);
878 text=TTF_RenderText_Blended(scorefont,str,color);
879 gltex=visual->SDL_GL_LoadTexture(text,texcoords);
880 scale=(float)viewportheight/600.0f;
881
882 glDisable(GL_TEXTURE_2D);
883 glColor4f(0.0f,0.0f,0.0f,0.5f);
884 glBegin(GL_QUADS);
885 glVertex2f(0.0f,text->h*scale);
886 glVertex2f(0.0f,0.0f);
887 glVertex2f(text->w*scale,0.0f);
888 glVertex2f(text->w*scale,text->h*scale);
889 glEnd();
890 glEnable(GL_TEXTURE_2D);
891
892 glColor4f(1.0f,0.0f,0.0f,0.6f+0.4f*((visual->game->score-visual->score)/50.0f));
893 glBegin(GL_QUADS);
894 glTexCoord2f(texcoords[0],texcoords[1]);
895 glVertex2f(0.0f,text->h*scale);
896 glTexCoord2f(texcoords[0],texcoords[3]);
897 glVertex2f(0.0f,0.0f);
898 glTexCoord2f(texcoords[2],texcoords[3]);
899 glVertex2f(text->w*scale,0.0f);
900 glTexCoord2f(texcoords[2],texcoords[1]);
901 glVertex2f(text->w*scale,text->h*scale);
902 glEnd();
903
904 SDL_FreeSurface(text);
905 glDeleteTextures(1,(GLuint*)&gltex);
906
907 glPopMatrix();
908
909 //Draw messages as appropriate
910 glPushMatrix();
911
912 if(!targetplayer->alive && targetplayer->lives){
913 if(visual->game->player->SafeToRespawn()){
914 text=TTF_RenderText_Blended(scorefont,"Press Return to Respawn",color);
915 }
916 else{
917 text=TTF_RenderText_Blended(scorefont,"Wait...",color);
918 glColor4f(1.0f,0.0f,0.0f,0.7f);
919 }
920 }
921 else if(messagetimer>0.0f){
922 messagetimer-=visual->game->dtf;
923 text=TTF_RenderText_Blended(scorefont,message.c_str(),color);
924 glColor4f(1.0f,0.0f,0.0f,0.1f+0.9f*(messagetimer/messagetimermax));
925 }
926 else
927 text=NULL;
928
929
930 if(text){
931 gltex=visual->SDL_GL_LoadTexture(text,texcoords);
932
933 glTranslatef(viewportwidth/2-text->w*scale/2,viewportheight/2-text->h*scale/2,0.0f);
934
935 glBegin(GL_QUADS);
936 glTexCoord2f(texcoords[0],texcoords[1]);
937 glVertex3f(0.0f,text->h*scale,0.0f);
938 glTexCoord2f(texcoords[0],texcoords[3]);
939 glVertex3f(0.0f,0.0f,0.0f);
940 glTexCoord2f(texcoords[2],texcoords[3]);
941 glVertex3f(text->w*scale,0.0f,0.0f);
942 glTexCoord2f(texcoords[2],texcoords[1]);
943 glVertex3f(text->w*scale,text->h*scale,0.0f);
944 glEnd();
945
946 SDL_FreeSurface(text);
947 glDeleteTextures(1,(GLuint*)&gltex);
948 }
949
950 glPopMatrix();
951
952 //Draw fps reading
953 if(GLOB_conf.drawfps){
954 glPushMatrix();
955
956 glColor4f(0.0f,1.0f,0.0f,0.7f);
957
958 sprintf(str,"%.0f",1000.0f/visual->game->dtf);
959
960 text=TTF_RenderText_Blended(scorefont,str,color);
961
962 gltex=visual->SDL_GL_LoadTexture(text,texcoords);
963
964 glTranslatef(viewportwidth-text->w,viewportheight-text->h,0.0f);
965
966 glBegin(GL_QUADS);
967 glTexCoord2f(texcoords[0],texcoords[1]);
968 glVertex3f(0.0f,text->h,0.0f);
969 glTexCoord2f(texcoords[0],texcoords[3]);
970 glVertex3f(0.0f,0.0f,0.0f);
971 glTexCoord2f(texcoords[2],texcoords[3]);
972 glVertex3f(text->w,0.0f,0.0f);
973 glTexCoord2f(texcoords[2],texcoords[1]);
974 glVertex3f(text->w,text->h,0.0f);
975 glEnd();
976
977 SDL_FreeSurface(text);
978 glDeleteTextures(1,(GLuint*)&gltex);
979
980 glPopMatrix();
981 }
982
983 }
984
985 //draw radar
986 GLUquadric* quadr;
987 float compx,compy,complen;
988 complen=viewportheight*0.12f;
989 compx=viewportwidth-complen*1.1f;
990 compy=viewportheight*0.87f;
991 quadr=gluNewQuadric();
992
993 glPushMatrix();
994 glTranslatef(compx,compy,0);
995 glColor4f(0.1f,0.3f,0.1f,0.8f);
996 gluDisk(quadr,0,complen,40,2);
997 glColor4f(0.0f,0.3f,0.0f,0.3f);
998 gluDisk(quadr,complen,complen+2,40,2);
999 glColor4f(0.0f,0.3f,0.0f,0.2f);
1000 gluDisk(quadr,complen+2,complen+3,40,2);
1001 glColor4f(0.0f,0.3f,0.0f,0.1f);
1002 gluDisk(quadr,complen+3,complen+4,40,2);
1003 glRotatef(-visual->game->player->bear*180/M_PI,0,0,1);
1004 glColor4f(0.3f,0.5f,0.3f,0.5f);
1005 glBegin(GL_LINES);
1006 glVertex2f(complen,0.0f);
1007 glVertex2f(-complen,0.0f);
1008 glVertex2f(0.0f,complen);
1009 glVertex2f(0.0f,-complen);
1010 glEnd();
1011 glColor4f(0.3f,0.5f,0.3f,0.9f);
1012 glLineWidth(2.0f);
1013 glBegin(GL_LINES);
1014 glVertex2f(0.0f,complen);
1015 glVertex2f(0.0f,0.0);
1016 glEnd();
1017 glLineWidth(1.0f);
1018
1019 LListItem<Ufo>* ufo_item;
1020 LListItem<PowerUp>* powerup_item;
1021 Vector relpos;
1022 Vector arrowarm;
1023 //float theta;
1024
1025 glPointSize(2.0f);
1026 for(ufo_item=visual->game->ufolist->head;ufo_item;ufo_item=ufo_item->next){
1027 relpos=visual->game->player->s-ufo_item->data.s;
1028 relpos.z*=-1.0f; //account for ogl coordinate sys
1029 relpos.y=0.0f;
1030 if(relpos.Mag2()<visual->game->player->radarrange*
1031 visual->game->player->radarrange){
1032 relpos*=complen/visual->game->player->radarrange;
1033 glColor4f(1.0f,0.0f,0.0f,1.0f);
1034 glBegin(GL_POINTS);
1035 glVertex2f(relpos.x,relpos.z);
1036 glEnd();
1037 }
1038 else{
1039 relpos.Unitize();
1040 relpos*=complen;
1041 arrowarm.Set3f(0.0f,1.0f,0.0f);
1042 arrowarm=arrowarm^relpos;
1043 arrowarm.Unitize();
1044 arrowarm*=complen*0.08f;
1045 glColor4f(0.6f,0.0f,0.0f,1.0f);
1046 glLineWidth(2.0f);
1047 glBegin(GL_LINES);
1048 glVertex2f(relpos.x,relpos.z);
1049 glVertex2f(relpos.x-arrowarm.x,relpos.z-arrowarm.z);
1050 glVertex2f(relpos.x,relpos.z);
1051 glVertex2f(relpos.x+arrowarm.x,relpos.z+arrowarm.z);
1052 glEnd();
1053 /* relpos.Unitize();
1054 relpos*=complen;
1055 theta=atan(relpos.z/relpos.x);
1056 arrowarm.x=5.0f*cos(theta+3.14*0.3f);
1057 arrowarm.z=5.0f*sin(theta+3.14*0.3f);
1058 glColor4f(0.6f,0.0f,0.0f,1.0f);
1059 glBegin(GL_LINES);
1060 glVertex2f(relpos.x,relpos.z);
1061 glVertex2f(relpos.x-arrowarm.x,relpos.z-arrowarm.z);
1062 glEnd();
1063 arrowarm.x=5.0f*cos(theta-3.14*0.3f);
1064 arrowarm.z=5.0f*sin(theta-3.14*0.3f);
1065 glBegin(GL_LINES);
1066 glVertex2f(relpos.x,relpos.z);
1067 glVertex2f(relpos.x-arrowarm.x,relpos.z-arrowarm.z);
1068 glEnd();*/
1069 }
1070 }
1071
1072 for(powerup_item=visual->game->poweruplist->head;powerup_item;powerup_item=powerup_item->next){
1073 relpos=visual->game->player->s-powerup_item->data.s;
1074 relpos.z*=-1.0f; //account for ogl coordinate sys
1075 relpos.y=0.0f;
1076 if(relpos.Mag2()<visual->game->player->radarrange*
1077 visual->game->player->radarrange){
1078 relpos*=complen/visual->game->player->radarrange;
1079 if(powerup_item->data.nature==POWERUP_LIFE)
1080 glColor4f(1.0f,0.0f,1.0f,1.0f);
1081 else
1082 glColor4f(0.8f,0.8f,1.0f,1.0f);
1083 glBegin(GL_POINTS);
1084 glVertex2f(relpos.x,relpos.z);
1085 glEnd();
1086 }
1087 else{
1088 relpos.Unitize();
1089 relpos*=complen;
1090 arrowarm.Set3f(0.0f,1.0f,0.0f);
1091 arrowarm=arrowarm^relpos;
1092 arrowarm.Unitize();
1093 arrowarm*=5.0f;
1094 if(powerup_item->data.nature==POWERUP_LIFE)
1095 glColor4f(1.0f,0.0f,1.0f,1.0f);
1096 else
1097 glColor4f(0.8f,0.8f,1.0f,1.0f);
1098 glLineWidth(2.0f);
1099 glBegin(GL_LINES);
1100 glVertex2f(relpos.x,relpos.z);
1101 glVertex2f(relpos.x-arrowarm.x,relpos.z-arrowarm.z);
1102 glVertex2f(relpos.x,relpos.z);
1103 glVertex2f(relpos.x+arrowarm.x,relpos.z+arrowarm.z);
1104 glEnd();
1105 }
1106
1107 }
1108
1109 glPopMatrix();
1110 gluDeleteQuadric(quadr);
1111
1112 //finish up:
1113
1114 glPopMatrix();
1115
1116 glMatrixMode(GL_PROJECTION);
1117 glPopMatrix();
1118 glMatrixMode(GL_MODELVIEW);
1119 glEnable(GL_DEPTH_TEST);
1120 glEnable(GL_LIGHTING);
1121
1122 }
1123
DrawUfo(Ufo * ufo)1124 void Camera::DrawUfo(Ufo* ufo)
1125 {
1126 glPushMatrix();
1127
1128 glTranslatef(ufo->s.x,ufo->s.y,ufo->s.z);
1129
1130 glRotatef((ufo->bear/M_PI)*180.0f,0.0f,1.0f,0.0f);
1131 glScalef(1-ufo->spawneffect/ufo->maxspawneffect,1-ufo->spawneffect/ufo->maxspawneffect,1-ufo->spawneffect/ufo->maxspawneffect);
1132
1133 visual->DrawMesh("ufo.mesh");
1134
1135 glPopMatrix();
1136
1137 }
1138
DrawMine(Mine * mine)1139 void Camera::DrawMine(Mine* mine)
1140 {
1141 float spawnfrac=mine->spawneffect/mine->maxspawneffect;
1142 glPushMatrix();
1143
1144 glTranslatef(mine->s.x,mine->s.y,mine->s.z);
1145
1146 glRotatef((mine->spin/M_PI)*180.0f,0.0f,1.0f,0.0f);
1147 glScalef(1-spawnfrac,1-spawnfrac,1-spawnfrac);
1148
1149 visual->DrawMesh("mine.mesh");
1150
1151 glPopMatrix();
1152
1153 }
1154
DrawPowerUp(PowerUp * powerup)1155 void Camera::DrawPowerUp(PowerUp* powerup)
1156 {
1157 GLUquadricObj *quad;
1158 float scalefactor;
1159
1160 glPushMatrix();
1161
1162 visual->UseTexture("powerupshell.png");
1163 glColor4f(1.0f,1.0f,1.0f,1.0f);
1164
1165 glTranslatef(powerup->s.x,powerup->s.y+sin(powerup->bouncecycle)*0.3f,powerup->s.z);
1166 glRotatef(powerup->spincycle*(180.0f/M_PI),0.0f,1.0f,0.0f);
1167
1168 scalefactor=1-powerup->spawneffect/powerup->maxspawneffect;
1169 glScalef(scalefactor,scalefactor,scalefactor);
1170
1171 glLineWidth(4.0f);
1172 if(powerup->nature==POWERUP_TRIPLESHOT){
1173 glDisable(GL_TEXTURE_2D);
1174 glBegin(GL_LINES);
1175 glVertex3f(0.0f,-1.25f,0.0f);
1176 glVertex3f(0.0f,1.25f,0.0f);
1177 glVertex3f(0.0f,-1.25f,0.0f);
1178 glVertex3f(0.0f,1.25f,1.5f);
1179 glVertex3f(0.0f,-1.25f,0.0f);
1180 glVertex3f(0.0f,1.25f,-1.5f);
1181 glEnd();
1182 glEnable(GL_TEXTURE_2D);
1183 }
1184
1185 if(powerup->nature==POWERUP_GUIDANCE){
1186 glDisable(GL_TEXTURE_2D);
1187 glBegin(GL_LINES);
1188 glVertex3f(0.0f,-1.25f,0.0f);
1189 glVertex3f(0.0f,1.25f,0.0f);
1190 glVertex3f(0.0f,1.25f,0.0f);
1191 glVertex3f(0.0f,1.25f,1.5f);
1192 glEnd();
1193 glEnable(GL_TEXTURE_2D);
1194 }
1195
1196 if(powerup->nature==POWERUP_LIFE){
1197 glDisable(GL_TEXTURE_2D);
1198 glBegin(GL_LINES);
1199 glVertex3f(0.0f,-1.5f,0.0f);
1200 glVertex3f(0.0f,1.5f,0.0f);
1201 glVertex3f(0.0f,0.0f,1.5f);
1202 glVertex3f(0.0f,0.0f,-1.5f);
1203 glEnd();
1204 glEnable(GL_TEXTURE_2D);
1205 }
1206
1207 if(powerup->nature==POWERUP_SUPERSHIELD){
1208 glDisable(GL_TEXTURE_2D);
1209 glBegin(GL_LINES);
1210 glVertex3f(0.0f,-1.5f,-1.5f);
1211 glVertex3f(0.0f,1.5f,-1.5f);
1212 glVertex3f(0.0f,1.5f,1.5f);
1213 glVertex3f(0.0f,-1.5f,1.5f);
1214 glEnd();
1215 glEnable(GL_TEXTURE_2D);
1216 }
1217
1218 quad=gluNewQuadric();
1219 gluQuadricNormals(quad,GL_SMOOTH);
1220 gluQuadricTexture(quad,GL_TRUE);
1221 gluSphere(quad,3,10,10);
1222 gluDeleteQuadric(quad);
1223
1224 glPopMatrix();
1225 }
1226
DrawObstacle(Obstacle * obstacle)1227 void Camera::DrawObstacle(Obstacle* obstacle)
1228 {
1229
1230 /* Quad* quad;
1231 quad=visual->game->arena->GetLastQuad();
1232 if(quad){
1233 glDisable(GL_TEXTURE_2D);
1234 glDisable(GL_CULL_FACE);
1235 glColor4f(0.0f,1.0f,0.0f,1.0f);
1236 glBegin(GL_QUADS);
1237 glNormal3f(quad->n.x,quad->n.y,quad->n.z);
1238 glTexCoord2f(0.0f,0.0f);
1239 glVertex3f(quad->v1.x,quad->v1.y,quad->v1.z);
1240 glTexCoord2f(0.0f,1.0f);
1241 glVertex3f(quad->v2.x,quad->v2.y,quad->v2.z);
1242 glTexCoord2f(1.0f,1.0f);
1243 glVertex3f(quad->v3.x,quad->v3.y,quad->v3.z);
1244 glTexCoord2f(1.0f,0.0f);
1245 glVertex3f(quad->v4.x,quad->v4.y,quad->v4.z);
1246 glEnd();
1247 glEnable(GL_TEXTURE_2D);
1248 glEnable(GL_CULL_FACE);
1249 }*/
1250
1251 glPushMatrix();
1252 glTranslatef(obstacle->s.x,obstacle->s.y,obstacle->s.z);
1253
1254 //glLineWidth(5.0f);
1255 glColor4f(1.0f,1.0f,1.0f,1.0f);
1256 visual->UseTexture("skyscraper.png");
1257 glBegin(GL_QUADS);
1258 glNormal3f(0.0f,0.0f,-1.0f);
1259 glTexCoord2f(0.0f,0.0f);
1260 glVertex3f(0.0f,0.0f,0.0f);
1261 glTexCoord2f(0.0f,1.0f);
1262 glVertex3f(0.0f,obstacle->w.y,0.0f);
1263 glTexCoord2f(1.0f,1.0f);
1264 glVertex3f(obstacle->w.x,obstacle->w.y,0.0f);
1265 glTexCoord2f(1.0f,0.0f);
1266 glVertex3f(obstacle->w.x,0.0f,0.0f);
1267
1268 glNormal3f(0.0f,0.0f,1.0f);
1269 glTexCoord2f(0.0f,0.0f);
1270 glVertex3f(0.0f,0.0f,obstacle->w.z);
1271 glTexCoord2f(1.0f,0.0f);
1272 glVertex3f(obstacle->w.x,0.0f,obstacle->w.z);
1273 glTexCoord2f(1.0f,1.0f);
1274 glVertex3f(obstacle->w.x,obstacle->w.y,obstacle->w.z);
1275 glTexCoord2f(0.0f,1.0f);
1276 glVertex3f(0.0f,obstacle->w.y,obstacle->w.z);
1277
1278 glNormal3f(-1.0f,0.0f,0.0f);
1279 glTexCoord2f(0.0f,0.0f);
1280 glVertex3f(0.0f,0.0f,0.0f);
1281 glTexCoord2f(1.0f,0.0f);
1282 glVertex3f(0.0f,0.0f,obstacle->w.z);
1283 glTexCoord2f(1.0f,1.0f);
1284 glVertex3f(0.0f,obstacle->w.y,obstacle->w.z);
1285 glTexCoord2f(0.0f,1.0f);
1286 glVertex3f(0.0f,obstacle->w.y,0.0f);
1287
1288 glNormal3f(1.0f,0.0f,0.0f);
1289 glTexCoord2f(0.0f,0.0f);
1290 glVertex3f(obstacle->w.x,0.0f,0.0f);
1291 glTexCoord2f(0.0f,1.0f);
1292 glVertex3f(obstacle->w.x,obstacle->w.y,0.0f);
1293 glTexCoord2f(1.0f,1.0f);
1294 glVertex3f(obstacle->w.x,obstacle->w.y,obstacle->w.z);
1295 glTexCoord2f(1.0f,0.0f);
1296 glVertex3f(obstacle->w.x,0.0f,obstacle->w.z);
1297 glEnd();
1298
1299 glDisable(GL_TEXTURE_2D);
1300 glColor4f(1.0f,1.0f,1.0f,1.0f);
1301 glBegin(GL_QUADS);
1302 glNormal3f(0.0f,1.0f,0.0f);
1303 glTexCoord2f(0.0f,0.0f);
1304 glVertex3f(0.0f,obstacle->w.y,0.0f);
1305 glTexCoord2f(0.0f,1.0f);
1306 glVertex3f(0.0f,obstacle->w.y,obstacle->w.z);
1307 glTexCoord2f(1.0f,1.0f);
1308 glVertex3f(obstacle->w.x,obstacle->w.y,obstacle->w.z);
1309 glTexCoord2f(1.0f,0.0f);
1310 glVertex3f(obstacle->w.x,obstacle->w.y,0.0f);
1311 glEnd();
1312 glEnable(GL_TEXTURE_2D);
1313
1314 glPopMatrix();
1315 }
1316
SetMessage(string newmessage)1317 void Camera::SetMessage(string newmessage)
1318 {
1319 message=newmessage;
1320 messagetimer=messagetimermax;
1321 }
1322
DrawSprite(Vector s_sprite,float radius,float spin)1323 void Camera::DrawSprite(Vector s_sprite,float radius,float spin)
1324 {
1325 glPushMatrix();
1326 glTranslatef(s_sprite.x,s_sprite.y,s_sprite.z);
1327 glRotatef((bear/M_PI)*180,0.0f,1.0f,0.0f);
1328 glRotatef(-(pitch/M_PI)*180,1.0f,0.0f,0.0f);
1329 glRotatef(spin,0.0f,0.0f,1.0f);
1330
1331 glBegin(GL_QUADS);
1332 glTexCoord2f(0.0f,0.0f);
1333 glVertex3f(-radius,-radius,0.0f);
1334
1335 glTexCoord2f(0.0f,1.0f);
1336 glVertex3f(-radius,radius,0.0f);
1337
1338 glTexCoord2f(1.0f,1.0f);
1339 glVertex3f(radius,radius,0.0f);
1340
1341 glTexCoord2f(1.0f,0.0f);
1342 glVertex3f(radius,-radius,0.0f);
1343
1344 glEnd();
1345 glPopMatrix();
1346 }
1347
DrawAxisSprite(Vector p1,Vector p2,float radius)1348 void Camera::DrawAxisSprite(Vector p1,Vector p2,float radius)
1349 {
1350 Vector v_=p1-p2;
1351
1352 Vector h=PerpLinePoint(p1,p2,s);
1353
1354 Vector d=h-s;
1355 d.Unitize();
1356
1357 Vector v1,v2,v3,v4;
1358
1359 v1=-d*radius;
1360 v2=d*radius;
1361 v3=-v_+d*radius;
1362 v4=-v_-d*radius;
1363
1364 glPushMatrix();
1365 glTranslatef(p1.x,p1.y,p1.z);
1366 glRotatef(90.0f,v_.x,v_.y,v_.z);
1367 glBegin(GL_QUADS);
1368 glTexCoord2f(0.0f,0.0f);
1369 glVertex3f(v1.x,v1.y,v1.z);
1370 glTexCoord2f(1.0f,0.0f);
1371 glVertex3f(v2.x,v2.y,v2.z);
1372 glTexCoord2f(1.0f,1.0f);
1373 glVertex3f(v3.x,v3.y,v3.z);
1374 glTexCoord2f(0.0f,1.0f);
1375 glVertex3f(v4.x,v4.y,v4.z);
1376 glEnd();
1377 glPopMatrix();
1378 }
1379