def __getitem__(self, key): if not isinstance(key, int) and not isinstance(key, slice): raise KeyError('Key must be an integer or a slice, got {}'.format( type(key).__qualname__)) if self.mapinfo is not None: return self.__getitem_mapped(self, key) self.bind() blen = len(self) if isinstance(key, int): key = eval_index(key, blen) buf = self.format.struct() buf_size = sizeof(buf) glGetBufferSubData(self.target, key * buf_size, buf_size, byref(buf)) return self.format.unpack_single(buf) else: start, stop, step = eval_slice(key, blen) buf_len = stop - start buf = (self.format.struct * buf_len)() buf_size = sizeof(buf) buf_offset = start * sizeof(self.format.struct) glGetBufferSubData(self.target, buf_offset, buf_size, byref(buf)) return self.format.unpack(buf[::step])
def __setitem__(self, key, value): with self.bound: sz = len(self) if isinstance(key, slice): start = int(key.start) if key.start is not None else 0 stop = int(key.stop) if key.stop is not None else start + value.size else: start = int(key) stop = start + 1 if start < 0 or stop < 0 or start >= stop: raise IndexError if stop > sz: newsz = max(sz * 2, stop) a = numpy.empty((newsz,), dtype=self.dtype) # intel dies when querying an empty buffer :[ if sz > 0: gl.glGetBufferSubData(gl.GL_ARRAY_BUFFER, 0, sz * self.dtype.itemsize, a.ctypes.data) b = numpy.asarray(value).reshape(-1) a[start:stop] = b gl.glBufferData(gl.GL_ARRAY_BUFFER, newsz * self.dtype.itemsize, a.ctypes.data, self.usage) else: a = numpy.ascontiguousarray(value, self.dtype).reshape(-1) sz = min((stop - start), len(a)) gl.glBufferSubData(gl.GL_ARRAY_BUFFER, start * self.dtype.itemsize, sz * self.dtype.itemsize, a.ctypes.data)
def __getitem__(self, key): if not isinstance(key, int) and not isinstance(key, slice): raise KeyError('Key must be an integer or a slice, got {}'.format(type(key).__qualname__)) if self.mapinfo is not None: return self.__getitem_mapped(self, key) self.bind() blen = len(self) if isinstance(key, int): key = eval_index(key, blen) buf = self.format.struct() buf_size = sizeof(buf) glGetBufferSubData(self.target, key*buf_size, buf_size, byref(buf)) return self.format.unpack_single(buf) else: start, stop, step = eval_slice(key, blen) buf_len = stop-start buf = (self.format.struct*buf_len)() buf_size = sizeof(buf) buf_offset = start * sizeof(self.format.struct) glGetBufferSubData(self.target, buf_offset, buf_size, byref(buf)) return self.format.unpack(buf[::step])
def __getitem__(self, key): with self.bound: if isinstance(key, slice): start = int(key.start) stop = int(key.stop) else: start = int(key) stop = start + 1 sz = len(self) if start < 0 or start >= sz or stop < 0 or stop > sz or start >= stop: raise IndexError shape = (stop - start,) a = numpy.empty(shape=shape, dtype=self.dtype) gl.glGetBufferSubData(gl.GL_ARRAY_BUFFER, start * self.dtype.itemsize, (stop - start) * self.dtype.itemsize, a.ctypes.data) return a
def get_data_from_vbo(vbo, count, stride): data = np.zeros(count, dtype=buffer_type) gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vbo.buffer_id) gl.glGetBufferSubData(gl.GL_ARRAY_BUFFER, 0, count * stride, data.ctypes.data_as(POINTER(gl.GLvoid))) return data