Finish up border rendering implementation
This commit is contained in:
parent
4b7f097c71
commit
b3550391e9
@ -5,7 +5,7 @@
|
|||||||
import ctypes
|
import ctypes
|
||||||
|
|
||||||
from .constants import viewport_size
|
from .constants import viewport_size
|
||||||
from .fast_data_types import glUniform3fv, GL_TRIANGLE_STRIP, glDrawArrays
|
from .fast_data_types import glUniform3fv, GL_TRIANGLE_FAN, glMultiDrawArrays
|
||||||
from .layout import available_height
|
from .layout import available_height
|
||||||
from .utils import get_dpi
|
from .utils import get_dpi
|
||||||
from .shaders import ShaderProgram
|
from .shaders import ShaderProgram
|
||||||
@ -20,7 +20,7 @@ def to_opengl(x, y):
|
|||||||
|
|
||||||
|
|
||||||
def as_rect(left, top, right, bottom, color=0):
|
def as_rect(left, top, right, bottom, color=0):
|
||||||
for (x, y) in ((left, bottom), (right, bottom), (right, top), (left, top)):
|
for (x, y) in ((right, top), (right, bottom), (left, bottom), (left, top)):
|
||||||
x, y = to_opengl(x, y)
|
x, y = to_opengl(x, y)
|
||||||
yield x
|
yield x
|
||||||
yield y
|
yield y
|
||||||
@ -32,12 +32,12 @@ class BordersProgram(ShaderProgram):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
ShaderProgram.__init__(self, '''\
|
ShaderProgram.__init__(self, '''\
|
||||||
uniform vec3 colors[3];
|
uniform vec3 colors[3];
|
||||||
in vec3 vertex;
|
in vec3 rect;
|
||||||
out vec3 color;
|
out vec3 color;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
gl_Position = vec4(vertex[0], vertex[1], 0, 1);
|
gl_Position = vec4(rect[0], rect[1], 0, 1);
|
||||||
color = colors[uint(vertex[2])];
|
color = colors[uint(rect[2])];
|
||||||
}
|
}
|
||||||
''', '''\
|
''', '''\
|
||||||
in vec3 color;
|
in vec3 color;
|
||||||
@ -47,10 +47,10 @@ void main() {
|
|||||||
final_color = vec4(color, 1);
|
final_color = vec4(color, 1);
|
||||||
}
|
}
|
||||||
''')
|
''')
|
||||||
self.add_vertex_array('rects')
|
self.add_vertex_array('rect')
|
||||||
|
|
||||||
def send_data(self, data):
|
def send_data(self, data):
|
||||||
self.send_vertex_data('rects', data)
|
self.send_vertex_data('rect', data)
|
||||||
|
|
||||||
def set_colors(self, color_buf):
|
def set_colors(self, color_buf):
|
||||||
glUniform3fv(self.uniform_location('colors'), 3, ctypes.addressof(color_buf))
|
glUniform3fv(self.uniform_location('colors'), 3, ctypes.addressof(color_buf))
|
||||||
@ -101,16 +101,23 @@ class Borders:
|
|||||||
rects.extend(as_rect(g.left - bw, g.top - bw, g.right + bw, g.top, color))
|
rects.extend(as_rect(g.left - bw, g.top - bw, g.right + bw, g.top, color))
|
||||||
rects.extend(as_rect(g.right, g.top - bw, g.right + bw, g.bottom + bw, color))
|
rects.extend(as_rect(g.right, g.top - bw, g.right + bw, g.bottom + bw, color))
|
||||||
rects.extend(as_rect(g.left - bw, g.bottom, g.right + bw, g.bottom + bw, color))
|
rects.extend(as_rect(g.left - bw, g.bottom, g.right + bw, g.bottom + bw, color))
|
||||||
self.data = (ctypes.c_float * len(rects))()
|
self.num_of_rects = len(rects) // 12
|
||||||
|
self.rects = (ctypes.c_float * len(rects))()
|
||||||
|
self.starts = (ctypes.c_int * self.num_of_rects)()
|
||||||
|
self.counts = (ctypes.c_uint * self.num_of_rects)()
|
||||||
for i, x in enumerate(rects):
|
for i, x in enumerate(rects):
|
||||||
self.data[i] = x
|
self.rects[i] = x
|
||||||
|
if i % 12 == 0:
|
||||||
|
idx = i // 12
|
||||||
|
self.starts[idx] = i // 3
|
||||||
|
self.counts[idx] = 4
|
||||||
|
|
||||||
def render(self, program):
|
def render(self, program):
|
||||||
if not self.can_render:
|
if not self.can_render:
|
||||||
return
|
return
|
||||||
with program:
|
with program:
|
||||||
if self.is_dirty:
|
if self.is_dirty:
|
||||||
program.send_data(self.data)
|
program.send_data(self.rects)
|
||||||
program.set_colors(self.color_buf)
|
program.set_colors(self.color_buf)
|
||||||
self.is_dirty = False
|
self.is_dirty = False
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
|
glMultiDrawArrays(GL_TRIANGLE_FAN, ctypes.addressof(self.starts), ctypes.addressof(self.counts), self.num_of_rects)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user