2
* This program is under the GNU GPL.
3
* Use at your own risk.
5
* written by David Bucciarelli (humanware@plus.it)
16
#define M_PI 3.14159265
19
#include "particles.h"
31
static int fullscreen=1;
35
static int HEIGHT=480;
36
static int NUMPART=7500;
40
static float fogcolor[4]={1.0,1.0,1.0,1.0};
45
static float q[4][3]={
52
static float qt[4][2]={
64
static GLuint groundid;
66
static float obs[3]={2.0,1.0,0.0};
69
static float alpha=-90.0;
70
static float beta=90.0;
72
static particleSystem *ps;
74
static float gettime()
76
static clock_t told=0;
85
return(ris/(float)CLOCKS_PER_SEC);
88
static float gettimerain()
90
static clock_t told=0;
99
return(ris/(float)CLOCKS_PER_SEC);
102
static void calcposobs(void)
104
dir[0]=sin(alpha*M_PI/180.0);
105
dir[2]=cos(alpha*M_PI/180.0)*sin(beta*M_PI/180.0);
106
dir[1]=cos(beta*M_PI/180.0);
112
rainParticle::setRainingArea(obs[0]-7.0f,-0.2f,obs[2]-7.0f,obs[0]+7.0f,8.0f,obs[2]+7.0f);
115
static void printstring(void *font, const char *string)
119
len=(int)strlen(string);
121
glutBitmapCharacter(font,string[i]);
124
static void reshape(int width, int height)
128
glViewport(0,0,(GLint)width,(GLint)height);
129
glMatrixMode(GL_PROJECTION);
131
gluPerspective(70.0,width/(float)height,0.1,30.0);
133
glMatrixMode(GL_MODELVIEW);
136
static void printhelp(void)
139
glColor4f(0.0,0.0,0.0,0.5);
140
glRecti(40,40,600,440);
143
glColor3f(1.0,0.0,0.0);
144
glRasterPos2i(300,420);
145
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Help");
147
glRasterPos2i(60,390);
148
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"h - Toggle Help");
150
glRasterPos2i(60,360);
151
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"f - Toggle Fog");
152
glRasterPos2i(60,330);
153
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Arrow Keys - Rotate");
154
glRasterPos2i(60,300);
155
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"a - Increase velocity");
156
glRasterPos2i(60,270);
157
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"z - Decrease velocity");
158
glRasterPos2i(60,240);
159
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"l - Increase rain length");
160
glRasterPos2i(60,210);
161
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"k - Decrease rain length");
164
static void drawrain(void)
167
static char frbuf[80];
170
glEnable(GL_DEPTH_TEST);
177
glDepthMask(GL_TRUE);
178
glClearColor(1.0,1.0,1.0,1.0);
179
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
183
gluLookAt(obs[0],obs[1],obs[2],
184
obs[0]+dir[0],obs[1]+dir[1],obs[2]+dir[2],
187
glColor4f(1.0,1.0,1.0,1.0);
189
glEnable(GL_TEXTURE_2D);
191
glBindTexture(GL_TEXTURE_2D,groundid);
193
glTexCoord2fv(qt[0]);
195
glTexCoord2fv(qt[1]);
197
glTexCoord2fv(qt[2]);
199
glTexCoord2fv(qt[3]);
205
glDisable(GL_TEXTURE_2D);
206
glShadeModel(GL_SMOOTH);
210
ps->addTime(gettimerain());
212
glShadeModel(GL_FLAT);
215
if((count % FRAME)==0) {
217
sprintf(frbuf,"Frame rate: %f",FRAME/fr);
220
glDisable(GL_TEXTURE_2D);
221
glDisable(GL_DEPTH_TEST);
224
glMatrixMode(GL_PROJECTION);
226
glOrtho(-0.5,639.5,-0.5,479.5,-1.0,1.0);
227
glMatrixMode(GL_MODELVIEW);
230
glColor3f(1.0,0.0,0.0);
231
glRasterPos2i(10,10);
232
printstring(GLUT_BITMAP_HELVETICA_18,frbuf);
233
glRasterPos2i(350,470);
234
printstring(GLUT_BITMAP_HELVETICA_10,"Rain V1.0 Written by David Bucciarelli (humanware@plus.it)");
239
reshape(WIDTH,HEIGHT);
248
static void special(int key, int x, int y)
266
static void key(unsigned char key, int x, int y)
281
rainParticle::setLength(rainParticle::getLength()+0.025f);
284
rainParticle::setLength(rainParticle::getLength()-0.025f);
295
XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
296
fullscreen=(!fullscreen);
302
static void inittextures(void)
309
glGenTextures(1,&groundid);
310
glBindTexture(GL_TEXTURE_2D,groundid);
312
if(!(img=LoadRGBImage("../images/s128.rgb",&width,&height,&format))){
313
fprintf(stderr,"Error reading a texture.\n");
316
glPixelStorei(GL_UNPACK_ALIGNMENT,4);
317
if((gluerr=(GLenum)gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height,GL_RGB,
318
GL_UNSIGNED_BYTE, (GLvoid *)(img)))) {
319
fprintf(stderr,"GLULib%s\n",gluErrorString(gluerr));
323
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
324
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
326
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
327
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
329
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
332
static void initparticle(void)
334
ps=new particleSystem;
336
rainParticle::setRainingArea(-7.0f,-0.2f,-7.0f,7.0f,8.0f,7.0f);
338
for(int i=0;i<NUMPART;i++) {
339
rainParticle *p=new rainParticle;
342
ps->addParticle((particle *)p);
346
int main(int ac,char **av)
348
fprintf(stderr,"Rain V1.0\nWritten by David Bucciarelli (humanware@plus.it)\n");
350
/* Default settings */
355
glutInitWindowPosition(0,0);
356
glutInitWindowSize(WIDTH,HEIGHT);
359
glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE);
361
if(!(win=glutCreateWindow("Rain"))) {
362
fprintf(stderr,"Error opening a window.\n");
366
reshape(WIDTH,HEIGHT);
370
glShadeModel(GL_FLAT);
371
glEnable(GL_DEPTH_TEST);
373
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
376
glFogi(GL_FOG_MODE,GL_EXP);
377
glFogfv(GL_FOG_COLOR,fogcolor);
378
glFogf(GL_FOG_DENSITY,0.1);
380
glHint(GL_FOG_HINT,GL_NICEST);
385
glutKeyboardFunc(key);
386
glutSpecialFunc(special);
387
glutDisplayFunc(drawrain);
388
glutIdleFunc(drawrain);
389
glutReshapeFunc(reshape);