Files
FreeJ/scripts/python/pygame/lesson_freej04.py
2008-12-02 01:59:23 +01:00

248 lines
8.0 KiB
Python

#!/usr/bin/env python
# pygame + PyOpenGL version of Nehe's OpenGL lesson06
# Paul Furber 2001 - m@verick.co.za
import os
import sys
from OpenGL.GL import *
from OpenGL.GLU import *
import pygame, pygame.image
from pygame.locals import *
# init freej and create a layer
import freej
import time
import random
import math
freejc = freej.Context()
freejc.init(512,512,2,0)
freejc.plugger.refresh(freejc)
freejc2 = freej.Context()
freejc2.init(512,512,2,0)
freejc2.plugger.refresh(freejc2)
for gen in range(1,freejc.generators.len()+1):
print freejc.generators[gen].name
def create_layer(ctx,name):
layer = freej.GenF0rLayer()
layer.init(ctx)
layer.open("partik0l")
layer.start()
ctx.add_layer(layer)
time.sleep(0.1)
for a in range(1,layer.generator.proto.parameters.len()+1):
par = layer.generator.proto.parameters[a]
val = 1.0*a*random.random()
print " *",par.name,par.description,val
par.setValue(val)
layer.generator.set_parameter(a)
return layer
layer = create_layer(freejc,"partik0l")
layer2 = create_layer(freejc2,"partik0l")
clearscreen = False
doecho = False
distort = False
rotate = True
xrot = yrot = zrot = 0.0
textures = [0,1,2]
def resize((width, height)):
if height==0:
height=1
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45, 1.0*width/height, 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def init():
glEnable(GL_TEXTURE_2D)
load_textures()
glShadeModel(GL_SMOOTH)
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
glEnable(GL_BLEND)
def load_textures():
global textures
# nehe texture
texturefile = os.path.join('..','..','..','doc','ipernav.png')
textureSurface = pygame.image.load(texturefile)
textureData = pygame.image.tostring(textureSurface, "RGBX", 1)
textures = glGenTextures(3)
glBindTexture(GL_TEXTURE_2D, textures[0])
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, textureSurface.get_width(), textureSurface.get_height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, textureData );
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
# freej texture
layers = [None,layer,layer2]
for idx in [1,2]:
glBindTexture(GL_TEXTURE_2D, textures[idx])
lay = layers[idx]
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, lay.geo.w, lay.geo.h, 0,
GL_RGBA, GL_UNSIGNED_BYTE, None );
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
def draw_freej_layer(ctx,layer,texturen):
# draw freej
#print "draw",ctx,layer,texturen
glBindTexture(GL_TEXTURE_2D, textures[texturen])
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
glTranslatef(0.0,0.0,-1.0) # XXX if this is not used, doesnt draw :P
glPixelZoom(-1.0,-1.0)
glViewport(layer.geo.w/2,layer.geo.h/2,layer.geo.w,layer.geo.h)
ctx.cafudda(0.0)
glColor3f (1.0, 1.0, 1.0)
glPixelZoom(1.0,1.0)
glViewport(0,0,layer.geo.w,layer.geo.h)
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 0, 0, layer.geo.w,layer.geo.h, 0)
glViewport(0,0,800,600)
# end draw freej
def draw():
global xrot, yrot, zrot
# alpha blending
glBlendFunc( GL_SRC_ALPHA, GL_ONE )
if random.random() < 0.5:
draw_freej_layer(freejc,layer,1)
draw_freej_layer(freejc2,layer2,2)
else:
draw_freej_layer(freejc2,layer2,2)
draw_freej_layer(freejc,layer,1)
# add blending
glBlendFunc( GL_ONE, GL_ONE )
# clear screen (or not)
if clearscreen:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
else:
glClear(GL_DEPTH_BUFFER_BIT)
if doecho:
sep = math.sin(time.time())
for i in range(10):
draw_cube(sep*5*i,1.0/(i+1))
else:
draw_cube(0.0,1.0)
if rotate:
xrot = xrot + 0.1
yrot = yrot + 0.1
zrot = zrot + 0.1
def draw_cube(ang,col):
glColor3f (col,col,col)
# now typical stuff
glLoadIdentity()
glTranslatef(0.0,0.0,-5.0)
glRotatef(xrot+ang,1.0,0.0,0.0)
glRotatef(yrot+ang,0.0,1.0,0.0)
glRotatef(zrot+ang,0.0,0.0,1.0)
#scale = (1/(col-0.51))*0.1
#glScalef(scale,scale,scale)
glDisable(GL_DEPTH_TEST)
glBindTexture(GL_TEXTURE_2D, textures[0])
glBegin(GL_QUADS)
# Front Face (note that the texture's corners have to match the quad's corners)
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) # Bottom Left Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) # Bottom Right Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) # Top Right Of The Texture and Quad
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) # Top Left Of The Texture and Quad
glEnd();
glBindTexture(GL_TEXTURE_2D, textures[1])
glBegin(GL_QUADS)
# Back Face
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0) # Bottom Right Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) # Top Right Of The Texture and Quad
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) # Top Left Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0) # Bottom Left Of The Texture and Quad
# Top Face
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) # Top Left Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0) # Bottom Left Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0) # Bottom Right Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) # Top Right Of The Texture and Quad
glEnd();
# Bottom Face
glBindTexture(GL_TEXTURE_2D, textures[2])
glBegin(GL_QUADS)
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0) # Top Right Of The Texture and Quad
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0) # Top Left Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) # Bottom Left Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) # Bottom Right Of The Texture and Quad
# Right face
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0) # Bottom Right Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) # Top Right Of The Texture and Quad
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) # Top Left Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) # Bottom Left Of The Texture and Quad
# Left Face
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0) # Bottom Left Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) # Bottom Right Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) # Top Right Of The Texture and Quad
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) # Top Left Of The Texture and Quad
glEnd();
glEnable(GL_DEPTH_TEST)
def main():
global clearscreen,doecho,rotate
video_flags = OPENGL|DOUBLEBUF
pygame.init()
surface = pygame.display.set_mode((800,600), video_flags)
resize((800,600))
init()
frames = 0
ticks = pygame.time.get_ticks()
while 1:
event = pygame.event.poll()
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
break
elif event.type == KEYDOWN:
if event.key == K_1:
clearscreen = 1-clearscreen
if event.key == K_2:
doecho = 1-doecho
if event.key == K_3:
rotate = 1-rotate
draw()
pygame.display.flip()
frames = frames+1
print "fps: %d" % ((frames*1000)/(pygame.time.get_ticks()-ticks))
if __name__ == '__main__': main()