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