74 lines
2.3 KiB
Python
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()
|
|
|