From: <spo...@us...> - 2008-05-20 21:26:58
|
Revision: 901 http://opengate.svn.sourceforge.net/opengate/?rev=901&view=rev Author: spom_spom Date: 2008-05-20 14:26:54 -0700 (Tue, 20 May 2008) Log Message: ----------- ogEditor can now load and show the testsector and its content Modified Paths: -------------- branches/ogEditor/ogEditor.py branches/ogEditor/plugins.cfg branches/ogEditor/propgridtest.py branches/ogEditor/resources.cfg branches/ogEditor/src/ObjectInspectorPanels.py branches/ogEditor/src/OgreWindowWx.py branches/ogEditor/src/PropertyGrid.py trunk/data/misc/testsector.xml trunk/src/AiCommands.h trunk/src/BaseObject.cpp trunk/src/Entity.cpp trunk/src/Entity.h trunk/src/EntityManager.cpp trunk/src/EntityManager.h trunk/src/GameStateManager.cpp trunk/src/Moveable.cpp trunk/src/Moveable.h trunk/src/Planet.cpp trunk/src/ResourceManager.cpp trunk/src/ResourceManager.h trunk/src/Sector.cpp trunk/src/Sector.h trunk/src/SectorObject.cpp trunk/src/SectorObjectMoveable.cpp trunk/src/Station.cpp trunk/src/Station.h trunk/src/Vessel.cpp trunk/src/Vessel.h Modified: branches/ogEditor/ogEditor.py =================================================================== --- branches/ogEditor/ogEditor.py 2008-05-18 19:30:59 UTC (rev 900) +++ branches/ogEditor/ogEditor.py 2008-05-20 21:26:54 UTC (rev 901) @@ -21,15 +21,17 @@ import opengate as og -class OGView3D( OgreWindow ): - def _PopulateScene(self): - #automatic called by parent init -# self.headEnt = self.sceneManager.createEntity("ogreHead", "athene.mesh") - self.headEnt = self.sceneManager.createEntity("ogreHead", "ogrehead.mesh") - #self.headEnt = self.sceneManager.createEntity("ogreHead", "Firefly.mesh") - self.headNode = self.sceneManager.getRootSceneNode().createChildSceneNode( ) - self.headNode.attachObject( self.headEnt ) - #self.sceneManager.setAmbientLight( (0.0, 0.0, 1.0, 1.0) ) +#class OGView3D( OgreWindow ): + #def _PopulateScene(self): + ##automatic called by parent init +## self.headEnt = self.sceneManager.createEntity("ogreHead", "athene.mesh") + ##self.headEnt = self.sceneManager.createEntity("ogreHead", "ogrehead.mesh") + ###self.headEnt = self.sceneManager.createEntity("ogreHead", "Firefly.mesh") + ##self.headNode = self.sceneManager.getRootSceneNode().createChildSceneNode( ) + ##self.headNode.attachObject( self.headEnt ) + ##self.sceneManager.setAmbientLight( (0.0, 0.0, 1.0, 1.0) ) + #sector = og.Sector( self.sceneManager, None ) + ##sector.populate("testsector") ID_MB_FILE_EXIT = wx.NewId() ID_MB_VIEW_SCENETREE = wx.NewId() @@ -59,7 +61,9 @@ self.initFrameManager_() self.initOpenGateResources_(); + self.sector = og.Sector( self.ogreRenderWindow.sceneManager, None ); + self.setDefaultProperties_(); self.auiMgr.Update() @@ -142,7 +146,7 @@ ################################################################################# def createRenderWindow_( self ): - self.ogreRenderWindow = OGView3D( self, -1, ogResourceMan = self.ogResourceManager ) + self.ogreRenderWindow = OgreWindow( self, -1, ogResourceMan = self.ogResourceManager ) return self.ogreRenderWindow def createCrustWindow_( self ): @@ -191,6 +195,7 @@ entityManager.load( self.ogResourceManager.resourceLocations( "General" ), "guns" ); entityManager.load( self.ogResourceManager.resourceLocations( "General" ), "missiles" ); entityManager.load( self.ogResourceManager.resourceLocations( "General" ), "ships" ); + entityManager.load( self.ogResourceManager.resourceLocations( "General" ), "stations" ); def setDefaultProperties_( self ): self.SetTitle("ogEditor") @@ -248,14 +253,24 @@ event.Skip() def doSelectTreeObject( self, event ): - self.objectInspector.showData( event.GetEventObject().GetPyData( event.GetEventObject().GetSelection() ) ); + + obj = event.GetEventObject().GetPyData( event.GetEventObject().GetSelection() ) + self.ogreRenderWindow.camera.lookAt( obj.getWorldPosition() ) + self.objectInspector.showData( obj ); event.Skip() ################################################################################# # utils ################################################################################# + def createObject( self, name, meshname ): + sceneManager = self.ogreRenderWindow.sceneManager; + node = sceneManager.getRootSceneNode().createChildSceneNode( name ); + entity = sceneManager.createEntity( name, meshname ); + node.attachObject( entity ); + def UpdateSceneGraphEvent(self, event): + self.sceneTree.DeleteAllItems() root = self.sceneTree.AddRoot( "SceneManager" ) self.sceneTree.SetPyData( root, self.ogreRenderWindow.sceneManager ) @@ -285,7 +300,8 @@ object_it = scenenode.getAttachedObjectIterator() while object_it.hasMoreElements(): m = object_it.getNext() - item = self.sceneTree.AppendItem( treenode, m.getMovableType() + "-" + m.getName() ) + item = self.sceneTree.AppendItem( treenode, m.getName() ) + #item = self.sceneTree.AppendItem( treenode, m.getMovableType() + "-" + m.getName() ) if m.getMovableType() == "Entity": id = self.SceneEntityIconID Modified: branches/ogEditor/plugins.cfg =================================================================== --- branches/ogEditor/plugins.cfg 2008-05-18 19:30:59 UTC (rev 900) +++ branches/ogEditor/plugins.cfg 2008-05-20 21:26:54 UTC (rev 901) @@ -17,4 +17,4 @@ Plugin=Plugin_ParticleFX #Plugin=Plugin_BSPSceneManager #Plugin=Plugin_OctreeSceneManager -#Plugin=Plugin_CgProgramManager +Plugin=Plugin_CgProgramManager Modified: branches/ogEditor/propgridtest.py =================================================================== --- branches/ogEditor/propgridtest.py 2008-05-18 19:30:59 UTC (rev 900) +++ branches/ogEditor/propgridtest.py 2008-05-20 21:26:54 UTC (rev 901) @@ -1,11 +1,13 @@ - +#!/usr/bin/python import wxversion wxversion.ensureMinimal('2.8') +import sys +import wx +sys.path.append( './src/' ) + from PropertyGrid import * -import sys -import wx class testClass(): def printValue(self, value): @@ -22,8 +24,11 @@ self.propertyGrid = PropertyMainGrid( self, -1, wx.DefaultPosition, wx.DefaultSize ) self.propertyGrid.appendRowItemName( "Main", "name" ) + self.propertyGrid.appendRowItemName( "float", value = 10.1, format = FORMAT_FLOAT, cback = test.printValue ) + self.propertyGrid.appendRowItemName( "int", value = 10, format = FORMAT_INT, cback = test.printValue ) + self.propertyGrid.appendRowItemSlider( "slider", cback = test.printValue ) - self.propertyGrid.appendPaneColourSelect( "Colour", cback = test.printValue ) + self.propertyGrid.appendRowItemColourSelect( "Colour", cback = test.printValue ) pane = PropertyPaneItem( self.propertyGrid, "testPane " ) self.propertyGrid.appendPane( pane ) @@ -32,13 +37,22 @@ pane.appendRow( text ) self.propertyGrid.appendRowItemSlider( "expDensity", 0.0001, 0.0002, - format = SLIDER_LOG10, + format = FORMAT_LOG10, cback = test.printValue ) modes = ("one", "two", "three" ) - self.propertyGrid.appendRowItemChoice( "Choice", itemList = modes, cback = test.printValue ) + self.propertyGrid.appendRowItemChoice( "Choice set", value = "one", + itemList = modes, cback = test.printValue ) + dic = ( (1, "eins"), (2, "zwei"), (3, "drei")) - self.propertyGrid.appendRowItemChoice( "Choice", itemMap = dic, cback = test.printValue ) + self.propertyGrid.appendRowItemChoice( "Choice map", value = 1, + itemMap = dic, cback = test.printValue ) + self.propertyGrid.appendRowItemFileSelect( "File", cback = test.printValue ) + self.propertyGrid.appendRowItemFileSelect( "Files", cback = test.printValue, + flag = wx.MULTIPLE ) + + self.propertyGrid.appendRowItemButton( "Button", cback = test.printValue ) + self.propertyGrid.appendRowItemInfo( "here is a long an verbose text entry" ) if __name__ == "__main__": ogEditor = wx.PySimpleApp(0) Modified: branches/ogEditor/resources.cfg =================================================================== --- branches/ogEditor/resources.cfg 2008-05-18 19:30:59 UTC (rev 900) +++ branches/ogEditor/resources.cfg 2008-05-20 21:26:54 UTC (rev 901) @@ -5,32 +5,32 @@ # Resource locations to be added to the default path [General] FileSystem=../../trunk/data/ +FileSystem=../../trunk/data/asteroids +FileSystem=../../trunk/data/capacitors FileSystem=../../trunk/data/commodities -FileSystem=../../trunk/data/capacitors +FileSystem=../../trunk/data/gui +FileSystem=../../trunk/data/gui/fonts +FileSystem=../../trunk/data/gui/layouts +FileSystem=../../trunk/data/gui/imagesets +FileSystem=../../trunk/data/gui/schemes +FileSystem=../../trunk/data/gui/looknfeel +FileSystem=../../trunk/data/gui/overlays +FileSystem=../../trunk/data/ecms FileSystem=../../trunk/data/engines +FileSystem=../../trunk/data/guns +FileSystem=../../trunk/data/materials +FileSystem=../../trunk/data/misc +FileSystem=../../trunk/data/missiles +FileSystem=../../trunk/data/power_plants FileSystem=../../trunk/data/radars FileSystem=../../trunk/data/shields -FileSystem=../../trunk/data/ecms -FileSystem=../../trunk/data/power_plants -FileSystem=../../trunk/data/guns -FileSystem=../../trunk/data/missiles FileSystem=../../trunk/data/ships/octavius/apteryx FileSystem=../../trunk/data/ships/quantar/storm +FileSystem=../../trunk/data/ships/squadrok/squid FileSystem=../../trunk/data/ships/tauseti/lady_kickstart -FileSystem=../../trunk/data/ships/squadrok/squid FileSystem=../../trunk/data/skybox FileSystem=../../trunk/data/stations -FileSystem=../../trunk/data/materials FileSystem=../../trunk/data/textures -FileSystem=../../trunk/data/asteroids -FileSystem=../../trunk/data/misc -FileSystem=../../trunk/data/gui -FileSystem=../../trunk/data/gui/fonts -FileSystem=../../trunk/data/gui/layouts -FileSystem=../../trunk/data/gui/imagesets -FileSystem=../../trunk/data/gui/schemes -FileSystem=../../trunk/data/gui/looknfeel -FileSystem=../../trunk/data/gui/overlays Zip=../../trunk/data/skybox/simpleSkybox.zip Modified: branches/ogEditor/src/ObjectInspectorPanels.py =================================================================== --- branches/ogEditor/src/ObjectInspectorPanels.py 2008-05-18 19:30:59 UTC (rev 900) +++ branches/ogEditor/src/ObjectInspectorPanels.py 2008-05-20 21:26:54 UTC (rev 901) @@ -176,13 +176,15 @@ def showSceneNode( self, data ): self.typeStaticText.SetLabel( "SceneNode" ) - self.showName( data ); - + self.showName( data ) + print data.getWorldPosition() + self.propertyGrid.appendRowItemInfo( "world position (%g, %g, %g)"%(data.getWorldPosition().x, data.getWorldPosition().y, data.getWorldPosition().z) ) + def showResource( self, data ): self.typeStaticText.SetLabel( "Resource: " + data.getCreator().getResourceType() ) self.showName( data ); - self.appendRowItemName( "Group", data.getGroup() ) - self.appendRowItemName( "Origin", data.getOrigin() ) + self.propertyGrid.appendRowItemName( "Group", data.getGroup() ) + self.propertyGrid.appendRowItemName( "Origin", data.getOrigin() ) # params = data.getParameters() # if len( params ) > 0: Modified: branches/ogEditor/src/OgreWindowWx.py =================================================================== --- branches/ogEditor/src/OgreWindowWx.py 2008-05-18 19:30:59 UTC (rev 900) +++ branches/ogEditor/src/OgreWindowWx.py 2008-05-20 21:26:54 UTC (rev 901) @@ -207,26 +207,25 @@ def _CreateCamera(self): "create a Camera" - camera = self.sceneManager.createCamera('Camera') - camera.lookAt(ogre.Vector3(0, 0, 0)) - camera.nearClipDistance = 1 - camera.setAutoAspectRatio( True ) + self.camera = self.sceneManager.createCamera('Camera') + self.camera.lookAt(ogre.Vector3(0, 0, 0)) + self.camera.nearClipDistance = 1 + self.camera.setAutoAspectRatio( True ) - self.sceneEntities.camera = camera - # create the camera nodes & attach camera - cameraNode = self.sceneManager.getRootSceneNode().createChildSceneNode( camera.getName() + "/Node", + cameraNode = self.sceneManager.getRootSceneNode().createChildSceneNode( self.camera.getName(), ogre.Vector3( 0, 0, 250 ) ) pitchNode = cameraNode.createChildSceneNode( cameraNode.getName() + "/PitchNode" ) - pitchNode.attachObject( camera ) + pitchNode.attachObject( self.camera ) + self.sceneEntities.camera = self.camera self.sceneEntities.cameraNode = cameraNode self.sceneEntities.cameraPitchNode = pitchNode def _CreateViewport(self): "create a Viewport" renderWindow=self.renderWindow - viewport = renderWindow.addViewport( self.sceneEntities.camera, 0, 0.0, 0.0, 1.0, 1.0) + viewport = renderWindow.addViewport( self.camera, 0, 0.0, 0.0, 1.0, 1.0) viewport.backgroundColour = ogre.ColourValue(0, 0, 0) def _PopulateScene(self): @@ -236,21 +235,34 @@ def _MouseAndKeysBindings(self): "Some Additional mouse and keys bindings" 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.moveKeyDict={ ord('W') :ogre.Vector3( 0.0, 0.0, -d), + ord('S') :ogre.Vector3( 0.0, 0.0, d), + ord('A') :ogre.Vector3( -d, 0.0, 0.0), + ord('D') :ogre.Vector3( d, 0.0, 0.0), + ord('R') :ogre.Vector3( 0.0, d, 0.0), + ord('F') :ogre.Vector3( 0.0, -d, 0.0), + 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)} + #ord('Q') :ogre.Vector3( 0.0, d, 0.0), + #ord('E') :ogre.Vector3( 0.0, -d, 0.0), + self.Bind( wx.EVT_KEY_DOWN, self._DefaultKeyDownManager ) self.Bind( wx.EVT_MOUSE_EVENTS, self._DefaultMouseEventManager) ##self.Bind(wx.EVT_ENTER_WINDOW,lambda evt : self.SetFocus()) def _DefaultKeyDownManager( self, event ): "If you want to implement a similar callback function, do not forget the event.Skip() at the end" - validMove = self.ControlKeyDict.get( event.m_keyCode, False ) + validMove = self.moveKeyDict.get( event.m_keyCode, False ) if validMove: - self.sceneEntities.cameraNode.translate( validMove, self.sceneEntities.cameraNode.TS_LOCAL ) + self.sceneEntities.cameraNode.translate( validMove, self.sceneEntities.cameraNode.TS_LOCAL ) + + #validRot = self.rotKeyDict.get( event.m_keyCode, False ) + #if validRot: + #self.sceneEntities.cameraNode.translate( validMove, self.sceneEntities.cameraNode.TS_LOCAL ) event.Skip() def _DefaultMouseEventManager( self, event ): @@ -262,10 +274,11 @@ if event.Dragging() and event.RightIsDown(): #Dragging with RMB x,y = event.GetPosition() - dx = x-self.StartDragX - dy = y-self.StartDragY + dx = self.StartDragX -x + dy = self.StartDragY -y self.StartDragX, self.StartDragY = x, y - self.sceneEntities.cameraNode.yaw( ogre.Degree( dx / 3.0 ) ) - self.sceneEntities.cameraPitchNode.pitch( ogre.Degree( dy / 3.0 ) ) + self.sceneEntities.cameraNode.yaw( ogre.Degree( dx / 3.0 ), ogre.Node.TS_LOCAL ) + self.sceneEntities.cameraNode.pitch( ogre.Degree( dy / 3.0 ), ogre.Node.TS_LOCAL ) + #self.sceneEntities.cameraPitchNode.pitch( ogre.Degree( dy / 3.0 ), ogre.Node.TS_LOCAL ) event.Skip() Modified: branches/ogEditor/src/PropertyGrid.py =================================================================== --- branches/ogEditor/src/PropertyGrid.py 2008-05-18 19:30:59 UTC (rev 900) +++ branches/ogEditor/src/PropertyGrid.py 2008-05-20 21:26:54 UTC (rev 901) @@ -1,23 +1,77 @@ -#!/usr/bin/env python - -import wx +import os, os.path, wx +import string import wx.combo import wx.lib.colourselect as csel -SLIDER_INT=0 -SLIDER_FLOAT=1 -SLIDER_LOG10=2 +FORMAT_INT=0 +FORMAT_FLOAT=1 +FORMAT_LOG10=2 +FORMAT_STRING=3 +ALPHA_ONLY = 1 +DIGIT_ONLY = 2 + class NullLog: - def write(*args): + def write(self, *args): pass class SimpleLog: - def write(*args): + def write(self, *args): print args +class MyValidator(wx.PyValidator): + def __init__(self, flag=None, pyVar=None): + wx.PyValidator.__init__(self) + self.flag = flag + self.Bind(wx.EVT_CHAR, self.OnChar) + def Clone(self): + return MyValidator(self.flag) + + def Validate(self, win): + tc = self.GetWindow() + val = tc.GetValue() + + if self.flag == ALPHA_ONLY: + for x in val: + if x not in string.letters: + return False + + elif self.flag == DIGIT_ONLY: + for x in val: + if x not in string.digits: + return False + + return True + + def OnChar(self, event): + key = event.GetKeyCode() + + if key < wx.WXK_SPACE or key == wx.WXK_DELETE or key > 255: + event.Skip() + return + + if self.flag == ALPHA_ONLY and chr(key) in string.letters: + event.Skip() + return + + if self.flag == DIGIT_ONLY and chr(key) in string.digits: + event.Skip() + return + + if not wx.Validator_IsSilent(): + wx.Bell() + + if self.flag == None: + event.Skip() + + # Returning without calling even.Skip eats the event before it + # gets to the text control + return + class ListCtrlComboPopup( wx.ListCtrl, wx.combo.ComboPopup ): + value = -1 + curritem = -1 def __init__( self, log = None, cback = None ): if log: self.log = log @@ -38,6 +92,14 @@ def AddItem(self, txt): self.InsertStringItem(self.GetItemCount(), txt) + def AddItems(self, txt): + for i in txt: + self.InsertStringItem(self.GetItemCount(), i) + + def SetItems(self, txt): + self.ClearAll() + self.AddItems( txt ) + def OnMotion(self, evt): item, flags = self.HitTest(evt.GetPosition()) if item >= 0: @@ -137,85 +199,271 @@ self.log.write("ListCtrlComboPopup.LazyCreate") return wx.combo.ComboPopup.LazyCreate(self) +class PropertyRowItem( ): + cback_ = None + parent_ = None + size_ = None + labelTextCtrl_ = None + rowHeight_ = 10 -class PropertyRowItem( ): + def __init__( self, parent, name, cback = None ): + self.cback_ = cback + self.parent_ = parent + self.sizer_ = wx.BoxSizer( wx.HORIZONTAL ) + + self.labelTextCtrl_ = wx.TextCtrl( parent, -1, name, + style = wx.NO_BORDER | wx.ALIGN_LEFT ) + self.rowHeight_ = self.labelTextCtrl_.GetSize()[ 1 ] + self.labelTextCtrl_.SetEditable( False ) + self.sizer_.Add( self.labelTextCtrl_, 0, wx.EXPAND | wx.ALIGN_RIGHT ) + + def Disable(self): + for item in self.sizer_.GetChildren(): + if item.GetWindow() != None: + item.GetWindow().Disable() + + def Enable(self, value ): + for item in self.sizer_.GetChildren(): + if item.GetWindow() != None: + item.GetWindow().Enable( value ) + +class PropertyRowItemInfo( PropertyRowItem ): def __init__( self, parent, name ): - self.sizer = wx.BoxSizer( wx.HORIZONTAL ) - - labelTextCtrl = wx.TextCtrl( parent, -1, name, + self.sizer_ = wx.BoxSizer( wx.HORIZONTAL ) + self.labelTextCtrl_ = wx.TextCtrl( parent, -1, name, style = wx.NO_BORDER | wx.ALIGN_LEFT ) - self.rowHeight = labelTextCtrl.GetSize()[ 1 ] - labelTextCtrl.SetEditable( False ) - self.sizer.Add( labelTextCtrl, 0, wx.EXPAND | wx.ALIGN_RIGHT ) - + self.labelTextCtrl_.SetEditable( False ) + self.sizer_.Add( self.labelTextCtrl_, 1, wx.EXPAND | wx.ALIGN_RIGHT ) + class PropertyRowItemName( PropertyRowItem ): - def __init__( self, parent, name, value = "" ): - PropertyRowItem.__init__( self, parent, name ) - self.valueTextCtrl = wx.TextCtrl( parent, -1, value, - size = wx.Size( 30, self.rowHeight ), - style = wx.NO_BORDER | wx.ALIGN_LEFT | wx.EXPAND) - self.sizer.AddSpacer( 1 ) - self.sizer.Add( self.valueTextCtrl, 1, wx.EXPAND | wx.ALIGN_LEFT ) + valueTextCtrl_ = None + format_ = None + def __init__( self, parent, name, value = None, format = FORMAT_STRING, cback = None): + PropertyRowItem.__init__( self, parent, name, cback = cback ) + self.format_ = format + self.validator = MyValidator() + + if format == FORMAT_INT: + self.validator = MyValidator( DIGIT_ONLY ) + + self.valueTextCtrl_ = wx.TextCtrl( parent, -1, "", + size = wx.Size( 40, self.rowHeight_ ), + style = wx.NO_BORDER | wx.ALIGN_LEFT | wx.EXPAND, + validator = self.validator ) + + if ( format == FORMAT_STRING ): + self.valueTextCtrl_.SetValue( "%s" % value ); + elif ( format == FORMAT_INT ): + self.valueTextCtrl_.SetValue( "%d" % value ); + elif ( format == FORMAT_FLOAT ): + self.valueTextCtrl_.SetValue( "%g" % value ); + + self.sizer_.AddSpacer( 1 ) + self.sizer_.Add( self.valueTextCtrl_, 1, wx.EXPAND | wx.ALIGN_LEFT ) + + self.valueTextCtrl_.Bind( wx.EVT_KILL_FOCUS, self.onText ) + + def onText(self, event): + self.value = self.valueTextCtrl_.GetValue() + self.applyValue( True ) + + def applyValue( self, update = True ): + if self.format_ == FORMAT_INT: + self.value = int(self.value) + elif self.format_ == FORMAT_FLOAT: + self.value = float(self.value) + + if update == True: + if self.cback_ != None: + self.cback_( self.value ) +class PropertyRowItemButton( PropertyRowItem ): + button_ = None + + def __init__( self, parent, name, cback = None ): + PropertyRowItem.__init__( self, parent, name, cback = cback ) + self.button_ = wx.Button( parent, -1, + size = wx.Size( 40, self.rowHeight_ ), + style = wx.NO_BORDER | wx.ALIGN_LEFT | wx.EXPAND) + self.sizer_.AddSpacer( 1 ) + self.sizer_.Add( self.button_, 1, wx.EXPAND | wx.ALIGN_LEFT ) + self.button_.Bind( wx.EVT_BUTTON, self.cback_ ) + +class PropertyRowItemFileSelect( PropertyRowItem ): + def __init__( self, parent, name, value = "", cback = None, flag = 0, + wildcard = "All files (*.*)|*.*" ): + PropertyRowItem.__init__( self, parent, name, cback = cback ) + self.value = value + self.filename = self.value + self.paths = [] + self.wildcard = wildcard + self.flag = flag + if self.flag == wx.MULTIPLE: + self.choice = wx.combo.ComboCtrl( parent, -1, + size = wx.Size( 100, self.rowHeight_ ), + style = wx.NO_BORDER | wx.NO_3D | wx.CB_READONLY ) + self.popup = ListCtrlComboPopup( cback = self.setFilenameIdx ) + self.popup.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) + self.choice.SetPopupControl( self.popup ) + + self.sizer_.AddSpacer( 1 ) + self.sizer_.Add( self.choice, 1, wx.EXPAND | wx.ALIGN_LEFT ) + else: + self.valueTextCtrl = wx.TextCtrl( parent, -1, value, + size = wx.Size( 40, self.rowHeight_ ), + style = wx.NO_BORDER | wx.ALIGN_LEFT | wx.EXPAND) + self.sizer_.AddSpacer( 1 ) + self.sizer_.Add( self.valueTextCtrl, 1, wx.EXPAND | wx.ALIGN_LEFT ) + + self.fileSelectButton = wx.Button( parent, -1, "'''", + size = wx.Size( self.rowHeight_, self.rowHeight_ ), + style = wx.NO_BORDER + ) + + self.sizer_.AddSpacer( 1 ) + self.sizer_.Add( self.fileSelectButton, 0, wx.EXPAND ) + self.fileSelectButton.Bind( wx.EVT_BUTTON, self.OnButton ) + + def OnButton( self, event): + dlg = wx.FileDialog( self.parent, message="Choose a file", + defaultDir=os.getcwd(), + defaultFile="", + wildcard=self.wildcard, + style=wx.OPEN | wx.CHANGE_DIR | self.flag) + + if dlg.ShowModal() == wx.ID_OK: + self.paths = dlg.GetPaths() + self.filename = self.paths[0] + + if self.flag == wx.MULTIPLE: + self.popup.ClearAll() + for path in self.paths: + self.popup.AddItem( os.path.basename( path ) ) + self.popup.Select(0) + self.applyValue() + #self.choice.SetSelection(0) + self.choice.SetValue(os.path.basename( self.filename )) + else: + self.valueTextCtrl.SetValue( os.path.basename( self.filename ) ) + self.applyValue() + + dlg.Destroy() + + def setFilenameIdx(self, idx ): + if idx >= 0: + self.filename = self.paths[ idx ] + self.applyValue() + + def applyValue( self, update = True ): + + if type( self.filename ) == unicode: + self.filename = self.filename.encode("iso-8859-1", "ignore") + + if update == True: + if self.cback_ != None: + self.cback_( self.filename ) + +class PropertyRowItemCheck( PropertyRowItem ): + def __init__( self, parent, name, value = False, cback = None): + PropertyRowItem.__init__( self, parent, name, cback = cback ) + self.isChecked = value + self.checkbox = wx.CheckBox( parent, -1 ) + self.sizer_.AddSpacer( 1 ) + self.sizer_.Add( self.checkbox, 1, wx.EXPAND | wx.ALIGN_LEFT ) + self.checkbox.Bind( wx.EVT_CHECKBOX, self.onChecked ) + self.checkbox.SetValue( self.isChecked ) + + def onChecked( self, event ): + self.isChecked = event.IsChecked() + self.applyValue() + + def applyValue( self, update = True ): + if update == True: + if self.cback_ != None: + self.cback_( self.isChecked ) + class PropertyRowItemSlider( PropertyRowItem ): - def __init__( self, parent, name, start = 0, end = 100, format = SLIDER_INT, cback = None ): - PropertyRowItem.__init__( self, parent, name ) + def __init__( self, parent, name, value = 0, start = 0, end = 100, + format = FORMAT_INT, cback = None ): + PropertyRowItem.__init__( self, parent, name, cback = cback ) self.format = format - self.cback = cback - self.value = 0 + self.value = value self.start = start self.end = end + if self.end == self.start: + self.end = self.end +1 + self.sliderValue = 0 - if self.format == SLIDER_INT: + if self.format == FORMAT_INT: + self.validator = MyValidator( DIGIT_ONLY ) self.sliderStart = start self.sliderEnd = end else: + self.validator = MyValidator( DIGIT_ONLY ) self.sliderStart = 0 self.sliderEnd = 100 + self.start = float( self.start ) + self.end = float( self.end ) self.scale = float( self.end - self.start )/( self.sliderEnd - self.sliderStart ) self.valueTextCtrl = wx.TextCtrl( parent, -1, "", - size = wx.Size( 30, self.rowHeight ), - style = wx.NO_BORDER | wx.ALIGN_LEFT | wx.EXPAND) + size = wx.Size( 40, self.rowHeight_ ), + style = wx.NO_BORDER | wx.ALIGN_LEFT | wx.EXPAND, + validator = self.validator) self.slider = wx.Slider( parent, -1, self.sliderValue, self.sliderStart, self.sliderEnd, - size = wx.Size( 100, self.rowHeight ), + size = wx.Size( 100, self.rowHeight_ ), style = wx.NO_BORDER | wx.NO_3D ) - self.sizer.AddSpacer( 1 ) - self.sizer.Add( self.valueTextCtrl, 0, wx.EXPAND | wx.ALIGN_LEFT ) - self.sizer.Add( self.slider, 1, wx.EXPAND | wx.ALIGN_LEFT ) - self.slider.Bind(wx.EVT_SLIDER, self.OnSlide ) + self.sizer_.AddSpacer( 1 ) + self.sizer_.Add( self.valueTextCtrl, 0, wx.EXPAND | wx.ALIGN_LEFT ) + self.sizer_.Add( self.slider, 1, wx.EXPAND | wx.ALIGN_LEFT ) + + self.valueTextCtrl.Bind( wx.EVT_KILL_FOCUS, self.onText ) + + self.slider.Bind(wx.EVT_SLIDER, self.onSlide ) + self.slider.Bind(wx.EVT_COMMAND_SCROLL_ENDSCROLL, self.onSlideEnd ) + self.applyValue( False ) - def OnSlide(self, event): + def onText(self, event): + self.value = self.valueTextCtrl.GetValue() + self.applyValue( True ) + + def onSlideEnd(self, event): val = event.GetEventObject().GetValue() self.value = self.start + self.scale * val; - self.applyValue() + self.applyValue( True ) + + def onSlide(self, event): + val = event.GetEventObject().GetValue() + self.value = self.start + self.scale * val; + self.applyValue( False ) def setValue(self, value): self.value = value self.applyValue( False ) def applyValue( self, update = True ): - if self.format == SLIDER_INT: + if self.format == FORMAT_INT: + self.value = int(self.value) self.valueTextCtrl.SetValue( "%d" % self.value ) else: - self.valueTextCtrl.SetValue( "%.1g" % self.value ) + self.value = float(self.value) + self.valueTextCtrl.SetValue( "%.1f" % self.value ) self.slider.SetValue( (self.value -self.start)/ self.scale ) if update == True: - if self.cback != None: - self.cback( self.value ) + if self.cback_ != None: + self.cback_( self.value ) class PropertyRowItemChoice( PropertyRowItem ): - def __init__( self, parent, name, itemList = None, itemMap = None, cback = None): - PropertyRowItem.__init__( self, parent, name ) - - self.cback = cback - self.value = "None" + def __init__( self, parent, name, value = None, itemList = None, itemMap = None, cback = None): + PropertyRowItem.__init__( self, parent, name, cback = cback ) + + self.value = "" if itemList != None: self.ITEMDICT = False @@ -225,34 +473,38 @@ self.itemList = itemMap self.choice = wx.combo.ComboCtrl( parent, -1, - size = wx.Size( 100, self.rowHeight ), + size = wx.Size( 100, self.rowHeight_ ), style = wx.NO_BORDER | wx.NO_3D | wx.CB_READONLY ) - - #self.choice.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) - self.popup = ListCtrlComboPopup( cback = self.choiceChanged ) self.popup.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) - self.choice.SetPopupControl( self.popup ) - - + if self.ITEMDICT == False: for i in self.itemList: self.popup.AddItem( i ) + if i == value: + self.value = value + self.valueName = i else: for i in self.itemList: self.popup.AddItem( i[ 1 ] ) + if i[0] == value: + self.value = i[0] + self.valueName = i[1] - self.sizer.AddSpacer( 1 ) - self.sizer.Add( self.choice, 1, wx.EXPAND | wx.ALIGN_LEFT ) + self.sizer_.AddSpacer( 1 ) + self.sizer_.Add( self.choice, 1, wx.EXPAND | wx.ALIGN_LEFT ) + self.popup.Select(0) + self.choice.SetValue( self.valueName ) def choiceChanged(self, idx): - if self.ITEMDICT == False: - self.value = self.itemList[ idx ] - else: - self.value = self.itemList[idx][ 0 ] + if idx != -1: + if self.ITEMDICT == False: + self.value = self.itemList[ idx ] + else: + self.value = self.itemList[idx][ 0 ] - self.applyValue() + self.applyValue() def setValue(self, value): self.value = value @@ -271,22 +523,21 @@ # print item if update == True: - if self.cback != None: - self.cback( self.value ) + if self.cback_ != None: + self.cback_( self.value ) class PropertyRowItemColourSelect( PropertyRowItemName ): def __init__( self, parent, name, cback = None ): - PropertyRowItemName.__init__( self, parent, name ) - self.cback = cback + PropertyRowItemName.__init__( self, parent, name, cback = cback ) self.value = wx.Colour(0,0,0) self.colourButton = csel.ColourSelect( parent, -1, "", colour = self.value, - size = wx.Size( self.rowHeight,self.rowHeight ), + size = wx.Size( self.rowHeight_, self.rowHeight_ ), style = wx.NO_BORDER ) - self.sizer.AddSpacer( 1 ) - self.sizer.Add( self.colourButton, 0, wx.EXPAND ) + self.sizer_.AddSpacer( 1 ) + self.sizer_.Add( self.colourButton, 0, wx.EXPAND ) self.colourButton.Bind( csel.EVT_COLOURSELECT, self.OnColour ) def OnColour(self, event): @@ -298,48 +549,72 @@ self.applyValue( False ) def applyValue( self, update = True ): - self.valueTextCtrl.SetValue( "%d,%d,%d" % (self.value[0],self.value[1],self.value[2]) ) + self.valueTextCtrl_.SetValue( "%d,%d,%d" % (self.value[0],self.value[1],self.value[2]) ) self.colourButton.SetColour( self.value ) if update == True: - if self.cback != None: - self.cback( self.value ) + if self.cback_ != None: + self.cback_( self.value ) class PropertyGrid( ): def __init__(self): - self.sizer = wx.BoxSizer( wx.VERTICAL ) - self.SetSizer( self.sizer ) - self.widthCol0 = 70 + self.sizer_ = wx.BoxSizer( wx.VERTICAL ) + self.SetSizer( self.sizer_ ) + self.widthCol0 = 50 self.widthCol2 = 24 self.xOffset = 17 def appendRow(self, row ): - self.sizer.AddSpacer(1) - self.sizer.Add( row.sizer, 0, wx.EXPAND ) + self.sizer_.AddSpacer(1) + self.sizer_.Add( row.sizer_, 0, wx.EXPAND ) - def appendRowItemName(self, name, value = "" ): - item = PropertyRowItemName( self.pane, name, value ) + def appendRowItemInfo(self, name ): + item = PropertyRowItemInfo( self.pane, name ) self.appendRow( item ) return item - def appendRowItemChoice(self, name, itemList = None, itemMap = None, cback = None ): - item = PropertyRowItemChoice( self.pane, name, itemList, itemMap, cback ) + def appendRowItemName(self, name, value = None, format = FORMAT_STRING, cback = None ): + item = PropertyRowItemName( self.pane, name, value, format, cback ) + self.appendRow( item ) + return item + + def appendRowItemButton(self, name, cback = None ): + item = PropertyRowItemButton( self.pane, name, cback = cback) + self.appendRow( item ) + return item + + def appendRowItemCheck(self, name, value = False, cback = None ): + item = PropertyRowItemCheck( self.pane, name, value, cback = cback) + self.appendRow( item ) + return item + + def appendRowItemChoice(self, name, value = None, itemList = None, itemMap = None, cback = None ): + item = PropertyRowItemChoice( self.pane, name, value, itemList, itemMap, cback ) self.appendRow( item ) return item - def appendRowItemSlider(self, name, start = 0, end = 100, format = SLIDER_INT, cback = None ): - item = PropertyRowItemSlider( self.pane, name, start, end, format, cback ) + def appendRowItemFileSelect(self, name, value = "", cback = None, flag = 0, + wildcard = "All files (*.*)|*.*" ): + item = PropertyRowItemFileSelect( self.pane, name, value = value, + cback = cback, flag = flag, + wildcard = wildcard ) self.appendRow( item ) return item + def appendRowItemSlider( self, name, value = 0, start = 0, end = 100, + format = FORMAT_INT, cback = None ): + item = PropertyRowItemSlider( self.pane, name, value, start, end, format, cback ) + self.appendRow( item ) + return item + def appendRowItemColourSelect( self, name, cback = None ): - item = PropertyRowItemColourSelect( self.pane, name, cback ) + item = PropertyRowItemColourSelect( self.pane, name, cback = cback ) self.appendRow( item ) return item def appendPane(self, pane ): - self.sizer.AddSpacer(1) - self.sizer.Add( pane, 0, wx.EXPAND ) + self.sizer_.AddSpacer(1) + self.sizer_.Add( pane, 0, wx.EXPAND ) def appendPaneColourSelect( self, name, cfront = None, cback = None ): pane = PropertyPaneItemColour( self.pane, name, cfront, cback ) @@ -370,7 +645,7 @@ event.GetEventObject().GetPane().Hide() else: event.GetEventObject().GetPane().Show() - parent = self.GetParent().Layout() + self.GetParent().Layout() class PropertyPaneItemColour( PropertyPaneItem ): @@ -386,7 +661,7 @@ self.g = self.appendRowItemSlider( "green", 0, 255, cback = self.setGreen ) self.b = self.appendRowItemSlider( "blue", 0, 255, cback = self.setBlue ) self.a = self.appendRowItemSlider( "alpha", 0, 255, cback = self.setAlpha ) - + if self.cfront != None: colour = self.cfront() self.value = map(lambda x: x * self.scale, [colour[0], colour[1], colour[2], colour[3]] ) @@ -430,6 +705,6 @@ self.pane = self def clean( self ): - self.sizer.Clear( True ) - self.sizer.Layout() + self.sizer_.Clear( True ) + self.sizer_.Layout() Modified: trunk/data/misc/testsector.xml =================================================================== --- trunk/data/misc/testsector.xml 2008-05-18 19:30:59 UTC (rev 900) +++ trunk/data/misc/testsector.xml 2008-05-20 21:26:54 UTC (rev 901) @@ -55,8 +55,8 @@ <position> -250, 0, 500</position> <scale>20, 20, 20</scale> <material>Asteroid</material> - </sectorobject> - <sectorobject> + </sectorobject>--> +- <sectorobject> <name>ring</name> <mesh>ring</mesh> <position> -650, 100, 800</position> Modified: trunk/src/AiCommands.h =================================================================== --- trunk/src/AiCommands.h 2008-05-18 19:30:59 UTC (rev 900) +++ trunk/src/AiCommands.h 2008-05-20 21:26:54 UTC (rev 901) @@ -29,7 +29,6 @@ namespace Ogre{ class Timer; - class Vector3; } #include <OgreVector3.h> Modified: trunk/src/BaseObject.cpp =================================================================== --- trunk/src/BaseObject.cpp 2008-05-18 19:30:59 UTC (rev 900) +++ trunk/src/BaseObject.cpp 2008-05-20 21:26:54 UTC (rev 901) @@ -34,7 +34,7 @@ sceneMgr_ = sector_->sceneManager(); try{ - mainNode_ = sceneMgr_->getRootSceneNode()->createChildSceneNode( name + "_MainNode" ); + mainNode_ = sceneMgr_->getRootSceneNode()->createChildSceneNode( name ); } catch( Ogre::Exception & e ) { LogManager::getSingleton().fatal( e.getFullDescription() ); } Modified: trunk/src/Entity.cpp =================================================================== --- trunk/src/Entity.cpp 2008-05-18 19:30:59 UTC (rev 900) +++ trunk/src/Entity.cpp 2008-05-20 21:26:54 UTC (rev 901) @@ -28,6 +28,7 @@ #include <OgreException.h> #include <OgreCEGUITexture.h> +#include <OgreMeshManager.h> #include <CEGUIImageset.h> #include <CEGUIExceptions.h> #include <CEGUIBase.h> @@ -41,62 +42,62 @@ // addProperty< float >( "baseYaw", this, setBaseYaw, baseYaw, mandatory, default, description ) //Property * prop = new Property< Uint32 >( "mass", this, &OpenGate::Entity::setMass, &OpenGate::Entity::mass ); //properties_.push_back( new Property< Uint32 >( "mass", this, &OpenGate::Entity::setMass, &OpenGate::Entity::mass ) ); - - id_ = 0; - techLevel_ = 0; - mass_ = 1; - size_ = 1; - rtti_ = ENTITY; - factionID_ = 1; - baseSize_ = Ogre::Vector3::ZERO; - baseYaw_ = 0; - basePitch_ = 0; - baseRoll_ = 0; + id_ = 0; + techLevel_ = 0; + mass_ = 1; + size_ = 1; + rtti_ = ENTITY; + factionID_ = 1; - imageInitialised_ = false; - setFactionName_( ResourceManager::getSingleton().factionName( factionID_ ) ); -} - -void Entity::setFactionID( int id ){ - factionID_ = id; + imageInitialised_ = false; setFactionName_( ResourceManager::getSingleton().factionName( factionID_ ) ); } -void Entity::setBaseSize( float length, float width, float height ){ - baseSize_[ 0 ] = length; - baseSize_[ 1 ] = width; - baseSize_[ 2 ] = height; -} +void Entity::readPropertiesFromXML( TiXmlHandle & hRoot ){ + readXMLNode< std::string >( hRoot, "name_"+ ResourceManager::getSingleton().languageSuffix() + " name_en name", + this, &OpenGate::Entity::setName, true ); - /*! If size is a scalar value, the length of the entity. */ -void Entity::setBaseSize( float size ){ baseSize_[ 2 ] = size; } + readXMLNode< Uint16 >( hRoot, "object_id", this, &OpenGate::Entity::setID, true ); + readXMLNode< Uint8 >( hRoot, "faction_id", this, &OpenGate::Entity::setFactionID, true ); -Ogre::Vector3 Entity::baseSize( ) const { return baseSize_; } + // what is that for + //readXMLNode< Uint8 >( hRoot, "class_id", this, &OpenGate::Entity::setClassID, false ); + readXMLNode< Uint8 >( hRoot, "techlevel required_rank", this, &OpenGate::Entity::setTechLevel, false ); + + readXMLNode< int >( hRoot, "size", this, &OpenGate::Entity::setSize, false ); + readXMLNode< int >( hRoot, "mass", this, &OpenGate::Entity::setMass, false ); + + readXMLNode< std::string >( hRoot, "description_" + ResourceManager::getSingleton().languageSuffix() + + " description_en description", this, &OpenGate::Entity::setDescription, false ); + + readXMLNodes< std::string >( hRoot, "production-center", this, &OpenGate::Entity::addProductionCenter ); +} + void Entity::loadImages_( ) { - imageInitialised_ = true; - bool haveSmall = true; + imageInitialised_ = true; + bool haveSmall = true; - if ( imageFileName_ == "unknown" ) imageFileName_ = name_; + if ( imageFileName_ == "unknown" ) imageFileName_ = name_; - if ( !initialiseImage( imageFileName_ + "_small.png", imageFileName_ + "Small" ) ){ - haveSmall = false; - } + if ( !initialiseImage( imageFileName_ + "_small.png", imageFileName_ + "Small" ) ){ + haveSmall = false; + } - if ( haveSmall ){ - ceguiSmallImageName_ = ceguiImageName_; - } + if ( haveSmall ){ + ceguiSmallImageName_ = ceguiImageName_; + } - if ( !initialiseImage( imageFileName_ + "_big.png", imageFileName_ ) ){ + if ( !initialiseImage( imageFileName_ + "_big.png", imageFileName_ ) ){ //**fallback; - initialiseImage( imageFileName_ + ".png", imageFileName_, true ); - } + initialiseImage( imageFileName_ + ".png", imageFileName_, true ); + } - if ( !haveSmall ) { - initialiseImage( imageFileName_ + ".png", imageFileName_ + "Small" ); - ceguiSmallImageName_ = ceguiImageName_; - } + if ( !haveSmall ) { + initialiseImage( imageFileName_ + ".png", imageFileName_ + "Small" ); + ceguiSmallImageName_ = ceguiImageName_; + } } bool Entity::initialiseImage( const std::string & imageName, const std::string & targetName, bool verbose ){ @@ -128,27 +129,26 @@ return !fail; } -void Entity::readPropertiesFromXML( TiXmlHandle & hRoot ){ - readXMLNode< std::string >( hRoot, "name_"+ ResourceManager::getSingleton().languageSuffix() + " name_en name", - this, &OpenGate::Entity::setName, true ); +void Entity::setFactionID( int id ){ + factionID_ = id; + setFactionName_( ResourceManager::getSingleton().factionName( factionID_ ) ); +} - readXMLNode< Uint16 >( hRoot, "object_id", this, &OpenGate::Entity::setID, true ); - readXMLNode< Uint8 >( hRoot, "faction_id", this, &OpenGate::Entity::setFactionID, true ); +MeshEntity::MeshEntity(): Entity(){ + baseSize_ = Ogre::Vector3::ZERO; + baseYaw_ = 0; + basePitch_ = 0; + baseRoll_ = 0; +} - // what is that for - //readXMLNode< Uint8 >( hRoot, "class_id", this, &OpenGate::Entity::setClassID, false ); - readXMLNode< Uint8 >( hRoot, "techlevel required_rank", this, &OpenGate::Entity::setTechLevel, false ); - - readXMLNode< int >( hRoot, "size", this, &OpenGate::Entity::setSize, false ); - readXMLNode< int >( hRoot, "mass", this, &OpenGate::Entity::setMass, false ); +MeshEntity::~MeshEntity(){} + +void MeshEntity::readPropertiesFromXML( TiXmlHandle & hRoot ){ + Entity::readPropertiesFromXML( hRoot ); - readXMLNode< std::string >( hRoot, "description_" + ResourceManager::getSingleton().languageSuffix() + - " description_en description", this, &OpenGate::Entity::setDescription, false ); - - readXMLNodes< std::string >( hRoot, "production-center", this, &OpenGate::Entity::addProductionCenter ); - readXMLNode< float >( hRoot, "baseyaw", this, &OpenGate::Entity::setBaseYaw, false ); - readXMLNode< float >( hRoot, "basepitch", this, &OpenGate::Entity::setBasePitch, false ); - readXMLNode< float >( hRoot, "baseroll", this, &OpenGate::Entity::setBaseRoll, false ); + readXMLNode< float >( hRoot, "baseyaw", this, &OpenGate::MeshEntity::setBaseYaw, false ); + readXMLNode< float >( hRoot, "basepitch", this, &OpenGate::MeshEntity::setBasePitch, false ); + readXMLNode< float >( hRoot, "baseroll", this, &OpenGate::MeshEntity::setBaseRoll, false ); TiXmlElement * pElem; @@ -171,8 +171,44 @@ if ( pElem ) height = toDouble( pElem->FirstChild()->Value() ); if ( length > 0 && width > 0 && height > 0 ) this->setBaseSize( width, height, length ); - + + if ( !readXMLNode< std::string >( hRoot, "mesh", this, &OpenGate::MeshEntity::setMesh, false ) ){ + + try { + setMesh( createMeshName( name_ ) ); + } catch( Ogre::Exception & e ){ + LogManager::getSingleton().warn( e.what() ); + } + } } + +void MeshEntity::setBaseSize( float length, float width, float height ){ + baseSize_[ 0 ] = length; + baseSize_[ 1 ] = width; + baseSize_[ 2 ] = height; +} + /*! If size is a scalar value, the length of the entity. */ +void MeshEntity::setBaseSize( float size ){ baseSize_[ 2 ] = size; } +Ogre::Vector3 MeshEntity::baseSize( ) const { return baseSize_; } + +std::string MeshEntity::createMeshName( const std::string & meshName ){ + return strReplaceBlankWithUnderscore( strCopyToLowerCase( meshName ) ); +} + +void MeshEntity::setMesh( const std::string & meshName ){ + meshName_ = meshName.substr( 0, meshName.rfind( ".mesh" ) ) + ".mesh" ; + + pMesh_ = Ogre::MeshManager::getSingleton().load( meshName_, + "General", + Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY, + Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY, + true, true); + + unsigned short src = 0, dest = 0; + if ( !pMesh_->suggestTangentVectorBuildParams( Ogre::VES_TANGENT, src, dest) ) { + pMesh_->buildTangentVectors( Ogre::VES_TANGENT, src, dest); + } +} } // namespace OpenGate Modified: trunk/src/Entity.h =================================================================== --- trunk/src/Entity.h 2008-05-18 19:30:59 UTC (rev 900) +++ trunk/src/Entity.h 2008-05-20 21:26:54 UTC (rev 901) @@ -27,6 +27,7 @@ #include "common.h" #include <OgreVector3.h> +#include <OgreMesh.h> // namespace Ogre{ // class Vector3; @@ -35,7 +36,7 @@ namespace OpenGate{ -enum EntityType{NONE,ENTITY,VESSEL,COMMODITY,POWERPLANT,ENGINE,RADAR,ECM,CAPACITOR,SHIELD,GUN,MISSILE,MODX}; +enum EntityType{NONE,ENTITY,VESSEL,COMMODITY,POWERPLANT,ENGINE,RADAR,ECM,CAPACITOR,SHIELD,GUN,MISSILE,MODX,STATION}; enum GunType{UNKNOWN,LASER,MININGLASER,BULLET}; class Commodity; @@ -92,26 +93,6 @@ inline void setID( int id ){ id_ = id; } inline int id( ) const { return id_; } - /*! Base sizes are necessary for resizing the ogremesh */ - void setBaseSize( float length, float width, float height ); - - /*! If size is a scalar value, the length of the entity.*/ - void setBaseSize( float size ); - - Ogre::Vector3 baseSize( ) const; - - /*! Base sizes are necessary for resizing the ogremesh */ - inline void setBaseYaw( Ogre::Real baseYaw ){ baseYaw_ = baseYaw; } - inline Ogre::Real baseYaw( ) const { return baseYaw_; } - - /*! Base sizes are necessary for resizing the ogremesh */ - inline void setBasePitch( Ogre::Real basePitch ){ basePitch_ = basePitch; } - inline Ogre::Real basePitch( ) const { return basePitch_; } - - /*! Base sizes are necessary for resizing the ogremesh */ - inline void setBaseRoll( Ogre::Real baseRoll ){ baseRoll_ = baseRoll; } - inline Ogre::Real baseRoll( ) const { return baseRoll_; } - inline void setTechLevel( int level ){ techLevel_ = level; } inline int techLevel( ) const { return techLevel_; } @@ -153,12 +134,6 @@ std::string factionName_; int factionID_; - //** geometric parameters - Ogre::Vector3 baseSize_; - Ogre::Real baseYaw_; - Ogre::Real basePitch_; - Ogre::Real baseRoll_; - std::string imageFileName_; std::string ceguiSmallImageName_; std::string ceguiImageName_; @@ -185,6 +160,67 @@ //std::vector < Property< class ValueType > * > properties_; }; +class MeshEntity : public Entity{ +public: + MeshEntity(); + + virtual ~MeshEntity(); + + void readPropertiesFromXML( TiXmlHandle & hRoot ); + + /*! Base sizes are necessary for resizing the ogremesh */ + void setBaseSize( float length, float width, float height ); + + /*! If size is a scalar value, the length of the entity.*/ + void setBaseSize( float size ); + Ogre::Vector3 baseSize( ) const; + + /*! Base sizes are necessary for resizing the ogremesh */ + inline void setBaseYaw( Ogre::Real baseYaw ){ baseYaw_ = baseYaw; } + inline Ogre::Real baseYaw( ) const { return baseYaw_; } + + /*! Base sizes are necessary for resizing the ogremesh */ + inline void setBasePitch( Ogre::Real basePitch ){ basePitch_ = basePitch; } + inline Ogre::Real basePitch( ) const { return basePitch_; } + + /*! Base sizes are necessary for resizing the ogremesh */ + inline void setBaseRoll( Ogre::Real baseRoll ){ baseRoll_ = baseRoll; } + inline Ogre::Real baseRoll( ) const { return baseRoll_; } + + void setMesh( const std::string & meshName ); + std::string meshName( ) const { return meshName_; } + virtual std::string createMeshName( const std::string & meshName ); + Ogre::MeshPtr & meshPtr( ){ return pMesh_; } + +protected: + //** geometric parameters + Ogre::Vector3 baseSize_; + Ogre::Real baseYaw_; + Ogre::Real basePitch_; + Ogre::Real baseRoll_; + + Ogre::MeshPtr pMesh_; + + std::string meshName_; +}; + +//! +/*!*/ +class Station : public MeshEntity{ +public: + Station( ) : MeshEntity(){ + rtti_ = STATION; + } + + virtual ~Station( ){} + + void readPropertiesFromXML( TiXmlHandle & hRoot ){ + MeshEntity::readPropertiesFromXML( hRoot ); + } + +protected: +}; + } // namespace OpenGate #endif //_OPENGATE_ENTITY_H Modified: trunk/src/EntityManager.cpp =================================================================== --- trunk/src/EntityManager.cpp 2008-05-18 19:30:59 UTC (rev 900) +++ trunk/src/EntityManager.cpp 2008-05-20 21:26:54 UTC (rev 901) @@ -73,7 +73,10 @@ category == "modx" || category == "modxs" ) return MODX; else if ( category == "Vessel" || category == "Vessels" || category == "vessel" || category == "vessels" ) return VESSEL; + else if ( category == "Station" || category == "Stations" || + category == "station" || category == "stations" ) return VESSEL; + LogManager::getSingleton().warn("Requested entity rtti for " + category + " unknown" ); return ENTITY; } @@ -93,6 +96,7 @@ case MISSILE: return "MISSILE"; case MODX: return "MODx"; case VESSEL: return "Vessel"; + case STATION: return "Station"; } LogManager::getSingleton().warn("Requested name for category " + toStr( type ) + " unknown" ); @@ -129,6 +133,7 @@ Ecm * EntityManager::ecm( const std::string & name ){ return entity_< Ecm >( name ); } Vessel * EntityManager::vessel( const std::string & name ){ return entity_< Vessel >( name ); } Vessel * EntityManager::vessel( Uint16 ID ){ return entity_< Vessel >( ID ); } +Station * EntityManager::station( const std::string & name ){ return entity_< Station >( name ); } std::vector < Entity * > EntityManager::allByCategory( const std::string & category ){ EntityType rtti = NONE; @@ -212,15 +217,16 @@ int category = toInt( pElem->FirstChild()->Value() ); switch( category ){ - case 1: entity = new Commodity(); break; + case 1: entity = new Commodity(); break; case 2: entity = new PowerPlant(); break; - case 4: entity = new Capacitor(); break; - case 6: entity = new Engine(); break; - case 7: entity = new Shield(); break; - case 8: entity = new Radar(); break; - case 9: entity = new Vessel(); break; - case 10: entity = new Gun(); break; - case 11: entity = new Missile(); break; + case 3: entity = new Station(); break; + case 4: entity = new Capacitor(); break; + case 6: entity = new Engine(); break; + case 7: entity = new Shield(); break; + case 8: entity = new Radar(); break; + case 9: entity = new Vessel(); break; + case 10: entity = new Gun(); break; + case 11: entity = new Missile(); break; default: log_->fatal( fileName + " category_id " + toStr( category ) + " unknown." ); return NULL; @@ -254,467 +260,7 @@ categories_.insert( entity->categoryName() ); return entity; } - -// template<> EquipmentManager * Ogre::Singleton< EquipmentManager >::ms_Singleton = 0; -// -// EquipmentManager::EquipmentManager(): EntityManager(){ -// Entity * entity = new Missile(); -// entity->setName( "firefly" ); -// entity->setID( 10001 ); -// dynamic_cast< Missile * >( entity )->setDamage( 10400 ); -// dynamic_cast< Missile * >( entity )->setThrust( 150000 ); -// // dynamic_cast< Missile * >( entity )->setYaw( 90 ); -// // dynamic_cast< Missile * >( entity )->setPitch( 90 ); -// // dynamic_cast< Missile * >( entity )->setRoll( 90 ); -// //dynamic_cast< Missile * >( entity )->setArmor( 1 ); -// //dynamic_cast< Missile * >( entity )->setMass( 150 ); -// dynamic_cast< Missile * >( entity )->setLifeTime( 20 ); -// // dynamic_cast< Missile * >( entity )->setDragFactor( 1 ); -// dynamic_cast< Missile * >( entity )->setBaseSize(0.2, 0.2, 1.0 ); -// try{ -// dynamic_cast< Missile * >(entity)->setMesh( "firefly.mesh", false ); -// -// -// } catch( Ogre::Exception & e ){ -// LogManager::getSingleton().warn( e.what() ); -// } -// templatesByName_[ entity->name() ] = entity; -// templatesByID_[ entity->id() ] = entity; -// } -// -// EquipmentManager::~EquipmentManager() { -// } -// -// EquipmentManager & EquipmentManager::getSingleton( ){ -// assert( ms_Singleton ); -// return ( *ms_Singleton ); -// } -// -// EquipmentManager * EquipmentManager::getSingletonPtr( ){ -// if ( ms_Singleton == NULL ){ -// LogManager::getSingleton().fatal( "CommodityManager not initialized." ); -// } -// return ms_Singl... [truncated message content] |