From: <ror...@us...> - 2007-08-07 15:14:08
|
Revision: 158 http://roreditor.svn.sourceforge.net/roreditor/?rev=158&view=rev Author: rorthomas Date: 2007-08-07 08:14:01 -0700 (Tue, 07 Aug 2007) Log Message: ----------- * added advanced odef parser for new format * added new ODef Edit Mode to Terrain Editor * bugfixed preview window * updated selection tree: right click now opens a menu, also the tree is now sorted and the root is hidden Modified Paths: -------------- trunk/lib/ror/odefparser.py trunk/lib/rorterraineditor/GUIObjectTree.py trunk/lib/rorterraineditor/MainFrame.py trunk/lib/rorterraineditor/RoRObjectPreviewOgreWindow.py trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py Added Paths: ----------- trunk/lib/rorterraineditor/MainFrame_Tools_ODefEditor.py trunk/lib/rorterraineditor/RoROdefEditorOgreWindow.py Modified: trunk/lib/ror/odefparser.py =================================================================== --- trunk/lib/ror/odefparser.py 2007-08-03 23:52:10 UTC (rev 157) +++ trunk/lib/ror/odefparser.py 2007-08-07 15:14:01 UTC (rev 158) @@ -1,4 +1,8 @@ -def loadOdef(odefFilename): +# old format: +from ror.logger import log +from ror.settingsManager import getSettingsManager + +def loadOdef_old(odefFilename): f=open(odefFilename, 'r') content = f.readlines() f.close() @@ -8,3 +12,67 @@ scalearr = content[1].split(",") return (meshname, float(scalearr[0]), float(scalearr[1]), float(scalearr[2])) + +class odefbox: + rotating=False + virtual=False + eventname="" + coords=[] + rotation = [] + + # for 3d + uuid = None + node=None + entity=None + def __str__(self): + s = "" + if self.rotating: + s+= "rotating, " + if self.virtual: + s+= "virtual, " + s += " eventname='%s'" % self.eventname + s += " coordinates: " + str(self.coords) + s += " rotation: " + str(self.rotation) + return s + +def loadOdef(odefFilename): + try: + f=open(odefFilename, 'r') + content = f.readlines() + f.close() + ismovable = False + meshname = content[0].strip() + scalearr = [1,1,1] + boxes = [] + actualbox = None + if len(content[1].split(",")) > 2: + scalearr = content[1].split(",") + for line in content[1:]: + line = line.strip().lower() + if len(line) == 0 or line[0] == '/': + continue + elif line == "end": + break + elif line == "movable": + ismovable = True + elif line in ["beginbox", "beginmesh"]: + actualbox = odefbox() + elif line[:9] == "boxcoords": + actualbox.coords = line[10:].split(",") + elif line[:6] == "rotate": + actualbox.rotating=True + actualbox.rotation = line[7:].split(",") + elif line == "virtual": + actualbox.virtual=True + elif line[:5] == "event": + actualbox.eventname=line[6:] + elif line == "endbox": + boxes.append(actualbox) + print meshname, float(scalearr[0]), float(scalearr[1]), float(scalearr[2]), ismovable + print "boxes:" + for b in boxes: + print b + return meshname, float(scalearr[0]), float(scalearr[1]), float(scalearr[2]), ismovable, boxes + except Exception, err: + log().error(str(err)) + return None, None, None, None, None \ No newline at end of file Modified: trunk/lib/rorterraineditor/GUIObjectTree.py =================================================================== --- trunk/lib/rorterraineditor/GUIObjectTree.py 2007-08-03 23:52:10 UTC (rev 157) +++ trunk/lib/rorterraineditor/GUIObjectTree.py 2007-08-07 15:14:01 UTC (rev 158) @@ -26,7 +26,7 @@ vert = wx.BoxSizer(wx.VERTICAL) - tree = wx.TreeCtrl(self, -1, wx.Point(0, 0), wx.DefaultSize, wx.NO_BORDER) + tree = wx.TreeCtrl(self, -1, wx.Point(0, 0), wx.DefaultSize, wx.NO_BORDER | wx.TR_HIDE_ROOT) root = tree.AddRoot("Objects") items = [] @@ -60,23 +60,47 @@ data.SetData(object) tree.AppendItem(items[-1], objectname, 1, data=data) - - tree.Expand(root) + # root is hidden, no expand! + #tree.Expand(root) vert.Add(tree, 1, wx.EXPAND, 5) self.SetSizer(vert) self.GetSizer().SetSizeHints(self) self.tree = tree + self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick, self.tree) self.Bind(wx.EVT_TREE_SEL_CHANGED, self.onTreeSelectionChange, self.tree) - self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.addStuff, self.tree) + self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnRightClick, self.tree) #self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.BeginDrag, self.tree) + def OnLeftDClick(self, event): + self.selectedfn = self.tree.GetItemData(event.GetItem()).GetData() + self.addStuff() - def addStuff(self, event): - fn = self.tree.GetItemData(event.GetItem()).GetData() - if fn is None: + def OnRightClick(self, event): + self.selectedfn = self.tree.GetItemData(event.GetItem()).GetData() + if self.selectedfn is None: + event.Skip() return - self.parent.addStuff(fn) + + menu = wx.Menu() + item_add = menu.Append(wx.ID_ANY, "add to Terrain") + self.Bind(wx.EVT_MENU, self.addStuff, item_add) + if self.selectedfn[-4:].lower() == "odef": + #create odef menu entry + item_edit_odef = menu.Append(wx.ID_ANY, "Edit in ODef Editor") + self.Bind(wx.EVT_MENU, self.editOdef, item_edit_odef) + self.PopupMenu(menu) + menu.Destroy() + + def editOdef(self, event=None): + if self.selectedfn is None: + return + self.parent.editODefFile(self.selectedfn) + + def addStuff(self, event=None): + if self.selectedfn is None: + return + self.parent.addStuff(self.selectedfn) #def BeginDrag(self, event): # ''' # EVT_TREE_BEGIN_DRAG handler. @@ -100,6 +124,7 @@ onlyfilename, extension = os.path.splitext(filename) if extension.lower() == ".truck": files.append(os.path.join(TRUCKDIR, filename)) + files.sort() return files def getInstalledLoads(self): @@ -108,6 +133,7 @@ onlyfilename, extension = os.path.splitext(filename) if extension.lower() == ".load": files.append(os.path.join(TRUCKDIR, filename)) + files.sort() return files def getInstalledObjects(self): @@ -116,4 +142,5 @@ onlyfilename, extension = os.path.splitext(filename) if extension.lower() == ".odef": files.append(os.path.join(OBJECTDIR, filename)) + files.sort() return files \ No newline at end of file Modified: trunk/lib/rorterraineditor/MainFrame.py =================================================================== --- trunk/lib/rorterraineditor/MainFrame.py 2007-08-03 23:52:10 UTC (rev 157) +++ trunk/lib/rorterraineditor/MainFrame.py 2007-08-07 15:14:01 UTC (rev 158) @@ -11,10 +11,12 @@ from RoRObjectPreviewOgreWindow import * from RoRTerrainSelectedObjectOgreWindow import * from RoRTerrainSelectedObjectTopOgreWindow import * +from RoROdefEditorOgreWindow import * # GUI Tools: from GUIObjectTree import * from MainFrame_Tools import * +from MainFrame_Tools_ODefEditor import * import wx import wx.grid @@ -35,6 +37,9 @@ ID_FindObject = wx.NewId() ID_Quit = wx.NewId() +ID_TerrainContent = wx.NewId() +ID_ODefEditorContent = wx.NewId() + ID_ViewHelp = wx.NewId() ID_CreateOgre = wx.NewId() @@ -78,7 +83,10 @@ file_menu.Append(wx.ID_EXIT, "Exit") view_menu = wx.Menu() - view_menu.Append(ID_CreateOgre, "Create OgreWindow") + view_menu.Append(ID_CreateOgre, "Create new 3D View") + view_menu.AppendSeparator() + view_menu.Append(ID_TerrainContent, "Terrain Editor Mode") + view_menu.Append(ID_ODefEditorContent, "ODef Editor Mode") self.managerInit() options_menu = wx.Menu() @@ -155,7 +163,7 @@ self.objectPreviewWindow = ObjectPreviewOgreWindow(self, wx.ID_ANY, rordir=self.rordir) self._mgr.AddPane(self.objectPreviewWindow, wx.aui.AuiPaneInfo(). - Name("ogretest1"). + Name("object_preview"). Caption("Object Preview"). Left(). MinSize(wx.Size(200,200)). @@ -189,7 +197,20 @@ CloseButton(True). MaximizeButton(True)) - # create the center pane + + # odef editor panels + self.oddefEditorViewSettings = OdefViewPanel(self, self) + self._mgr.AddPane(self.oddefEditorViewSettings, wx.aui.AuiPaneInfo(). + Name("odef_editor_view_settings"). + Caption("ODef Editor View Settings"). + MinSize(wx.Size(200,100)). + Left(). + CloseButton(True). + MaximizeButton(False). + Hide()) + + + # create the center pane(s) #Timer creation (for rendering) self.ogreTimer = wx.Timer() self.ogreTimer.SetOwner(self) @@ -202,14 +223,15 @@ self.Bind(wx.EVT_TIMER, self.OnGUITimer, self.guitimer) self.guitimer.Start(200) - - + # the terrain editor ogre window self.terrainOgreWin = RoRTerrainOgreWindow(self, wx.ID_ANY, rordir=self.rordir) - self._mgr.AddPane(self.terrainOgreWin, wx.aui.AuiPaneInfo().Name("ogre_content"). - CenterPane()) - - # add the toolbars to the manager - + self._mgr.AddPane(self.terrainOgreWin, wx.aui.AuiPaneInfo().Name("ogre_terrain_content").CenterPane()) + + # the odef editor ogre window (hidden): + self.odefEditorOgreWin = ODefEditorOgreWindow(self, wx.ID_ANY, rordir=self.rordir) + self._mgr.AddPane(self.odefEditorOgreWin, wx.aui.AuiPaneInfo().Name("ogre_odef_editor_content").CenterPane().Hide()) + + # add the toolbars to the manager self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo(). Name("tb1"). Caption("General Toolbar"). @@ -226,7 +248,7 @@ #for ii in xrange(len(all_panes)): # if not all_panes[ii].IsToolbar(): # all_panes[ii].Hide() - self._mgr.GetPane("ogre_content").Show() + self._mgr.GetPane("ogre_terrain_content").Show() perspective_default = self._mgr.SavePerspective() self._perspectives.append(perspective_default) @@ -245,6 +267,9 @@ self.Bind(wx.EVT_MENU, self.OnSaveTerrainAs, id=ID_SaveTerrainAs) self.Bind(wx.EVT_MENU, self.OnViewHelp, id=ID_ViewHelp) + self.Bind(wx.EVT_MENU, self.OnChangeEditorModePerMenu, id=ID_TerrainContent) + self.Bind(wx.EVT_MENU, self.OnChangeEditorModePerMenu, id=ID_ODefEditorContent) + self.Bind(wx.EVT_MENU, self.OnCreateOgre, id=ID_CreateOgre) self.Bind(wx.EVT_MENU, self.OnCreatePerspective, id=ID_CreatePerspective) @@ -258,7 +283,23 @@ self.Bind(wx.EVT_MENU_RANGE, self.OnRestorePerspective, id=ID_FirstPerspective, id2=ID_FirstPerspective+1000) - + + def OnChangeEditorModePerMenu(self, event): + self.changeEditorMode(event.GetId()) + + def changeEditorMode(self, id): + if id == ID_TerrainContent: + self._mgr.GetPane("ogre_odef_editor_content").Show(False) + self._mgr.GetPane("odef_editor_view_settings").Show(False) + self._mgr.GetPane("ogre_terrain_content").Show(True) + self._mgr.GetPane("object_preview").Show(True) + elif id == ID_ODefEditorContent: + self._mgr.GetPane("object_preview").Show(False) + self._mgr.GetPane("ogre_terrain_content").Show(False) + self._mgr.GetPane("ogre_odef_editor_content").Show(True) + self._mgr.GetPane("odef_editor_view_settings").Show(True) + self._mgr.Update() + def OnViewHelp(self, event=None): # show the settings pane, and float it floating_pane = self._mgr.GetPane("help").Float().Show() @@ -271,6 +312,7 @@ def addStuff(self, filename): try: + self.changeEditorMode(ID_TerrainContent) onlyfilename, extension = os.path.splitext(os.path.basename(filename)) if extension.lower() in ['.truck', '.load']: if not self.terrainOgreWin.addTruckToTerrain(truckFilename=filename): @@ -286,11 +328,20 @@ pass def previewObject(self, filename): - try: - self.objectPreviewWindow.loadFile(filename) - except: - pass - + #try: + self.objectPreviewWindow.loadFile(filename) + #except: + # pass + + def editODefFile(self, filename): + #try: + self.odefEditorOgreWin.loadFile(filename) + self.changeEditorMode(ID_ODefEditorContent) + self.oddefEditorViewSettings.resetControls() + #except Exception, err: + # print err + # pass + def updateObjPosRot(self, event=None): self.statusbar.SetStatusText(self.terrainOgreWin.currentStatusMsg, 1) if self.terrainOgreWin.terrain is None: Added: trunk/lib/rorterraineditor/MainFrame_Tools_ODefEditor.py =================================================================== --- trunk/lib/rorterraineditor/MainFrame_Tools_ODefEditor.py (rev 0) +++ trunk/lib/rorterraineditor/MainFrame_Tools_ODefEditor.py 2007-08-07 15:14:01 UTC (rev 158) @@ -0,0 +1,83 @@ +import sys, os, os.path + +from ror.logger import log +from ror.settingsManager import getSettingsManager + +import wx +import wx.aui + +import cStringIO + +ID_ChangeMainMeshTrans = wx.NewId() +ID_ChangeMainMeshVisibility = wx.NewId() +ID_ChangeNormalBoxesVisibility = wx.NewId() +ID_ChangeVirtualBoxesVisibility = wx.NewId() + +class OdefViewPanel(wx.Panel): + def __init__(self, parent, frame): + wx.Panel.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, + wx.DefaultSize) + self._frame = frame + self.parent = parent + + vert = wx.BoxSizer(wx.VERTICAL) + + s1 = wx.BoxSizer(wx.HORIZONTAL) + self.ObjTransparencySlider = wx.SpinCtrl(self, ID_ChangeMainMeshTrans, "", wx.DefaultPosition, wx.Size(50,20), min=0, max=100, initial=60) + s1.Add((1, 1), 1, wx.EXPAND) + s1.Add(wx.StaticText(self, -1, "Object Transparency:")) + s1.Add(self.ObjTransparencySlider) + s1.Add((1, 1), 1, wx.EXPAND) + vert.Add(s1, 0, wx.EXPAND | wx.LEFT | wx.BOTTOM, 5) + + self.chkMeshVisible = wx.CheckBox(self, ID_ChangeMainMeshVisibility, "Display Object", wx.DefaultPosition, wx.Size(50,20)) + vert.Add(self.chkMeshVisible, 0, wx.EXPAND | wx.LEFT | wx.BOTTOM, 5) + + self.chkBoxNormalVisible = wx.CheckBox(self, ID_ChangeNormalBoxesVisibility, "Display Collision Boxes", wx.DefaultPosition, wx.Size(50,20)) + vert.Add(self.chkBoxNormalVisible, 0, wx.EXPAND | wx.LEFT | wx.BOTTOM, 5) + + self.chkBoxVirtualVisible = wx.CheckBox(self, ID_ChangeVirtualBoxesVisibility, "Display Virtual Boxes", wx.DefaultPosition, wx.Size(50,20)) + self.chkBoxVirtualVisible.SetValue(True) + vert.Add(self.chkBoxVirtualVisible, 0, wx.EXPAND | wx.LEFT | wx.BOTTOM, 5) + + + self.Bind(wx.EVT_SPINCTRL, self.OnMainMeshTransChange, id=ID_ChangeMainMeshTrans) + self.Bind(wx.EVT_CHECKBOX, self.OnMainMeshVisibilityChange, id=ID_ChangeMainMeshVisibility) + self.Bind(wx.EVT_CHECKBOX, self.OnNormalBoxesVisibilityChange, id=ID_ChangeNormalBoxesVisibility) + self.Bind(wx.EVT_CHECKBOX, self.OnVirtualBoxesVisibilityChange, id=ID_ChangeVirtualBoxesVisibility) + + self.SetSizer(vert) + self.GetSizer().SetSizeHints(self) + self.resetControls() + + def resetControls(self): + self.chkMeshVisible.SetValue(True) + self.chkBoxNormalVisible.SetValue(True) + self.ObjTransparencySlider.SetValue(60) + + + def OnMainMeshTransChange(self, event): + self.parent.odefEditorOgreWin.setMainMeshTrans(event.GetInt()) + + def OnMainMeshVisibilityChange(self, event): + self.parent.odefEditorOgreWin.setMainMeshVisible(event.IsChecked()) + + def OnNormalBoxesVisibilityChange(self, event): + self.parent.odefEditorOgreWin.setBoxesVisibility("normal", event.IsChecked()) + + def OnVirtualBoxesVisibilityChange(self, event): + self.parent.odefEditorOgreWin.setBoxesVisibility("virtual", event.IsChecked()) + + def loadReadme(self): + if os.path.isfile(HELPFILENAME): + try: + f = open(HELPFILENAME,'r') + content = f.read() + f.close() + return content + except Exception, err: + log().error(str(err)) + return None + else: + log().error("TerrainEditor Readme not found: %s" % HELPFILENAME) + return None Modified: trunk/lib/rorterraineditor/RoRObjectPreviewOgreWindow.py =================================================================== --- trunk/lib/rorterraineditor/RoRObjectPreviewOgreWindow.py 2007-08-03 23:52:10 UTC (rev 157) +++ trunk/lib/rorterraineditor/RoRObjectPreviewOgreWindow.py 2007-08-07 15:14:01 UTC (rev 158) @@ -69,7 +69,7 @@ self.camera = self.sceneManager.createCamera(str(randomID())+'Camera') self.camera.lookAt(ogre.Vector3(0, 0, 0)) self.camera.setPosition(ogre.Vector3(0, 0, 100)) - self.camera.nearClipDistance = 0.1 + self.camera.nearClipDistance = 1 self.camera.setAutoAspectRatio(True) # create the Viewport" @@ -96,7 +96,7 @@ self.free() uuid = randomID() self.objnode, self.objentity, manualobject = createTruckMesh(self.sceneManager, filename, uuid) - print "aaa", self.objnode.getPosition() + #print "aaa", self.objnode.getPosition() elif extension.lower() in [".odef"]: self.free() uuid = randomID() @@ -104,9 +104,9 @@ def loadodef(self, filename, uuid): try: - (meshname, sx, sy, sz) = loadOdef(filename) + meshname, sx, sy, sz, ismovable, boxes = loadOdef(filename) except Exception, err: - log().error("error while processing odef file %s" % odefFilename) + log().error("error while processing odef file %s" % filename) log().error(str(err)) return # create mesh @@ -118,6 +118,7 @@ #self.objnode.setPosition(0,0,0) if not sx is None: self.objnode.setScale(sx, sy, sz) + def free(self): try: @@ -164,7 +165,10 @@ def updateCamera(self): if not self.objnode is None: self.radius = self.objentity.getBoundingRadius() * 2 - height = self.objentity.getBoundingBox().getMaximum().z + if self.objentity is None: + height = 20 + else: + height = self.objentity.getBoundingBox().getMaximum().z #pos = self.objnode.getPosition() + ogre.Vector3(0, height*0.4, 0) # always look to the center! pos = self.objnode.getPosition() + ogre.Vector3(0, height*0.4, 0) + (self.objentity.getBoundingBox().getMinimum() + self.objentity.getBoundingBox().getMaximum() ) / 2 Added: trunk/lib/rorterraineditor/RoROdefEditorOgreWindow.py =================================================================== --- trunk/lib/rorterraineditor/RoROdefEditorOgreWindow.py (rev 0) +++ trunk/lib/rorterraineditor/RoROdefEditorOgreWindow.py 2007-08-07 15:14:01 UTC (rev 158) @@ -0,0 +1,359 @@ +#Thomas Fischer 31/05/2007, th...@th... +import wx, math +import ogre.renderer.OGRE as ogre +from wxogre.OgreManager import * +from wxogre.wxOgreWindow import * +from ror.SimpleTruckRepresentation import * +from ror.odefparser import * +from ror.rorcommon import * + + +class TreeDropTarget(wx.PyDropTarget): + def __init__(self, window): + wx.PyDropTarget.__init__(self) + self.do = wx.FileDataObject() + self.SetDataObject(self.do) + + def OnEnter(self, x, y, d): + print "OnEnter: %d, %d, %d\n" % (x, y, d) + return wx.DragCopy + + def OnDragOver(self, x, y, d): + print "OnDragOver: %d, %d, %d\n" % (x, y, d) + return wx.DragCopy + + def OnLeave(self): + print "OnLeave\n" + + def OnDrop(self, x, y): + print "OnDrop: %d %d\n" % (x, y) + return True + + def OnData(self, x, y, d): + print "OnData: %d, %d, %d\n" % (x, y, d) + self.GetData() + print "%s\n" % self.do.GetFilenames() + return d + + +NEWMATNAME = "mysimple/odefeditor/objplaceholder" + +class ODefEditorOgreWindow(wxOgreWindow): + def __init__(self, parent, ID, size = wx.Size(200,200), rordir = "", **kwargs): + self.rordir = rordir + self.parent = parent + self.objnode = None + self.objentity = None + self.camalpha = 0 + self.radius = 40 + self.dragging = False + self.boxes = [] + self.objmat = None + self.randcolors = [0,0.2,0.4] + wxOgreWindow.__init__(self, parent, ID, size = size, **kwargs) + droptarget = TreeDropTarget(self) + self.SetDropTarget(droptarget) + + + def SceneInitialisation(self): + addresources = [self.rordir+"\\data\\terrains",self.rordir+"\\data\\trucks",self.rordir+"\\data\\objects"] + # only init things in the main window, not in shared ones! + # setup resources + for r in addresources: + ogre.ResourceGroupManager.getSingleton().addResourceLocation(r, "FileSystem", "General", False) + + ogre.ResourceGroupManager.getSingleton().addResourceLocation("media/packs/OgreCore.zip", "Zip", "Bootstrap", False) + ogre.ResourceGroupManager.getSingleton().addResourceLocation("media", "FileSystem", "General", False) + ogre.ResourceGroupManager.getSingleton().addResourceLocation("media/materials", "FileSystem", "General", False) + ogre.ResourceGroupManager.getSingleton().addResourceLocation("media/models", "FileSystem", "General", False) + ogre.ResourceGroupManager.getSingleton().initialiseAllResourceGroups() + + #get the scenemanager + self.sceneManager = getOgreManager().createSceneManager(ogre.ST_GENERIC) + + # create a camera + self.camera = self.sceneManager.createCamera(str(randomID())+'Camera') + self.camera.lookAt(ogre.Vector3(0, 0, 0)) + self.camera.setPosition(ogre.Vector3(0, 0, 100)) + self.camera.nearClipDistance = 1 + self.camera.setAutoAspectRatio(True) + + # create the Viewport" + self.viewport = self.renderWindow.addViewport(self.camera, 0, 0.0, 0.0, 1.0, 1.0) + self.viewport.backgroundColour = ogre.ColourValue(0, 0, 0) + + # bind mouse and keyboard + d=10.0 #displacement for key strokes + self.ControlKeyDict={wx.WXK_LEFT:ogre.Vector3(-d,0.0,0.0), + wx.WXK_RIGHT:ogre.Vector3(d,0.0,0.0), + wx.WXK_UP:ogre.Vector3(0.0,0.0,-d), + wx.WXK_DOWN:ogre.Vector3(0.0,0.0,d), + wx.WXK_PAGEUP:ogre.Vector3(0.0,d,0.0), + wx.WXK_PAGEDOWN:ogre.Vector3(0.0,-d,0.0)} + self.Bind(wx.EVT_KEY_DOWN, self.onKeyDown) + #self.Bind(wx.EVT_KEY_UP, self.onKeyUp) + self.Bind(wx.EVT_MOUSE_EVENTS, self.onMouseEvent) + #create objects + self.populateScene() + + def loadFile(self, filename): + self.filename = filename + filenameonly, extension = os.path.splitext(filename) + if extension.lower() in [".truck", ".load"]: + self.free() + uuid = randomID() + self.objnode, self.objentity, manualobject = createTruckMesh(self.sceneManager, filename, uuid) + elif extension.lower() in [".odef"]: + self.free() + uuid = randomID() + self.loadodef(filename, uuid) + + def loadodef(self, filename, uuid): + try: + meshname, sx, sy, sz, ismovable, boxes = loadOdef(filename) + except Exception, err: + log().error("error while processing odef file %s" % filename) + log().error(str(err)) + return + # create mesh + self.objnode = self.sceneManager.getRootSceneNode().createChildSceneNode(uuid+"objnode") + self.objentity = self.sceneManager.createEntity(uuid+'objentity', meshname) + self.objnode.attachObject(self.objentity) + self.objnode.rotate(ogre.Vector3.UNIT_X, ogre.Degree(-90),relativeTo=ogre.Node.TransformSpace.TS_WORLD) + + self.objOriginalMat = ogre.MaterialManager.getSingleton().getByName(self.objentity.getSubEntity(0).getMaterialName()) + if self.objmat is None: + self.objmat = ogre.MaterialManager.getSingleton().getByName(NEWMATNAME) + self.objOriginalMat.copyDetailsTo(self.objmat) + # self.objmat = ogre.MaterialManager.getSingleton().getByName(NEWMATNAME) + self.objmat.setSceneBlending(ogre.SceneBlendFactor.SBF_SOURCE_ALPHA, ogre.SceneBlendFactor.SBF_DEST_ALPHA ) + self.objentity.setMaterialName(NEWMATNAME) + self.setMainMeshTrans(60) + + self.objnode.setPosition(0,0,0) + if not sx is None: + self.objnode.setScale(sx, sy, sz) + for box in boxes: + + matname = "mysimple/odefeditor/transred" + if box.virtual: + matname = "mysimple/odefeditor/transgreen" + matname = self.getNewMat(matname) + box.uuid = randomID() + box.node = self.sceneManager.getRootSceneNode().createChildSceneNode(box.uuid+"boxnode") + box.entity = self.sceneManager.createEntity(box.uuid+'boxentity', "beam.mesh") + box.entity.setMaterialName(matname) + box.node.attachObject(box.entity) + + if box.rotating: + rotx = float(box.rotation[0]) + roty = float(box.rotation[1]) + rotz = float(box.rotation[2]) + box.node.rotate(ogre.Vector3.UNIT_Z, ogre.Degree(rotz),relativeTo=ogre.Node.TransformSpace.TS_WORLD) + box.node.rotate(ogre.Vector3.UNIT_Y, ogre.Degree(roty),relativeTo=ogre.Node.TransformSpace.TS_WORLD) + box.node.rotate(ogre.Vector3.UNIT_X, ogre.Degree(rotx),relativeTo=ogre.Node.TransformSpace.TS_WORLD) + + x = float(box.coords[0]) + x1 = float(box.coords[1]) + y = float(box.coords[2]) + y1 = float(box.coords[3]) + z = float(box.coords[4]) + z1 = float(box.coords[5]) + xdiff = x1-x + ydiff = y1-y + zdiff = z1-z + box.node.setPosition(x+xdiff/2, y+ydiff/2, z+zdiff/2) + box.node.setScale(xdiff, ydiff, zdiff) + self.boxes.append(box) + + def getNewMat(self, basematname): + uuid = randomID() + matname = uuid+"mat" + basemat = ogre.MaterialManager.getSingleton().getByName(basematname) + mat = ogre.MaterialManager.getSingleton().create(matname, basemat.getGroup()) + basemat.copyDetailsTo(mat) + #mat = ogre.MaterialManager.getSingleton().getByName(matname) + for i in range(0,2): + self.randcolors[i] += 0.1 + if self.randcolors[i] >= 1: + self.randcolors[i] -= 1 + mat.setDiffuse(self.randcolors[0], self.randcolors[1], self.randcolors[2], 0.8) + mat.setSpecular(self.randcolors[0], self.randcolors[1], self.randcolors[2], 0.8) + mat.setSelfIllumination(self.randcolors[0], self.randcolors[1], self.randcolors[2]) + mat.setAmbient(self.randcolors[0], self.randcolors[1], self.randcolors[2]) + print "new material:", matname + return matname + + def setMainMeshTrans(self, alpha): + alpha = float(alpha) / float(100) + self.objmat.setDiffuse(0.5, 1, 0.5, alpha) + self.objmat.setSpecular(0.5, 1, 0.5, alpha) + + def setMainMeshVisible(self, visible): + self.objentity.setVisible(visible) + + def setBoxesVisibility(self, type, visible): + for box in self.boxes: + if type == "normal" and box.virtual == False: + box.entity.setVisible(visible) + elif type == "virtual" and box.virtual == True: + box.entity.setVisible(visible) + + def free(self): + for box in self.boxes: + try: + box.node.detachAllObjects() + self.sceneManager.destroySceneNode(box.node.getName()) + except: + pass + try: + self.sceneManager.destroyEntity(box.entity) + except: + pass + self.boxes = [] + + try: + self.sceneManager.destroyAllManualObjects() + except: + pass + try: + self.objnode.detachAllObjects() + self.sceneManager.destroySceneNode(self.objnode.getName()) + except: + pass + try: + self.sceneManager.destroyEntity(self.objentity) + except: + pass + + def populateScene(self): + self.sceneManager.AmbientLight = ogre.ColourValue(0.7, 0.7, 0.7 ) + self.sceneManager.setShadowTechnique(ogre.ShadowTechnique.SHADOWTYPE_STENCIL_ADDITIVE); + self.sceneManager.setSkyDome(True, 'mysimple/terraineditor/previewwindowsky', 4.0, 8.0) + + #self.MainLight = self.sceneManager.createLight('MainLight') + #self.MainLight.setPosition (ogre.Vector3(20, 80, 130)) + + # add some fog + self.sceneManager.setFog(ogre.FOG_EXP, ogre.ColourValue.White, 0.0002) + + # create a floor Mesh + plane = ogre.Plane() + plane.normal = ogre.Vector3(0, 1, 0) + plane.d = 200 + uuid = str(randomID()) + ogre.MeshManager.getSingleton().createPlane(uuid + 'FloorPlane', "General", plane, 200000.0, 200000.0, + 20, 20, True, 1, 50.0, 50.0,ogre.Vector3(0, 0, 1), + ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY, + ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY, + True, True) + + # create floor entity + entity = self.sceneManager.createEntity(uuid+'floor', uuid + 'FloorPlane') + entity.setMaterialName('mysimple/terraineditor/previewwindowfloor') + self.sceneManager.getRootSceneNode().createChildSceneNode().attachObject(entity) + + def updateCamera(self): + return + if not self.objnode is None: + self.radius = self.objentity.getBoundingRadius() * 2 + height = self.objentity.getBoundingBox().getMaximum().z + #pos = self.objnode.getPosition() + ogre.Vector3(0, height*0.4, 0) + # always look to the center! + pos = self.objnode.getPosition() + ogre.Vector3(0, height*0.4, 0) + (self.objentity.getBoundingBox().getMinimum() + self.objentity.getBoundingBox().getMaximum() ) / 2 + dx = math.cos(self.camalpha) * self.radius + dy = math.sin(self.camalpha) * self.radius + self.camera.setPosition(pos - ogre.Vector3(dx, -5, dy)) + self.camera.lookAt(pos + ogre.Vector3(0, height / 2, 0)) + + # disable auto rotation + #if self.dragging == False: + # self.camalpha += math.pi / 720 + if self.camalpha >= 360: + self.camalpha -= 360 + + + def OnFrameStarted(self): + self.updateCamera() + wxOgreWindow.OnFrameStarted(self) + + def onMouseEvent(self,event): + self.SetFocus() + width, height, a, b, c = self.renderWindow.getMetrics() + + if event.RightDown(): #Precedes dragging + self.StartDragX, self.StartDragY = event.GetPosition() #saves position of initial click + if event.GetWheelRotation() != 0: + zfactor = 0.001 + if event.ShiftDown(): + zfactor = 0.01 + zoom = zfactor * -event.GetWheelRotation() + self.camera.moveRelative(ogre.Vector3(0,0, zoom)) + + if event.Dragging() and event.RightIsDown() and event.ControlDown(): + x,y = event.GetPosition() + dx = self.StartDragX - x + dy = self.StartDragY - y + self.StartDragX, self.StartDragY = x, y + if event.ShiftDown(): + dx = float(dx) / 10 + dy = float(dy) / 10 + else: + dx = float(dx) / 50 + dy = float(dy) / 50 + self.camera.moveRelative(ogre.Vector3(dx,-dy,0)) + + elif event.Dragging() and event.RightIsDown(): #Dragging with RMB + x,y = event.GetPosition() + dx = self.StartDragX - x + dy = self.StartDragY - y + self.StartDragX, self.StartDragY = x, y + + self.camera.yaw(ogre.Degree(dx/3.0)) + self.camera.pitch(ogre.Degree(dy/3.0)) + if event.LeftDown(): + #self.selectnew(event) + self.StartDragLeftX, self.StartDragLeftY = event.GetPosition() #saves position of initial click + zfactor = 0.1 + if event.ShiftDown(): + zfactor = 5 + zoom = zfactor * -event.GetWheelRotation() + self.camera.moveRelative(ogre.Vector3(0,0, zoom)) + + def onKeyDown(self,event): + #print event.m_keyCode + d = 3 + if event.ShiftDown(): + d = 10 + if event.m_keyCode == 65: # A, wx.WXK_LEFT: + self.camera.moveRelative(ogre.Vector3(-d,0,0)) + elif event.m_keyCode == 68: # D, wx.WXK_RIGHT: + self.camera.moveRelative(ogre.Vector3(d,0,0)) + elif event.m_keyCode == 87: # W ,wx.WXK_UP: + self.camera.moveRelative(ogre.Vector3(0,0,-d)) + elif event.m_keyCode == 83: # S, wx.WXK_DOWN: + self.camera.moveRelative(ogre.Vector3(0,0,d)) + elif event.m_keyCode == wx.WXK_PAGEUP: + self.camera.moveRelative(ogre.Vector3(0,d,0)) + elif event.m_keyCode == wx.WXK_PAGEDOWN: + self.camera.moveRelative(ogre.Vector3(0,-d,0)) + elif event.m_keyCode == 84: # 84 = T + if self.filtering == ogre.TFO_BILINEAR: + self.filtering = ogre.TFO_TRILINEAR + self.Aniso = 1 + elif self.filtering == ogre.TFO_TRILINEAR: + self.filtering = ogre.TFO_ANISOTROPIC + self.Aniso = 8 + else: + self.filtering = ogre.TFO_BILINEAR + self.Aniso = 1 + ogre.MaterialManager.getSingleton().setDefaultTextureFiltering(self.filtering) + ogre.MaterialManager.getSingleton().setDefaultAnisotropy(self.Aniso) + elif event.m_keyCode == 82: # 82 = R + detailsLevel = [ ogre.PM_SOLID, + ogre.PM_WIREFRAME, + ogre.PM_POINTS ] + self.sceneDetailIndex = (self.sceneDetailIndex + 1) % len(detailsLevel) + self.camera.polygonMode=detailsLevel[self.sceneDetailIndex] + elif event.m_keyCode == 81: # Q, wx.WXK_LEFT: + self.enablephysics = not self.enablephysics \ No newline at end of file Modified: trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py =================================================================== --- trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-08-03 23:52:10 UTC (rev 157) +++ trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-08-07 15:14:01 UTC (rev 158) @@ -197,7 +197,9 @@ self.camera = self.sceneManager.createCamera(str(cameraUUID)+"camera") self.camera.lookAt(ogre.Vector3(0, 0, 0)) self.camera.setPosition(ogre.Vector3(0, 0, 100)) - self.camera.nearClipDistance = 0.1 + + # dont set this too low, or you will get z-fights!! + self.camera.nearClipDistance = 2 self.camera.setAutoAspectRatio(True) # create the Viewport" @@ -491,7 +493,7 @@ meshname = None try: - (meshname, sx, sy, sz) = loadOdef(odefFilename) + meshname, sx, sy, sz, ismovable, boxes = loadOdef(odefFilename) except Exception, err: data.error=True log().error("error while processing odef file %s" % odefFilename) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |