From: <ror...@us...> - 2007-08-02 14:26:55
|
Revision: 149 http://roreditor.svn.sourceforge.net/roreditor/?rev=149&view=rev Author: rorthomas Date: 2007-08-02 07:26:50 -0700 (Thu, 02 Aug 2007) Log Message: ----------- * deleted unused mesh * added object browser and re-added functionality to add objects to the terrain * splitted up some code, to use it in more than one place (odefparser, simpletruckrep.) Modified Paths: -------------- trunk/lib/ror/rorcommon.py trunk/lib/rorterraineditor/MainFrame.py trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py trunk/media/materials/mysimple.material Added Paths: ----------- trunk/lib/ror/SimpleTruckRepresentation.py trunk/lib/ror/odefparser.py trunk/lib/rorterraineditor/GUIObjectTree.py trunk/lib/rorterraineditor/GUIPreviewObject.py trunk/lib/rorterraineditor/RoRObjectPreviewOgreWindow.py Removed Paths: ------------- trunk/media/models/wheel.mesh Added: trunk/lib/ror/SimpleTruckRepresentation.py =================================================================== --- trunk/lib/ror/SimpleTruckRepresentation.py (rev 0) +++ trunk/lib/ror/SimpleTruckRepresentation.py 2007-08-02 14:26:50 UTC (rev 149) @@ -0,0 +1,105 @@ +#Thomas Fischer 31/05/2007, th...@th... +import wx, os, os.path, copy +import ogre.renderer.OGRE as ogre +from ror.truckparser import * +from ror.terrainparser import * +from wxogre.OgreManager import * +from wxogre.wxOgreWindow import * +from ror.rorcommon import * + +def createTruckMesh(sceneManager, fn, uuid): + if not os.path.isfile(fn): + #print "truck file not found: " + fn + log().error("truck file not found: %s" % fn) + return + p = rorparser() + p.parse(fn) + if not 'nodes' in p.tree.keys() or not 'beams' in p.tree.keys(): + log().error("error while processing truck file %s" % fn) + return False + + try: + myManualObject = sceneManager.createManualObject(str(uuid)+"manual") + + #myManualObjectMaterial = ogre.MaterialManager.getSingleton().create("manualmaterial"+truckname+str(self.randomcounter),"debugger"); + #myManualObjectMaterial.setReceiveShadows(False) + #myManualObjectMaterial.getTechnique(0).setLightingEnabled(True) + #myManualObjectMaterial.getTechnique(0).getPass(0).setDiffuse(0,0,1,0) + #myManualObjectMaterial.getTechnique(0).getPass(0).setAmbient(0,0,1) + #myManualObjectMaterial.getTechnique(0).getPass(0).setSelfIllumination(0,0,1) + #myManualObjectMaterial.getTechnique(0).getPass(0).setCullingMode(ogre.CULL_ANTICLOCKWISE) + + matname = "" + if fn[-4:].lower() == "load": + matname = 'mysimple/loadcolor' + elif fn[-5:].lower() == "truck": + matname = 'mysimple/truckcolor' + + myManualObject.useIndexes = True + myManualObject.estimateVertexCount(2000) + myManualObject.estimateIndexCount(2000) + + myManualObject.begin(matname+"grid", ogre.RenderOperation.OT_LINE_LIST) + for nodeobj in p.tree['nodes']: + if nodeobj.has_key('type'): + continue + node = nodeobj['data'] + myManualObject.position(float(node[1]),float(node[2]),float(node[3])) + for beamobj in p.tree['beams']: + if beamobj.has_key('type'): + continue + beam = beamobj['data'] + myManualObject.index(int(beam[0])) + myManualObject.index(int(beam[1])) + myManualObject.end() + myManualObject.begin(matname, ogre.RenderOperation.OT_TRIANGLE_LIST) + for nodeobj in p.tree['nodes']: + if nodeobj.has_key('type'): + continue + node = nodeobj['data'] + myManualObject.position(float(node[1]),float(node[2]),float(node[3])) + + #print len(p.tree['submeshgroups']) + if len(p.tree['submeshgroups']) > 0: + faces = [] + for smobj in p.tree['submeshgroups']: + for cabobj in smobj['cab']: + if cabobj.has_key('type'): + continue + cab = cabobj['data'] + #print "########face" + if cab != []: + try: + myManualObject.triangle(int(cab[0]),int(cab[1]),int(cab[2])) + except: + print "error with cab: " + str(cab) + pass + else: + print "truck has no faces!" + + myManualObject.end() + + try: + mesh = myManualObject.convertToMesh(str(uuid)+"manual") + entity = sceneManager.createEntity(str(uuid)+"entity", str(uuid)+"manual") + #trucknode = sceneManager.getRootSceneNode().createChildSceneNode() + myManualObjectNode = sceneManager.getRootSceneNode().createChildSceneNode(str(uuid)+"node") + myManualObjectNode.attachObject(myManualObject) + mesh = myManualObject.convertToMesh(str(uuid)+"manual") + entity = sceneManager.createEntity(str(uuid)+"entity", str(uuid)+"manual") + #trucknode = sceneManager.getRootSceneNode().createChildSceneNode() + myManualObjectNode = sceneManager.getRootSceneNode().createChildSceneNode(str(uuid)+"node") + myManualObjectNode.attachObject(entity) + myManualObjectNode.attachObject(myManualObject) + except: + mesh = None + entity = None + myManualObjectNode = sceneManager.getRootSceneNode().createChildSceneNode(str(uuid)+"node") + myManualObjectNode.attachObject(myManualObject) + + + return myManualObjectNode, entity, mesh + except Exception, err: + log().error("error while processing truck file %s" % fn) + log().error(str(err)) + return None, None, None \ No newline at end of file Added: trunk/lib/ror/odefparser.py =================================================================== --- trunk/lib/ror/odefparser.py (rev 0) +++ trunk/lib/ror/odefparser.py 2007-08-02 14:26:50 UTC (rev 149) @@ -0,0 +1,10 @@ +def loadOdef(odefFilename): + f=open(odefFilename, 'r') + content = f.readlines() + f.close() + meshname = content[0].strip() + scalearr = [1,1,1] + if len(content) > 2: + scalearr = content[1].split(",") + + return (meshname, float(scalearr[0]), float(scalearr[1]), float(scalearr[2])) Modified: trunk/lib/ror/rorcommon.py =================================================================== --- trunk/lib/ror/rorcommon.py 2007-08-01 12:09:55 UTC (rev 148) +++ trunk/lib/ror/rorcommon.py 2007-08-02 14:26:50 UTC (rev 149) @@ -14,9 +14,10 @@ dlg.ShowModal() dlg.Destroy() - - + +uniqueIDs = [] def randomID(num_bits=64): + global uniqueIDs """Return a string representing a bitfield num_bits long. Maximum artbitrarily set to 1025""" @@ -36,4 +37,11 @@ # The 2: removes the '0x' and :-1 removes the L rnd_id = hex(tmp_id)[2:-1] - return(rnd_id) \ No newline at end of file + + # this ensure that all ids are unique + if rnd_id in uniqueIDs: + rnd_id = randomID(num_bits) + else: + uniqueIDs.append(rnd_id) + + return rnd_id \ No newline at end of file Added: trunk/lib/rorterraineditor/GUIObjectTree.py =================================================================== --- trunk/lib/rorterraineditor/GUIObjectTree.py (rev 0) +++ trunk/lib/rorterraineditor/GUIObjectTree.py 2007-08-02 14:26:50 UTC (rev 149) @@ -0,0 +1,119 @@ +import sys, os, os.path + +import wx +import wx.grid +import wx.html +import wx.aui +import ror.settingsManager + +import cStringIO + +RORPATH = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") +DATADIR = os.path.join(RORPATH, "data") +TRUCKDIR = os.path.join(DATADIR, "trucks") +TERRAINDIR = os.path.join(DATADIR, "terrains") +OBJECTDIR = os.path.join(DATADIR, "objects") + +class RoRObjectTreeCtrl(wx.Panel): + def __init__(self, parent, frame): + wx.Panel.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, + wx.DefaultSize) + + self.parent = parent + self._frame = frame + + + vert = wx.BoxSizer(wx.VERTICAL) + + + tree = wx.TreeCtrl(self, -1, wx.Point(0, 0), wx.DefaultSize, wx.NO_BORDER) + + root = tree.AddRoot("Objects") + items = [] + + imglist = wx.ImageList(16, 16, True, 2) + imglist.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, wx.Size(16,16))) + imglist.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, wx.Size(16,16))) + tree.AssignImageList(imglist) + + trucks = self.getInstalledTrucks() + items.append(tree.AppendItem(root, "Trucks", 0)) + for truck in trucks: + truckname, extension = os.path.splitext(os.path.basename(truck)) + data = wx.TreeItemData() + data.SetData(truck) + tree.AppendItem(items[-1], truckname, 1, data=data) + + loads = self.getInstalledLoads() + items.append(tree.AppendItem(root, "Loads", 0)) + for load in loads: + loadname, extension = os.path.splitext(os.path.basename(load)) + data = wx.TreeItemData() + data.SetData(load) + tree.AppendItem(items[-1], loadname, 1, data=data) + + objects = self.getInstalledObjects() + items.append(tree.AppendItem(root, "Objects", 0)) + for object in objects: + objectname, extension = os.path.splitext(os.path.basename(object)) + data = wx.TreeItemData() + data.SetData(object) + tree.AppendItem(items[-1], objectname, 1, data=data) + + + tree.Expand(root) + vert.Add(tree, 1, wx.EXPAND, 5) + self.SetSizer(vert) + self.GetSizer().SetSizeHints(self) + + self.tree = 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_BEGIN_DRAG, self.BeginDrag, self.tree) + + def addStuff(self, event): + fn = self.tree.GetItemData(event.GetItem()).GetData() + if fn is None: + return + self.parent.addStuff(fn) + #def BeginDrag(self, event): + # ''' + # EVT_TREE_BEGIN_DRAG handler. + # ''' + # self.dragItem = event.GetItem() + # fn = self.tree.GetItemData(event.GetItem()).GetData() + # if fn is None: + # return + # #event.Allow() + # wx.TreeEvent.Allow(event) + + def onTreeSelectionChange(self, event=None): + fn = self.tree.GetItemData(self.tree.GetSelection()).GetData() + if fn is None: + return + self.parent.previewObject(fn) + + def getInstalledTrucks(self): + files = [] + for filename in os.listdir(TRUCKDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".truck": + files.append(os.path.join(TRUCKDIR, filename)) + return files + + def getInstalledLoads(self): + files = [] + for filename in os.listdir(TRUCKDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".load": + files.append(os.path.join(TRUCKDIR, filename)) + return files + + def getInstalledObjects(self): + files = [] + for filename in os.listdir(OBJECTDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".odef": + files.append(os.path.join(OBJECTDIR, filename)) + return files \ No newline at end of file Added: trunk/lib/rorterraineditor/GUIPreviewObject.py =================================================================== --- trunk/lib/rorterraineditor/GUIPreviewObject.py (rev 0) +++ trunk/lib/rorterraineditor/GUIPreviewObject.py 2007-08-02 14:26:50 UTC (rev 149) @@ -0,0 +1,70 @@ +import sys, os, os.path + +import wx +import wx.grid +import wx.html +import wx.aui +import ror.settingsManager + +import cStringIO + +RORPATH = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") +DATADIR = os.path.join(RORPATH, "data") +TRUCKDIR = os.path.join(DATADIR, "trucks") +TERRAINDIR = os.path.join(DATADIR, "terrains") +OBJECTDIR = os.path.join(DATADIR, "objects") + +class RoRObjectTreeCtrl(wx.Panel): + def __init__(self, parent, frame): + wx.Panel.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, + wx.DefaultSize) + + self._frame = frame + + + vert = wx.BoxSizer(wx.VERTICAL) + + + tree = wx.TreeCtrl(self, -1, wx.Point(0, 0), wx.DefaultSize, wx.NO_BORDER) + + root = tree.AddRoot("Objects") + items = [] + + imglist = wx.ImageList(16, 16, True, 2) + imglist.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, wx.Size(16,16))) + imglist.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, wx.Size(16,16))) + tree.AssignImageList(imglist) + + trucks = self.getInstalledTrucks() + items.append(tree.AppendItem(root, "Trucks", 0)) + for truck in trucks: + truckname, extension = os.path.splitext(truck) + tree.AppendItem(items[-1], truckname, 1) + + objects = self.getInstalledObjects() + items.append(tree.AppendItem(root, "Objects", 0)) + for object in objects: + objectname, extension = os.path.splitext(object) + tree.AppendItem(items[-1], objectname, 1) + + + tree.Expand(root) + vert.Add(tree, 1, wx.EXPAND, 5) + self.SetSizer(vert) + self.GetSizer().SetSizeHints(self) + + def getInstalledTrucks(self): + files = [] + for filename in os.listdir(TRUCKDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".truck": + files.append(filename) + return files + + def getInstalledObjects(self): + files = [] + for filename in os.listdir(OBJECTDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".odef": + files.append(filename) + return files \ No newline at end of file Modified: trunk/lib/rorterraineditor/MainFrame.py =================================================================== --- trunk/lib/rorterraineditor/MainFrame.py 2007-08-01 12:09:55 UTC (rev 148) +++ trunk/lib/rorterraineditor/MainFrame.py 2007-08-02 14:26:50 UTC (rev 149) @@ -8,9 +8,12 @@ from ror.rorcommon import * from RoRTerrainOgreWindow import * +from RoRObjectPreviewOgreWindow import * from RoRTerrainSelectedObjectOgreWindow import * from RoRTerrainSelectedObjectTopOgreWindow import * +# GUI Tools: +from GUIObjectTree import * from MainFrame_Tools import * import wx @@ -34,14 +37,12 @@ ID_CreateOgre = wx.NewId() -ID_CreateTree = wx.NewId() ID_CreateGrid = wx.NewId() ID_CreateText = wx.NewId() ID_CreateHTML = wx.NewId() ID_CreateSizeReport = wx.NewId() ID_GridContent = wx.NewId() ID_TextContent = wx.NewId() -ID_TreeContent = wx.NewId() ID_HTMLContent = wx.NewId() ID_SizeReportContent = wx.NewId() ID_CreatePerspective = wx.NewId() @@ -86,14 +87,12 @@ view_menu.Append(ID_CreateOgre, "Create OgreWindow") view_menu.Append(ID_CreateText, "Create Text Control") view_menu.Append(ID_CreateHTML, "Create HTML Control") - view_menu.Append(ID_CreateTree, "Create Tree") view_menu.Append(ID_CreateGrid, "Create Grid") view_menu.Append(ID_CreateSizeReport, "Create Size Reporter") view_menu.AppendSeparator() view_menu.Append(ID_GridContent, "Use a Grid for the Content Pane") view_menu.Append(ID_TextContent, "Use a Text Control for the Content Pane") view_menu.Append(ID_HTMLContent, "Use an HTML Control for the Content Pane") - view_menu.Append(ID_TreeContent, "Use a Tree Control for the Content Pane") view_menu.Append(ID_SizeReportContent, "Use a Size Reporter for the Content Pane") @@ -137,38 +136,65 @@ tb1.SetToolBitmapSize(wx.Size(16,16)) tb1.AddLabelTool(ID_OpenTerrain, "Open Terrain", wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) tb1.AddLabelTool(ID_SaveTerrain, "Save Terrain", wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE)) + tb1.EnableTool(ID_SaveTerrain, False) tb1.AddLabelTool(ID_SaveTerrainAs, "Save Terrain as", wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS)) + tb1.EnableTool(ID_SaveTerrainAs, False) tb1.AddSeparator() tb1.AddLabelTool(ID_AddObject, "Add Something", wx.ArtProvider_GetBitmap(wx.ART_NEW)) + tb1.EnableTool(ID_AddObject, False) tb1.AddLabelTool(ID_DeleteSelection, "Delete Selection", wx.ArtProvider_GetBitmap(wx.ART_DELETE)) + tb1.EnableTool(ID_DeleteSelection, False) tb1.AddSeparator() tb1.AddLabelTool(ID_CopySelection, "Copy Selection", wx.ArtProvider_GetBitmap(wx.ART_COPY)) + tb1.EnableTool(ID_CopySelection, False) tb1.AddLabelTool(ID_PasteSelection, "Paste Selection", wx.ArtProvider_GetBitmap(wx.ART_PASTE)) + tb1.EnableTool(ID_PasteSelection, False) tb1.AddSeparator() tb1.AddLabelTool(ID_UndoAction, "Undo last Action", wx.ArtProvider_GetBitmap(wx.ART_UNDO)) + tb1.EnableTool(ID_UndoAction, False) tb1.AddLabelTool(ID_RedoAction, "Redo last Undo", wx.ArtProvider_GetBitmap(wx.ART_REDO)) + tb1.EnableTool(ID_RedoAction, False) tb1.AddSeparator() tb1.AddLabelTool(ID_FindObject, "Find Object", wx.ArtProvider_GetBitmap(wx.ART_FIND)) + tb1.EnableTool(ID_FindObject, False) tb1.AddSeparator() tb1.AddLabelTool(ID_Quit, "Quit", wx.ArtProvider_GetBitmap(wx.ART_QUIT)) - tb1.EnableTool(ID_SaveTerrain, False) - tb1.EnableTool(ID_SaveTerrainAs, False) tb1.Realize() self.tb1 = tb1 + + self.rordir = getSettingsManager().getSetting("RigsOfRods", "BasePath") + + # add a bunch of panes - self._mgr.AddPane(self.CreateSizeReportCtrl(), wx.aui.AuiPaneInfo(). - Name("test1").Caption("Pane Caption").Top(). - CloseButton(True).MaximizeButton(True)) + self.objectPreviewWindow = ObjectPreviewOgreWindow(self, wx.ID_ANY, rordir=self.rordir) + self._mgr.AddPane(self.objectPreviewWindow, wx.aui.AuiPaneInfo(). + Name("ogretest1"). + Caption("Object Preview"). + Left(). + MinSize(wx.Size(200,200)). + CloseButton(True). + MaximizeButton(False)) + self._mgr.AddPane(SettingsPanel(self, self), wx.aui.AuiPaneInfo(). - Name("settings").Caption("Dock Manager Settings"). - Dockable(False).Float().Hide().CloseButton(True).MaximizeButton(True)) + Name("settings"). + Caption("Dock Manager Settings"). + Dockable(False). + Float(). + Fixed(). + Hide(). + CloseButton(True). + MaximizeButton(True)) + + self._mgr.AddPane(RoRObjectTreeCtrl(self, self), wx.aui.AuiPaneInfo(). + Caption("Object Tree"). + MinSize(wx.Size(200,100)). + Left(). + CloseButton(True). + MaximizeButton(True)) # create some center panes - self._mgr.AddPane(self.CreateTreeCtrl(), wx.aui.AuiPaneInfo().Name("tree_content"). - CenterPane().Hide()) - self._mgr.AddPane(self.CreateSizeReportCtrl(), wx.aui.AuiPaneInfo().Name("sizereport_content"). CenterPane().Hide()) @@ -191,7 +217,7 @@ self.guitimer.Start(200) - self.rordir = getSettingsManager().getSetting("RigsOfRods", "BasePath") + self.terrainOgreWin = RoRTerrainOgreWindow(self, wx.ID_ANY, rordir=self.rordir) self._mgr.AddPane(self.terrainOgreWin, wx.aui.AuiPaneInfo().Name("ogre_content"). CenterPane()) @@ -211,9 +237,9 @@ # all - perspective all_panes = self._mgr.GetAllPanes() - for ii in xrange(len(all_panes)): - if not all_panes[ii].IsToolbar(): - all_panes[ii].Hide() + #for ii in xrange(len(all_panes)): + # if not all_panes[ii].IsToolbar(): + # all_panes[ii].Hide() self._mgr.GetPane("ogre_content").Show() perspective_default = self._mgr.SavePerspective() @@ -238,7 +264,6 @@ self.Bind(wx.EVT_MENU, self.OnCreateOgre, id=ID_CreateOgre) - self.Bind(wx.EVT_MENU, self.OnCreateTree, id=ID_CreateTree) self.Bind(wx.EVT_MENU, self.OnCreateGrid, id=ID_CreateGrid) self.Bind(wx.EVT_MENU, self.OnCreateText, id=ID_CreateText) self.Bind(wx.EVT_MENU, self.OnCreateHTML, id=ID_CreateHTML) @@ -249,7 +274,6 @@ self.Bind(wx.EVT_MENU, self.OnSettings, id=ID_Settings) self.Bind(wx.EVT_MENU, self.OnChangeContentPane, id=ID_GridContent) - self.Bind(wx.EVT_MENU, self.OnChangeContentPane, id=ID_TreeContent) self.Bind(wx.EVT_MENU, self.OnChangeContentPane, id=ID_TextContent) self.Bind(wx.EVT_MENU, self.OnChangeContentPane, id=ID_SizeReportContent) self.Bind(wx.EVT_MENU, self.OnChangeContentPane, id=ID_HTMLContent) @@ -259,6 +283,28 @@ self.Bind(wx.EVT_MENU_RANGE, self.OnRestorePerspective, id=ID_FirstPerspective, id2=ID_FirstPerspective+1000) + def addStuff(self, filename): + try: + onlyfilename, extension = os.path.splitext(os.path.basename(filename)) + if extension.lower() in ['.truck', '.load']: + if not self.terrainOgreWin.addTruckToTerrain(truckFilename=filename): + dlg = wx.MessageDialog(self, "You must select a position on the ground first!", "error", wx.OK | wx.ICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + elif extension.lower() in ['.odef']: + if not self.terrainOgreWin.addObjectToTerrain(odefFilename=filename): + dlg = wx.MessageDialog(self, "You must select a position on the ground first!", "error", wx.OK | wx.ICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + except: + pass + + def previewObject(self, filename): + try: + self.objectPreviewWindow.loadFile(filename) + except: + pass + def updateObjPosRot(self, event=None): self.statusbar.SetStatusText(self.terrainOgreWin.currentStatusMsg, 1) if self.terrainOgreWin.terrain is None: @@ -297,6 +343,13 @@ if res == wx.ID_OK: filename = dialog.GetPath() self.terrainOgreWin.LoadTerrain(filename) + self.tb1.EnableTool(ID_AddObject, True) + self.tb1.EnableTool(ID_DeleteSelection, True) + self.tb1.EnableTool(ID_CopySelection, True) + self.tb1.EnableTool(ID_PasteSelection, True) + self.tb1.EnableTool(ID_UndoAction, True) + self.tb1.EnableTool(ID_RedoAction, True) + self.tb1.EnableTool(ID_FindObject, True) self.tb1.EnableTool(ID_SaveTerrain, True) self.tb1.EnableTool(ID_SaveTerrainAs, True) @@ -322,7 +375,7 @@ def OnPaneClose(self, event): caption = event.GetPane().caption - if caption in ["Tree Pane", "Dock Manager Settings", "Fixed Pane"]: + if caption in ["Dock Manager Settings", "Fixed Pane"]: msg = "Are You Sure You Want To Close This Pane?" dlg = wx.MessageDialog(self, msg, "AUI Question", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) @@ -410,14 +463,6 @@ return wx.Point(pt.x + x, pt.y + x) - def OnCreateTree(self, event): - self._mgr.AddPane(self.CreateTreeCtrl(), wx.aui.AuiPaneInfo(). - Caption("Tree Control"). - Float().FloatingPosition(self.GetStartPosition()). - FloatingSize(wx.Size(150, 300)).CloseButton(True).MaximizeButton(True)) - self._mgr.Update() - - def OnCreateGrid(self, event): self._mgr.AddPane(self.CreateGrid(), wx.aui.AuiPaneInfo(). Caption("Grid"). @@ -454,7 +499,6 @@ self._mgr.GetPane("grid_content").Show(event.GetId() == ID_GridContent) self._mgr.GetPane("text_content").Show(event.GetId() == ID_TextContent) - self._mgr.GetPane("tree_content").Show(event.GetId() == ID_TreeContent) self._mgr.GetPane("sizereport_content").Show(event.GetId() == ID_SizeReportContent) self._mgr.GetPane("html_content").Show(event.GetId() == ID_HTMLContent) self._mgr.Update() @@ -463,12 +507,12 @@ self._mgr.AddPane(self.CreateOgreCtrl(), wx.aui.AuiPaneInfo(). Caption("Ogre Window"). Float().FloatingPosition(self.GetStartPosition()). - CloseButton(True).MaximizeButton(True)) + CloseButton(True).MaximizeButton(False)) self._mgr.Update() def CreateOgreCtrl(self): - return RoRTerrainOgreWindow(self, wx.ID_ANY, scenemanager=self.ogrewin.sceneManager) + return RoRTerrainOgreWindow(self, wx.ID_ANY, scenemanager=self.terrainOgreWin.sceneManager) def CreateTextCtrl(self): text = ("This is text box %d")%(self.n + 1) @@ -483,39 +527,6 @@ grid.CreateGrid(50, 20) return grid - - def CreateTreeCtrl(self): - tree = wx.TreeCtrl(self, -1, wx.Point(0, 0), wx.Size(160, 250), - wx.TR_DEFAULT_STYLE | wx.NO_BORDER) - - root = tree.AddRoot("AUI Project") - items = [] - - imglist = wx.ImageList(16, 16, True, 2) - imglist.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, wx.Size(16,16))) - imglist.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, wx.Size(16,16))) - tree.AssignImageList(imglist) - - items.append(tree.AppendItem(root, "Item 1", 0)) - items.append(tree.AppendItem(root, "Item 2", 0)) - items.append(tree.AppendItem(root, "Item 3", 0)) - items.append(tree.AppendItem(root, "Item 4", 0)) - items.append(tree.AppendItem(root, "Item 5", 0)) - - for ii in xrange(len(items)): - - id = items[ii] - tree.AppendItem(id, "Subitem 1", 1) - tree.AppendItem(id, "Subitem 2", 1) - tree.AppendItem(id, "Subitem 3", 1) - tree.AppendItem(id, "Subitem 4", 1) - tree.AppendItem(id, "Subitem 5", 1) - - tree.Expand(root) - - return tree - - def CreateSizeReportCtrl(self, width=80, height=80): ctrl = SizeReportCtrl(self, -1, wx.DefaultPosition, wx.Size(width, height), self._mgr) Added: trunk/lib/rorterraineditor/RoRObjectPreviewOgreWindow.py =================================================================== --- trunk/lib/rorterraineditor/RoRObjectPreviewOgreWindow.py (rev 0) +++ trunk/lib/rorterraineditor/RoRObjectPreviewOgreWindow.py 2007-08-02 14:26:50 UTC (rev 149) @@ -0,0 +1,211 @@ +#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 + +class ObjectPreviewOgreWindow(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 + 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 = 0.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_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) = loadOdef(filename) + except Exception, err: + log().error("error while processing odef file %s" % odefFilename) + log().error(str(err)) + return + # create mesh + print meshname, sx, sy, sz + 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.objnode.setPosition(0,0,0) + if not sx is None: + self.objnode.setScale(sx, sy, sz) + + def free(self): + 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): + if not self.objnode is None: + if self.objentity is None: + self.radius = 15 + height = 2 + else: + self.radius = self.objentity.getBoundingRadius() * 2 + height = self.objentity.getBoundingBox().getMaximum().z + pos = self.objnode.getPosition() + ogre.Vector3(0, height*0.4, 0) + 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)) + 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 onKeyDown(self,event): + validMove = self.ControlKeyDict.get(event.m_keyCode, False) + if validMove: + pos = self.camera.getPosition() + pos += validMove + self.camera.setPosition(pos) + event.Skip() + + def onMouseEvent(self, event): + self.SetFocus() #Gives Keyboard focus to the window + + if event.RightDown(): #Precedes dragging + self.StartDragX, self.StartDragY = event.GetPosition() #saves position of initial click + 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.camalpha -= float(dx) * (math.pi / 720) + self.updateCamera() + self.dragging = True + else: + self.dragging = False + event.Skip() + \ No newline at end of file Modified: trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py =================================================================== --- trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-08-01 12:09:55 UTC (rev 148) +++ trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-08-02 14:26:50 UTC (rev 149) @@ -3,11 +3,12 @@ import ogre.renderer.OGRE as ogre from ror.truckparser import * from ror.terrainparser import * +from ror.odefparser import * from wxogre.OgreManager import * from wxogre.wxOgreWindow import * from ror.rorcommon import * +from ror.SimpleTruckRepresentation import * - ADDEDBY = "//added by the terrrain editor:\n" SHIFT_SPEED_FACTOR = 20 SLOW_DOWN_FACTOR = 0.75 @@ -26,6 +27,33 @@ Position = None Rotation = None +class MyDropTarget(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 + class RoRTerrainOgreWindow(wxOgreWindow): terrain = None @@ -65,8 +93,9 @@ self.size = size self.kwargs = kwargs self.ID = ID - wxOgreWindow.__init__(self, self.parent, self.ID, size = self.size, **self.kwargs) + myDrop = MyDropTarget(self) + self.SetDropTarget(myDrop) def CameraLandCollision(self, value): self.cameralandcollisionenabled = value @@ -417,21 +446,7 @@ log().error("Error while adding an object to the terrain:") log().error(str(err)) - self.currentStatusMsg = "Terrain loaded" - - - def loadOdef(self, odefFilename): - f=open(odefFilename, 'r') - content = f.readlines() - f.close() - meshname = content[0].strip() - scalearr = [1,1,1] - if len(content) > 2: - scalearr = content[1].split(",") - - return (meshname, float(scalearr[0]), float(scalearr[1]), float(scalearr[2])) - - + self.currentStatusMsg = "Terrain loaded" def addObjectToTerrain(self, data=None, odefFilename=None, coords=None): if coords is None: @@ -460,7 +475,7 @@ meshname = None try: - (meshname, sx, sy, sz) = self.loadOdef(odefFilename) + (meshname, sx, sy, sz) = loadOdef(odefFilename) except Exception, err: data.error=True log().error("error while processing odef file %s" % odefFilename) @@ -513,7 +528,7 @@ entry = Entry() entry.uuid = uuid - entry.node, entry.entity, entry.manualobject = self.createTruckMesh(truckFilename, uuid) + entry.node, entry.entity, entry.manualobject = createTruckMesh(truckFilename, uuid) entry.data = data entry.node.rotate(ogre.Vector3.UNIT_Z, ogre.Degree(data.rotz).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) @@ -523,89 +538,8 @@ self.entries[uuid] = entry return True - def createTruckMesh(self, fn, uuid): - if not os.path.isfile(fn): - #print "truck file not found: " + fn - return - p = rorparser() - p.parse(fn) - if not 'nodes' in p.tree.keys() or not 'beams' in p.tree.keys() : - return False - - try: - myManualObject = self.sceneManager.createManualObject(str(uuid)+"manual") - #myManualObjectMaterial = ogre.MaterialManager.getSingleton().create("manualmaterial"+truckname+str(self.randomcounter),"debugger"); - #myManualObjectMaterial.setReceiveShadows(False) - #myManualObjectMaterial.getTechnique(0).setLightingEnabled(True) - #myManualObjectMaterial.getTechnique(0).getPass(0).setDiffuse(0,0,1,0) - #myManualObjectMaterial.getTechnique(0).getPass(0).setAmbient(0,0,1) - #myManualObjectMaterial.getTechnique(0).getPass(0).setSelfIllumination(0,0,1) - #myManualObjectMaterial.getTechnique(0).getPass(0).setCullingMode(ogre.CULL_ANTICLOCKWISE) - matname = "" - if fn[-4:].lower() == "load": - matname = 'mysimple/loadcolor' - elif fn[-5:].lower() == "truck": - matname = 'mysimple/truckcolor' - - myManualObject.useIndexes = True - myManualObject.estimateVertexCount(2000) - myManualObject.estimateIndexCount(2000) - - myManualObject.begin(matname+"grid", ogre.RenderOperation.OT_LINE_LIST) - for nodeobj in p.tree['nodes']: - if nodeobj.has_key('type'): - continue - node = nodeobj['data'] - myManualObject.position(float(node[1]),float(node[2]),float(node[3])) - for beamobj in p.tree['beams']: - if beamobj.has_key('type'): - continue - beam = beamobj['data'] - myManualObject.index(int(beam[0])) - myManualObject.index(int(beam[1])) - myManualObject.end() - myManualObject.begin(matname, ogre.RenderOperation.OT_TRIANGLE_LIST) - for nodeobj in p.tree['nodes']: - if nodeobj.has_key('type'): - continue - node = nodeobj['data'] - myManualObject.position(float(node[1]),float(node[2]),float(node[3])) - - #print len(p.tree['submeshgroups']) - if len(p.tree['submeshgroups']) > 0: - faces = [] - for smobj in p.tree['submeshgroups']: - for cabobj in smobj['cab']: - if cabobj.has_key('type'): - continue - cab = cabobj['data'] - #print "########face" - if cab != []: - try: - myManualObject.triangle(int(cab[0]),int(cab[1]),int(cab[2])) - except: - print "error with cab: " + str(cab) - pass - else: - print "truck has no faces!" - - myManualObject.end() - mesh = myManualObject.convertToMesh(str(uuid)+"manual") - entity = self.sceneManager.createEntity(str(uuid)+"entity", str(uuid)+"manual") - #trucknode = self.sceneManager.getRootSceneNode().createChildSceneNode() - myManualObjectNode = self.sceneManager.getRootSceneNode().createChildSceneNode(str(uuid)+"node") - myManualObjectNode.attachObject(entity) - - myManualObjectNode.attachObject(myManualObject) - - return myManualObjectNode, entity, mesh - except Exception, err: - log().error("error while processing truck file %s" % fn) - log().error(str(err)) - return None, None, None - def getPointedPosition(self, event): x, y = event.GetPosition() width, height, a, b, c = self.renderWindow.getMetrics() Modified: trunk/media/materials/mysimple.material =================================================================== --- trunk/media/materials/mysimple.material 2007-08-01 12:09:55 UTC (rev 148) +++ trunk/media/materials/mysimple.material 2007-08-02 14:26:50 UTC (rev 149) @@ -75,6 +75,7 @@ } } } + material mysimple/truckcolor { technique @@ -289,3 +290,33 @@ } } } + +material mysimple/terraineditor/previewwindowfloor +{ + technique + { + pass + { + lighting off + texture_unit + { + colour_op_ex source1 src_manual src_current 0.8 0.8 0.8 + } + } + } +} + +material mysimple/terraineditor/previewwindowsky +{ + technique + { + pass + { + lighting off + texture_unit + { + colour_op_ex source1 src_manual src_current 0.8 0.8 0.8 + } + } + } +} \ No newline at end of file Deleted: trunk/media/models/wheel.mesh =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |