#include #include GLint width=640; GLint height=480; GLfloat eye[3] = {15.0, 8.0, 0.0}; GLfloat look[3] = {0.0, 0.0, 0.0}; GLubyte texture[768]; char *texture_ascii[] = { "################", "################", "#######@@#######", "#####@@88@@#####", "####@8oooo8@####", "####@o+--+o@####", "###@8o-..-o8@###", "###@8+- -+8@###", "####@o+--+o@####", "####@8oooo8@####", "#####@@88@@#####", "#######@@#######", "################", "################", "################", "################" }; #define MAX_PARTICLES 512 struct Particle { GLboolean used; // flag: is this entry used GLfloat x, y, z; // Position GLfloat dx, dy, dz; // Directional velocity GLfloat r,g,b; // Color GLint age; // Age }; struct Particle psystem[MAX_PARTICLES]; void CreateTexture() { int i, j; GLubyte *t = texture; for (i = 0; i < 16; i++) { for (j = 0; j < 16; j++) { switch (texture_ascii[i][j]) { case '#': *t++ = 0; // R *t++ = 0; // G *t++ = 0; // B break; case '@': *t++ = 32; *t++ = 32; *t++ = 32; break; case '8': *t++ = 64; *t++ = 64; *t++ = 64; break; case 'o': *t++ = 96; *t++ = 96; *t++ = 96; break; case '+': *t++ = 128; *t++ = 128; *t++ = 128; break; case '-': *t++ = 160; *t++ = 160; *t++ = 160; break; case '.': *t++ = 192; *t++ = 192; *t++ = 192; break; case ' ': *t++ = 240; *t++ = 240; *t++ = 240; break; } } } glBindTexture(GL_TEXTURE_2D, 1); glTexImage2D(GL_TEXTURE_2D, 0, 3, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } void reshape(int w, int h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70.0, 1.3333333, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); glViewport(0, 0, w, h); glClearColor(0.0f, 0.f, 0.f, 1.f); glClearDepth(1.0); } void UpdateParticles(void) { int i; int cRate = 5; for (i = 0; i < MAX_PARTICLES; i++) { if (psystem[i].used) { psystem[i].x += psystem[i].dx; psystem[i].y += psystem[i].dy; psystem[i].z += psystem[i].dz; glPushMatrix(); glTranslatef(psystem[i].x, psystem[i].y, psystem[i].z); glColor3f(psystem[i].r, psystem[i].g, psystem[i].b); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, 0.5, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f(0.5, 0.5, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(0.5, -0.5, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, -0.5, 0.0); glEnd(); glPopMatrix(); psystem[i].age++; if (psystem[i].age > 100) psystem[i].used = GL_FALSE; } else { cRate--; if (cRate == 0) break; psystem[i].x = (GLfloat)(rand()%20) - 10.0; psystem[i].y = 10.0; psystem[i].z = (GLfloat)(rand()%20) - 10.0; psystem[i].dx = 0.0; psystem[i].dy = -0.2; psystem[i].dz = 0.0; psystem[i].r = (GLfloat)(rand()%255)/255.0; psystem[i].g = (GLfloat)(rand()%255)/255.0; psystem[i].b = (GLfloat)(rand()%255)/255.0; psystem[i].used = GL_TRUE; psystem[i].age = 0; } } } void DoFrame(void) { mglLockDisplay(); glClearColor(0.0f, 0.f, 0.f, 1.f); glClearDepth(1.0); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(eye[0], eye[1], eye[2], look[0], look[1], look[2], 0.0, 1.0, 0.0); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); glColor3f(0.2, 0.8, 0.2); glBegin(GL_QUADS); glVertex3f(-10.0, 0.0, -10.0); glVertex3f(10.0, 0.0, -10.0); glVertex3f(10.0, 0.0, 10.0); glVertex3f(-10.0, 0.0, 10.0); glEnd(); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); UpdateParticles(); glFlush(); mglUnlockDisplay(); mglSwitchDisplay(); } void keys(unsigned char c) { switch (c) { case 0x1b: mglExit(); break; } } void main(int argc, char *argv[]) { int i; for (i=1; i