import sys, time, math, os, random import Image from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * startDir = os.getcwd() def initTexture(filename): img = Image.open(filename).transpose(Image.FLIP_TOP_BOTTOM) textureID = glGenTextures(1) print 'generating texture', textureID, 'from ', filename glBindTexture(GL_TEXTURE_2D, textureID) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, img.tostring()) glBindTexture(GL_TEXTURE_2D, 0) return textureID class Square: def __init__(self, width=1.0, height=1.0, xpos=0.0, ypos=0.0, color=[1,1,1], texture=0): self.width = width self.height = height self.xpos = xpos self.ypos = ypos self.color = color self.texture = texture def draw(self): glColor3fv(self.color) if self.texture != 0: glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, self.texture) glPushMatrix() glTranslatef(self.xpos, self.ypos, 0) glBegin(GL_QUADS) glTexCoord2f(0,0) glVertex2f(-self.width/2.0, -self.height/2.0) glTexCoord2f(1,0) glVertex2f(self.width/2.0, -self.height/2.0) glTexCoord2f(1,1) glVertex2f(self.width/2.0, self.height/2.0) glTexCoord2f(0,1) glVertex2f(-self.width/2.0, self.height/2.0) glEnd() glPopMatrix() if self.texture != 0: glDisable(GL_TEXTURE_2D) objects = [] def createObjects(textureFile): global objects square1 = Square(2, 2, texture=initTexture(textureFile)) objects.append(square1) square2 = Square(xpos=2, ypos=2.5, color=[1,0,0]) objects.append(square2) def draw(): glClearColor(0, 0.3, 0.5, 0) glClear(GL_COLOR_BUFFER_BIT) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluOrtho2D(-2, 2, -2, 2) glMatrixMode(GL_MODELVIEW) for o in objects: o.draw() glutSwapBuffers() def keyboard(key, x, y): if key == chr(27): sys.exit(0) def specialkey(key,x,y): global objects if key == GLUT_KEY_LEFT: objects[0].xpos -= 0.25 elif key == GLUT_KEY_RIGHT: objects[0].xpos += 0.25 elif key == GLUT_KEY_UP: objects[0].ypos += 0.25 elif key == GLUT_KEY_DOWN: objects[0].ypos -= 0.25 def update(dummy): glutTimerFunc(16, update, 0) global objects objects[1].xpos += random.uniform(-0.1, 0.1) objects[1].ypos += random.uniform(-0.1, 0.1) glutPostRedisplay() glutInit([]) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE) glutInitWindowSize(400,400) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutKeyboardFunc(keyboard) glutSpecialFunc(specialkey) glutTimerFunc(1, update, 0) os.chdir(startDir) if len(sys.argv) > 1: createObjects(sys.argv[1]) else: createObjects("texture.jpg") glutMainLoop()