def test_detach(self): vert = VertexShader("A") frag = FragmentShader("B") program = Program(vert, frag) program.detach(frag) assert len(program.shaders) == 1 assert program.shaders[0].code == "A"
def test_attach(self): vert = VertexShader("A") frag = FragmentShader("B") program = Program(vert) program.attach(frag) assert len(program.shaders) == 2 assert program.shaders[0].code == "A" assert program.shaders[1].code == "B"
def test_failed_build(self): vert = VertexShader("A") frag = FragmentShader("B") program = Program(verts=vert) self.assertRaises(ValueError, program.activate) program = Program(frags=frag) self.assertRaises(ValueError, program.activate)
def test_uniform(self): vert = VertexShader("uniform float A;") frag = FragmentShader("uniform float A; uniform vec4 B;") program = Program(vert, frag) assert ("A", gl.GL_FLOAT) in program.all_uniforms assert ("B", gl.GL_FLOAT_VEC4) in program.all_uniforms assert len(program.all_uniforms) == 2
def __init__(self, dtype, itype, mode, vertex, fragment, geometry=None, **kwargs): """ """ self._uniforms = {} self._attributes = {} self._varyings = {} self._mode = mode vtype = [] utype = [] # Build vtype and utype according to parameters declarations = {"uniforms": "", "attributes": "", "varyings": ""} defaults = {} for item in dtype: name, (basetype, count), scope, default = item basetype = np.dtype(basetype).name if scope[0] == "!": scope = scope[1:] else: scope = kwargs.get(name, scope) defaults[name] = default gtype = Collection._gtypes[(basetype, count)] if scope == "local": vtype.append((name, basetype, count)) declarations["attributes"] += "attribute %s %s;\n" % (gtype, name) elif scope == "shared": utype.append((name, basetype, count)) declarations["varyings"] += "varying %s %s;\n" % (gtype, name) else: declarations["uniforms"] += "uniform %s %s;\n" % (gtype, name) self._uniforms[name] = None vtype = np.dtype(vtype) itype = np.dtype(itype) if itype else None utype = np.dtype(utype) if utype else None BaseCollection.__init__(self, vtype=vtype, utype=utype, itype=itype) self._declarations = declarations self._defaults = defaults # Build program (once base collection is built) saved = library.get(vertex) vertex = "" if self.utype is not None: vertex += fetchcode(self.utype) + vertex else: vertex += "void fetch_uniforms(void) { }\n" + vertex vertex += self._declarations["uniforms"] vertex += self._declarations["attributes"] vertex += saved self._vertex = vertex self._fragment = fragment program = Program(vertex, fragment, geometry) self._programs.append(program) # Initialize uniforms for name in self._uniforms.keys(): self._uniforms[name] = self._defaults.get(name) program[name] = self._uniforms[name]
def test_setitem(self): vert = VertexShader("") frag = FragmentShader("") program = Program(vert, frag) self.assertRaises(ValueError, program.__setitem__, "A", 1)
def test_attributes(self): vert = VertexShader("attribute float A;") frag = FragmentShader("") program = Program(vert, frag) assert program.all_attributes == [("A", gl.GL_FLOAT)]
def test_unique_shader(self): vert = VertexShader("A") frag = FragmentShader("B") program = Program([vert, vert], [frag, frag, frag]) assert len(program.shaders) == 2
def test_init_from_shader(self): program = Program(VertexShader("A"), FragmentShader("B")) assert len(program.shaders) == 2 assert program.shaders[0].code == "A" assert program.shaders[1].code == "B"
def test_init_from_string(self): program = Program("A", "B") assert len(program.shaders) == 2 assert program.shaders[0].code == "A" assert program.shaders[1].code == "B"
def test_delete_no_context(self): program = Program() program.delete()
def test_init(self): program = Program() assert program._handle == -1 assert program.shaders == []