Agregados dos tipos de disparos y mejora visual en los checkpoints.
[nespa.git] / src / e3d_sprite.cpp
blobb5cd2f29d7a418655b02364b6bb3665cdebad5d8
1 #ifdef WIN32
2 #define WIN32_LEAN_AND_MEAN
3 #include <windows.h>
4 #endif
5 #if defined(__APPLE__) && defined(__MACH__)
6 #include <OpenGL/gl.h> // Header File For The OpenGL32 Library
7 #include <OpenGL/glu.h> // Header File For The GLu32 Library
8 #else
9 #include <GL/gl.h> // Header File For The OpenGL32 Library
10 #include <GL/glu.h> // Header File For The GLu32 Library
11 #endif
12 #include "SDL/SDL.h"
13 #include "SDL/SDL_image.h"
14 #include "SDL/SDL_timer.h"
15 #include "SDL/SDL_mixer.h"
17 #include "e3d_engine.h"
19 // Desde nespa.cpp; Callbacks
20 extern void callback_Checkpoint_onChange(int new_checkpoint);
23 string e3D_Sprite::spritelist[MAX_SPRITE_LIMIT];
24 GLuint e3D_Sprite::maxsprite;
25 GLuint e3D_Sprite::sprite_shadow;
26 e3D_Checkpoint e3D_Checkpoint::*checkpointlist[128];
27 int e3D_Checkpoint::maxcheckpoint=0;
28 int e3D_Checkpoint::currentpoint=0;
31 e3D_Sprite::e3D_Sprite(e3D_Object *parent, const char *sprite) : e3D_Object(parent)
33 // Ship.LoadObj(fileobj,size);
34 // cout << "Create ship:" << fileobj << endl;
35 //matrixidentity(position);
36 //matrixidentity(inverse);
37 //matrixidentity(inverse_orientation);
38 GLuint i;
39 nsprite=0;
40 for (i=1;i<=this->maxsprite && i<MAX_SPRITE_LIMIT;i++)
42 if (this->spritelist[i]==sprite)
44 nsprite=i;
45 // cout << "Located sprite " << sprite << " onto " << nsprite << endl;
48 if (!nsprite) LoadSprite(sprite);
49 angle=0;
50 shadowed=0;
51 R=G=B=A=1;
53 init_physics();
56 e3D_Sprite::e3D_Sprite(e3D_Object *parent, const char *sprite, double size, double density) : e3D_Object(parent)
58 GLuint i;
59 nsprite=0;
60 shadowed=0;
61 for (i=1;i<=this->maxsprite && i<MAX_SPRITE_LIMIT;i++)
63 if (this->spritelist[i]==sprite)
65 nsprite=i;
68 if (!nsprite) LoadSprite(sprite);
69 angle=0;
70 R=G=B=A=1;
71 init_physics(size,density);
74 void e3D_Sprite::LoadShadow(const char *spritefile)
76 SDL_Surface *pixsprite;
77 pixsprite = IMG_Load(spritefile);
78 if (!pixsprite) {
79 cout << "Can't load sprite " << spritefile << " onto " << nsprite << endl;
80 return;}
82 // Create MipMapped Texture
83 GLuint texture;
84 glGenTextures(1, &texture);
85 if (texture)
87 glBindTexture(GL_TEXTURE_2D, texture);
88 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
89 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
90 gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA,
91 pixsprite->w, pixsprite->h, GL_RGBA, GL_UNSIGNED_BYTE,
92 pixsprite->pixels);
95 sprite_shadow=texture;
96 spritelist[sprite_shadow]=spritefile;
97 if (maxsprite<sprite_shadow) maxsprite=sprite_shadow;
99 cout << "Loaded sprite " << spritefile << " onto " << texture << endl;
104 void e3D_Sprite::LoadSprite(const char *spritefile)
106 if (!this->sprite_shadow)
108 LoadShadow("images/shadow1.png");
110 SDL_Surface *pixsprite;
111 pixsprite = IMG_Load(spritefile);
112 if (!pixsprite) {
113 cout << "Can't load sprite " << spritefile << " onto " << nsprite << endl;
114 return;}
116 // Create MipMapped Texture
117 GLuint texture;
118 glGenTextures(1, &texture);
119 if (texture)
121 glBindTexture(GL_TEXTURE_2D, texture);
122 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
123 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
124 gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA,
125 pixsprite->w, pixsprite->h, GL_RGBA, GL_UNSIGNED_BYTE,
126 pixsprite->pixels);
129 nsprite=texture;
130 spritelist[nsprite]=spritefile;
131 if (maxsprite<nsprite) maxsprite=nsprite;
132 if (__E3D_ENGINE_DEBUG) cout << "Loaded sprite " << spritefile << " onto " << nsprite << endl;
136 void e3D_Sprite::Draw(int pass=0)
139 glDisable(GL_LIGHTING);
140 glEnable(GL_BLEND);
141 //glDepthMask(GL_FALSE);
142 // glDepthMask(GL_TRUE);
144 glPushMatrix();
146 matriz M;
147 glGetDoublev(GL_MODELVIEW_MATRIX,M);
148 matrixresetrot(M);
149 glLoadMatrixd(M);
150 glRotated(angle,0,0,1);
151 if (shadowed)
153 glBlendFunc(GL_ONE_MINUS_SRC_ALPHA,GL_SRC_COLOR); // Sustractivo
154 glBindTexture(GL_TEXTURE_2D, sprite_shadow);
155 glColor4f(1.0f,1.0f,1.0f,1.0f);
156 glBegin(GL_QUADS);
157 glNormal3f( 0.0f, 0.0f, -1.0f);
158 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f);
159 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
160 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
161 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
162 glEnd();
165 glBindTexture(GL_TEXTURE_2D, nsprite);
166 glBlendFunc(GL_SRC_ALPHA,GL_ONE); // Aditivo
167 //Render->LoadCameraRot(Render->Camera);
168 glColor4f(R,G,B,A);
169 glBegin(GL_QUADS);
170 glNormal3f( 0.0f, 0.0f, -1.0f);
171 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f);
172 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
173 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
174 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
175 glEnd();
178 glPopMatrix();
182 void e3D_Shoot::Draw(int pass=0)
184 if (life<0) return;
185 ApplyGravityForces(Render->OG_Planets);
186 if (scale_x<max_size)
188 scale_x*=1+0.02/scale_x;
189 scale_y*=1+0.02/scale_y;
190 scale_z*=1+0.02/scale_z;
191 dBodyAddRelForce(body,0,0,-speed*(max_size-scale_x));
193 life-=1.0/60.0;
194 if (life<0)
196 AutoDeleteAfterDraw=1;
198 else if (life<3)
200 scale_x=max_size*(life)/3.0;
201 scale_y=max_size*(life)/3.0;
202 scale_z=max_size*(life)/3.0;
204 glBindTexture(GL_TEXTURE_2D, nsprite);
205 glDisable(GL_LIGHTING);
206 glEnable(GL_BLEND);
207 glDepthMask(GL_FALSE);
208 glDisable(GL_ALPHA_TEST);
210 glBlendFunc(GL_SRC_ALPHA,GL_ONE); // Aditivo
212 glPushMatrix();
214 matriz M;
215 glGetDoublev(GL_MODELVIEW_MATRIX,M);
216 matrixresetrot(M);
217 glLoadMatrixd(M);
218 glRotated(angle,0,0,1);
219 //Render->LoadCameraRot(Render->Camera);
220 //glColor4f(1.0f,1.0f,1.0f,1.0f);
221 glColor4f(R,G,B,A);
222 glBegin(GL_QUADS);
223 glNormal3f( 0.0f, 0.0f, -1.0f);
224 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f);
225 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
226 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
227 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
228 glEnd();
229 glPopMatrix();
233 void e3D_Checkpoint::Draw(int pass)
235 e3D_Sprite::Draw(pass);
236 float d=1+sin(Render->App->total_time/120.0)/15.0;
237 if (cpoint!=currentpoint) d=1+sin(Render->App->total_time/240.0)/15.0;
238 glScaled(d,d,d);
239 e3D_Sprite::Draw(pass);
241 double Ax,Ay,Az;
242 double Bx,By,Bz;
243 Parent->GetXYZ(&Ax,&Ay,&Az);
244 Render->Ship1->GetXYZ(&Bx,&By,&Bz);
246 double ABx=Bx-Ax,ABy=By-Ay,ABz=Bz-Az;
247 double Rxy=sqrt(ABx*ABx+ABy*ABy);
248 double R2=Rxy*Rxy+ABz*ABz;
249 double R=sqrt(R2);
250 if (cpoint!=currentpoint && cpoint!=currentpoint-1)
252 this->A=(this->A*800+0)/801.0;
253 this->R=(this->R*30+1)/31.0;
254 this->G=(this->G*60+1)/61.0;
255 this->B=(this->B*120+1)/121.0;
257 else
259 this->A=(this->A*300+1)/301.0;
260 if (cpoint==currentpoint)
262 this->R=(this->R*100+1)/101.0;
263 this->G=(this->G*100+2/scale_x)/101.0;
264 this->B=(this->B*100+1/scale_x)/101.0;
266 else
268 this->R=(this->R*100+0)/101.0;
269 this->G=(this->G*30+.2)/31.0;
270 this->B=(this->B*100+1)/101.0;
273 if (this->R>1) this->R=1;
274 if (this->G>1) this->G=1;
275 if (this->B>1) this->B=1;
276 if (this->A>1) this->A=1;
277 R-=8.0;
278 if (R/planet_size<scale_x) {
279 if (cpoint==currentpoint)
281 currentpoint--;
282 callback_Checkpoint_onChange(currentpoint);
284 if (cpoint>currentpoint)
286 Render->Ship1->used_fuel-=sqrt(planet_size)*50.0*(scale_x-R/planet_size)/(R/planet_size+.1);
287 if (Render->Ship1->used_fuel<0) Render->Ship1->used_fuel=0;
288 scale_x=scale_y=scale_z=R/planet_size;
290 } else if (R/planet_size>scale_x*3 && scale_x<2) {
291 scale_x+=0.001;
292 scale_y+=0.001;
293 scale_z+=0.001;
297 e3D_Checkpoint::e3D_Checkpoint(e3D_Object *parent) : e3D_Sprite(parent,"images/escudos.png")
299 R=1.0;
300 G=0.2;
301 B=0.0;
302 A=0.0;
303 planet_size=Parent->scale_x;
304 float max_size=sqrt(planet_size)*1;
305 Scale(max_size,max_size,max_size);
306 //checkpointlist[maxcheckpoint]=this;
307 cpoint=currentpoint=maxcheckpoint;
308 maxcheckpoint++;