2 * This program is under the GNU GPL.
3 * Use at your own risk.
5 * written by David Bucciarelli (humanware@plus.it)
14 #include "glut_wrap.h"
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(DEMOS_DATA_DIR
"s128.rgb",
313 &width
,&height
,&format
))){
314 fprintf(stderr
,"Error reading a texture.\n");
317 glPixelStorei(GL_UNPACK_ALIGNMENT
,4);
318 if((gluerr
=(GLenum
)gluBuild2DMipmaps(GL_TEXTURE_2D
, 3, width
, height
,GL_RGB
,
319 GL_UNSIGNED_BYTE
, (GLvoid
*)(img
)))) {
320 fprintf(stderr
,"GLULib%s\n",gluErrorString(gluerr
));
324 glTexParameterf(GL_TEXTURE_2D
,GL_TEXTURE_WRAP_S
,GL_REPEAT
);
325 glTexParameterf(GL_TEXTURE_2D
,GL_TEXTURE_WRAP_T
,GL_REPEAT
);
327 glTexParameterf(GL_TEXTURE_2D
,GL_TEXTURE_MIN_FILTER
,GL_LINEAR_MIPMAP_LINEAR
);
328 glTexParameterf(GL_TEXTURE_2D
,GL_TEXTURE_MAG_FILTER
,GL_LINEAR
);
330 glTexEnvf(GL_TEXTURE_ENV
,GL_TEXTURE_ENV_MODE
,GL_DECAL
);
333 static void initparticle(void)
335 ps
=new particleSystem
;
337 rainParticle::setRainingArea(-7.0f
,-0.2f
,-7.0f
,7.0f
,8.0f
,7.0f
);
339 for(int i
=0;i
<NUMPART
;i
++) {
340 rainParticle
*p
=new rainParticle
;
343 ps
->addParticle((particle
*)p
);
347 int main(int ac
,char **av
)
349 fprintf(stderr
,"Rain V1.0\nWritten by David Bucciarelli (humanware@plus.it)\n");
351 /* Default settings */
356 glutInitWindowPosition(0,0);
357 glutInitWindowSize(WIDTH
,HEIGHT
);
360 glutInitDisplayMode(GLUT_RGB
|GLUT_DEPTH
|GLUT_DOUBLE
);
362 if(!(win
=glutCreateWindow("Rain"))) {
363 fprintf(stderr
,"Error opening a window.\n");
367 reshape(WIDTH
,HEIGHT
);
371 glShadeModel(GL_FLAT
);
372 glEnable(GL_DEPTH_TEST
);
374 glBlendFunc(GL_SRC_ALPHA
,GL_ONE_MINUS_SRC_ALPHA
);
377 glFogi(GL_FOG_MODE
,GL_EXP
);
378 glFogfv(GL_FOG_COLOR
,fogcolor
);
379 glFogf(GL_FOG_DENSITY
,0.1);
381 glHint(GL_FOG_HINT
,GL_NICEST
);
386 glutKeyboardFunc(key
);
387 glutSpecialFunc(special
);
388 glutDisplayFunc(drawrain
);
389 glutIdleFunc(drawrain
);
390 glutReshapeFunc(reshape
);