Lightningbeam/PyGUI-2.5.3/GUI/Generic/GGLViews.py

74 lines
2.3 KiB
Python

#
# PyGUI - OpenGL View - Generic
#
from OpenGL.GL import glViewport, glMatrixMode, glLoadIdentity, \
GL_PROJECTION, GL_MODELVIEW
from GUI import Component
from GUI import ViewBase
from GUI.GLContexts import GLContext
class GLError(StandardError):
pass
class GLView(ViewBase, Component, GLContext):
"""A GLView is a Component providing an OpenGL 3D display area.
Constructors:
GLView(config_attr = value..., share = None)
GLView(config, share = None)
"""
_default_size = (100, 100)
def __init__(self, **kwds):
Component.__init__(self, **kwds)
ViewBase.__init__(self)
def destroy(self):
ViewBase.destroy(self)
Component.destroy(self)
def _render(self):
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
self.render()
def render(self):
"""This method is called when the contents of the view needs to
be redrawn, with the view's OpenGL context as the current context.
The modelview matrix has been selected as the current matrix and
set to an identity matrix. After calling this method, buffers will
be automatically swapped or drawing flushed as appropriate."""
pass
def viewport_changed(self):
"""This method is called when the view's size has changed, with
the view's OpenGL context as the current context, and the OpenGL
viewport set to (0, 0, width, height). The default implementation
loads an identity projection matrix and calls init_projection()."""
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
self.init_projection()
def init_projection(self):
"""This method is called to establish the projection whenever the
viewport changes. The projection matrix has been selected as the
current matrix and set to an identity matrix."""
pass
def update(self):
"""Redraws the contents of the view immediately, without waiting
for a return to the event loop."""
self.with_context(self.render, flush = True)
def _init_context(self):
self.init_context()
self._update_viewport()
def _update_viewport(self):
width, height = self.size
glViewport(0, 0, int(width), int(height))
self.viewport_changed()