def create_line_generic(point_list: PointList, color: Color, shape_mode: int, line_width: float = 1) -> Shape: """ This function is used by ``create_line_strip`` and ``create_line_loop``, just changing the OpenGL type for the line drawing. """ colors = [get_four_byte_color(color)] * len(point_list) shape = create_line_generic_with_colors(point_list, colors, shape_mode, line_width) return shape
def _generic_draw_line_strip(point_list: PointList, color: Color, mode: int = gl.GL_LINE_STRIP): """ Draw a line strip. A line strip is a set of continuously connected line segments. :param point_list: List of points making up the line. Each point is in a list. So it is a list of lists. :param Color color: color, specified in a list of 3 or 4 bytes in RGB or RGBA format. """ # Cache the program. But not on linux because it fails unit tests for some reason. # if not _generic_draw_line_strip.program or sys.platform == "linux": _generic_draw_line_strip.program = shader.program( vertex_shader=_line_vertex_shader, fragment_shader=_line_fragment_shader, ) c4 = get_four_byte_color(color) c4e = c4 * len(point_list) a = array.array('B', c4e) color_buf = shader.buffer(a.tobytes()) color_buf_desc = shader.BufferDescription( color_buf, '4B', ['in_color'], normalized=['in_color'], ) def gen_flatten(my_list): return [item for sublist in my_list for item in sublist] vertices = array.array('f', gen_flatten(point_list)) vbo_buf = shader.buffer(vertices.tobytes()) vbo_buf_desc = shader.BufferDescription(vbo_buf, '2f', ['in_vert']) vao_content = [vbo_buf_desc, color_buf_desc] vao = shader.vertex_array(_generic_draw_line_strip.program, vao_content) with vao: _generic_draw_line_strip.program['Projection'] = get_projection( ).flatten() vao.render(mode=mode)
def create_line_generic_with_colors(point_list: PointList, color_list: Iterable[Color], shape_mode: int, line_width: float = 1) -> Shape: """ This function is used by ``create_line_strip`` and ``create_line_loop``, just changing the OpenGL type for the line drawing. :param PointList point_list: :param Iterable[Color] color_list: :param float shape_mode: :param float line_width: :Returns Shape: """ window = get_window() ctx = window.ctx program = ctx.line_generic_with_colors_program buffer_type = np.dtype([('vertex', '2f4'), ('color', '4B')]) data = np.zeros(len(point_list), dtype=buffer_type) data['vertex'] = point_list data['color'] = [get_four_byte_color(color) for color in color_list] vbo = ctx.buffer(data=data.tobytes()) vao_content = [ BufferDescription( vbo, '2f 4f1', ('in_vert', 'in_color'), normalized=['in_color'] ) ] vao = ctx.geometry(vao_content) shape = Shape() shape.vao = vao shape.vbo = vbo shape.program = program shape.mode = shape_mode shape.line_width = line_width return shape
def _generic_draw_line_strip(point_list: PointList, color: Color, mode: int = gl.GL_LINE_STRIP): """ Draw a line strip. A line strip is a set of continuously connected line segments. :param point_list: List of points making up the line. Each point is in a list. So it is a list of lists. :param Color color: color, specified in a list of 3 or 4 bytes in RGB or RGBA format. """ # Cache the program. But not on linux because it fails unit tests for some reason. # if not _generic_draw_line_strip.program or sys.platform == "linux": window = get_window() ctx = window.ctx c4 = get_four_byte_color(color) c4e = c4 * len(point_list) a = array.array('B', c4e) def gen_flatten(my_list): return [item for sublist in my_list for item in sublist] vertices = array.array('f', gen_flatten(point_list)) geometry = ctx.generic_draw_line_strip_geometry program = ctx.line_vertex_shader geometry.num_vertices = len(point_list) # Double buffer sizes if out of space while len(vertices) * 4 > ctx.generic_draw_line_strip_vbo.size: ctx.generic_draw_line_strip_vbo.orphan( ctx.generic_draw_line_strip_vbo.size * 2) ctx.generic_draw_line_strip_color.orphan( ctx.generic_draw_line_strip_color.size * 2) ctx.generic_draw_line_strip_vbo.write(vertices.tobytes()) ctx.generic_draw_line_strip_color.write(a.tobytes()) geometry.render(program, mode=mode)
def create_line_generic_with_colors(point_list: PointList, color_list: Iterable[Color], shape_mode: int, line_width: float = 1) -> Shape: """ This function is used by ``create_line_strip`` and ``create_line_loop``, just changing the OpenGL type for the line drawing. :param PointList point_list: :param Iterable[Color] color_list: :param float shape_mode: :param float line_width: :Returns Shape: """ program = shader.program( vertex_shader=''' #version 330 uniform mat4 Projection; in vec2 in_vert; in vec4 in_color; out vec4 v_color; void main() { gl_Position = Projection * vec4(in_vert, 0.0, 1.0); v_color = in_color; } ''', fragment_shader=''' #version 330 in vec4 v_color; out vec4 f_color; void main() { f_color = v_color; } ''', ) buffer_type = np.dtype([('vertex', '2f4'), ('color', '4B')]) data = np.zeros(len(point_list), dtype=buffer_type) data['vertex'] = point_list data['color'] = [get_four_byte_color(color) for color in color_list] vbo = shader.buffer(data.tobytes()) vao_content = [ shader.BufferDescription(vbo, '2f 4B', ('in_vert', 'in_color'), normalized=['in_color']) ] vao = shader.vertex_array(program, vao_content) with vao: program['Projection'] = get_projection().flatten() shape = Shape() shape.vao = vao shape.vbo = vbo shape.program = program shape.mode = shape_mode shape.line_width = line_width return shape