import sys, time, math from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from dmsgl import * from random import * gravity = Vector([0, -9.8, 0]) class particle: def __init__(self, pos=Vector([0,0,0])): self.pos = pos self.vel = Vector([uniform(-3,3), 8, uniform(-3,3)]) self.color = [uniform(.5,1), uniform(0,1), uniform(0,0.5)] self.removeTime = time.time() + uniform(0.5,2) def update(self, dt): self.pos += self.vel * dt self.vel += gravity * dt class particleSystem: def __init__(self): self.particles = [] def addParticles(self, num): for i in range(0,num): p = particle() self.particles.append(p) def draw(self): glColor3f(1,1,1) glBegin(GL_LINES) for p in self.particles: glColor3fv(p.color) glVertex3fv(p.pos) glVertex3fv(p.pos - p.vel*0.1) glEnd() def update(self, dt): for p in self.particles: p.update(dt) t = time.time() for i in range(len(self.particles)-1, -1, -1): if self.particles[i].removeTime <= t: del self.particles[i] elif self.particles[i].pos[1] < 0: systems.append(explodeSystem(self.particles[i].pos)) del self.particles[i] self.addParticles(1) class explodeSystem: def __init__(self,pos): self.particles = [] self.addParticles(20,pos) def addParticles(self, num, pos): for i in range(0,num): p = particle(pos) self.particles.append(p) def draw(self): glColor3f(1,1,1) glBegin(GL_LINES) for p in self.particles: glColor3fv(p.color) glVertex3fv(p.pos) glVertex3fv(p.pos - p.vel*0.1) glEnd() def update(self, dt): for p in self.particles: p.update(dt) t = time.time() for i in range(len(self.particles)-1, -1, -1): if self.particles[i].removeTime <= t: del self.particles[i] systems = [particleSystem()] camera = PerspCamera() camera.moveBackward(5) def draw(): Color.X11['DeepSkyBlue'].clear() camera.apply() for s in systems: s.draw() glutSwapBuffers() def keyboard(key, x, y): global viewDistance if key == chr(27): sys.exit(0) elif key == '.': camera.moveForward(1) elif key == ',': camera.moveBackward(1) elif key == ' ': systems.append(explodeSystem(Vector([uniform(-5,5),0,uniform(-5,5)]))) def specialkey(key,x,y): global cameraVelX, cameraVelY if key == GLUT_KEY_LEFT: cameraVelY += 90 elif key == GLUT_KEY_RIGHT: cameraVelY -= 90 elif key == GLUT_KEY_UP: cameraVelX += 90 elif key == GLUT_KEY_DOWN: cameraVelX -= 90 def specialkeyUp(key,x,y): global cameraVelX, cameraVelY if key == GLUT_KEY_LEFT: cameraVelY -= 90 elif key == GLUT_KEY_RIGHT: cameraVelY += 90 elif key == GLUT_KEY_UP: cameraVelX -= 90 elif key == GLUT_KEY_DOWN: cameraVelX += 90 cameraVelX = 0.0 cameraVelY = 0.0 prevTime = time.time() def update(): global viewRotX, viewRotY, cameraVelX, cameraVelY global prevTime t = time.time() dt = t - prevTime prevTime = t camera.pitch(cameraVelX * dt) camera.turn(cameraVelY * dt) for s in systems: s.update(dt) for i in range(len(systems)-1, -1, -1): if len(systems[i].particles) == 0: del systems[i] print len(systems), 'particle systems' glutPostRedisplay() glutInit([]) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(400,400) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutKeyboardFunc(keyboard) glutSpecialFunc(specialkey) glutSpecialUpFunc(specialkeyUp) glutIgnoreKeyRepeat(1) glutIdleFunc(update) glEnable(GL_DEPTH_TEST) glutMainLoop()