mirror of https://github.com/kivy/kivy.git
integrate Kovak's ScissorPush/Pop instructions, documentation needed
This commit is contained in:
parent
bab2ca8245
commit
600fff5665
|
@ -65,6 +65,8 @@ r('StencilPush', module='kivy.graphics.stencil_instructions')
|
||||||
r('StencilPop', module='kivy.graphics.stencil_instructions')
|
r('StencilPop', module='kivy.graphics.stencil_instructions')
|
||||||
r('StencilUse', module='kivy.graphics.stencil_instructions')
|
r('StencilUse', module='kivy.graphics.stencil_instructions')
|
||||||
r('StencilUnUse', module='kivy.graphics.stencil_instructions')
|
r('StencilUnUse', module='kivy.graphics.stencil_instructions')
|
||||||
|
r('ScissorPush', module='kivy.graphics.scissor_instructions')
|
||||||
|
r('ScissorPop', module='kivy.graphics.scissor_instructions')
|
||||||
r('Triangle', module='kivy.graphics.vertex_instructions')
|
r('Triangle', module='kivy.graphics.vertex_instructions')
|
||||||
r('Quad', module='kivy.graphics.vertex_instructions')
|
r('Quad', module='kivy.graphics.vertex_instructions')
|
||||||
r('Rectangle', module='kivy.graphics.vertex_instructions')
|
r('Rectangle', module='kivy.graphics.vertex_instructions')
|
||||||
|
|
|
@ -0,0 +1,158 @@
|
||||||
|
include "config.pxi"
|
||||||
|
include "opcodes.pxi"
|
||||||
|
|
||||||
|
from kivy.graphics.c_opengl cimport *
|
||||||
|
IF USE_OPENGL_DEBUG == 1:
|
||||||
|
from kivy.graphics.c_opengl_debug cimport *
|
||||||
|
from kivy.graphics.instructions cimport Instruction
|
||||||
|
|
||||||
|
cdef class Rect:
|
||||||
|
cdef int _x
|
||||||
|
cdef int _y
|
||||||
|
cdef int _width
|
||||||
|
cdef int _height
|
||||||
|
|
||||||
|
def __init__(self, int x, int y, int width, int height):
|
||||||
|
self._x = x
|
||||||
|
self._y = y
|
||||||
|
self._width = width
|
||||||
|
self._height = height
|
||||||
|
|
||||||
|
def intersect(self, Rect other):
|
||||||
|
max_x = min(self._x + self._width, other._x + other._width)
|
||||||
|
x = max(self._x, other._x)
|
||||||
|
width = max(0, max_x - x)
|
||||||
|
max_y = min(self._y + self._height, other._y + other._height)
|
||||||
|
y = max(self._y, other._y)
|
||||||
|
height = max(0, max_y - y)
|
||||||
|
self._x = x
|
||||||
|
self._width = width
|
||||||
|
self._y = y
|
||||||
|
self._height = height
|
||||||
|
|
||||||
|
|
||||||
|
cdef class ScissorStack:
|
||||||
|
cdef list _stack
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._stack = []
|
||||||
|
|
||||||
|
property empty:
|
||||||
|
def __get__(self):
|
||||||
|
return True if len(self._stack) is 0 else False
|
||||||
|
|
||||||
|
property back:
|
||||||
|
def __get__(self):
|
||||||
|
return self._stack[-1]
|
||||||
|
|
||||||
|
def push(self, element):
|
||||||
|
self._stack.append(element)
|
||||||
|
|
||||||
|
def pop(self):
|
||||||
|
return self._stack.pop()
|
||||||
|
|
||||||
|
|
||||||
|
scissor_stack = ScissorStack()
|
||||||
|
|
||||||
|
|
||||||
|
cdef class ScissorPush(Instruction):
|
||||||
|
cdef int _x
|
||||||
|
cdef int _y
|
||||||
|
cdef int _width
|
||||||
|
cdef int _height
|
||||||
|
cdef bint _on
|
||||||
|
cdef Rect _rect
|
||||||
|
|
||||||
|
property x:
|
||||||
|
def __get__(self):
|
||||||
|
return self._x
|
||||||
|
def __set__(self, value):
|
||||||
|
self._x = value
|
||||||
|
self._rect = Rect(self._x, self._y, self._width, self._height)
|
||||||
|
self.flag_update()
|
||||||
|
|
||||||
|
property y:
|
||||||
|
def __get__(self):
|
||||||
|
return self._y
|
||||||
|
def __set__(self, value):
|
||||||
|
self._y = value
|
||||||
|
self._rect = Rect(self._x, self._y, self._width, self._height)
|
||||||
|
self.flag_update()
|
||||||
|
|
||||||
|
property width:
|
||||||
|
def __get__(self):
|
||||||
|
return self._width
|
||||||
|
def __set__(self, value):
|
||||||
|
self._width = value
|
||||||
|
self._rect = Rect(self._y, self._y, self._width, self._height)
|
||||||
|
self.flag_update()
|
||||||
|
|
||||||
|
property height:
|
||||||
|
def __get__(self):
|
||||||
|
return self._height
|
||||||
|
def __set__(self, value):
|
||||||
|
self._height = value
|
||||||
|
self._rect = Rect(self._y, self._y, self._width, self._height)
|
||||||
|
self.flag_update()
|
||||||
|
|
||||||
|
property pos:
|
||||||
|
def __get__(self):
|
||||||
|
return self._x, self._y
|
||||||
|
def __set__(self, value):
|
||||||
|
self._x, self._y = value
|
||||||
|
self._rect = Rect(self._x, self._y, self._width, self._height)
|
||||||
|
self.flag_update()
|
||||||
|
|
||||||
|
property size:
|
||||||
|
def __get__(self):
|
||||||
|
return self._width, self._height
|
||||||
|
def __set__(self, value):
|
||||||
|
self._width, self._height = value
|
||||||
|
self._rect = Rect(self._x, self._y, self._width, self._height)
|
||||||
|
self.flag_update()
|
||||||
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
super(ScissorPush, self).__init__(**kwargs)
|
||||||
|
pos = kwargs.get('pos', (kwargs.get('x', 0), kwargs.get('y', 0)))
|
||||||
|
self._x, self._y = kwargs.get(
|
||||||
|
'pos', (
|
||||||
|
kwargs.get('x', 0),
|
||||||
|
kwargs.get('y', 0)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self._width, self._height = kwargs.get(
|
||||||
|
'size', (
|
||||||
|
kwargs.get('width', 100),
|
||||||
|
kwargs.get('height', 100)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self._rect = Rect(self._x, self._y, self._width, self._height)
|
||||||
|
|
||||||
|
cdef void apply(self):
|
||||||
|
cdef Rect rect = self._rect
|
||||||
|
cdef Rect new_scissor_rect
|
||||||
|
cdef Rect back
|
||||||
|
if scissor_stack.empty:
|
||||||
|
scissor_stack.push(rect)
|
||||||
|
glEnable(GL_SCISSOR_TEST)
|
||||||
|
glScissor(self._x, self._y, self._width, self._height)
|
||||||
|
else:
|
||||||
|
new_scissor_rect = Rect(rect._x, rect._y,
|
||||||
|
rect._width, rect._height)
|
||||||
|
back = scissor_stack.back
|
||||||
|
new_scissor_rect.intersect(back)
|
||||||
|
scissor_stack.push(new_scissor_rect)
|
||||||
|
glScissor(new_scissor_rect._x, new_scissor_rect._y,
|
||||||
|
new_scissor_rect._width, new_scissor_rect._height)
|
||||||
|
|
||||||
|
cdef class ScissorPop(Instruction):
|
||||||
|
|
||||||
|
cdef void apply(self):
|
||||||
|
scissor_stack.pop()
|
||||||
|
cdef Rect new_scissor_rect
|
||||||
|
if scissor_stack.empty:
|
||||||
|
glDisable(GL_SCISSOR_TEST)
|
||||||
|
else:
|
||||||
|
new_scissor_rect = scissor_stack.back
|
||||||
|
glScissor(new_scissor_rect._x, new_scissor_rect._y,
|
||||||
|
new_scissor_rect._width, new_scissor_rect._height)
|
3
setup.py
3
setup.py
|
@ -425,6 +425,8 @@ graphics_dependencies = {
|
||||||
'stencil_instructions.pxd': ['instructions.pxd'],
|
'stencil_instructions.pxd': ['instructions.pxd'],
|
||||||
'stencil_instructions.pyx': [
|
'stencil_instructions.pyx': [
|
||||||
'config.pxi', 'opcodes.pxi', 'c_opengl.pxd', 'c_opengl_debug.pxd'],
|
'config.pxi', 'opcodes.pxi', 'c_opengl.pxd', 'c_opengl_debug.pxd'],
|
||||||
|
'scissor_instructions.pyx': [
|
||||||
|
'config.pxi', 'opcodes.pxi', 'c_opengl.pxd', 'c_opengl_debug.pxd'],
|
||||||
'texture.pxd': ['c_opengl.pxd'],
|
'texture.pxd': ['c_opengl.pxd'],
|
||||||
'texture.pyx': [
|
'texture.pyx': [
|
||||||
'config.pxi', 'common.pxi', 'opengl_utils_def.pxi', 'context.pxd',
|
'config.pxi', 'common.pxi', 'opengl_utils_def.pxi', 'context.pxd',
|
||||||
|
@ -457,6 +459,7 @@ sources = {
|
||||||
'graphics/opengl_utils.pyx': merge(base_flags, gl_flags),
|
'graphics/opengl_utils.pyx': merge(base_flags, gl_flags),
|
||||||
'graphics/shader.pyx': merge(base_flags, gl_flags),
|
'graphics/shader.pyx': merge(base_flags, gl_flags),
|
||||||
'graphics/stencil_instructions.pyx': merge(base_flags, gl_flags),
|
'graphics/stencil_instructions.pyx': merge(base_flags, gl_flags),
|
||||||
|
'graphics/scissor_instructions.pyx': merge(base_flags, gl_flags),
|
||||||
'graphics/texture.pyx': merge(base_flags, gl_flags),
|
'graphics/texture.pyx': merge(base_flags, gl_flags),
|
||||||
'graphics/transformation.pyx': merge(base_flags, gl_flags),
|
'graphics/transformation.pyx': merge(base_flags, gl_flags),
|
||||||
'graphics/vbo.pyx': merge(base_flags, gl_flags),
|
'graphics/vbo.pyx': merge(base_flags, gl_flags),
|
||||||
|
|
Loading…
Reference in New Issue