CodeSnippets Ogre Editor

From PyWiki

Jump to: navigation, search

Simple Ogre Editor (WIP!)

Terrain!


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()
Personal tools