diff --git a/src/Magnum/SceneTools/Implementation/convertToSingleFunctionObjects.h b/src/Magnum/SceneTools/Implementation/convertToSingleFunctionObjects.h index 854152f2f..a17c5a505 100644 --- a/src/Magnum/SceneTools/Implementation/convertToSingleFunctionObjects.h +++ b/src/Magnum/SceneTools/Implementation/convertToSingleFunctionObjects.h @@ -154,6 +154,8 @@ inline Trade::SceneData convertToSingleFunctionObjects(const Trade::SceneData& s - fields that don't actually get their object mapping touched during the process (and then all fields that share object mapping with them) */ +#warning removing implicit mapping from here will mean the null will get treated as a placeholder by copy(), not wanted +#warning it needs to restore the field instead } else fields[i] = Trade::SceneFieldData{field.name(), field.mappingType(), field.mappingData(), field.fieldType(), field.fieldData(), field.fieldArraySize(), field.flags() & ~Trade::SceneFieldFlag::ImplicitMapping}; } diff --git a/src/Magnum/SceneTools/Test/CombineTest.cpp b/src/Magnum/SceneTools/Test/CombineTest.cpp index 544cc5b45..2107da2f5 100644 --- a/src/Magnum/SceneTools/Test/CombineTest.cpp +++ b/src/Magnum/SceneTools/Test/CombineTest.cpp @@ -41,6 +41,9 @@ struct CombineTest: TestSuite::Tester { void objectsShared(); void objectsPlaceholderFieldPlaceholder(); void objectSharedFieldPlaceholder(); + + void implicitNullMapping(); + void trivialNullParent(); }; struct { @@ -60,7 +63,10 @@ CombineTest::CombineTest() { addTests({&CombineTest::alignment, &CombineTest::objectsShared, &CombineTest::objectsPlaceholderFieldPlaceholder, - &CombineTest::objectSharedFieldPlaceholder}); + &CombineTest::objectSharedFieldPlaceholder, + + &CombineTest::implicitNullMapping, + &CombineTest::trivialNullParent}); } using namespace Math::Literals; @@ -324,6 +330,47 @@ void CombineTest::objectSharedFieldPlaceholder() { CORRADE_COMPARE(scene.field(Trade::SceneField::MeshMaterial).stride()[0], 4); } +void CombineTest::implicitNullMapping() { + const Short parentFieldData[]{-1, 0, 0}; + const UnsignedByte meshFieldData[]{3, 5}; + + Trade::SceneData scene = Implementation::combine(Trade::SceneMappingType::UnsignedShort, 167, Containers::arrayView({ + /* If the field has any flags, it shouldn't be treated as a + placeholder */ +#warning or maybe it should be preserved? yeah + Trade::SceneFieldData{Trade::SceneField::Mesh, Containers::ArrayView{nullptr, Containers::arraySize(meshFieldData)}, Containers::arrayView(meshFieldData), Trade::SceneFieldFlag::ImplicitMapping}, + Trade::SceneFieldData{Trade::SceneField::Parent, Containers::ArrayView{nullptr, Containers::arraySize(parentFieldData)}, Containers::arrayView(parentFieldData), Trade::SceneFieldFlag::ImplicitMapping} + })); + + CORRADE_COMPARE(scene.mappingBound(), 167); + CORRADE_COMPARE(scene.fieldCount(), 2); + + CORRADE_COMPARE(scene.fieldName(0), Trade::SceneField::Mesh); + CORRADE_COMPARE(scene.fieldFlags(0), Trade::SceneFieldFlag::ImplicitMapping); + CORRADE_COMPARE(scene.fieldType(0), Trade::SceneFieldType::UnsignedByte); + CORRADE_COMPARE(scene.fieldArraySize(0), 0); + CORRADE_COMPARE_AS(scene.mapping(0), Containers::arrayView({ + 0, 1, 2 + }), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(scene.field(0), + Containers::arrayView(meshFieldData), + TestSuite::Compare::Container); + + CORRADE_COMPARE(scene.fieldName(1), Trade::SceneField::Parent); + CORRADE_COMPARE(scene.fieldFlags(1), Trade::SceneFieldFlag::ImplicitMapping); + CORRADE_COMPARE(scene.fieldType(1), Trade::SceneFieldType::Short); + CORRADE_COMPARE(scene.fieldArraySize(1), 0); + CORRADE_COMPARE_AS(scene.mapping(1), Containers::arrayView({ + 0, 1 + }), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(scene.field(1), + Containers::arrayView(meshFieldData), + TestSuite::Compare::Container); +} + +void CombineTest::trivialNullParent() { +} + }}}} CORRADE_TEST_MAIN(Magnum::SceneTools::Test::CombineTest)