Beispiel #1
0
    def __init__(self, uniform_block):
        assert type(uniform_block) == UniformBlock, "Must be a UniformBlock instance"
        self.block = uniform_block
        self.buffer = create_buffer(self.block.size, target=GL_UNIFORM_BUFFER)
        glBindBufferBase(GL_UNIFORM_BUFFER, self.block.index, self.buffer.id)

        self.view = self._introspect_uniforms()
        self._view_ptr = pointer(self.view)
Beispiel #2
0
 def __init__(self, block, index):
     assert type(block) == UniformBlock, "Must be a UniformBlock instance"
     self.block = block
     self.buffer = create_buffer(self.block.size, target=GL_UNIFORM_BUFFER, mappable=False)
     self.buffer.bind()
     self.view = self._introspect_uniforms()
     self._view_ptr = pointer(self.view)
     self.index = index
Beispiel #3
0
 def __init__(self, block):
     assert type(block) == UniformBlock, "Must be a UniformBlock instance"
     self.block = block
     self.buffer = create_buffer(self.block.size, target=GL_UNIFORM_BUFFER)
     self.view = self._introspect_uniforms()
     self._view_ptr = pointer(self.view)
     index = len(block.program.uniform_buffers)
     glBindBufferBase(GL_UNIFORM_BUFFER, index, self.buffer.id)
     glUniformBlockBinding(self.block.program.id, self.block.index, index)
Beispiel #4
0
def draw_indexed(size, mode, indices, *data):
    """Draw a primitive with indexed vertices immediately.

    :Parameters:
        `size` : int
            Number of vertices given
        `mode` : int
            OpenGL drawing mode, e.g. ``GL_TRIANGLES``
        `indices` : sequence of int
            Sequence of integers giving indices into the vertex list.
        `data` : data items
            Attribute formats and data.  See the module summary for details.

    """
    # Create and bind a throwaway VAO
    vao_id = GLuint()
    glGenVertexArrays(1, vao_id)
    glBindVertexArray(vao_id)
    # Activate shader program:
    group = get_default_group()
    group.set_state()

    buffers = []
    for fmt, array in data:
        attribute = vertexattribute.create_attribute(group.program.id, fmt)
        assert size == len(
            array) // attribute.count, 'Data for %s is incorrect length' % fmt

        buffer = vertexbuffer.create_buffer(size * attribute.stride,
                                            mappable=False)

        attribute.set_region(buffer, 0, size, array)
        attribute.enable()
        attribute.set_pointer(buffer.ptr)
        buffers.append(buffer)

    if size <= 0xff:
        index_type = GL_UNSIGNED_BYTE
        index_c_type = ctypes.c_ubyte
    elif size <= 0xffff:
        index_type = GL_UNSIGNED_SHORT
        index_c_type = ctypes.c_ushort
    else:
        index_type = GL_UNSIGNED_INT
        index_c_type = ctypes.c_uint

    index_array = (index_c_type * len(indices))(*indices)
    glDrawElements(mode, len(indices), index_type, index_array)
    glFlush()

    # Deactivate shader program:
    group.unset_state()
    # Discard everything after drawing:
    del buffers
    glBindVertexArray(0)
    glDeleteVertexArrays(1, vao_id)
Beispiel #5
0
    def __init__(self, attribute_usages):
        self.allocator = allocation.Allocator(self._initial_count)

        static_attributes = []
        attributes = []
        self.buffer_attributes = []  # list of (buffer, attributes)
        for attribute, usage in attribute_usages:

            if usage == GL_STATIC_DRAW:
                # Group attributes for interleaved buffer
                static_attributes.append(attribute)
                attributes.append(attribute)
            else:
                # Create non-interleaved buffer
                attributes.append(attribute)
                attribute.buffer = vertexbuffer.create_buffer(
                    attribute.stride * self.allocator.capacity, usage=usage)
                attribute.buffer.element_size = attribute.stride
                attribute.buffer.attributes = (attribute, )
                self.buffer_attributes.append(
                    (attribute.buffer, (attribute, )))

        # Create buffer for interleaved data
        if static_attributes:
            vertexattribute.interleave_attributes(static_attributes)
            stride = static_attributes[0].stride
            buffer = vertexbuffer.create_buffer(stride *
                                                self.allocator.capacity,
                                                usage=GL_STATIC_DRAW)
            buffer.element_size = stride
            self.buffer_attributes.append((buffer, static_attributes))

            attributes.extend(static_attributes)
            for attribute in static_attributes:
                attribute.buffer = buffer

        # Create named attributes for each attribute
        self.attributes = attributes
        self.attribute_names = {}
        for attribute in attributes:
            name = attribute.name
            assert name not in self.attributes, 'More than one "%s" attribute given' % name
            self.attribute_names[name] = attribute
Beispiel #6
0
    def __init__(self, attribute_usages, index_gl_type=GL_UNSIGNED_INT):
        super(IndexedVertexDomain, self).__init__(attribute_usages)

        self.index_allocator = allocation.Allocator(self._initial_index_count)

        self.index_gl_type = index_gl_type
        self.index_c_type = vertexattribute._c_types[index_gl_type]
        self.index_element_size = ctypes.sizeof(self.index_c_type)
        self.index_buffer = vertexbuffer.create_buffer(
            self.index_allocator.capacity * self.index_element_size,
            target=GL_ELEMENT_ARRAY_BUFFER)
Beispiel #7
0
def numpy2vbo(nparray,
              target=GL_ARRAY_BUFFER,
              usage=GL_STATIC_DRAW,
              use_vbos=True):
    vbo = create_buffer(nparray.nbytes,
                        target=target,
                        usage=usage,
                        vbo=use_vbos)
    vbo.bind()
    vbo.set_data(nparray.ctypes.data)
    return vbo
Beispiel #8
0
def draw(size, mode, *data):
    """Draw a primitive immediately.

    :Parameters:
        `size` : int
            Number of vertices given
        `mode` : gl primitive type 
            OpenGL drawing mode, e.g. ``GL_TRIANGLES``, 
            avoiding quotes.
        `data` : data items
            Attribute formats and data.  See the module summary for 
            details.

    """
    # Create and bind a throwaway VAO
    vao_id = GLuint()
    glGenVertexArrays(1, vao_id)
    glBindVertexArray(vao_id)
    # Activate shader program:
    group = get_default_group()
    group.set_state()

    buffers = []
    for fmt, array in data:
        attribute = vertexattribute.create_attribute(group.program.id, fmt)
        assert size == len(
            array) // attribute.count, 'Data for %s is incorrect length' % fmt

        buffer = vertexbuffer.create_buffer(size * attribute.stride,
                                            mappable=False)

        attribute.set_region(buffer, 0, size, array)
        attribute.enable()
        attribute.set_pointer(buffer.ptr)

        buffers.append(buffer)  # Don't garbage collect it.

    glDrawArrays(mode, 0, size)

    # Deactivate shader program:
    group.unset_state()
    # Discard everything after drawing:
    del buffers
    glBindVertexArray(0)
    glDeleteVertexArrays(1, vao_id)
Beispiel #9
0
def numpy2vbo(nparray, target = GL_ARRAY_BUFFER, usage = GL_STATIC_DRAW, use_vbos = True):
    vbo = create_buffer(nparray.nbytes, target = target, usage = usage, vbo = use_vbos)
    vbo.bind()
    vbo.set_data(nparray.ctypes.data)
    return vbo