Difference between revisions of "User:Crond/sandbox/openglExample"
From CEGUI Wiki - Crazy Eddie's GUI System (Open Source)
< User:Crond | sandbox
m (1) |
m (→Requirements: superfluous) |
||
(7 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | + | {{VersionBadge|0.7}} {{VersionAtLeast|0.7.5}} | |
− | + | <br /><br /><br /><br /> | |
− | + | == 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 == | ||
<source lang="python"> | <source lang="python"> | ||
− | import | + | #!/usr/bin/env python |
+ | # | ||
+ | # | ||
+ | # example.py | ||
+ | |||
+ | |||
+ | # Import: std | ||
+ | import sys, os | ||
+ | # Import: PyOpenGL | ||
from OpenGL.GL import * | from OpenGL.GL import * | ||
from OpenGL.GLU import * | from OpenGL.GLU import * | ||
from OpenGL.GLUT import * | from OpenGL.GLUT import * | ||
− | # | + | # Import: PyCEGUI |
− | + | ||
import PyCEGUI | import PyCEGUI | ||
− | + | from PyCEGUIOpenGLRenderer import OpenGLRenderer as Renderer | |
− | + | # Constants | |
+ | PATH_RESOURCES = './' | ||
− | class | + | |
+ | # Application | ||
+ | class Application(object): | ||
+ | |||
+ | # Constructor | ||
def __init__(self): | def __init__(self): | ||
− | + | super(Application, self).__init__() | |
− | glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA) | + | self.lastFrameTime = 0 |
− | glutInitWindowSize( | + | self.updateFPS = 0 |
− | glutInitWindowPosition( | + | 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") | glutCreateWindow("Crazy Eddie's GUI Mk-2 - glut Base Application") | ||
glutSetCursor(GLUT_CURSOR_NONE) | 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 | |
− | PyCEGUI. | + | # - Store some components; saves a lot of typing. |
− | + | def initializePyCEGUI(self): | |
− | self. | + | Renderer.bootstrapSystem() |
− | + | self.sys = PyCEGUI.System.getSingleton() | |
− | + | self.rp = self.sys.getResourceProvider() | |
− | def | + | self.scheme = PyCEGUI.SchemeManager.getSingleton() |
− | self. | + | self.wm = PyCEGUI.WindowManager.getSingleton() |
− | self. | + | return |
− | + | ||
− | self. | + | # Initialize: Defaults |
− | self. | + | # - Resource locations. |
− | + | def initializeDefaults(self): | |
− | + | self.rp.setResourceGroupDirectory('schemes', os.path.join(PATH_RESOURCES, 'datafiles/schemes')) | |
− | def | + | self.rp.setResourceGroupDirectory('imagesets', os.path.join(PATH_RESOURCES, 'datafiles/imagesets')) |
− | + | self.rp.setResourceGroupDirectory('fonts', os.path.join(PATH_RESOURCES, 'datafiles/fonts')) | |
− | elapsed = ( | + | self.rp.setResourceGroupDirectory('layouts', os.path.join(PATH_RESOURCES, 'datafiles/layouts')) |
− | self.lastFrameTime = | + | 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.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) | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) | ||
− | + | self.sys.renderGUI() | |
glutPostRedisplay() | glutPostRedisplay() | ||
glutSwapBuffers() | glutSwapBuffers() | ||
− | + | return | |
− | def | + | |
+ | # Handler: Resize | ||
+ | # - `glViewport` modifies the OpenGL viewport to whatever the window size is. | ||
+ | def handlerResize(self, width, height): | ||
glViewport(0, 0, 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): | |
− | + | ||
− | def | + | |
if button == GLUT_LEFT_BUTTON: | if button == GLUT_LEFT_BUTTON: | ||
if state == GLUT_UP: | if state == GLUT_UP: | ||
− | + | self.sys.injectMouseButtonUp(PyCEGUI.LeftButton) | |
else: | else: | ||
− | + | self.sys.injectMouseButtonDown(PyCEGUI.LeftButton) | |
− | + | ||
elif button == GLUT_RIGHT_BUTTON: | elif button == GLUT_RIGHT_BUTTON: | ||
if state == GLUT_UP: | if state == GLUT_UP: | ||
− | + | self.sys.injectMouseButtonUp(PyCEGUI.RightButton) | |
else: | 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()) | ||
+ | </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())