Browse Source

python: expose scenetools.combine_fields().

Finally it's possible to create scenes from scratch from Python.
next
Vladimír Vondruš 2 years ago
parent
commit
c2284590e2
  1. 6
      doc/python/magnum.trade.rst
  2. 4
      src/python/magnum/scenetools.cpp
  3. 31
      src/python/magnum/test/test_scenetools.py

6
doc/python/magnum.trade.rst

@ -705,8 +705,10 @@
.. py:class:: magnum.trade.SceneFieldData
Associates a pair of typed data views with a name, type and other scene
field properties. The mapping data view is always one-dimensional. The
field data view can be either one-dimensional, for example a NumPy array:
field properties, which can be subsequently put into a :ref:`SceneData`
instance, for example with :ref:`scenetools.combine_fields()`. The mapping
data view is always one-dimensional. The field data view can be either
one-dimensional, for example a NumPy array:
..
Just to verify the snippet below actually works (don't want the arrows

4
src/python/magnum/scenetools.cpp

@ -32,6 +32,7 @@
#include <Corrade/Containers/Pair.h>
#include <Magnum/Math/Matrix3.h>
#include <Magnum/Math/Matrix4.h>
#include <Magnum/SceneTools/Combine.h>
#include <Magnum/SceneTools/Filter.h>
#include <Magnum/SceneTools/Hierarchy.h>
#include <Magnum/Trade/SceneData.h>
@ -53,6 +54,9 @@ void scenetools(py::module_& m) {
#endif
m
.def("combine_fields", [](const Trade::SceneMappingType mappingType, UnsignedLong mappingBound, const std::vector<Trade::SceneFieldData>& fields) {
return SceneTools::combineFields(mappingType, mappingBound, fields);
}, "Combine scene fields together", py::arg("mapping_type"), py::arg("mapping_bound"), py::arg("fields"))
.def("filter_fields", [](const Trade::SceneData& scene, const Containers::BitArrayView fieldsToKeep) {
if(fieldsToKeep.size() != scene.fieldCount()) {
PyErr_Format(PyExc_AssertionError, "expected %u bits but got %zu", scene.fieldCount(), fieldsToKeep.size());

31
src/python/magnum/test/test_scenetools.py

@ -23,6 +23,7 @@
# DEALINGS IN THE SOFTWARE.
#
import array
import os
import sys
import unittest
@ -32,6 +33,36 @@ from magnum import *
from magnum import scenetools, trade
import magnum
class Combine(unittest.TestCase):
def test(self):
mapping = array.array('I', [0, 176, 35])
meshes = array.array('H', [26, 17, 2])
materials = array.array('b', [-1, 104, 8])
scene = scenetools.combine_fields(trade.SceneMappingType.UNSIGNED_LONG, 180, [
trade.SceneFieldData(trade.SceneField.MESH,
trade.SceneMappingType.UNSIGNED_INT, mapping,
trade.SceneFieldType.UNSIGNED_SHORT, meshes),
trade.SceneFieldData(trade.SceneField.MESH_MATERIAL,
trade.SceneMappingType.UNSIGNED_INT, mapping,
trade.SceneFieldType.BYTE, materials),
])
self.assertEqual(scene.mapping_type, trade.SceneMappingType.UNSIGNED_LONG)
self.assertEqual(scene.mapping_bound, 180)
self.assertEqual(scene.field_count, 2)
self.assertEqual(scene.field_size(0), 3)
self.assertEqual(scene.field_name(0), trade.SceneField.MESH)
self.assertEqual(scene.field_type(0), trade.SceneFieldType.UNSIGNED_SHORT)
self.assertEqual(list(scene.mapping(0)), [0, 176, 35])
self.assertEqual(list(scene.field(0)), [26, 17, 2])
self.assertEqual(scene.field_size(1), 3)
self.assertEqual(scene.field_name(1), trade.SceneField.MESH_MATERIAL)
self.assertEqual(scene.field_type(1), trade.SceneFieldType.BYTE)
self.assertEqual(list(scene.mapping(1)), [0, 176, 35])
self.assertEqual(list(scene.field(1)), [-1, 104, 8])
class Filter(unittest.TestCase):
def test_fields(self):
# Static builds with non-static plugins cause assertions with non-owned

Loading…
Cancel
Save