Some work.
[krufty_fps.git] / demo / Engine.py~
blob7ad8c435777bcbe24e28e960a6130d587331222b
1 #!/usr/bin/python
3 CONFIG = 'game_config.xml'
4 INIT = 'run.xml'
5 PACK_DIR = 'pack'
6 WINDOW_SIZE = (640, 480)
7 BACKGROUND_COLOR = (1, 0, 0, 0)
8 GUI_THEME = 'theme_two.zip'
9 WIDGETS_FILE = 'widgets.xml'
11 import os, sys
12 from os import *
13 from os.path import *
15 import pygame
16 from pygame import *
18 import lamina
20 from DerGUI import GUISystem
22 import OpenGL
23 import OpenGL.GL
24 from OpenGL.GL import *
25 import OpenGL.GLU
26 from OpenGL.GLU import *
28 import Dice3DS
29 from Dice3DS import dom3ds, util
30 from Dice3DS.example import glmodel, gltexture
32 from zipfile import *
34 import copy
36 from xml.dom.minidom import parse, parseString
38 from experimental import *
39 from Transform import Transformation
40 from ThreadQueue import ThreadQueue
42 from Entity import *
44 def main():
46 print "Engine.py class... more documentation to come"
48 class Engine:
50 def __init__(self, config_file=CONFIG):
52 assert exists(config_file)
53 dom = parse(config_file)
54 self.config = reduceDOM(dom)
55 self.config = reduceConfig(self.config)
57 # pygame init stuff
59 window_size = WINDOW_SIZE
61 if self.config.has_key('window_size'):
62 try:
63 window_size = eval(self.config['window_size'])
64 except:
65 print "Engine.__init__(): Error in eval() using default window size of", WINDOW_SIZE
67 video_flags = OPENGL|DOUBLEBUF
68 self.display = pygame.display.set_mode(window_size, video_flags)
70 # OpenGL init stuff
72 background_color = BACKGROUND_COLOR
74 if self.config.has_key('background_color'):
75 try:
76 background_color = eval(self.config['background_color'])
77 except:
78 print "Engine.__init__(): Error in eval(), using default background color of", BACKGROUND_COLOR
80 glShadeModel(GL_SMOOTH)
81 glClearColor(background_color[0],
82 background_color[1],
83 background_color[2],
84 background_color[3])
85 glClearDepth(1.0)
86 glEnable(GL_DEPTH_TEST)
87 glDepthFunc(GL_LEQUAL)
88 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
90 self.camera_pos = Transformation()
92 # more stuff
94 if self.config.has_key('window_title'):
95 self.window_title = self.config['window_title']
96 else:
97 self.window_title = WINDOW_CAPTION
98 print "Engine.__init__(): No window title specified, using default of", WINDOW_CAPTION
100 pygame.display.set_caption(self.window_title)
102 # lamina and gui stuff
104 gui_theme = GUI_THEME
106 if self.config.has_key('gui_theme'):
107 gui_theme = self.config['gui_theme']
108 else:
109 print "Engine.__init__(): No gui theme specified, using default of", GUI_THEME
111 self.lamina_screen = lamina.LaminaScreenSurface()
112 self.gui_system = GUISystem(WIDGETS_FILE, gui_theme)
114 self.change = None
116 # zipfile stuff
118 self.filelist = {}
119 self.zipfiles = []
121 pack_dir = PACK_DIR
123 if self.config.has_key('pack_dir'):
124 pack_dir = self.config['pack_dir']
125 else:
126 print "Engine.__init__(): No pack directory specified, using default of", PACK_DIR
128 for file in listdir(pack_dir):
129 if is_zipfile(os.path.join(pack_dir, file)):
130 self.zipfiles.append(ZipFile(os.path.join(pack_dir, file)))
132 for item in self.zipfiles[-1].namelist():
133 self.filelist[item] = "self.zipfiles[" + str(len(self.zipfiles) - 1) + "].read(\"" + item + "\")"
135 self.texcache = {}
137 # file stuff
139 self.files = {}
141 self.menudefs = {}
142 self.objectdefs = {}
143 self.objects = []
144 self.menus = {}
146 self.running = 1
148 # thread stuff
150 self.event_queue = None
152 def addFile(self, filename, parent=''):
154 if self.filelist.has_key(filename):
156 dom = parseString(eval(self.filelist[filename]))
157 assert dom != None
159 parsed = reduceDOM(dom)
160 instances = []
162 results = {
163 'menu_def': {},
164 'object_def': {},
165 'menu_instance': {},
166 'object_instance': [],
167 'parent': None,
168 'children': []}
170 for item in parsed[1][0]:
172 if item[0] == 'def':
174 for defx in item[1][0]:
176 if defx[0] == 'object':
177 obj = reduceObjectDef(defx)
178 results['object_def'][obj['name']] = obj
179 self.objectdefs[obj['name']] = obj
181 if defx[0] == 'menu':
182 menu = reduceMenuDef(defx)
183 results['menu_def'][menu[0]] = menu
184 self.menudefs[menu[0]] = menu
186 if item[0] == 'instance':
188 for defx in item[1][0]:
190 inst = reduceInstance(defx)
191 instances.append(inst)
193 # do instance stuff here
194 for item in instances:
195 if item[0] == 'object':
196 print "debug", item
198 assert item[1]['contents'] in self.objectdefs.keys()
200 d = {}
201 for n in item[1].keys():
202 d[n] = item[1][n]
204 for n in self.objectdefs[item[1]['contents']].keys():
205 d[n] = self.objectdefs[item[1]['contents']][n]
207 nobject = Entity(self, d)
208 results['object_instance'].append(nobject)
209 self.objects.append(nobject)
211 results['parent'] = parent
212 if not parent == '':
213 self.files[parent]['children'].append(filename)
215 self.files[filename] = results
217 return 1
219 else:
220 return 0
222 def readZipfile(self, filename):
223 assert filename in self.filelist.keys()
224 return eval(self.filelist[filename])
226 def loadTexture(self, filename):
228 if self.texcache.has_key(filename):
229 return texcache[filename]
231 tex = None
233 try:
234 data = self.readZipfile(filename)
235 except:
236 print "Engine.loadTexture(): No file", filename
237 return tex
239 try:
240 tex = gltexture.Texture(data)
241 except:
242 print "Engine.loadTexture(): Error making texture from", filename
243 return tex
245 self.texcache[filename] = tex
247 return tex
249 def run(self):
251 if self.event_queue == None:
252 self.event_queue = ThreadQueue()
254 self.gui_system.draw(self.lamina_screen.surf)
255 self.lamina_screen.refresh()
257 while self.running:
259 self.processEvents()
260 self.draw()
261 pygame.display.flip()
263 return
265 def processEvents(self):
267 for e in pygame.event.get():
268 if e.type == QUIT:
269 self.running = 0
270 print "Engine.processEvents(): Should be quitting..."
272 self.change = self.gui_system.event(e)
274 new_event = convertEvent(e)
275 self.event_queue.append(new_event)
277 iterating = 1
278 while iterating:
280 if len(self.event_queue):
281 new_event = self.event_queue.pop()
282 else:
283 return
285 for obj in self.objects:
286 obj.event(new_event[0], new_event[1])
288 return
290 def draw(self):
292 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
293 glMatrixMode(GL_MODELVIEW)
295 # something temporary
296 glColor3f(1.0, 0, 0)
298 for obj in self.objects:
299 glLoadIdentity()
300 self.camera_pos.transform()
301 obj.draw(self)
303 # also temp
306 glLoadIdentity()
307 if self.change:
308 self.lamina_screen.clear()
309 self.gui_system.draw(self.lamina_screen.surf)
310 self.lamina_screen.refresh()
311 self.lamina_screen.display()
313 return
315 if __name__ == '__main__': main()