From 7bd8bd965b7a64f0544b94adcc245eddd9ab563e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 29 Sep 2022 19:58:58 +0200 Subject: [PATCH] python: expose trade.MeshData.index_data and .vertex_data. Useful for rudimentary data size stats queries, not much else as the other APIs are not exposed yet. --- src/python/magnum/test/test_trade.py | 19 ++++++++++++++++++- src/python/magnum/trade.cpp | 8 +++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/python/magnum/test/test_trade.py b/src/python/magnum/test/test_trade.py index aaee76a..a3e60fe 100644 --- a/src/python/magnum/test/test_trade.py +++ b/src/python/magnum/test/test_trade.py @@ -105,10 +105,27 @@ class MeshData(unittest.TestCase): importer = trade.ImporterManager().load_and_instantiate('GltfImporter') importer.open_file(os.path.join(os.path.dirname(__file__), 'mesh.glb')) - mesh = importer.mesh(0) + mesh = importer.mesh(1) + mesh_refcount = sys.getrefcount(mesh) self.assertEqual(mesh.primitive, MeshPrimitive.TRIANGLES) # TODO: test more, once it's exposed + index_data = mesh.index_data + self.assertEqual(len(index_data), 3) + self.assertIs(index_data.owner, mesh) + self.assertEqual(sys.getrefcount(mesh), mesh_refcount + 1) + + del index_data + self.assertEqual(sys.getrefcount(mesh), mesh_refcount) + + vertex_data = mesh.vertex_data + self.assertEqual(len(vertex_data), 72) + self.assertIs(vertex_data.owner, mesh) + self.assertEqual(sys.getrefcount(mesh), mesh_refcount + 1) + + del vertex_data + self.assertEqual(sys.getrefcount(mesh), mesh_refcount) + class Importer(unittest.TestCase): def test(self): manager = trade.ImporterManager() diff --git a/src/python/magnum/trade.cpp b/src/python/magnum/trade.cpp index 356537a..2b9a136 100644 --- a/src/python/magnum/trade.cpp +++ b/src/python/magnum/trade.cpp @@ -307,9 +307,15 @@ void trade(py::module_& m) { py::class_{m, "MeshData", "Mesh data"} .def_property_readonly("primitive", &Trade::MeshData::primitive, "Primitive") + .def_property_readonly("index_data", [](Trade::MeshData& self) { + return Containers::pyArrayViewHolder(self.indexData(), py::cast(self)); + }, "Raw index data") + .def_property_readonly("vertex_data", [](Trade::MeshData& self) { + return Containers::pyArrayViewHolder(self.vertexData(), py::cast(self)); + }, "Raw vertex data") .def_property_readonly("is_indexed", &Trade::MeshData::isIndexed, "Whether the mesh is indexed") - .def_property_readonly("vertex_count", &Trade::MeshData::vertexCount) .def_property_readonly("index_count", &Trade::MeshData::indexCount) + .def_property_readonly("vertex_count", &Trade::MeshData::vertexCount) .def_property_readonly("attribute_count", static_cast(&Trade::MeshData::attributeCount)); py::class_ imageData1D{m, "ImageData1D", "One-dimensional image data"};