From: <ror...@us...> - 2007-07-20 12:41:41
|
Revision: 111 http://roreditor.svn.sourceforge.net/roreditor/?rev=111&view=rev Author: rorthomas Date: 2007-07-20 05:41:36 -0700 (Fri, 20 Jul 2007) Log Message: ----------- * logging stubs * terrain editor undo/redo function Modified Paths: -------------- trunk/lib/ror/terrainparser.py trunk/lib/rorterraineditor/MainFrame.py trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py trunk/lib/wxogre/OgreManager.py trunk/terrainreadme.txt Modified: trunk/lib/ror/terrainparser.py =================================================================== --- trunk/lib/ror/terrainparser.py 2007-07-20 10:00:13 UTC (rev 110) +++ trunk/lib/ror/terrainparser.py 2007-07-20 12:41:36 UTC (rev 111) @@ -184,29 +184,6 @@ obj.additionaloptions = objname[1:] self.objects.append(obj) - - - def loadOdef(self, objname): - try: - f=open(self.rordir+"\\data\\objects\\%s.odef" % (objname), 'r') - content = f.readlines() - f.close() - meshname = content[0].strip() - scalearr = content[1].split(",") - self.myODefs[objname] = [] - if len(content) > 2: - for i in range(1,len(content)): - line = content[i] - if line.lower().strip() == "end": - break - self.myODefs[objname].append(line.split(",")) - return (meshname, float(scalearr[0]), float(scalearr[1]), float(scalearr[2])) - else: - return (meshname, 1, 1, 1) - except Exception, err: - print "error while processing odef file of %s" % objname - print str(err) - def getObjectLines(self, object): lines = [] Modified: trunk/lib/rorterraineditor/MainFrame.py =================================================================== --- trunk/lib/rorterraineditor/MainFrame.py 2007-07-20 10:00:13 UTC (rev 110) +++ trunk/lib/rorterraineditor/MainFrame.py 2007-07-20 12:41:36 UTC (rev 111) @@ -77,8 +77,8 @@ self.ogreTimer.Start(25) #create statusbar - self.statusbar = self.CreateStatusBar(4, 0, wx.ID_ANY, "mainstatusbar") - self.statusbar.SetStatusWidths([-1, 300, 300, 80]) + self.statusbar = self.CreateStatusBar(5, 0, wx.ID_ANY, "mainstatusbar") + self.statusbar.SetStatusWidths([-1, 200, 130, 250, 80]) #self.statusbar.SetStatusText("", 1) #create toolbar @@ -214,10 +214,11 @@ self.terrainOgreWin.stickCurrentObjectToGround = self.btnStickToGround.GetValue() def updateObjPosRot(self, event=None): + self.statusbar.SetStatusText(self.terrainOgreWin.currentStatusMsg, 1) if self.terrainOgreWin.terrain is None: return if self.terrainOgreWin.selectedEntry is None: - self.statusbar.SetStatusText("", 1) + self.statusbar.SetStatusText("Nothing selected", 2) return entry = self.terrainOgreWin.selectedEntry #comment = self.terrainOgreWin.getCommentsForObject(n.getName()).lstrip('/') @@ -225,11 +226,11 @@ # txt = "%s / %s" % (n.getName(), comment) #else: txt = "%s %s" % (entry.data.name, " ".join(entry.data.additionaloptions)) - self.statusbar.SetStatusText(txt, 1) - + self.statusbar.SetStatusText(txt, 2) + posx, posy, posz, rotx, roty, rotz = self.terrainOgreWin.getSelectionPositionRotation() txt = "%0.2f, %0.2f, %0.2f / %0.2f, %0.2f, %0.2f" % (posx, posy, posz, rotx, roty, rotz) - self.statusbar.SetStatusText(txt, 2) + self.statusbar.SetStatusText(txt, 3) #pos = n.getPosition() #self.terrPosX.SetValue(str(round(pos.x,2))) @@ -332,7 +333,7 @@ def OnTimer(self, event): #fill labels with some information, all windows have the same FPS! txt = "%0.2f FPS" % (self.terrainOgreWin.renderWindow.getStatistics().lastFPS) - self.statusbar.SetStatusText(txt, 3) + self.statusbar.SetStatusText(txt, 4) self.updateObjPosRot() def OnExit(self, event): Modified: trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py =================================================================== --- trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-07-20 10:00:13 UTC (rev 110) +++ trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-07-20 12:41:36 UTC (rev 111) @@ -1,5 +1,5 @@ #Thomas Fischer 31/05/2007, th...@th... -import wx, os, os.path +import wx, os, os.path, copy import ogre.renderer.OGRE as ogre from ror.truckparser import * from ror.terrainparser import * @@ -7,6 +7,7 @@ from wxogre.wxOgreWindow import * from ror.rorcommon import * + ADDEDBY = "//added by the terrrain editor:\n" SHIFT_SPEED_FACTOR = 20 SLOW_DOWN_FACTOR = 0.75 @@ -14,19 +15,28 @@ # this class holds all the needed 3d data and also the underlying object data class Entry: + uuid = None node = None entity = None data = None manual = None +class HistoryEntry: + uuid = None + Position = None + Rotation = None class RoRTerrainOgreWindow(wxOgreWindow): terrain = None - clearlist = {'entity':[]} + commandhistory = [] + historypointer = 0 + selectedEntry = None selectedCoords = None + currentStatusMsg = "" + cameralandcollisionenabled = True entries = {} @@ -322,13 +332,11 @@ entry.node.detachAllObjects() self.sceneManager.destroySceneNode(entry.node.getName()) except: - print "A" pass if not entry.entity is None: try: self.sceneManager.destroyEntity(entry.entity) except: - print "B" pass if not entry.data is None: del entry.data @@ -360,14 +368,14 @@ self.updateDataStructures() if not self.terrain is None: return self.terrain.save(fn) - + def LoadTerrain(self, filename): if not self.terrain is None: self.free() - print filename + #print filename self.terrain = RoRTerrain(filename) - print len(self.terrain.objects) + #print len(self.terrain.objects) cfgfile = os.path.join(os.path.dirname(filename), self.terrain.TerrainConfig) self.sceneManager.setWorldGeometry(cfgfile) @@ -438,6 +446,7 @@ return entry = Entry() + entry.uuid = uuid entry.node = self.sceneManager.getRootSceneNode().createChildSceneNode(str(uuid)+"node") entry.entity = self.sceneManager.createEntity(str(uuid)+"entity", meshname) entry.data = data @@ -481,6 +490,7 @@ truckFilename = self.rordir + "\\data\\trucks\\"+truckFilename entry = Entry() + entry.uuid = uuid entry.node, entry.entity, entry.manualobject = self.createTruckMesh(truckFilename, uuid) entry.data = data @@ -683,7 +693,68 @@ def controlSelectedObject(self,action, value): pass + + def addObjectToHistory(self, entry): + if len(self.commandhistory) > 0: + if self.historypointer < len(self.commandhistory): + del self.commandhistory[self.historypointer:] + + pos = entry.node.getPosition() + rot = entry.node.getOrientation() + + if len(self.commandhistory) > 0: + # check if double + hentry = self.commandhistory[-1] + if hentry.position == pos and hentry.rotation == rot: + return + hentry = HistoryEntry() + hentry.uuid = entry.uuid + hentry.position = pos + hentry.rotation = rot + self.commandhistory.append(hentry) + self.historypointer = len(self.commandhistory) + + def undoHistory(self): + if self.historypointer == 0: + return + self.SelectedArrow = None + + + self.historypointer -= 1 + hentry = self.commandhistory[self.historypointer] + self.entries[hentry.uuid].node.setPosition(hentry.position) + self.entries[hentry.uuid].node.setOrientation(hentry.rotation) + + # update node positions + self.TranslateNode.setPosition(self.entries[hentry.uuid].node.getPosition()) + self.RotateNode.setPosition(self.entries[hentry.uuid].node.getPosition()) + #self.TranslateNode.setOrientation(self.entries[hentry.uuid].node.getOrientation()) + self.RotateNode.setOrientation(self.entries[hentry.uuid].node.getOrientation()) + + #self.entries[obj.uuid].node.setPosition(obj.node.getPosition) + self.currentStatusMsg = "undo step %d of %d" % (self.historypointer+1, len(self.commandhistory)) + + def redoHistory(self): + if self.historypointer + 1 >= len(self.commandhistory): + return + self.SelectedArrow = None + + self.historypointer += 1 + hentry = self.commandhistory[self.historypointer] + self.entries[hentry.uuid].node.setPosition(hentry.position) + self.entries[hentry.uuid].node.setOrientation(hentry.rotation) + + # update node positions + self.TranslateNode.setPosition(self.entries[hentry.uuid].node.getPosition()) + self.RotateNode.setPosition(self.entries[hentry.uuid].node.getPosition()) + #self.TranslateNode.setOrientation(self.entries[hentry.uuid].node.getOrientation()) + self.RotateNode.setOrientation(self.entries[hentry.uuid].node.getOrientation()) + + #self.entries[obj.uuid].node.setPosition(obj.node.getPosition) + self.currentStatusMsg = "redo step %d of %d" % (self.historypointer+1, len(self.commandhistory)) + + def controlArrows(self, event): if self.SelectedArrow is None: return @@ -711,6 +782,7 @@ self.TranslateNode.setPosition(self.StickVectorToGround(self.TranslateNode.getPosition())) self.RotateNode.setPosition(self.TranslateNode.getPosition()) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.setPosition(self.TranslateNode.getPosition()) elif self.SelectedArrow.getName() == 'movearrowsY': self.TranslateNode.translate(0,0,forcex,relativeTo=ogre.Node.TransformSpace.TS_LOCAL) @@ -718,6 +790,7 @@ self.TranslateNode.setPosition(self.StickVectorToGround(self.TranslateNode.getPosition())) self.RotateNode.setPosition(self.TranslateNode.getPosition()) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.setPosition(self.TranslateNode.getPosition()) elif self.SelectedArrow.getName() == 'movearrowsZ': self.TranslateNode.translate(0,forcex,0,relativeTo=ogre.Node.TransformSpace.TS_LOCAL) @@ -725,18 +798,22 @@ self.TranslateNode.setPosition(self.StickVectorToGround(self.TranslateNode.getPosition())) self.RotateNode.setPosition(self.TranslateNode.getPosition()) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.setPosition(self.TranslateNode.getPosition()) elif self.SelectedArrow.getName() == 'rotatearrowsX': self.RotateNode.yaw(forceDegree) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.yaw(forceDegree) elif self.SelectedArrow.getName() == 'rotatearrowsY': self.RotateNode.pitch(forceDegree) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.pitch(forceDegree) elif self.SelectedArrow.getName() == 'rotatearrowsZ': self.RotateNode.roll(forceDegree) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.roll(forceDegree) def onMouseEvent(self,event): @@ -772,6 +849,7 @@ if event.LeftDown() and event.ControlDown() and not self.selectedEntry is None: pos = self.getPointedPosition(event) if not pos is None: + self.addObjectToHistory(self.selectedEntry) self.TranslateNode.setPosition(pos) self.RotateNode.setPosition(pos) self.selectedEntry.node.setPosition(pos) @@ -800,7 +878,7 @@ d = 0.5 if event.ShiftDown(): d *= SHIFT_SPEED_FACTOR - + if event.m_keyCode == 65: # A, wx.WXK_LEFT: self.keyPress.x = -d elif event.m_keyCode == 68: # D, wx.WXK_RIGHT: @@ -809,6 +887,10 @@ self.keyPress.z = -d elif event.m_keyCode == 83: # S, wx.WXK_DOWN: self.keyPress.z = d + elif event.m_keyCode == 70: # F + self.undoHistory() + elif event.m_keyCode == 71: # G + self.redoHistory() elif event.m_keyCode == wx.WXK_PAGEUP: self.keyPress.y = d elif event.m_keyCode == wx.WXK_PAGEDOWN: Modified: trunk/lib/wxogre/OgreManager.py =================================================================== --- trunk/lib/wxogre/OgreManager.py 2007-07-20 10:00:13 UTC (rev 110) +++ trunk/lib/wxogre/OgreManager.py 2007-07-20 12:41:36 UTC (rev 111) @@ -4,6 +4,7 @@ import ogre.renderer.OGRE as ogre from ror.logger import log +from ror.ogrelogger import initOgreLogging from ror.settingsManager import getSettingsManager # singleton implementation of OgreManager @@ -14,6 +15,15 @@ _ogremanager = OgreManager() return _ogremanager +class MyLog(ogre.LogListener): + def __init__(self): + # Creates a C++ log that will try and write to console and file + ogre.LogListener.__init__(self) + + def messageLogged(self, message, level, debug, logName): + print ">>>", message + return True + class OgreManager(): renderWindows = {} @@ -27,7 +37,13 @@ def init(self): #Root creation - self.ogreRoot = ogre.Root(self.getConfigPath('plugins.cfg'), self.getConfigPath('ogre.cfg'), "ogre.log") + self.ogreRoot = ogre.Root(self.getConfigPath('plugins.cfg'), self.getConfigPath('ogre.cfg'), "Ogre.log") + #logMgr = ogre.LogManager() + #currentLog = ogre.LogManager.getSingletonPtr().createLog("ogre.log" ,True, False, False) + #myLog = MyLog() + #currentLog.addListener ( myLog ) + #ogre.LogManager.getSingletonPtr().setDefaultLog(currentLog) + if not self.tryDetectRenderer(): self.ogreRoot.showConfigDialog() self.ogreRoot.initialise(False) Modified: trunk/terrainreadme.txt =================================================================== --- trunk/terrainreadme.txt 2007-07-20 10:00:13 UTC (rev 110) +++ trunk/terrainreadme.txt 2007-07-20 12:41:36 UTC (rev 111) @@ -25,6 +25,10 @@ T switch between bilinear and trilinear filtering R switch between solid, wireframe and point mode +History Functions: +F undo last movement/rotation +G redo last undo + ============================================================ How To Add Things ============================================================ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |