CodeSnippets Ogre Editor
From PyWiki
Simple Ogre Editor (WIP!)
Source Code:
To Run this code, you need to make a new folder in your demos folder. Create a new file with the code below, and save it. Copy ogreWindowWx.py from the ogre demos folder into your new folder. You also need SampleFramework.py, and plugins.cfg. Open up ogreWindowWx.py and add the code below at the end of the resource loading section in the _OgreInit() handler (the lines look similar to the code you're pasting in).
ogre.ResourceGroupManager.getSingleton().addResourceLocation("../caelum/media", "FileSystem", "Caelum", False)
save the file and you should be ready to go.
Seems like this was broken, so I updated it. Here's the changes I made:
- Updated all calls to Caelum to reflect API changes
- Fixed time of day slider
- Added time scale slider
- Added terrain (Caelum without the terrain just looks odd :)
- Mangled the camera a bit to move it to a nice starting position, but that could use some tweaking.
- "Button1" in the top left now tells you the coordinates of the camera in a messagebox.
- Zen
Editor Source
#!/usr/bin/env python # -*- coding: ISO-8859-1 -*- # generated by wxGlade 0.4.1cvs on Wed Dec 12 20:09:05 2007 from C:\PythonOgre\demos\Demo_Editor\mainWindow.wxg import wx import time import ogre.renderer.OGRE as ogre from OgreWindowWx import * import ogre.addons.ogreforests as forests import ogre.addons.plib as plib #import ogre.sound.OgreAL as OgreAL import ogre.addons.caelum as caelum class ogreViewPane(OgreWindow): def _ChooseSceneManager(self): self.sceneManager = self.ogreRoot.createSceneManager("TerrainSceneManager") def _PopulateScene(self): self.sceneManager.setWorldGeometry ("CaelumDemoTerrain.cfg") self.sceneManager.setAmbientLight ( ogre.ColourValue(0,0,0 )) #self.skyManager = SkyManager(self) self.MakeSkyManager() # position camera # honestly not really sure whats up with this camera, didnt have # time to look, so this is a weird hack to get it to show a nice # starting location camStartingLocation = ogre.Vector3(250, 60, -200) self.sceneEntities.CamNode.setPosition(camStartingLocation) self.sceneEntities.PitchNode.setPosition(camStartingLocation) self.sceneEntities.Camera.setPosition(camStartingLocation) self.sceneEntities.CamNode.yaw(ogre.Degree(-124)) self.sceneEntities.PitchNode.pitch(ogre.Degree(6)) self.headEnt = self.sceneManager.createEntity("ogreHead", "ogrehead.mesh") self.headNode = self.sceneManager.getRootSceneNode().createChildSceneNode() self.headNode.setPosition(camStartingLocation) self.headNode.attachObject(self.headEnt) def MakeSkyManager(self): componentMask = caelum.CaelumSystem.CAELUM_COMPONENTS_DEFAULT self.caelumSystem = caelum.CaelumSystem(ogre.Root.getSingletonPtr(), self.sceneManager, componentMask) ## Set some time parameters ogre.ControllerManager.getSingleton().setTimeFactor (256) self.caelumSystem.getUniversalClock ().setTimeScale (256) # slider also defaults to 256 # set the current time to right now (to match up with the slider) currentTime = time.gmtime(time.time()) self.caelumSystem.getUniversalClock() \ .setGregorianDateTime(currentTime.tm_year, currentTime.tm_mon, currentTime.tm_mday, currentTime.tm_hour, currentTime.tm_min, currentTime.tm_sec, ) ## Register all to the render window self.renderWindow.addListener(self.caelumSystem) ogre.Root.getSingletonPtr().addFrameListener(self.caelumSystem) def dropEntity(self, entListNumber): pass def selectEntity(self): pass class MyFrame(wx.Frame): def __init__(self, *args, **kwds): # begin wxGlade: MyFrame.__init__ kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.window_1 = wx.SplitterWindow(self, -1, style=wx.SP_3D|wx.SP_BORDER) self.window_1_pane_2 = wx.Panel(self.window_1, -1) self.window_5 = wx.SplitterWindow(self.window_1_pane_2, -1, style=wx.SP_3D|wx.SP_BORDER) self.window_5_pane_2 = wx.Panel(self.window_5, -1) self.window_5_pane_1 = wx.Panel(self.window_5, -1) self.notebook_1 = wx.Notebook(self.window_5_pane_1, -1, style=0) self.notebook_1_pane_4 = wx.Panel(self.notebook_1, -1) self.notebook_1_pane_2 = wx.Panel(self.notebook_1, -1) self.notebook_1_pane_1 = wx.Panel(self.notebook_1, -1) self.ogreWin = wx.Panel(self.window_1, -1) self.window_2 = wx.SplitterWindow(self.ogreWin, -1, style=wx.SP_3D|wx.SP_BORDER) self.window_2_pane_2 = wx.Panel(self.window_2, -1) self.window_2_pane_1 = wx.Panel(self.window_2, -1) self.panel_1 = wx.Panel(self, -1) # Menu Bar self.editor_menubar = wx.MenuBar() self.SetMenuBar(self.editor_menubar) wxglade_tmp_menu = wx.Menu() self.fNew = wx.MenuItem(wxglade_tmp_menu, wx.NewId(), "New", "", wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.fNew) wxglade_tmp_menu.AppendSeparator() self.fOpen = wx.MenuItem(wxglade_tmp_menu, wx.NewId(), "Open", "", wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.fOpen) self.fSave = wx.MenuItem(wxglade_tmp_menu, wx.NewId(), "Save", "", wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.fSave) wxglade_tmp_menu.AppendSeparator() self.fExit = wx.MenuItem(wxglade_tmp_menu, wx.NewId(), "Exit", "", wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.fExit) self.editor_menubar.Append(wxglade_tmp_menu, "File") wxglade_tmp_menu = wx.Menu() self.editor_menubar.Append(wxglade_tmp_menu, "item1") # Menu Bar end self.button_1 = wx.Button(self.panel_1, -1, "button_1") self.ogreRenderWindow = ogreViewPane(self.window_2_pane_1, -1) self.window_4 = wx.TextCtrl(self.window_2_pane_2, -1) self.label_1 = wx.StaticText(self.notebook_1_pane_1, -1, "label_1") self.text_ctrl_1 = wx.TextCtrl(self.notebook_1_pane_1, -1, "") self.button_2 = wx.Button(self.notebook_1_pane_1, -1, "button_2") self.label_2 = wx.StaticText(self.notebook_1_pane_1, -1, "label_2") self.window_3 = wx.ColourPickerCtrl(self.notebook_1_pane_1, -1) self.label_2_copy = wx.StaticText(self.notebook_1_pane_1, -1, "label_2") self.label_2_copy_1 = wx.StaticText(self.notebook_1_pane_1, -1, "label_2") self.label_2_copy_2 = wx.StaticText(self.notebook_1_pane_1, -1, "label_2") self.label_2_copy_3 = wx.StaticText(self.notebook_1_pane_1, -1, "label_2") self.label_2_copy_4 = wx.StaticText(self.notebook_1_pane_1, -1, "label_2") self.label_2_copy_5 = wx.StaticText(self.notebook_1_pane_1, -1, "label_2") self.noSkyButton = wx.RadioButton(self.notebook_1_pane_2, -1, "None", style=wx.RB_GROUP) self.skyboxButton = wx.RadioButton(self.notebook_1_pane_2, -1, "SkyBox") self.caelumButton = wx.RadioButton(self.notebook_1_pane_2, -1, "Caelum") self.label_8 = wx.StaticText(self.notebook_1_pane_2, -1, "SkyBox Material :") self.text_ctrl_2 = wx.TextCtrl(self.notebook_1_pane_2, -1, "defaultSkyBox") self.button_3 = wx.Button(self.notebook_1_pane_2, -1, "..") self.label_9 = wx.StaticText(self.notebook_1_pane_2, -1, "Caelum Sky Settings") self.label_9_copy = wx.StaticText(self.notebook_1_pane_2, -1, "Ambient Colour") self.window_6 = wx.ColourPickerCtrl(self.notebook_1_pane_2, -1) self.label_9_copy_copy = wx.StaticText(self.notebook_1_pane_2, -1, "Sun Colour") self.window_6_copy = wx.ColourPickerCtrl(self.notebook_1_pane_2, -1) self.label_9_copy_copy_1 = wx.StaticText(self.notebook_1_pane_2, -1, "Time of Day") self.slider_1 = wx.Slider(self.notebook_1_pane_2, -1, 0, 0, 128) self.label_timespeed = wx.StaticText(self.notebook_1_pane_2, -1, "Time Speed") self.slider_timespeed = wx.Slider(self.notebook_1_pane_2, -1, 256, 0, 2048) self.notebook_1_pane_3 = wx.Panel(self.notebook_1, -1) self.label_11 = wx.StaticText(self.notebook_1_pane_4, -1, "Water : ") self.radio_btn_5 = wx.RadioButton(self.notebook_1_pane_4, -1, "ON", style=wx.RB_GROUP) self.radio_btn_5_copy = wx.RadioButton(self.notebook_1_pane_4, -1, "OFF") self.label_11_copy = wx.StaticText(self.notebook_1_pane_4, -1, "Level : ") self.slider_2 = wx.Slider(self.notebook_1_pane_4, -1, 0, -100, 100) self.label_11_copy_copy = wx.StaticText(self.notebook_1_pane_4, -1, "Material : ") self.text_ctrl_4 = wx.TextCtrl(self.notebook_1_pane_4, -1, "") self.notebook_1_pane_5 = wx.Panel(self.notebook_1, -1) self.label_10 = wx.StaticText(self.window_5_pane_2, -1, "Objects") self.objectLibraryList = wx.ListBox(self.window_5_pane_2, -1, choices=["test"], style=wx.LB_SINGLE|wx.LB_SORT) self.objectPropertyDisplay = wx.ListCtrl(self.window_5_pane_2, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) self.__set_properties() self.__do_layout() self.Bind(wx.EVT_MENU, self.fileNew, self.fNew) self.Bind(wx.EVT_MENU, self.fileOpen, self.fOpen) self.Bind(wx.EVT_MENU, self.fileSave, self.fSave) self.Bind(wx.EVT_MENU, self.fileExit, self.fExit) self.Bind(wx.EVT_BUTTON, self.button1Click, self.button_1) self.Bind(wx.EVT_RADIOBUTTON, self.setSkyNone, self.noSkyButton) self.Bind(wx.EVT_RADIOBUTTON, self.setSkyBoxOn, self.skyboxButton) self.Bind(wx.EVT_RADIOBUTTON, self.setCaelumOn, self.caelumButton) self.Bind(wx.EVT_TEXT_ENTER, self.setSkyBoxMaterial, self.text_ctrl_2) self.Bind(wx.EVT_BUTTON, self.browseSkyBoxMaterials, self.button_3) self.Bind(wx.EVT_COMMAND_SCROLL, self.changeTimeOfDay, self.slider_1) self.Bind(wx.EVT_COMMAND_SCROLL, self.changeTimeSpeed, self.slider_timespeed) self.Bind(wx.EVT_LISTBOX, self.setEditorObjectSelection, self.objectLibraryList) # end wxGlade self.loadObjectsList() def __set_properties(self): # begin wxGlade: MyFrame.__set_properties self.SetTitle("frame_1") self.SetSize((1024, 843)) self.ogreRenderWindow.SetMinSize((669, 572)) self.caelumButton.SetValue(1) self.label_9.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.label_10.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.objectLibraryList.SetSelection(0) # end wxGlade def __do_layout(self): # begin wxGlade: MyFrame.__do_layout sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_5 = wx.BoxSizer(wx.HORIZONTAL) sizer_11 = wx.BoxSizer(wx.VERTICAL) sizer_12 = wx.BoxSizer(wx.HORIZONTAL) sizer_6 = wx.BoxSizer(wx.HORIZONTAL) grid_sizer_4 = wx.FlexGridSizer(3, 2, 0, 0) sizer_13 = wx.BoxSizer(wx.HORIZONTAL) sizer_8 = wx.BoxSizer(wx.VERTICAL) grid_sizer_3 = wx.GridSizer(4, 2, 5, 5) sizer_10 = wx.BoxSizer(wx.HORIZONTAL) sizer_9 = wx.BoxSizer(wx.HORIZONTAL) grid_sizer_2 = wx.GridSizer(8, 3, 0, 0) sizer_2 = wx.BoxSizer(wx.HORIZONTAL) sizer_4 = wx.BoxSizer(wx.HORIZONTAL) sizer_3 = wx.BoxSizer(wx.HORIZONTAL) grid_sizer_1 = wx.GridSizer(2, 16, 3, 3) grid_sizer_1.Add(self.button_1, 0, 0, 0) self.panel_1.SetSizer(grid_sizer_1) sizer_1.Add(self.panel_1, 0, wx.EXPAND, 0) sizer_3.Add(self.ogreRenderWindow, 1, wx.EXPAND, 0) self.window_2_pane_1.SetSizer(sizer_3) sizer_4.Add(self.window_4, 1, wx.EXPAND, 0) self.window_2_pane_2.SetSizer(sizer_4) self.window_2.SplitHorizontally(self.window_2_pane_1, self.window_2_pane_2) sizer_2.Add(self.window_2, 1, wx.EXPAND, 0) self.ogreWin.SetSizer(sizer_2) grid_sizer_2.Add(self.label_1, 0, wx.ALL, 5) grid_sizer_2.Add(self.text_ctrl_1, 1, wx.EXPAND, 0) grid_sizer_2.Add(self.button_2, 0, 0, 0) grid_sizer_2.Add(self.label_2, 0, wx.ALL, 5) grid_sizer_2.Add(self.window_3, 1, wx.EXPAND, 0) grid_sizer_2.Add(self.label_2_copy, 0, wx.ALL, 5) grid_sizer_2.Add(self.label_2_copy_1, 0, wx.ALL, 5) grid_sizer_2.Add(self.label_2_copy_2, 0, wx.ALL, 5) grid_sizer_2.Add(self.label_2_copy_3, 0, wx.ALL, 5) grid_sizer_2.Add(self.label_2_copy_4, 0, wx.ALL, 5) grid_sizer_2.Add(self.label_2_copy_5, 0, wx.ALL, 5) self.notebook_1_pane_1.SetSizer(grid_sizer_2) sizer_9.Add(self.noSkyButton, 0, wx.ALL, 5) sizer_9.Add(self.skyboxButton, 0, wx.ALL, 5) sizer_9.Add(self.caelumButton, 0, wx.ALL, 5) sizer_8.Add(sizer_9, 0, wx.ALL, 5) sizer_10.Add(self.label_8, 0, wx.ALL, 5) sizer_10.Add(self.text_ctrl_2, 0, wx.ALL, 5) sizer_10.Add(self.button_3, 0, wx.ALL, 5) sizer_8.Add(sizer_10, 0, 0, 0) sizer_8.Add(self.label_9, 0, wx.ALL, 5) grid_sizer_3.Add(self.label_9_copy, 0, wx.ALL, 5) grid_sizer_3.Add(self.window_6, 0, 0, 0) grid_sizer_3.Add(self.label_9_copy_copy, 0, wx.ALL, 5) grid_sizer_3.Add(self.window_6_copy, 0, 0, 0) grid_sizer_3.Add(self.label_9_copy_copy_1, 0, wx.ALL, 5) grid_sizer_3.Add(self.slider_1, 0, wx.EXPAND, 0) grid_sizer_3.Add(self.label_timespeed, 0, wx.ALL, 5) grid_sizer_3.Add(self.slider_timespeed, 0, wx.EXPAND, 0) sizer_8.Add(grid_sizer_3, 0, 0, 0) self.notebook_1_pane_2.SetSizer(sizer_8) grid_sizer_4.Add(self.label_11, 0, wx.ALL, 5) sizer_13.Add(self.radio_btn_5, 0, wx.ALL, 5) sizer_13.Add(self.radio_btn_5_copy, 0, wx.ALL, 5) grid_sizer_4.Add(sizer_13, 1, wx.EXPAND, 0) grid_sizer_4.Add(self.label_11_copy, 0, wx.ALL, 5) grid_sizer_4.Add(self.slider_2, 0, 0, 0) grid_sizer_4.Add(self.label_11_copy_copy, 0, wx.ALL, 5) grid_sizer_4.Add(self.text_ctrl_4, 0, 0, 0) self.notebook_1_pane_4.SetSizer(grid_sizer_4) self.notebook_1.AddPage(self.notebook_1_pane_1, "World Settings") self.notebook_1.AddPage(self.notebook_1_pane_2, "Sky") self.notebook_1.AddPage(self.notebook_1_pane_3, "Foliage") self.notebook_1.AddPage(self.notebook_1_pane_4, "Water") self.notebook_1.AddPage(self.notebook_1_pane_5, "Sounds") sizer_6.Add(self.notebook_1, 1, wx.ALL|wx.EXPAND, 5) self.window_5_pane_1.SetSizer(sizer_6) sizer_11.Add(self.label_10, 0, wx.ALL, 5) sizer_12.Add(self.objectLibraryList, 0, wx.ALL|wx.EXPAND, 5) sizer_12.Add(self.objectPropertyDisplay, 1, wx.ALL|wx.EXPAND, 5) sizer_11.Add(sizer_12, 1, wx.EXPAND, 0) self.window_5_pane_2.SetSizer(sizer_11) self.window_5.SplitHorizontally(self.window_5_pane_1, self.window_5_pane_2) sizer_5.Add(self.window_5, 1, wx.EXPAND, 0) self.window_1_pane_2.SetSizer(sizer_5) self.window_1.SplitVertically(self.ogreWin, self.window_1_pane_2) sizer_1.Add(self.window_1, 1, wx.EXPAND, 0) self.SetSizer(sizer_1) self.Layout() # end wxGlade def button1Click(self, event): # wxGlade: MyFrame.<event_handler> loc = self.ogreRenderWindow.sceneEntities.Camera.getPosition() yaw = self.ogreRenderWindow.sceneEntities.CamNode.getOrientation().getYaw().valueDegrees() pitch = self.ogreRenderWindow.sceneEntities.PitchNode.getOrientation().getPitch().valueDegrees() msgString = "Camera Location - x: " + str(loc.x) + ", y: " + str(loc.y) + ", z: " + str(loc.z) + "\n" msgString += "Yaw: " + str(yaw) + "\n" msgString += "Pitch: " + str(pitch) + "\n" wx.MessageBox(msgString, 'Info') def fileNew(self, event): # wxGlade: MyFrame.<event_handler> print "Event handler `fileNew' not implemented!" event.Skip() def fileOpen(self, event): # wxGlade: MyFrame.<event_handler> print "Event handler `fileOpen' not implemented!" event.Skip() def fileSave(self, event): # wxGlade: MyFrame.<event_handler> print "Event handler `fileSave' not implemented!" event.Skip() def fileExit(self, event): # wxGlade: MyFrame.<event_handler> print "Event handler `fileExit' not implemented!" event.Skip() def setSkyNone(self, event): # wxGlade: MyFrame.<event_handler> print "Event handler `setSkyNone' not implemented" event.Skip() def setSkyBoxOn(self, event): # wxGlade: MyFrame.<event_handler> print "Event handler `setSkyBoxOn' not implemented" event.Skip() def setCaelumOn(self, event): # wxGlade: MyFrame.<event_handler> print "Event handler `setCaelumOn' not implemented" event.Skip() def setSkyBoxMaterial(self, event): # wxGlade: MyFrame.<event_handler> print "Event handler `setSkyBoxMaterial' not implemented" event.Skip() def browseSkyBoxMaterials(self, event): # wxGlade: MyFrame.<event_handler> print "Event handler `browseSkyBoxMaterials' not implemented" event.Skip() def changeTimeOfDay(self, event): # wxGlade: MyFrame.<event_handler> # this is the amount of time that goes by per notch on the slider. # 1440 minutes in a day, divided by 128 (slider notices) = 11.25 intervalInMinutes = 11.25 intervalInSeconds = intervalInMinutes * 60 baseTime = time.time() # this is the current time in seconds sliderPosition = event.GetSelection() # goes from 0 to 128 userTimeInSeconds = baseTime + (sliderPosition * intervalInSeconds) userTime = time.gmtime(userTimeInSeconds) self.ogreRenderWindow.caelumSystem.getUniversalClock() \ .setGregorianDateTime(userTime.tm_year, userTime.tm_mon, userTime.tm_mday, userTime.tm_hour, userTime.tm_min, userTime.tm_sec, ) def changeTimeSpeed(self, event): self.ogreRenderWindow.caelumSystem.setTimeScale(event.GetSelection()) def setEditorObjectSelection(self, event): # wxGlade: MyFrame.<event_handler> print "Event handler `setEditorObjectSelection' not implemented" event.Skip() # User Defined Events def loadObjectsList(self): try: f = open("game_objects.txt", "r") l = f.readlines() for i in l: try: print i objName, objMesh, objMat = i.split() data = {"mesh":objMesh, "material":objMat} self.objectLibraryList.Append(objName, data) except: print i objName, objMesh = i.split() data = {"mesh":objMesh} self.objectLibraryList.Append(objName, data) finally: pass except: pass # end of class MyFrame if __name__ == "__main__": app = wx.PySimpleApp(0) wx.InitAllImageHandlers() editor = MyFrame(None, -1, "") editor.ogreRenderWindow.StartRendering() app.SetTopWindow(editor) editor.Show() app.MainLoop()
