from OpenGL.GL import * from OpenGL.GLU import * import random from math import * # trigonometry import pygame, sys,os, time from pygame.locals import * import Image from GLTools import * #exit clean def input(events): for event in events: if event.type == QUIT: return False if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: return False else: pass #print event return True # get an OpenGL surface pygame.init() pygame.display.set_mode((800,600), pygame.OPENGL|pygame.DOUBLEBUF) vertex_shader=""" varying vec3 v; varying vec3 N; varying vec4 C; void main(void) { v = gl_ModelViewMatrix * gl_Vertex; N = gl_NormalMatrix * gl_Normal; C = gl_Color; gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; } """; fragment_shader=""" varying vec3 N; varying vec3 v; varying vec4 C; void main(void) { vec3 L = gl_LightSource[0].position.xyz-v; // "Lambert's law"? (see notes) // Rather: faces will appear dimmer when struck in an acute angle // distance attenuation float Idiff = max(dot(normalize(L),N),0.0)*pow(length(L),-2.0); gl_FragColor = C+ // purple vec4(1.0,1.0,1.0,1.0)*Idiff; // diffuse reflection } """; # build shader program shader = Shader(vertex_shader, fragment_shader) t=0 # load a cube into a display list box = Box([0.05,0.06,0.07]) while True: t=t+1 glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(90,1,0.01,1000) gluLookAt(sin(t/260.0)*4,cos(t/260.0)*4,cos(t/687.0)*3,0,0,0,0,1,0) glClearColor(0.05, 0.06, 0.07, 1.0) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) glMatrixMode(GL_MODELVIEW) # calculate light source position ld=[sin(t/16.0)*4.0,sin(t/20.0)*4.0,cos(t/16.0)*4.0] # pass data to fragment shader glLightfv(GL_LIGHT0,GL_POSITION,[ld[0],ld[1],ld[2]]); # fallback glColor3f(1,1,1) glLoadIdentity() # render a pretty range of cubes glBlendFunc( GL_ONE, GL_ONE ) glEnable( GL_BLEND ) glDisable(GL_DEPTH_TEST) for i in range(-5,5): for j in range(-5,5): for k in range(-5,5): glPushMatrix() glTranslate(i,j,k) f = 0.1 + 0.1 * abs( sin(i + j + k) ) glScale(f,f,f) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) box.render() glScale(1.2,1.2,1.2) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) box.render() glPopMatrix() pygame.display.flip() if (input(pygame.event.get()) == False): pygame.display.quit() sys.exit(0)