#!/usr/bin/env python3
from pyglet.gl import *
from pyglet.graphics import Group, OrderedGroup
from glooey.helpers import *
[docs]class StencilGroup(Group):
[docs] def __init__(self, parent=None):
Group.__init__(self, parent)
[docs] def set_state(self):
glEnable(GL_STENCIL_TEST)
glClear(GL_DEPTH_BUFFER_BIT)
glClear(GL_STENCIL_BUFFER_BIT)
[docs] def unset_state(self):
glDisable(GL_STENCIL_TEST)
[docs]class StencilMask(OrderedGroup):
[docs] def __init__(self, parent=None, order=0):
super().__init__(order, parent)
[docs] def set_state(self):
# Disable writing the to color or depth buffers.
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
glDepthMask(GL_FALSE)
glStencilFunc(GL_NEVER, 1, 0xFF)
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP)
glStencilMask(0xFF)
[docs] def unset_state(self):
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
glDepthMask(GL_TRUE);
[docs]class WhereStencilIs(OrderedGroup):
[docs] def __init__(self, parent=None, order=1):
super().__init__(order, parent)
[docs] def set_state(self):
glStencilMask(0x00)
glStencilFunc(GL_EQUAL, 1, 0xFF)
[docs] def unset_state(self):
pass
[docs]class WhereStencilIsnt(OrderedGroup):
[docs] def __init__(self, parent=None, order=1):
super().__init__(order, parent)
[docs] def set_state(self):
glStencilMask(0x00);
glStencilFunc(GL_EQUAL, 0, 0xFF)
[docs] def unset_state(self):
pass
[docs]class ScissorGroup(Group):
[docs] def __init__(self, rect=None, parent=None):
super().__init__(parent)
self.rect = rect
[docs] def set_state(self):
glPushAttrib(GL_ENABLE_BIT)
glEnable(GL_SCISSOR_TEST)
glScissor(
int(self.rect.left),
int(self.rect.bottom),
int(self.rect.width),
int(self.rect.height),
)
[docs] def unset_state(self):
glPopAttrib()