User:Crond/sandbox/openglExample
From CEGUI Wiki - Crazy Eddie's GUI System (Open Source)
Base app
I will provide a little base application below so you know the basics of how to use CEGUI in python environment. OpenGL is used in the base app.
Also, note that this script assumes that the default CEGUI resources (lua_scripts, schemes, xml_schemas, etc) are located in a directory named 'datafiles', which itself is located in the same directory as the script itself. That is to say, if the script path is '/home/foo/script.py', there needs to be a path '/home/foo/datafiles' which contains all the resources.
import os, sys from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * # you must have PyCEGUI python package installed (see pypi repository) # or you must make it work yourself using binary bindings from SDK import PyCEGUI import PyCEGUIOpenGLRenderer CEGUI_PATH = "./" class BaseApp(object): def __init__(self): glutInit(sys.argv) glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA) glutInitWindowSize(1280, 1024) glutInitWindowPosition(100, 100) glutCreateWindow("Crazy Eddie's GUI Mk-2 - glut Base Application") glutSetCursor(GLUT_CURSOR_NONE) glutDisplayFunc(self.displayFunc) glutReshapeFunc(self.reshapeFunc) glutMouseFunc(self.mouseFunc) glutMotionFunc(self.mouseMotionFunc) glutPassiveMotionFunc(self.mouseMotionFunc) PyCEGUIOpenGLRenderer.OpenGLRenderer.bootstrapSystem() def __del__(self): PyCEGUIOpenGLRenderer.OpenGLRenderer.destroySystem() def initialiseResources(self): rp = PyCEGUI.System.getSingleton().getResourceProvider() rp.setResourceGroupDirectory("schemes", CEGUI_PATH + "datafiles/schemes") rp.setResourceGroupDirectory("imagesets", CEGUI_PATH + "datafiles/imagesets") rp.setResourceGroupDirectory("fonts", CEGUI_PATH + "datafiles/fonts") rp.setResourceGroupDirectory("layouts", CEGUI_PATH + "datafiles/layouts") rp.setResourceGroupDirectory("looknfeels", CEGUI_PATH + "datafiles/looknfeel") rp.setResourceGroupDirectory("schemas", CEGUI_PATH + "datafiles/xml_schemas") PyCEGUI.Imageset.setDefaultResourceGroup("imagesets") PyCEGUI.Font.setDefaultResourceGroup("fonts") PyCEGUI.Scheme.setDefaultResourceGroup("schemes") PyCEGUI.WidgetLookManager.setDefaultResourceGroup("looknfeels") PyCEGUI.WindowManager.setDefaultResourceGroup("layouts") parser = PyCEGUI.System.getSingleton().getXMLParser() if parser.isPropertyPresent("SchemaDefaultResourceGroup"): parser.setProperty("SchemaDefaultResourceGroup", "schemas") def setupUI(self): PyCEGUI.SchemeManager.getSingleton().create("VanillaSkin.scheme") PyCEGUI.SchemeManager.getSingleton().create("TaharezLook.scheme") PyCEGUI.System.getSingleton().setDefaultMouseCursor("Vanilla-Images", "MouseArrow") root = PyCEGUI.WindowManager.getSingleton().loadWindowLayout("VanillaWindows.layout") PyCEGUI.System.getSingleton().setGUISheet(root) self.wnd = PyCEGUI.WindowManager.getSingleton().createWindow("TaharezLook/FrameWindow", "Demo Window") root.addChildWindow(self.wnd) def run(self): self.initialiseResources() self.setupUI() self.lastFrameTime = glutGet(GLUT_ELAPSED_TIME) self.updateFPS = 0 glutMainLoop() def displayFunc(self): thisTime = glutGet(GLUT_ELAPSED_TIME) elapsed = (thisTime - self.lastFrameTime) / 1000.0 self.lastFrameTime = thisTime self.updateFPS = self.updateFPS - elapsed PyCEGUI.System.getSingleton().injectTimePulse(elapsed) # do rendering for this frame. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) PyCEGUI.System.getSingleton().renderGUI() glutPostRedisplay() glutSwapBuffers() def reshapeFunc(self, width, height): glViewport(0, 0, width, height) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(60.0, width / height, 1.0, 50.0) glMatrixMode(GL_MODELVIEW) PyCEGUI.System.getSingleton().notifyDisplaySizeChanged(PyCEGUI.Size(width, height)) def mouseFunc(self, button, state, x, y): if button == GLUT_LEFT_BUTTON: if state == GLUT_UP: PyCEGUI.System.getSingleton().injectMouseButtonUp(PyCEGUI.LeftButton) else: PyCEGUI.System.getSingleton().injectMouseButtonDown(PyCEGUI.LeftButton) elif button == GLUT_RIGHT_BUTTON: if state == GLUT_UP: PyCEGUI.System.getSingleton().injectMouseButtonUp(PyCEGUI.RightButton) else: PyCEGUI.System.getSingleton().injectMouseButtonDown(PyCEGUI.RightButton) def mouseMotionFunc(self, x, y): PyCEGUI.System.getSingleton().injectMousePosition(x, y) app = BaseApp() app.run() del app
I must say that this app isn't perfect or complete but it will get you going. You might want to make it exception safe and add keyboard injection. If you do that, please post it back here for others to benefit.