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)
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
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)
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)
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
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)
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
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)
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