From 439945ce1f1cf7ab298f47a1d3c0d11ca071bb94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 23 May 2025 00:28:57 +0200 Subject: [PATCH] python: expose new cube primitive flags. --- doc/python/pages/changelog.rst | 1 + src/python/magnum/primitives.cpp | 28 ++++++++++++++++++++++- src/python/magnum/test/test_primitives.py | 14 +++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/doc/python/pages/changelog.rst b/doc/python/pages/changelog.rst index 33207bc..33884a2 100644 --- a/doc/python/pages/changelog.rst +++ b/doc/python/pages/changelog.rst @@ -150,6 +150,7 @@ Changelog :ref:`platform.glfw.Application.is_key_pressed()` - Exposed all :ref:`platform.sdl2.Application.Configuration.WindowFlags` and :ref:`platform.glfw.Application.Configuration.WindowFlags` +- Exposed the new :ref:`primitives.CubeFlags` - Exposed the new :ref:`text.AbstractShaper`, :ref:`text.RendererCore`, :ref:`text.Renderer`, :ref:`text.RendererGL` classes as well as the new :ref:`text.Feature`, :ref:`text.Script` enums and the diff --git a/src/python/magnum/primitives.cpp b/src/python/magnum/primitives.cpp index 5f84338..05dfb53 100644 --- a/src/python/magnum/primitives.cpp +++ b/src/python/magnum/primitives.cpp @@ -80,6 +80,19 @@ void primitives(py::module_& m) { .value("NONE", Primitives::ConeFlag{}); corrade::enumOperators(coneFlags); + py::enum_ cubeFlags{m, "CubeFlags", "Cube flags"}; + cubeFlags.value("TEXTURE_COORDINATES_ALL_SAME", Primitives::CubeFlag::TextureCoordinatesAllSame) + .value("TEXTURE_COORDINATES_POSITIVE_UP_NEGATIVE_DOWN", Primitives::CubeFlag::TextureCoordinatesPositiveUpNegativeDown) + .value("TEXTURE_COORDINATES_NEGATIVE_X_UP_NEGATIVE_X_DOWN", Primitives::CubeFlag::TextureCoordinatesNegativeXUpNegativeXDown) + .value("TEXTURE_COORDINATES_NEGATIVE_X_UP_POSITIVE_Z_DOWN", Primitives::CubeFlag::TextureCoordinatesNegativeXUpPositiveZDown) + .value("TEXTURE_COORDINATES_NEGATIVE_X_UP_POSITIVE_X_DOWN", Primitives::CubeFlag::TextureCoordinatesNegativeXUpPositiveXDown) + .value("TEXTURE_COORDINATES_NEGATIVE_X_UP_NEGATIVE_Z_DOWN", Primitives::CubeFlag::TextureCoordinatesNegativeXUpNegativeZDown) + .value("TEXTURE_COORDINATES_POSITIVE_Z_UP_POSITIVE_Z_DOWN", Primitives::CubeFlag::TextureCoordinatesPositiveZUpPositiveZDown) + .value("TEXTURE_COORDINATES_POSITIVE_Z_UP_POSITIVE_X_DOWN", Primitives::CubeFlag::TextureCoordinatesPositiveZUpPositiveXDown) + .value("TANGENTS", Primitives::CubeFlag::Tangents) + .value("NONE", Primitives::CubeFlag{}); + corrade::enumOperators(cubeFlags); + py::enum_ cylinderFlags{m, "CylinderFlags", "Cylinder flags"}; cylinderFlags.value("TEXTURE_COORDINATES", Primitives::CylinderFlag::TextureCoordinates) .value("CAP_ENDS", Primitives::CylinderFlag::CapEnds) @@ -192,7 +205,20 @@ void primitives(py::module_& m) { .def("crosshair2d", Primitives::crosshair2D, "2D crosshair") .def("crosshair3d", Primitives::crosshair3D, "3D crosshair") - .def("cube_solid", Primitives::cubeSolid, "Solid 3D cube") + .def("cube_solid", [](Primitives::CubeFlag flags) { + const UnsignedInt textureCoordinateVariant = UnsignedByte(flags) >> 1; + /** @todo don't hardcode this, how? */ + if(textureCoordinateVariant > 8) { + PyErr_Format(PyExc_AssertionError, "unrecognized texture coordinate option 0x%x", UnsignedInt(UnsignedByte(flags & ~Primitives::CubeFlag::Tangents))); + throw py::error_already_set{}; + } + if((flags & Primitives::CubeFlag::Tangents) && !textureCoordinateVariant) { + PyErr_SetString(PyExc_AssertionError, "a texture coordinate option has to be picked if tangents are enabled"); + throw py::error_already_set{}; + } + + return Primitives::cubeSolid(flags); + }, "Solid 3D cube", py::arg("flags") = Primitives::CubeFlag{}) .def("cube_solid_strip", Primitives::cubeSolidStrip, "Solid 3D cube as a single strip") .def("cube_wireframe", Primitives::cubeWireframe, "Wireframe 3D cube") diff --git a/src/python/magnum/test/test_primitives.py b/src/python/magnum/test/test_primitives.py index ed25c13..3767874 100644 --- a/src/python/magnum/test/test_primitives.py +++ b/src/python/magnum/test/test_primitives.py @@ -208,9 +208,21 @@ class Crosshair(unittest.TestCase): class Cube(unittest.TestCase): def test_solid(self): - a = primitives.cube_solid() + a = primitives.cube_solid(primitives.CubeFlags.TEXTURE_COORDINATES_POSITIVE_Z_UP_POSITIVE_Z_DOWN|primitives.CubeFlags.TANGENTS) self.assertEqual(a.primitive, MeshPrimitive.TRIANGLES) self.assertTrue(a.is_indexed) + self.assertEqual(a.attribute_count(), 4) + + b = primitives.cube_solid() + self.assertEqual(b.primitive, MeshPrimitive.TRIANGLES) + self.assertTrue(b.is_indexed) + self.assertEqual(b.attribute_count(), 2) + + def test_solid_invalid(self): + with self.assertRaisesRegex(AssertionError, "a texture coordinate option has to be picked if tangents are enabled"): + primitives.cube_solid(primitives.CubeFlags.TANGENTS) + with self.assertRaisesRegex(AssertionError, "unrecognized texture coordinate option 0x12"): + primitives.cube_solid(primitives.CubeFlags(int(primitives.CubeFlags.TEXTURE_COORDINATES_POSITIVE_Z_UP_POSITIVE_X_DOWN) + 2)) def test_solid_strip(self): a = primitives.cube_solid_strip()