/Richter/Engine.py
import sys
import imp
import pygame
from pygame.locals import *
from Sprite import Sprite

try:
    from OpenGL.GL import *
    from OpenGL.GLU import *
except:
    print 'sprite_engine requires PyOpenGL'
    raise SystemExit

import config

fpsman = pygame.time.Clock()

def init(resolution=(640,480)):
	pygame.init()
	try:
		sres = [int(n * config.scalefactor) for n in resolution]
	except AttributeError:
		sres = resolution
	flags = OPENGL|DOUBLEBUF
	try:
		if config.fullscreen:
			flags |= FULLSCREEN
	except AttributeError:
		pass
	pygame.display.set_mode(sres, flags)

	glViewport(0, 0, sres[0], sres[1])
	# Set up the camera
	glLoadIdentity()
	glMatrixMode(GL_PROJECTION)
	#gluOrtho2D(0,resolution[0],0,resolution[1])
	# calculate Z-depth from average resolution
	zdepth = sum(resolution) / 2
	glFrustum(0,resolution[0],0,resolution[1],zdepth,zdepth * 10)
	glTranslate(0,0,-zdepth)

	#glTranslate(resolution[0]/2, resolution[1]/2, 0)
	#glTranslate(0,0,-zdepth)
	#glRotate(30, 0, 1, 0)
	#glTranslate(-resolution[0]/2, -resolution[1]/2, 0)

	# And initialize things how we like in GL
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
	glEnable(GL_TEXTURE_2D)
	glEnable(GL_BLEND)
	glDisable(GL_DITHER)
	glShadeModel(GL_FLAT)
	glEnable(GL_CULL_FACE)
	#glDepthFunc(GL_LEQUAL)
	#glEnable(GL_DEPTH_TEST)
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST)
	glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST)
	glEnableClientState(GL_VERTEX_ARRAY)
	glEnableClientState(GL_TEXTURE_COORD_ARRAY)


running = True
level = None
eventhandlers = []
updaters = []
drawers = []


def loadLevel(name):
	global level
	unloadLevel()
	fp, pathname, description = imp.find_module(name)
	level = imp.load_module(name, fp, pathname, description)
	updaters.insert(0, level.update)
	drawers.insert(0, level.draw)
	return level


def unloadLevel():
	global level
	if level:
		updaters.remove(level.update)
		drawers.remove(level.draw)
		level = None


def stop():
	global running
	running = False


def run():
	global running
	running = True
	while running:
		events = pygame.event.get()
		for e in events:
			for h in eventhandlers:
				h(e)

		#clear screen and move camera
		#glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
		glClear(GL_COLOR_BUFFER_BIT)

		for update in updaters:
			update()

		for draw in drawers:
			draw()

		pygame.display.flip()
		fpsman.tick(60)