CodeSnippets PyQtv4 Ogre Widget

From PyWiki

Jump to: navigation, search

I've put together some examples found on the Ogre Wiki and in the Forums and produced this simple QtWidget,
which embeds a Ogre window.
It can be used from Qt Designer: just promote a Standard Widget to a OgreWidget and add the module to the source folder.


from PyQt4 import QtOpenGL,QtCore
import ogre.renderer.OGRE as Ogre
 
class OgreWidget(QtOpenGL.QGLWidget):
    #widget specific metods---------------------------------------------------------------------
    def __init__(self,parent = None):
        QtOpenGL.QGLWidget.__init__(self,parent)
        self.root = None
        self.camera = None
        self.renderWindow = None
        self.sceneManager = None
        self.viewport = None
 
 
 
    def initializeGL(self):
        self.createRoot()
        self.loadPlugins()
        self.defineResources()
        self.setupRenderSystem()
        self.createRenderWindow("test")
        wnid = self.renderWindow.getCustomAttributeFloat("WINDOW")
        self.create(wnid)
        self.setAttribute(QtCore.Qt.WA_PaintOnScreen,True)
        self.createCamera()
        self.createViewport()
        self.loadScene()
 
        #needed to update the widget every 50 mS. (i.e. 20 fps)
        self.timer = QtCore.QTimer(self)                                                
        self.connect(self.timer,QtCore.SIGNAL("timeout()"),self,QtCore.SLOT("update()"))
        self.timer.start(100)
 
    def paintGL(self):
        self.root.renderOneFrame()
        self.animationStates.addTime(1)
 
    def resizeGL(self,widht,height):
        self.renderWindow.windowMovedOrResized()
 
    #ogre specific metods------------------------------------------------------------------------
    def createRoot(self):
        #create root object without any configuration file
        self.root = Ogre.Root("","","")
 
    def loadPlugins(self):
        #add any other needed plugin here
        self.root.loadPlugin("plugins/RenderSystem_GL")
 
    def defineResources(self):
        #add any other needed resource here
        self.root.addResourceLocation("media/models","FileSystem","General")
        Ogre.ResourceGroupManager.getSingleton().initialiseAllResourceGroups() 
 
    def setupRenderSystem(self):
        renderSystemList = self.root.getAvailableRenderers() #list of aviable render systems
        for rs in renderSystemList:
            rsName = rs.getName()
            if rsName == "OpenGL Rendering Subsystem":       #select OpenGL Render System
                self.root.setRenderSystem(rs)
                self.root.initialise(False)                  #initalise Ogre without creating render window
 
        self.sceneManager = self.root.createSceneManager(Ogre.ST_GENERIC)
 
    def createRenderWindow(self,name):
        opts = Ogre.NameValuePairList()
        opts['externalWindowHandle'] = str(int(self.winId())) #handle of the widget
        opts['externalGLControl'] = "true"                    #the OpenGL context is get from Qt
        self.renderWindow = self.root.createRenderWindow(name,self.width(),self.height(),False,opts)
        self.renderWindow.setActive(True)
 
 
 
    def createCamera(self):
        self.camera = self.sceneManager.createCamera('Camera') 
        self.camera.lookAt(Ogre.Vector3(0, 0, 0)) 
        self.camera.NearClipDistance = 5 
 
 
    def createViewport(self):
        renderWindow = self.renderWindow
        self.viewport = renderWindow.addViewport(self.camera) 
        self.viewport.BackgroundColour = Ogre.ColourValue(255.0, 255.0, 255.0) 
 
    def loadScene(self):
        sceneManager = self.sceneManager
        camera = self.camera
        entity = sceneManager.createEntity('robot', 'robot.mesh')
        sceneManager.getRootSceneNode().createChildSceneNode(Ogre.Vector3(0, 0, 0)).attachObject(entity)
        self.animationStates = entity.getAnimationState('Walk')
        light = sceneManager.createLight('BlueLight')
        light.setPosition (-200, -80, -100)
        light.setDiffuseColour (Ogre.ColourValue(0.5, 0.5, 1.0) )
        self.animationStates.Enabled = True
 
 
        light = sceneManager.createLight('GreenLight')
        light.setPosition (0, 0, -100)
        light.setDiffuseColour (0.5, 1.0, 0.5)
 
        camera.setPosition (100, 50, 100)
        camera.lookAt(-50, 50, 0)
 
    def cleanUp(self):
        pass
Personal tools