Beispiel #1
0
    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])
Beispiel #2
0
 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)
Beispiel #3
0
    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])
Beispiel #4
0
 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
Beispiel #5
0
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