API to conveniently download data from a vertex buffer
This commit is contained in:
parent
03e0b9de04
commit
36432c8616
@ -52,12 +52,14 @@ class BufferManager: # {{{
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.sizes = {}
|
self.sizes = {}
|
||||||
self.types = {}
|
self.types = {}
|
||||||
|
self.ctypes_types = {}
|
||||||
self.name_count = 0
|
self.name_count = 0
|
||||||
|
|
||||||
def create(self, for_use=GL_TEXTURE_BUFFER):
|
def create(self, for_use=GL_TEXTURE_BUFFER):
|
||||||
buf_id = glGenBuffers(1)
|
buf_id = glGenBuffers(1)
|
||||||
self.types[buf_id] = for_use
|
self.types[buf_id] = for_use
|
||||||
self.sizes.pop(buf_id, None)
|
self.sizes.pop(buf_id, None)
|
||||||
|
self.ctypes_types.pop(buf_id, None)
|
||||||
return buf_id
|
return buf_id
|
||||||
|
|
||||||
def delete(self, buf_id):
|
def delete(self, buf_id):
|
||||||
@ -65,18 +67,24 @@ class BufferManager: # {{{
|
|||||||
glDeleteBuffer(buf_id)
|
glDeleteBuffer(buf_id)
|
||||||
self.sizes.pop(buf_id, None)
|
self.sizes.pop(buf_id, None)
|
||||||
self.types.pop(buf_id)
|
self.types.pop(buf_id)
|
||||||
|
self.ctypes_types.pop(buf_id, None)
|
||||||
|
|
||||||
def set_data(self, buf_id, data, usage=GL_STREAM_DRAW, verify=False):
|
def set_data(self, buf_id, data, usage=GL_STREAM_DRAW, verify=False):
|
||||||
prev_sz = self.sizes.get(buf_id, 0)
|
prev_sz = self.sizes.get(buf_id, 0)
|
||||||
new_sz = sizeof(data)
|
new_sz = sizeof(data)
|
||||||
replace_or_create_buffer(buf_id, new_sz, prev_sz, addressof(data), usage, self.types[buf_id])
|
replace_or_create_buffer(buf_id, new_sz, prev_sz, addressof(data), usage, self.types[buf_id])
|
||||||
self.sizes[buf_id] = new_sz
|
self.sizes[buf_id] = new_sz
|
||||||
|
self.ctypes_types[buf_id] = type(data)
|
||||||
if verify:
|
if verify:
|
||||||
verify_data = type(data)()
|
verify_data = self.get_data(buf_id)
|
||||||
glGetBufferSubData(buf_id, new_sz, 0, addressof(verify_data))
|
|
||||||
if list(data) != list(verify_data):
|
if list(data) != list(verify_data):
|
||||||
raise RuntimeError('OpenGL failed to upload to buffer')
|
raise RuntimeError('OpenGL failed to upload to buffer')
|
||||||
|
|
||||||
|
def get_data(self, buf_id):
|
||||||
|
verify_data = self.ctypes_types[buf_id]()
|
||||||
|
glGetBufferSubData(buf_id, self.sizes[buf_id], 0, addressof(verify_data))
|
||||||
|
return verify_data
|
||||||
|
|
||||||
def bind(self, buf_id):
|
def bind(self, buf_id):
|
||||||
glBindBuffer(self.types[buf_id], buf_id)
|
glBindBuffer(self.types[buf_id], buf_id)
|
||||||
|
|
||||||
@ -284,6 +292,10 @@ class ShaderProgram: # {{{
|
|||||||
bufid = self.vertex_arrays[vao_id]
|
bufid = self.vertex_arrays[vao_id]
|
||||||
buffer_manager.set_data(bufid, data, usage=usage)
|
buffer_manager.set_data(bufid, data, usage=usage)
|
||||||
|
|
||||||
|
def get_vertex_data(self, vao_id):
|
||||||
|
bufid = self.vertex_arrays[vao_id]
|
||||||
|
return buffer_manager.get_data(bufid)
|
||||||
|
|
||||||
def __hash__(self) -> int:
|
def __hash__(self) -> int:
|
||||||
return self.program_id
|
return self.program_id
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user