We've got object rendering and positioning working.
[krufty_fps.git] / demo / Engine.py
blob9dcc7288a286f2f188836f505e33a57508def0a2
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'
10 TEMP_FILE = "dtemp.3ds"
12 import os, sys
13 #from os import *
14 from os.path import *
16 import pygame
17 from pygame import *
19 import lamina
21 from DerGUI import GUISystem
23 from zipfile import *
25 import copy
27 from xml.dom.minidom import parse, parseString
29 from experimental import *
30 from ThreadQueue import ThreadQueue
32 from PyOSG import osg, osgUtil, osgDB
34 from Entity import *
36 def main():
38 print "Engine.py class... more documentation to come"
40 class Engine:
42 def __init__(self, config_file=CONFIG):
44 assert exists(config_file)
45 dom = parse(config_file)
46 self.config = reduceDOM(dom)
47 self.config = reduceConfig(self.config)
49 # pygame init stuff
51 window_size = WINDOW_SIZE
53 if self.config.has_key('window_size'):
54 try:
55 window_size = eval(self.config['window_size'])
56 except:
57 print "Engine.__init__(): Error in eval() using default window size of", WINDOW_SIZE
59 video_flags = OPENGL|DOUBLEBUF
60 self.display = pygame.display.set_mode(window_size, video_flags)
62 # PyOSG init stuff
64 background_color = BACKGROUND_COLOR
66 if self.config.has_key('background_color'):
67 try:
68 background_color = eval(self.config['background_color'])
69 except:
70 print "Engine.__init__(): Error in eval(), using default background color of", BACKGROUND_COLOR
72 self.root = osg.Group()
74 self.sceneView = osgUtil.SceneView()
75 self.sceneView.setDefaults()
76 self.sceneView.init()
77 self.sceneView.setSceneData(self.root)
78 self.sceneView.setClearColor(
79 osg.Vec4(background_color[0], background_color[1],
80 background_color[2], background_color[3]))
82 # more stuff
84 if self.config.has_key('window_title'):
85 self.window_title = self.config['window_title']
86 else:
87 self.window_title = WINDOW_CAPTION
88 print "Engine.__init__(): No window title specified, using default of", WINDOW_CAPTION
90 pygame.display.set_caption(self.window_title)
92 # lamina and gui stuff
94 gui_theme = GUI_THEME
96 if self.config.has_key('gui_theme'):
97 gui_theme = self.config['gui_theme']
98 else:
99 print "Engine.__init__(): No gui theme specified, using default of", GUI_THEME
101 self.lamina_screen = lamina.LaminaScreenSurface()
102 self.gui_system = GUISystem(WIDGETS_FILE, gui_theme)
104 self.change = None
106 # zipfile stuff
108 self.filelist = {}
109 self.zipfiles = []
111 pack_dir = PACK_DIR
113 if self.config.has_key('pack_dir'):
114 pack_dir = self.config['pack_dir']
115 else:
116 print "Engine.__init__(): No pack directory specified, using default of", PACK_DIR
118 for file in os.listdir(pack_dir):
119 if is_zipfile(os.path.join(pack_dir, file)):
120 self.zipfiles.append(ZipFile(os.path.join(pack_dir, file)))
122 for item in self.zipfiles[-1].namelist():
123 self.filelist[item] = "self.zipfiles[" + str(len(self.zipfiles) - 1) + "].read(\"" + item + "\")"
125 # file stuff
127 self.files = {}
129 self.menudefs = {}
130 self.objectdefs = {}
131 self.objects = []
132 self.menus = {}
134 self.running = 1
136 # thread stuff
138 self.event_queue = None
140 def addFile(self, filename, parent=''):
142 if self.filelist.has_key(filename):
144 dom = parseString(eval(self.filelist[filename]))
145 assert dom != None
147 parsed = reduceDOM(dom)
148 instances = []
150 results = {
151 'menu_def': {},
152 'object_def': {},
153 'menu_instance': {},
154 'object_instance': [],
155 'parent': None,
156 'children': []}
158 for item in parsed[1][0]:
160 if item[0] == 'def':
162 for defx in item[1][0]:
164 if defx[0] == 'object':
165 obj = reduceObjectDef(defx)
166 results['object_def'][obj['name']] = obj
167 self.objectdefs[obj['name']] = obj
169 if defx[0] == 'menu':
170 menu = reduceMenuDef(defx)
171 results['menu_def'][menu[0]] = menu
172 self.menudefs[menu[0]] = menu
174 if item[0] == 'instance':
176 for defx in item[1][0]:
178 inst = reduceInstance(defx)
179 instances.append(inst)
181 # do instance stuff here
182 for item in instances:
183 if item[0] == 'object':
184 assert item[1]['contents'] in self.objectdefs.keys()
186 d = {}
187 for n in item[1].keys():
188 d[n] = item[1][n]
190 for n in self.objectdefs[item[1]['contents']].keys():
191 d[n] = self.objectdefs[item[1]['contents']][n]
193 nobject = Entity(self, d)
194 results['object_instance'].append(nobject)
195 self.objects.append(nobject)
197 results['parent'] = parent
198 if not parent == '':
199 self.files[parent]['children'].append(filename)
201 self.files[filename] = results
203 return 1
205 else:
206 return 0
208 def readZipfile(self, filename):
209 assert filename in self.filelist.keys()
210 return eval(self.filelist[filename])
212 def readNodeFile(self, filename):
214 node = None
215 error = 0
216 temp_file = None
218 if exists(TEMP_FILE):
219 os.rename(TEMP_FILE, TEMP_FILE + ".bak")
220 print "Engine.readNodeFile(): Renaming existing file..."
222 #try:
223 temp_file = open(TEMP_FILE, 'wb')
225 #except:
226 # print "Engine.readNodeFile(): Error opening temp file.", TEMP_FILE
227 # error = 1
229 if error != 1:
230 try:
231 data = self.readZipfile(filename)
232 except:
233 temp_file.close()
234 print "Engine.readNodeFile(): Error reading filename"
235 error = 1
237 if error != 1:
238 temp_file.write(data)
240 temp_file.close()
242 node = osgDB.readNodeFile(TEMP_FILE)
244 if exists(TEMP_FILE + ".bak"):
245 os.rename(TEMP_FILE + ".bak", TEMP_FILE)
246 else:
247 os.remove(TEMP_FILE)
249 return node
251 def run(self):
253 if self.event_queue == None:
254 self.event_queue = ThreadQueue()
256 self.lamina_screen.clear()
257 self.gui_system.draw(self.lamina_screen.surf)
258 self.lamina_screen.refresh()
260 while self.running:
262 self.processEvents()
263 self.draw()
264 pygame.display.flip()
266 return
268 def processEvents(self):
270 for e in pygame.event.get():
271 if e.type == QUIT:
272 self.running = 0
273 print "Engine.processEvents(): Should be quitting..."
275 self.change = self.gui_system.event(e)
277 new_event = convertEvent(e)
278 self.event_queue.append(new_event)
280 iterating = 1
281 while iterating:
283 if len(self.event_queue):
284 new_event = self.event_queue.pop()
285 else:
286 return
288 for obj in self.objects:
289 obj.event(new_event[0], new_event[1])
291 return
293 def draw(self):
295 self.sceneView.update()
296 self.sceneView.cull()
297 self.sceneView.draw()
299 self.lamina_screen.display()
301 return
303 if __name__ == '__main__': main()