Difference between revisions of "User:Crond/sandbox/openglExample"
From CEGUI Wiki - Crazy Eddie's GUI System (Open Source)
< User:Crond | sandbox
m (2.75) |
m (→Requirements: superfluous) |
||
(4 intermediate revisions by the same user not shown) | |||
Line 6: | Line 6: | ||
== Requirements == | == Requirements == | ||
− | * Python 2.6 | + | * Python 2.6 |
* PyCEGUI | * PyCEGUI | ||
− | * PyOpenGL | + | * PyOpenGL |
== Notes == | == Notes == | ||
Line 22: | Line 22: | ||
# Import: std | # Import: std | ||
− | import sys | + | import sys, os |
# Import: PyOpenGL | # Import: PyOpenGL | ||
Line 40: | Line 40: | ||
class Application(object): | class Application(object): | ||
− | + | # Constructor | |
− | + | def __init__(self): | |
− | + | super(Application, self).__init__() | |
− | + | self.lastFrameTime = 0 | |
− | + | self.updateFPS = 0 | |
− | + | return | |
− | + | # Initialize: OpenGL | |
− | + | # - A full list of values for `glutInitDisplayMode` can be found in the GLUT | |
− | + | # documentation. | |
− | + | def initializeOpenGL(self): | |
− | + | glutInit() | |
− | + | glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA) | |
− | + | glutInitWindowSize(1024, 768) | |
− | + | glutInitWindowPosition(-1, -1) # Let the windowing system figure it out | |
− | + | glutCreateWindow("Crazy Eddie's GUI Mk-2 - glut Base Application") | |
− | + | glutSetCursor(GLUT_CURSOR_NONE) | |
− | + | return | |
− | + | # Initialize: Handlers | |
− | + | # - Setup the methods which will be called when events happen. | |
− | + | def initializeHandlers(self): | |
− | + | glutDisplayFunc(self.handlerDisplay) | |
− | + | glutReshapeFunc(self.handlerResize) | |
− | + | glutMouseFunc(self.handlerMouse) | |
− | + | glutMotionFunc(self.handlerMouseMotion) | |
− | + | glutPassiveMotionFunc(self.handlerMouseMotion) | |
− | + | return | |
− | + | # Initialize: PyCEGUI | |
− | + | # - Store some components; saves a lot of typing. | |
− | + | def initializePyCEGUI(self): | |
− | + | Renderer.bootstrapSystem() | |
− | + | self.sys = PyCEGUI.System.getSingleton() | |
− | + | self.rp = self.sys.getResourceProvider() | |
− | + | self.scheme = PyCEGUI.SchemeManager.getSingleton() | |
− | + | self.wm = PyCEGUI.WindowManager.getSingleton() | |
− | + | return | |
− | + | # Initialize: Defaults | |
− | + | # - Resource locations. | |
− | + | def initializeDefaults(self): | |
− | + | self.rp.setResourceGroupDirectory('schemes', os.path.join(PATH_RESOURCES, 'datafiles/schemes')) | |
− | + | self.rp.setResourceGroupDirectory('imagesets', os.path.join(PATH_RESOURCES, 'datafiles/imagesets')) | |
− | + | self.rp.setResourceGroupDirectory('fonts', os.path.join(PATH_RESOURCES, 'datafiles/fonts')) | |
− | + | self.rp.setResourceGroupDirectory('layouts', os.path.join(PATH_RESOURCES, 'datafiles/layouts')) | |
− | + | self.rp.setResourceGroupDirectory('looknfeels', os.path.join(PATH_RESOURCES, 'datafiles/looknfeel')) | |
− | + | self.rp.setResourceGroupDirectory('schemas', os.path.join(PATH_RESOURCES, 'datafiles/xml_schemas')) | |
− | + | PyCEGUI.Imageset.setDefaultResourceGroup('imagesets') | |
− | + | PyCEGUI.Font.setDefaultResourceGroup('fonts') | |
− | + | PyCEGUI.Scheme.setDefaultResourceGroup('schemes') | |
− | + | PyCEGUI.WidgetLookManager.setDefaultResourceGroup('looknfeels') | |
− | + | PyCEGUI.WindowManager.setDefaultResourceGroup('layouts') | |
− | + | parser = self.sys.getXMLParser() | |
− | + | if parser.isPropertyPresent('SchemaDefaultResourceGroup'): | |
− | + | parser.setProperty('SchemaDefaultResourceGroup', 'schemas') | |
− | + | return | |
− | + | # Initialize: GUI | |
− | + | # - This is where we are actually setting up the windows we will see. | |
− | + | def initializeGUI(self): | |
− | + | self.scheme.create('VanillaSkin.scheme') | |
− | + | self.scheme.create('TaharezLook.scheme') | |
− | + | # GUISheet | |
− | + | self.rootWindow = self.wm.loadWindowLayout('VanillaWindows.layout') | |
− | + | self.sys.setGUISheet(self.rootWindow) | |
− | + | # Cursor | |
− | + | self.sys.setDefaultMouseCursor('Vanilla-Images', 'MouseArrow') | |
− | + | # An extra window | |
− | + | w = self.wm.createWindow('TaharezLook/FrameWindow', 'Demo window') | |
− | + | self.rootWindow.addChildWindow(w) | |
− | + | return | |
− | + | # Initialize | |
− | + | def Initialize(self): | |
− | + | self.initializeOpenGL() | |
− | + | self.initializeHandlers() | |
− | + | self.initializePyCEGUI() | |
− | + | self.initializeDefaults() | |
− | + | self.initializeGUI() | |
− | + | return | |
− | + | # Handler: Display | |
− | + | def handlerDisplay(self): | |
− | + | # Injecting the time allows CEGUI to know how much time has passed, and | |
− | + | # use that to coordinate certain activities - fading, animation, tooltips, | |
− | + | # etc. | |
− | + | now = glutGet(GLUT_ELAPSED_TIME) | |
− | + | elapsed = (now - self.lastFrameTime) / 1000.0 | |
− | + | self.lastFrameTime = now | |
− | + | self.updateFPS = self.updateFPS - elapsed | |
− | + | self.sys.injectTimePulse(elapsed) | |
− | + | # Actual rendering | |
− | + | # - `renderGUI` updates CEGUI's picture of the GUI. | |
− | + | # - `glutPostRedisplay` is what actually marks the window as needing to | |
− | + | # be redrawn by OpenGL. | |
− | + | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) | |
− | + | self.sys.renderGUI() | |
− | + | glutPostRedisplay() | |
− | + | glutSwapBuffers() | |
− | + | return | |
− | + | # Handler: Resize | |
− | + | # - `glViewport` modifies the OpenGL viewport to whatever the window size is. | |
− | + | def handlerResize(self, width, height): | |
− | + | glViewport(0, 0, width, height) | |
− | + | self.sys.notifyDisplaySizeChanged(PyCEGUI.Size(width, height)) | |
− | + | return | |
− | + | # Handler: Mouse buttons | |
− | + | def handlerMouse(self, button, state, x, y): | |
− | + | if button == GLUT_LEFT_BUTTON: | |
− | + | if state == GLUT_UP: | |
− | + | self.sys.injectMouseButtonUp(PyCEGUI.LeftButton) | |
− | + | else: | |
− | + | self.sys.injectMouseButtonDown(PyCEGUI.LeftButton) | |
− | + | elif button == GLUT_RIGHT_BUTTON: | |
− | + | if state == GLUT_UP: | |
− | + | self.sys.injectMouseButtonUp(PyCEGUI.RightButton) | |
− | + | else: | |
− | + | self.sys.injectMouseButtonDown(PyCEGUI.RightButton) | |
− | + | return | |
− | + | # Handler: Mouse motion | |
− | + | def handlerMouseMotion(self, x, y): | |
− | + | self.sys.injectMousePosition(x, y) | |
− | return | + | return |
+ | |||
+ | # Run | ||
+ | def Run(self): | ||
+ | self.lastFrameTime = glutGet(GLUT_ELAPSED_TIME) | ||
+ | glutMainLoop() | ||
+ | return | ||
− | |||
− | |||
− | |||
− | |||
− | |||
# Main | # Main | ||
def main(): | def main(): | ||
− | + | app = Application() | |
− | + | app.Initialize() | |
− | + | app.Run() | |
− | + | return 0 | |
# Guard | # Guard | ||
if __name__ == '__main__': | if __name__ == '__main__': | ||
− | + | sys.exit(main()) | |
</source> | </source> |
Latest revision as of 15:50, 20 June 2011
Written for CEGUI 0.7
Works with versions 0.7.x (obsolete)
Requires at least version
0.7.5
Contents
Introduction
This presents a minimal PyCEGUI application, using OpenGL as the renderer. The goal is to familiarize the reader with the basics of how to get PyCEGUI up and running, and to provide a few pointers along the way.
Requirements
- Python 2.6
- PyCEGUI
- PyOpenGL
Notes
This example assumes you have the CEGUI resources located in the same directory as the script; change `PATH_RESOURCES` if they are elsewhere.
Source
#!/usr/bin/env python # # # example.py # Import: std import sys, os # Import: PyOpenGL from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * # Import: PyCEGUI import PyCEGUI from PyCEGUIOpenGLRenderer import OpenGLRenderer as Renderer # Constants PATH_RESOURCES = './' # Application class Application(object): # Constructor def __init__(self): super(Application, self).__init__() self.lastFrameTime = 0 self.updateFPS = 0 return # Initialize: OpenGL # - A full list of values for `glutInitDisplayMode` can be found in the GLUT # documentation. def initializeOpenGL(self): glutInit() glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA) glutInitWindowSize(1024, 768) glutInitWindowPosition(-1, -1) # Let the windowing system figure it out glutCreateWindow("Crazy Eddie's GUI Mk-2 - glut Base Application") glutSetCursor(GLUT_CURSOR_NONE) return # Initialize: Handlers # - Setup the methods which will be called when events happen. def initializeHandlers(self): glutDisplayFunc(self.handlerDisplay) glutReshapeFunc(self.handlerResize) glutMouseFunc(self.handlerMouse) glutMotionFunc(self.handlerMouseMotion) glutPassiveMotionFunc(self.handlerMouseMotion) return # Initialize: PyCEGUI # - Store some components; saves a lot of typing. def initializePyCEGUI(self): Renderer.bootstrapSystem() self.sys = PyCEGUI.System.getSingleton() self.rp = self.sys.getResourceProvider() self.scheme = PyCEGUI.SchemeManager.getSingleton() self.wm = PyCEGUI.WindowManager.getSingleton() return # Initialize: Defaults # - Resource locations. def initializeDefaults(self): self.rp.setResourceGroupDirectory('schemes', os.path.join(PATH_RESOURCES, 'datafiles/schemes')) self.rp.setResourceGroupDirectory('imagesets', os.path.join(PATH_RESOURCES, 'datafiles/imagesets')) self.rp.setResourceGroupDirectory('fonts', os.path.join(PATH_RESOURCES, 'datafiles/fonts')) self.rp.setResourceGroupDirectory('layouts', os.path.join(PATH_RESOURCES, 'datafiles/layouts')) self.rp.setResourceGroupDirectory('looknfeels', os.path.join(PATH_RESOURCES, 'datafiles/looknfeel')) self.rp.setResourceGroupDirectory('schemas', os.path.join(PATH_RESOURCES, 'datafiles/xml_schemas')) PyCEGUI.Imageset.setDefaultResourceGroup('imagesets') PyCEGUI.Font.setDefaultResourceGroup('fonts') PyCEGUI.Scheme.setDefaultResourceGroup('schemes') PyCEGUI.WidgetLookManager.setDefaultResourceGroup('looknfeels') PyCEGUI.WindowManager.setDefaultResourceGroup('layouts') parser = self.sys.getXMLParser() if parser.isPropertyPresent('SchemaDefaultResourceGroup'): parser.setProperty('SchemaDefaultResourceGroup', 'schemas') return # Initialize: GUI # - This is where we are actually setting up the windows we will see. def initializeGUI(self): self.scheme.create('VanillaSkin.scheme') self.scheme.create('TaharezLook.scheme') # GUISheet self.rootWindow = self.wm.loadWindowLayout('VanillaWindows.layout') self.sys.setGUISheet(self.rootWindow) # Cursor self.sys.setDefaultMouseCursor('Vanilla-Images', 'MouseArrow') # An extra window w = self.wm.createWindow('TaharezLook/FrameWindow', 'Demo window') self.rootWindow.addChildWindow(w) return # Initialize def Initialize(self): self.initializeOpenGL() self.initializeHandlers() self.initializePyCEGUI() self.initializeDefaults() self.initializeGUI() return # Handler: Display def handlerDisplay(self): # Injecting the time allows CEGUI to know how much time has passed, and # use that to coordinate certain activities - fading, animation, tooltips, # etc. now = glutGet(GLUT_ELAPSED_TIME) elapsed = (now - self.lastFrameTime) / 1000.0 self.lastFrameTime = now self.updateFPS = self.updateFPS - elapsed self.sys.injectTimePulse(elapsed) # Actual rendering # - `renderGUI` updates CEGUI's picture of the GUI. # - `glutPostRedisplay` is what actually marks the window as needing to # be redrawn by OpenGL. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) self.sys.renderGUI() glutPostRedisplay() glutSwapBuffers() return # Handler: Resize # - `glViewport` modifies the OpenGL viewport to whatever the window size is. def handlerResize(self, width, height): glViewport(0, 0, width, height) self.sys.notifyDisplaySizeChanged(PyCEGUI.Size(width, height)) return # Handler: Mouse buttons def handlerMouse(self, button, state, x, y): if button == GLUT_LEFT_BUTTON: if state == GLUT_UP: self.sys.injectMouseButtonUp(PyCEGUI.LeftButton) else: self.sys.injectMouseButtonDown(PyCEGUI.LeftButton) elif button == GLUT_RIGHT_BUTTON: if state == GLUT_UP: self.sys.injectMouseButtonUp(PyCEGUI.RightButton) else: self.sys.injectMouseButtonDown(PyCEGUI.RightButton) return # Handler: Mouse motion def handlerMouseMotion(self, x, y): self.sys.injectMousePosition(x, y) return # Run def Run(self): self.lastFrameTime = glutGet(GLUT_ELAPSED_TIME) glutMainLoop() return # Main def main(): app = Application() app.Initialize() app.Run() return 0 # Guard if __name__ == '__main__': sys.exit(main())