def test_setitem(self): dtype = np.dtype( [ ('position', np.float32, 3), ('texcoord', np.float32, 2), ('color', np.float32, 4) ] ) data = np.zeros(100, dtype=dtype) buffer = VertexBuffer(data) with self.assertRaises(ValueError): buffer['color'] = data['color'] buffer[...] = data assert len(buffer._pending_data) == 2 buffer[10:20] = data[10:20] assert len(buffer._pending_data) == 3 # Discart all pending data buffer.set_data(data) assert len(buffer._pending_data) == 1 with self.assertRaises(ValueError): buffer[10:20] = data[10:19] with self.assertRaises(ValueError): buffer[10:20] = data[10:21]
def test_init_with_structured_data(self): # Singular 1 data = np.zeros(100, [('a', np.float32, 1)]) buffer = VertexBuffer(data) assert buffer.count == 100 assert buffer.vsize == 1 assert buffer.dtype == np.float32 # Singular 2 data = np.zeros(100, [('a', np.float32, 4)]) buffer = VertexBuffer(data) assert buffer.count == 100 assert buffer.vsize == 4 assert buffer.dtype == np.float32 # Multple data = np.zeros(100, [ ('a', np.float32, 1), ('b', np.uint8, 2), ('c', np.int16, 3) ] ) buffer = VertexBuffer(data) assert buffer.vsize == 1 assert buffer.dtype == data.dtype assert buffer['a'].vsize == 1 assert buffer['a'].dtype == np.float32 assert buffer['b'].vsize == 2 assert buffer['b'].dtype == np.uint8 assert buffer['c'].vsize == 3 assert buffer['c'].dtype == np.int16
def test_setitem(self): dtype = np.dtype([('position', np.float32, 3), ('texcoord', np.float32, 2), ('color', np.float32, 4)]) data = np.zeros(100, dtype=dtype) buffer = VertexBuffer(data) def setter(b, d): b['color'] = d['color'] self.assertRaises(ValueError, setter, buffer, data) buffer[...] = data self.assertEqual(len(buffer._pending_data), 2) buffer[10:20] = data[10:20] self.assertEqual(len(buffer._pending_data), 3) # Discart all pending data buffer.set_data(data) self.assertEqual(len(buffer._pending_data), 1) def setter(b, d): b[10:20] = d[10:19] self.assertRaises(ValueError, setter, buffer, data) def setter(b, d): buffer[10:20] = data[10:21] self.assertRaises(ValueError, setter, buffer, data)
def test_typechecking(self): # VertexBuffer supports these for dtype in (np.uint8, np.int8, np.uint16, np.int16, np.float32, np.float16): buffer = VertexBuffer(dtype) # VertexBuffer does *not* support these float128 = getattr(np, 'float128', np.float64) # may not exist for dtype in (np.uint32, np.int32, np.float64, float128): with self.assertRaises(TypeError): buffer = VertexBuffer(dtype)
def test_resize(self): # Resize allowed with set_data (and offset=0) V = VertexBuffer(np.float32) V.set_data(np.ones(200, np.float32)) assert V.count == 200 V.set_data(np.ones(300, np.float32)) assert V.count == 300 # Resize not allowed with set_subdata self.assertRaises(ValueError, V.set_subdata, 0, np.ones(400, np.float32))
def test_stride(self): dtype = np.dtype( [ ('position', np.float32, 3), ('texcoord', np.float32, 2), ('color', np.float32, 4) ] ) data = np.zeros(100, dtype=dtype) buffer = VertexBuffer(data) assert buffer['position'].stride == 9*np.dtype(np.float32).itemsize assert buffer['texcoord'].stride == 9*np.dtype(np.float32).itemsize assert buffer['color'].stride == 9*np.dtype(np.float32).itemsize buffer = VertexBuffer(data['position']) assert buffer.offset == 0 assert buffer.stride == 3*np.dtype(np.float32).itemsize
def test_glsl_type(self): data = np.zeros((10, ), np.float32) B = VertexBuffer(data) C = B[1:] assert B.glsl_type == ('attribute', 'float') assert C.glsl_type == ('attribute', 'float') data = np.zeros((10, 2), np.float32) B = VertexBuffer(data) C = B[1:] assert B.glsl_type == ('attribute', 'vec2') assert C.glsl_type == ('attribute', 'vec2') data = np.zeros((10, 4), np.float32) B = VertexBuffer(data) C = B[1:] assert B.glsl_type == ('attribute', 'vec4') assert C.glsl_type == ('attribute', 'vec4')
def test_resize(self): # Resize allowed with set_data (and offset=0) V = VertexBuffer(np.float32) V.set_data(np.ones(200, np.float32)) assert V.count == 200 V.set_data(np.ones(300, np.float32)) assert V.count == 300 # Resize not allowed with set_subdata with self.assertRaises(ValueError): V.set_subdata(0, np.ones(400, np.float32))
def test_init_with_data(self): for dtype in (np.float32, np.uint8, np.int16): data = np.zeros(100, dtype) buffer = VertexBuffer(data) assert buffer.count == 100 assert buffer.vsize == 1 assert buffer.dtype == dtype data = np.zeros((100, 1), dtype) buffer = VertexBuffer(data) assert buffer.count == 100 assert buffer.vsize == 1 assert buffer.dtype == dtype data = np.zeros((100,4), dtype) buffer = VertexBuffer(data) assert buffer.count == 100 assert buffer.vsize == 4 assert buffer.dtype == dtype
def test_init_with_dtype(self): # Single element, this is simply unraveled dtype = np.dtype([('a',np.float32,4)]) buffer = VertexBuffer(dtype) assert buffer.count == 0 assert buffer.vsize == 4 assert buffer.dtype == np.float32 # Short notation specific to VertexBuffer buffer = VertexBuffer(('a',np.float32,4)) assert buffer.vsize == 4 assert buffer.dtype == np.float32 # Plain dtype descriptor buffer = VertexBuffer(np.float32) assert buffer.vsize == 1 assert buffer.dtype == np.float32 # String dtype descirptor buffer = VertexBuffer('float32') assert buffer.vsize == 1 assert buffer.dtype == np.float32 # Multiple elements dtype = dtype=[('a',np.float32,4), ('b',np.uint8,2)] buffer = VertexBuffer(dtype) assert buffer.count == 0 assert buffer.vsize == 1 assert buffer.dtype == np.dtype(dtype) # subbuffer = buffer['a'] assert subbuffer.count == 0 assert subbuffer.vsize == 4 assert subbuffer.dtype == np.float32 # subbuffer = buffer['b'] assert subbuffer.count == 0 assert subbuffer.vsize == 2 assert subbuffer.dtype == np.uint8
def test_set_vars(self): vert = VertexShader("attribute vec4 color;") frag = FragmentShader("") program = Program(vert, frag) arr = np.array((100, 5), dtype=np.float32) assert_raises(ValueError, program.set_vars, arr) dtype = np.dtype([('position', np.float32, 3), ('texcoord', np.float32, 2), ('color', np.float32, 4)]) data = np.zeros(100, dtype=dtype) arr = VertexBuffer(data) program.set_vars(arr) assert_raises(TypeError, program.set_vars, 'hello') program.set_vars(dict(color=arr, fake=arr))
def test_set_data_on_view(self): dtype = np.dtype( [ ('a', np.float32, 3), ('b', np.float32, 2), ('c', np.float32, 4) ] ) data = np.zeros(100, dtype=dtype) buffer = VertexBuffer(data) with self.assertRaises(RuntimeError): buffer['a'].set_count(100) with self.assertRaises(RuntimeError): buffer['a'].set_data(data['a']) with self.assertRaises(RuntimeError): buffer['a'].set_subdata(data['a'])
def test_set_attribute_float(self): vert = VertexShader("attribute float f;") frag = FragmentShader("") program = Program(vert, frag) program["f"] = VertexBuffer(np.zeros(100, dtype=np.float32)) assert program._attributes["f"].count == 100 program = Program(vert, frag) program["f"] = ClientVertexBuffer( np.zeros((100, 1, 1), dtype=np.float32)) assert program._attributes["f"].count == 100 program = Program(vert, frag) with self.assertRaises(ValueError): program["f"] = np.zeros((100, 1, 1), dtype=np.float32)
def test_set_attribute_float(self): vert = VertexShader("attribute float f;") frag = FragmentShader("") program = Program(vert, frag) program["f"] = VertexBuffer(np.zeros(100, dtype=np.float32)) assert program._attributes["f"].count == 100 program = Program(vert, frag) program.set_vars(f=ClientVertexBuffer(np.zeros((100, 1, 1), dtype=np.float32))) assert_raises(NameError, program.set_vars, junk='foo') assert program._attributes["f"].count == 100 program = Program(vert, frag) def modifier(p): p["f"] = np.zeros((100, 1, 1), dtype=np.float32) self.assertRaises(ValueError, modifier, program)
def test_init_allowed_dtype(self): for dtype in (np.uint8, np.int8, np.uint16, np.int16, np.float32): V = VertexBuffer(np.zeros((10, 3), dtype=dtype)) names = V.dtype.names assert V.dtype[names[0]].base == dtype assert V.dtype[names[0]].shape == (3,) for dtype in (np.float64, np.int64): self.assertRaises(TypeError, VertexBuffer, np.zeros((10, 3), dtype=dtype)) # Tuple/list is also allowed V = VertexBuffer([1, 2, 3]) assert V.size == 3 assert V.itemsize == 4 # V = VertexBuffer([[1, 2], [3, 4], [5, 6]]) assert V.size == 3 assert V.itemsize == 2 * 4 # Convert data = np.zeros((10,), 'uint8') B = VertexBuffer(data) assert B.dtype[0].base == np.uint8 assert B.dtype[0].itemsize == 1 # data = np.zeros((10, 2), 'uint8') B = VertexBuffer(data) assert B.dtype[0].base == np.uint8 assert B.dtype[0].itemsize == 2 B.set_data(data, convert=True) assert B.dtype[0].base == np.float32 assert B.dtype[0].itemsize == 8 B = VertexBuffer(data[::2].copy()) # This is converted to 1D B = VertexBuffer([[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]) assert B.size == 10 # Not allowed self.assertRaises(TypeError, VertexBuffer, dtype=np.float64)
def test_init(self): data = np.zeros(100, np.float32) buffer = VertexBuffer(data=data) assert buffer.count == 100 assert buffer.vsize == 1 assert buffer.dtype == np.float32
def test_init_allowed_dtype(self): for dtype in (np.uint8, np.int8, np.uint16, np.int16, np.float32): V = VertexBuffer(dtype=dtype) names = V.dtype.names assert V.dtype[names[0]].base == dtype assert V.dtype[names[0]].shape == ()
def test_init_allowed_dtype(self): for dtype in (np.uint8, np.int8, np.uint16, np.int16, np.float32): V = VertexBuffer(np.zeros((10, 3), dtype=dtype)) names = V.dtype.names assert V.dtype[names[0]].base == dtype assert V.dtype[names[0]].shape == (3, ) # Tuple/list is also allowed V = VertexBuffer([1, 2, 3]) assert V.size == 3 assert V.itemsize == 4 # V = VertexBuffer([[1, 2], [3, 4], [5, 6]]) assert V.size == 3 assert V.itemsize == 2 * 4 # Convert data = np.zeros((10, ), 'uint8') B = VertexBuffer(data) assert B.dtype[0].base == np.uint8 assert B.dtype[0].itemsize == 1 # data = np.zeros((10, 2), 'uint8') B = VertexBuffer(data) assert B.dtype[0].base == np.uint8 assert B.dtype[0].itemsize == 2 B.set_data(data, convert=True) assert B.dtype[0].base == np.float32 assert B.dtype[0].itemsize == 8 B = VertexBuffer(data[::2].copy()) # This is converted to 1D B = VertexBuffer([[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]) assert B.size == 10 # Not allowed self.assertRaises(TypeError, VertexBuffer, dtype=np.float64)