From 7c082a36ab032704e75668ba51a1c88aae02d247 Mon Sep 17 00:00:00 2001 From: Brian Caine Date: Sun, 23 Dec 2007 01:33:27 -0500 Subject: [PATCH] We've got object rendering and positioning working. Hooray!11! I'm still looking into an easy way to position the camera. But if you run it, and take a look at the console, you can see that the mouse information and key information shows up. So, it should be simple to just tweak the camera. --- demo/Engine.py | 50 ++++++- demo/Engine.py~ | 315 ------------------------------------------- demo/Entity.py | 33 ++++- demo/experimental.py~ | 174 ------------------------ demo/pack_out/scripts/cam.py | 4 + the_list | 6 + 6 files changed, 81 insertions(+), 501 deletions(-) delete mode 100644 demo/Engine.py~ delete mode 100644 demo/experimental.py~ diff --git a/demo/Engine.py b/demo/Engine.py index 10fd1c7..9dcc728 100644 --- a/demo/Engine.py +++ b/demo/Engine.py @@ -7,9 +7,10 @@ WINDOW_SIZE = (640, 480) BACKGROUND_COLOR = (1, 0, 0, 0) GUI_THEME = 'theme_two.zip' WIDGETS_FILE = 'widgets.xml' +TEMP_FILE = "dtemp.3ds" import os, sys -from os import * +#from os import * from os.path import * import pygame @@ -28,7 +29,7 @@ from xml.dom.minidom import parse, parseString from experimental import * from ThreadQueue import ThreadQueue -from PyOSG import osg, osgUtil +from PyOSG import osg, osgUtil, osgDB from Entity import * @@ -114,15 +115,13 @@ class Engine: else: print "Engine.__init__(): No pack directory specified, using default of", PACK_DIR - for file in listdir(pack_dir): + for file in os.listdir(pack_dir): if is_zipfile(os.path.join(pack_dir, file)): self.zipfiles.append(ZipFile(os.path.join(pack_dir, file))) for item in self.zipfiles[-1].namelist(): self.filelist[item] = "self.zipfiles[" + str(len(self.zipfiles) - 1) + "].read(\"" + item + "\")" - self.texcache = {} - # file stuff self.files = {} @@ -182,8 +181,6 @@ class Engine: # do instance stuff here for item in instances: if item[0] == 'object': - print "debug", item - assert item[1]['contents'] in self.objectdefs.keys() d = {} @@ -212,6 +209,45 @@ class Engine: assert filename in self.filelist.keys() return eval(self.filelist[filename]) + def readNodeFile(self, filename): + + node = None + error = 0 + temp_file = None + + if exists(TEMP_FILE): + os.rename(TEMP_FILE, TEMP_FILE + ".bak") + print "Engine.readNodeFile(): Renaming existing file..." + + #try: + temp_file = open(TEMP_FILE, 'wb') + + #except: + # print "Engine.readNodeFile(): Error opening temp file.", TEMP_FILE + # error = 1 + + if error != 1: + try: + data = self.readZipfile(filename) + except: + temp_file.close() + print "Engine.readNodeFile(): Error reading filename" + error = 1 + + if error != 1: + temp_file.write(data) + + temp_file.close() + + node = osgDB.readNodeFile(TEMP_FILE) + + if exists(TEMP_FILE + ".bak"): + os.rename(TEMP_FILE + ".bak", TEMP_FILE) + else: + os.remove(TEMP_FILE) + + return node + def run(self): if self.event_queue == None: diff --git a/demo/Engine.py~ b/demo/Engine.py~ deleted file mode 100644 index 7ad8c43..0000000 --- a/demo/Engine.py~ +++ /dev/null @@ -1,315 +0,0 @@ -#!/usr/bin/python - -CONFIG = 'game_config.xml' -INIT = 'run.xml' -PACK_DIR = 'pack' -WINDOW_SIZE = (640, 480) -BACKGROUND_COLOR = (1, 0, 0, 0) -GUI_THEME = 'theme_two.zip' -WIDGETS_FILE = 'widgets.xml' - -import os, sys -from os import * -from os.path import * - -import pygame -from pygame import * - -import lamina - -from DerGUI import GUISystem - -import OpenGL -import OpenGL.GL -from OpenGL.GL import * -import OpenGL.GLU -from OpenGL.GLU import * - -import Dice3DS -from Dice3DS import dom3ds, util -from Dice3DS.example import glmodel, gltexture - -from zipfile import * - -import copy - -from xml.dom.minidom import parse, parseString - -from experimental import * -from Transform import Transformation -from ThreadQueue import ThreadQueue - -from Entity import * - -def main(): - - print "Engine.py class... more documentation to come" - -class Engine: - - def __init__(self, config_file=CONFIG): - - assert exists(config_file) - dom = parse(config_file) - self.config = reduceDOM(dom) - self.config = reduceConfig(self.config) - - # pygame init stuff - - window_size = WINDOW_SIZE - - if self.config.has_key('window_size'): - try: - window_size = eval(self.config['window_size']) - except: - print "Engine.__init__(): Error in eval() using default window size of", WINDOW_SIZE - - video_flags = OPENGL|DOUBLEBUF - self.display = pygame.display.set_mode(window_size, video_flags) - - # OpenGL init stuff - - background_color = BACKGROUND_COLOR - - if self.config.has_key('background_color'): - try: - background_color = eval(self.config['background_color']) - except: - print "Engine.__init__(): Error in eval(), using default background color of", BACKGROUND_COLOR - - glShadeModel(GL_SMOOTH) - glClearColor(background_color[0], - background_color[1], - background_color[2], - background_color[3]) - glClearDepth(1.0) - glEnable(GL_DEPTH_TEST) - glDepthFunc(GL_LEQUAL) - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) - - self.camera_pos = Transformation() - - # more stuff - - if self.config.has_key('window_title'): - self.window_title = self.config['window_title'] - else: - self.window_title = WINDOW_CAPTION - print "Engine.__init__(): No window title specified, using default of", WINDOW_CAPTION - - pygame.display.set_caption(self.window_title) - - # lamina and gui stuff - - gui_theme = GUI_THEME - - if self.config.has_key('gui_theme'): - gui_theme = self.config['gui_theme'] - else: - print "Engine.__init__(): No gui theme specified, using default of", GUI_THEME - - self.lamina_screen = lamina.LaminaScreenSurface() - self.gui_system = GUISystem(WIDGETS_FILE, gui_theme) - - self.change = None - - # zipfile stuff - - self.filelist = {} - self.zipfiles = [] - - pack_dir = PACK_DIR - - if self.config.has_key('pack_dir'): - pack_dir = self.config['pack_dir'] - else: - print "Engine.__init__(): No pack directory specified, using default of", PACK_DIR - - for file in listdir(pack_dir): - if is_zipfile(os.path.join(pack_dir, file)): - self.zipfiles.append(ZipFile(os.path.join(pack_dir, file))) - - for item in self.zipfiles[-1].namelist(): - self.filelist[item] = "self.zipfiles[" + str(len(self.zipfiles) - 1) + "].read(\"" + item + "\")" - - self.texcache = {} - - # file stuff - - self.files = {} - - self.menudefs = {} - self.objectdefs = {} - self.objects = [] - self.menus = {} - - self.running = 1 - - # thread stuff - - self.event_queue = None - - def addFile(self, filename, parent=''): - - if self.filelist.has_key(filename): - - dom = parseString(eval(self.filelist[filename])) - assert dom != None - - parsed = reduceDOM(dom) - instances = [] - - results = { - 'menu_def': {}, - 'object_def': {}, - 'menu_instance': {}, - 'object_instance': [], - 'parent': None, - 'children': []} - - for item in parsed[1][0]: - - if item[0] == 'def': - - for defx in item[1][0]: - - if defx[0] == 'object': - obj = reduceObjectDef(defx) - results['object_def'][obj['name']] = obj - self.objectdefs[obj['name']] = obj - - if defx[0] == 'menu': - menu = reduceMenuDef(defx) - results['menu_def'][menu[0]] = menu - self.menudefs[menu[0]] = menu - - if item[0] == 'instance': - - for defx in item[1][0]: - - inst = reduceInstance(defx) - instances.append(inst) - - # do instance stuff here - for item in instances: - if item[0] == 'object': - print "debug", item - - assert item[1]['contents'] in self.objectdefs.keys() - - d = {} - for n in item[1].keys(): - d[n] = item[1][n] - - for n in self.objectdefs[item[1]['contents']].keys(): - d[n] = self.objectdefs[item[1]['contents']][n] - - nobject = Entity(self, d) - results['object_instance'].append(nobject) - self.objects.append(nobject) - - results['parent'] = parent - if not parent == '': - self.files[parent]['children'].append(filename) - - self.files[filename] = results - - return 1 - - else: - return 0 - - def readZipfile(self, filename): - assert filename in self.filelist.keys() - return eval(self.filelist[filename]) - - def loadTexture(self, filename): - - if self.texcache.has_key(filename): - return texcache[filename] - - tex = None - - try: - data = self.readZipfile(filename) - except: - print "Engine.loadTexture(): No file", filename - return tex - - try: - tex = gltexture.Texture(data) - except: - print "Engine.loadTexture(): Error making texture from", filename - return tex - - self.texcache[filename] = tex - - return tex - - def run(self): - - if self.event_queue == None: - self.event_queue = ThreadQueue() - - self.gui_system.draw(self.lamina_screen.surf) - self.lamina_screen.refresh() - - while self.running: - - self.processEvents() - self.draw() - pygame.display.flip() - - return - - def processEvents(self): - - for e in pygame.event.get(): - if e.type == QUIT: - self.running = 0 - print "Engine.processEvents(): Should be quitting..." - - self.change = self.gui_system.event(e) - - new_event = convertEvent(e) - self.event_queue.append(new_event) - - iterating = 1 - while iterating: - - if len(self.event_queue): - new_event = self.event_queue.pop() - else: - return - - for obj in self.objects: - obj.event(new_event[0], new_event[1]) - - return - - def draw(self): - - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) - glMatrixMode(GL_MODELVIEW) - - # something temporary - glColor3f(1.0, 0, 0) - - for obj in self.objects: - glLoadIdentity() - self.camera_pos.transform() - obj.draw(self) - - # also temp - d() - - glLoadIdentity() - if self.change: - self.lamina_screen.clear() - self.gui_system.draw(self.lamina_screen.surf) - self.lamina_screen.refresh() - self.lamina_screen.display() - - return - -if __name__ == '__main__': main() diff --git a/demo/Entity.py b/demo/Entity.py index f4caa58..b04a2a6 100644 --- a/demo/Entity.py +++ b/demo/Entity.py @@ -1,6 +1,8 @@ #!/usr/bin/python # this is the Entity class +from PyOSG import osg, osgUtil, osgDB + def main(): print "Entity class...more documentation to come" @@ -22,13 +24,34 @@ class Entity: self.engine = engine - self.data = None - self.model = None + self.transform = osg.PositionAttitudeTransform() - def draw(self, engine): + if specs.has_key('model') and specs['model'] != '': + #try: + self.model = self.engine.readNodeFile(specs['model']) + #except: + # print "Entity.__init__(): Error loading node file" + # self.model = None + + if self.model: + self.transform.addChild(self.model) + self.engine.root.addChild(self.transform) - if self.data == None: - return + if specs.has_key('pos'): + + specs_pos = eval(specs['pos']) + pos = osg.Vec3d(specs_pos[0], + specs_pos[1], + specs_pos[2]) + self.transform.setPosition(pos) + + if specs.has_key('rot'): + specs_rot = eval(specs['rot']) + rot = osg.Quat(specs_rot[0], specs_rot[1], + specs_rot[2], 1) + self.transform.setAttitude(rot) + + def draw(self, engine): return diff --git a/demo/experimental.py~ b/demo/experimental.py~ deleted file mode 100644 index e7ac9d2..0000000 --- a/demo/experimental.py~ +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/python -# this has some dom related functions - -def reduceDOM(dom): - - results = {} - - cur = [] - - def parseLevel(level): - parsed_stuff = [[], {}] - - if level.hasAttributes(): - for i in range(len(level.attributes)): - - attrname = level.attributes.item(i).name.encode() - - parsed_stuff[1][attrname] = level.attributes.item(1).value.encode() - - if len(level.childNodes) == 1 and level.childNodes[0].nodeType == 3: - - parsed_stuff[0] = level.childNodes[0].nodeValue.encode() - - else: - - parsed_stuff[0] = [] - - for node in level.childNodes: - if node.nodeType == 1: - - name, contents = parseLevel(node) - parsed_stuff[0].append([name, contents]) - - return level.nodeName.encode(), parsed_stuff - - results = parseLevel(dom.childNodes[0]) - - return results - -def reduceConfig(config): - - results = {} - - for item in config[1][0]: - results[item[0]] = item[1][0] - - return results - -def reduceObjectDef(file): - - results = {} - - for item in file[1][0]: - - results[item[0]] = item[1][0] - - return results - -def reduceMenuDef(file): - - name = None - script = None - elements = {} - - for item in file[1][0]: - - if item[0] == 'name': - name = item[1][0] - - if item[0] == 'script': - script = item[1][0] - - if item[0] != 'script' and item[0] != 'name': - temp = item[1][1] - temp['contents'] = item[1][0] - temp['type'] = item[0] - elements[temp['id']] = temp - - return name, script, elements - -def reduceInstance(item): - - type = item[0] - results = item[1][1] - - results['contents'] = item[1][0] - - return type, results - -def convertEvent(self, e): - data = {} - - if e.type == QUIT: - data['none'] = '' - - if e.type == ACTIVEEVENT: - data['gain'] = e.gain - data['state'] = e.state - - if e.type == KEYDOWN: - data['unicode'] = e.unicode - data['key'] = e.key - data['mod'] = e.mod - - if e.type == KEYUP: - data['key'] = e.key - data['mod'] = e.mod - - if e.type == MOUSEMOTION: - data['pos'] = e.pos - data['rel'] = e.rel - data['buttons'] = e.buttons - - if e.type == MOUSEBUTTONUP: - data['pos'] = e.pos - data['button'] = e.button - - if e.type == MOUSEBUTTONDOWN: - data['pos'] = e.pos - data['button'] = e.button - - if e.type == JOYAXISMOTION: - data['joy'] = e.joy - data['axis'] = e.axis - data['value'] = e.value - - if e.type == JOYBALLMOTION: - data['joy'] = e.joy - data['ball'] = e.ball - data['rel'] = e.rel - - if e.type == JOYHATMOTION: - data['joy'] = e.joy - data['hat'] = e.hat - data['value'] = e.value - - if e.type == JOYBUTTONUP: - data['joy'] = e.joy - data['button'] = e.button - - if e.type == JOYBUTTONDOWN: - data['joy'] = e.joy - data['button'] = e.button - - if e.type == VIDEORESIZE: - data['size'] = e.size - data['w'] = e.w - data['h'] = e.h - - if e.type == VIDEOEXPOSE: - data['none'] = '' - - if e.type == USEREVENT: - data['code'] = e.code - - type = '' - - if e.type == QUIT: type = "QUIT" - if e.type == ACTIVEEVENT: type = "ACTIVEEVENT" - if e.type == KEYDOWN: type = "KEYDOWN" - if e.type == KEYUP: type = "KEYUP" - if e.type == MOUSEMOTION : type = "MOUSEMOTION" - if e.type == MOUSEBUTTONUP: type = "MOUSEBUTTONUP" - if e.type == MOUSEBUTTONDOWN: type = "MOUSEBUTTONDOWN" - if e.type == JOYAXISMOTION: type = "JOYAXISMOTION" - if e.type == JOYBALLMOTION: type = "JOYBALLMOTION" - if e.type == JOYHATMOTION: type = "JOYHATMOTION" - if e.type == JOYBUTTONUP: type = "JOYBUTTONUP" - if e.type == JOYBUTTONDOWN: type = "JOYBUTTONDOWN" - if e.type == VIDEORESIZE: type = "VIDEORESIZE" - if e.type == VIDEOEXPOSE: type = "VIDEOEXPOSE" - if e.type == USEREVENT: type = "USEREVENT" - - return [type, data] diff --git a/demo/pack_out/scripts/cam.py b/demo/pack_out/scripts/cam.py index d8765c1..495b90b 100644 --- a/demo/pack_out/scripts/cam.py +++ b/demo/pack_out/scripts/cam.py @@ -3,4 +3,8 @@ def key_down(me, params): print "the params are", params +def mouse_stuff(me, params): + print "the params to the mouse are", params + +self.functions['MOUSEMOTION'] = mouse_stuff self.functions['KEYDOWN'] = key_down diff --git a/the_list b/the_list index ba0ef48..76b3f05 100644 --- a/the_list +++ b/the_list @@ -17,6 +17,12 @@ In no particular order: * Write a Ventrilo/TeamSpeak clone. Too many WoW nerds use this type of crap, so there should be a good, simple alternative. Maybe write it in C to increace the leetness. +* An underground paper, to counter all the mis-information out there. +* A kickass text editor. Like, there are things I like in Kate, Emacs, + JEdit, Gedit and nano, but none of them have the perfect combination + of features. We need syntax highlighting, and this needs to be defined + in a scripting language, so it's easy to add new ones. General purpose + scripting with squirrel maybe. Yeah, that's all I could think of. We've thunk up alot more, but they escape me at the moment. -- 2.11.4.GIT