3 CONFIG
= 'game_config.xml'
6 WINDOW_SIZE
= (640, 480)
7 BACKGROUND_COLOR
= (1, 0, 0, 0)
8 GUI_THEME
= 'theme_two.zip'
9 WIDGETS_FILE
= 'widgets.xml'
20 from DerGUI
import GUISystem
24 from OpenGL
.GL
import *
26 from OpenGL
.GLU
import *
29 from Dice3DS
import dom3ds
, util
30 from Dice3DS
.example
import glmodel
, gltexture
36 from xml
.dom
.minidom
import parse
, parseString
38 from experimental
import *
39 from Transform
import Transformation
40 from ThreadQueue
import ThreadQueue
46 print "Engine.py class... more documentation to come"
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
)
59 window_size
= WINDOW_SIZE
61 if self
.config
.has_key('window_size'):
63 window_size
= eval(self
.config
['window_size'])
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
)
72 background_color
= BACKGROUND_COLOR
74 if self
.config
.has_key('background_color'):
76 background_color
= eval(self
.config
['background_color'])
78 print "Engine.__init__(): Error in eval(), using default background color of", BACKGROUND_COLOR
80 glShadeModel(GL_SMOOTH
)
81 glClearColor(background_color
[0],
86 glEnable(GL_DEPTH_TEST
)
87 glDepthFunc(GL_LEQUAL
)
88 glHint(GL_PERSPECTIVE_CORRECTION_HINT
, GL_NICEST
)
90 self
.camera_pos
= Transformation()
94 if self
.config
.has_key('window_title'):
95 self
.window_title
= self
.config
['window_title']
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']
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
)
123 if self
.config
.has_key('pack_dir'):
124 pack_dir
= self
.config
['pack_dir']
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
+ "\")"
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
]))
159 parsed
= reduceDOM(dom
)
166 'object_instance': [],
170 for item
in parsed
[1][0]:
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':
198 assert item
[1]['contents'] in self
.objectdefs
.keys()
201 for n
in item
[1].keys():
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
213 self
.files
[parent
]['children'].append(filename
)
215 self
.files
[filename
] = results
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
]
234 data
= self
.readZipfile(filename
)
236 print "Engine.loadTexture(): No file", filename
240 tex
= gltexture
.Texture(data
)
242 print "Engine.loadTexture(): Error making texture from", filename
245 self
.texcache
[filename
] = tex
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()
261 pygame
.display
.flip()
265 def processEvents(self
):
267 for e
in pygame
.event
.get():
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
)
280 if len(self
.event_queue
):
281 new_event
= self
.event_queue
.pop()
285 for obj
in self
.objects
:
286 obj
.event(new_event
[0], new_event
[1])
292 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT
)
293 glMatrixMode(GL_MODELVIEW
)
295 # something temporary
298 for obj
in self
.objects
:
300 self
.camera_pos
.transform()
308 self
.lamina_screen
.clear()
309 self
.gui_system
.draw(self
.lamina_screen
.surf
)
310 self
.lamina_screen
.refresh()
311 self
.lamina_screen
.display()
315 if __name__
== '__main__': main()