diff --git a/doc/python/magnum.shaders.rst b/doc/python/magnum.shaders.rst index 02270b3..41f4b49 100644 --- a/doc/python/magnum.shaders.rst +++ b/doc/python/magnum.shaders.rst @@ -37,3 +37,10 @@ :data POSITION: Vertex position :data NORMAL: Normal direction :data TEXTURE_COORDINATES: 2D texture coordinates + +.. py:property:: magnum.shaders.Phong.alpha_mask + :raise AttributeError: If the shader was not created with `Flags.ALPHA_MASK` +.. py:property:: magnum.shaders.Phong.light_positions + :raise ValueError: If list length is different from `light_count` +.. py:property:: magnum.shaders.Phong.light_colors + :raise ValueError: If list length is different from `light_count` diff --git a/src/python/magnum/shaders.cpp b/src/python/magnum/shaders.cpp index 71aa9a0..4aa09f3 100644 --- a/src/python/magnum/shaders.cpp +++ b/src/python/magnum/shaders.cpp @@ -112,8 +112,14 @@ void shaders(py::module& m) { // TODO: textures, once exposed .def_property("shininess", nullptr, &Shaders::Phong::setShininess, "Shininess") - .def_property("alpha_mask", nullptr, - &Shaders::Phong::setAlphaMask, "Alpha mask") + .def_property("alpha_mask", nullptr, [](Shaders::Phong& self, Float mask) { + if(!(self.flags() & Shaders::Phong::Flag::AlphaMask)) { + PyErr_SetString(PyExc_AttributeError, "the shader was not created with alpha mask enabled"); + throw py::error_already_set{}; + } + + self.setAlphaMask(mask); + }, "Alpha mask") .def_property("transformation_matrix", nullptr, &Shaders::Phong::setTransformationMatrix, "Set transformation matrix") .def_property("normal_matrix", nullptr, @@ -121,9 +127,19 @@ void shaders(py::module& m) { .def_property("projection_matrix", nullptr, &Shaders::Phong::setProjectionMatrix, "Set projection matrix") .def_property("light_positions", nullptr, [](Shaders::Phong& self, const std::vector& positions) { + if(positions.size() != self.lightCount()) { + PyErr_Format(PyExc_ValueError, "expected %u items but got %u", self.lightCount(), UnsignedInt(positions.size())); + throw py::error_already_set{}; + } + self.setLightPositions(positions); }, "Light positions") .def_property("light_colors", nullptr, [](Shaders::Phong& self, const std::vector& colors) { + if(colors.size() != self.lightCount()) { + PyErr_Format(PyExc_ValueError, "expected %u items but got %u", self.lightCount(), UnsignedInt(colors.size())); + throw py::error_already_set{}; + } + self.setLightColors(colors); }, "Light colors"); } diff --git a/src/python/magnum/test/test_shaders_gl.py b/src/python/magnum/test/test_shaders_gl.py index 1bd2aaf..6cd2d39 100644 --- a/src/python/magnum/test/test_shaders_gl.py +++ b/src/python/magnum/test/test_shaders_gl.py @@ -58,9 +58,19 @@ class Phong(GLTestCase): self.assertEqual(c.light_count, 3) def test_uniforms(self): - a = shaders.Phong() + a = shaders.Phong(shaders.Phong.Flags.ALPHA_MASK, 2) a.diffuse_color = (0.5, 1.0, 0.9) a.transformation_matrix = Matrix4.translation(Vector3.x_axis()) a.projection_matrix = Matrix4.zero_init() - a.light_positions = [(0.5, 1.0, 0.3)] - a.light_colors = [Color4()] + a.light_positions = [(0.5, 1.0, 0.3), Vector3()] + a.light_colors = [Color4(), Color4()] + a.alpha_mask = 0.3 + + def test_uniforms_errors(self): + a = shaders.Phong() + with self.assertRaisesRegex(AttributeError, "the shader was not created with alpha mask enabled"): + a.alpha_mask = 0.3 + with self.assertRaisesRegex(ValueError, "expected 1 items but got 0"): + a.light_positions = [] + with self.assertRaisesRegex(ValueError, "expected 1 items but got 0"): + a.light_colors = []