import sys, time, math, os from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from OpenGL.GL.ARB.multitexture import * from dmsgl import * # This is needed for OSX - the OpenGL.GL.ARB.multitexture functions generate errors if hasattr(os,'uname') and os.uname()[0] == 'Darwin': import multitex glActiveTextureARB = multitex.activetexture glMultiTexCoord2fARB = multitex.texcoord2f GL_CLAMP_TO_EDGE = 0x812F startdir = os.getcwd() camera = PerspCamera() camera.moveBackward(25) light = Light() light.position = [1, 3, 2, 0] basetex = Texture2D('rock.jpg', minFilter=GL_LINEAR_MIPMAP_LINEAR) texttex = Texture2D('text.tif', wrap=GL_CLAMP_TO_EDGE, texenv=GL_DECAL) showTex1 = True showTex2 = False def drawSquare(): Color.White.apply() if showTex1: glActiveTextureARB(GL_TEXTURE0_ARB) basetex.apply() if showTex2: glActiveTextureARB(GL_TEXTURE1_ARB) texttex.apply() glBegin(GL_QUADS) glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0, 0) glMultiTexCoord2fARB(GL_TEXTURE1_ARB, -0.5, -2) glVertex3f(-10, -10, 0) glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 5, 0) glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.25, -2) glVertex3f(10, -10, 0) glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 5, 5) glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.25, 3) glVertex3f(10, 10, 0) glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0, 5) glMultiTexCoord2fARB(GL_TEXTURE1_ARB, -0.5, 3) glVertex3f(-10, 10, 0) glEnd() glActiveTextureARB(GL_TEXTURE1_ARB) texttex.disable() glActiveTextureARB(GL_TEXTURE0_ARB) basetex.disable() def draw(): Color.X11['DeepSkyBlue'].clear() camera.apply() light.apply() drawSquare() glutSwapBuffers() def keyboard(key, x, y): global cameraVelDist, showTex1, showTex2 if key == chr(27): sys.exit(0) elif key == '.': cameraVelDist += 4 elif key == ',': cameraVelDist += -4 elif key == '1': showTex1 = not showTex1 elif key == '2': showTex2 = not showTex2 def keyboardUp(key, x, y): global cameraVelDist if key == chr(27): sys.exit(0) elif key == '.': cameraVelDist -= 4 elif key == ',': cameraVelDist -= -4 def specialkey(key,x,y): global cameraVelPitch, cameraVelTurn if key == GLUT_KEY_LEFT: cameraVelTurn += 90 elif key == GLUT_KEY_RIGHT: cameraVelTurn -= 90 elif key == GLUT_KEY_UP: cameraVelPitch += 90 elif key == GLUT_KEY_DOWN: cameraVelPitch -= 90 def specialkeyUp(key,x,y): global cameraVelPitch, cameraVelTurn if key == GLUT_KEY_LEFT: cameraVelTurn -= 90 elif key == GLUT_KEY_RIGHT: cameraVelTurn += 90 elif key == GLUT_KEY_UP: cameraVelPitch -= 90 elif key == GLUT_KEY_DOWN: cameraVelPitch += 90 cameraVelPitch = 0.0 cameraVelTurn = 0.0 cameraVelDist = 0.0 prevTime = time.time() def update(): global cameraVelPitch, cameraVelTurn, cameraVelDist global prevTime t = time.time() dt = t - prevTime prevTime = t camera.pitch(cameraVelPitch * dt) camera.turn(cameraVelTurn * dt) camera.moveForward(cameraVelDist * dt) glutPostRedisplay() glutInit([]) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(400,400) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutKeyboardFunc(keyboard) glutKeyboardUpFunc(keyboardUp) glutSpecialFunc(specialkey) glutSpecialUpFunc(specialkeyUp) glutIgnoreKeyRepeat(1) glutIdleFunc(update) os.chdir(startdir) glEnable(GL_DEPTH_TEST) quadric = gluNewQuadric() gluQuadricTexture(quadric, GL_TRUE) glInitMultitextureARB() glutMainLoop()