diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index e3b0cb425..754915b71 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -50,6 +50,7 @@ #include #include +#include #include #include #include @@ -94,19 +95,35 @@ void fillDefaultConfiguration(Utility::ConfigurationGroup& conf) { postprocess.setValue("SortByPType", true); } +/* Setup an Assimp::Importer with sane default configuration */ +Corrade::Containers::Pointer createImporter() +{ + Corrade::Containers::Pointer importer{new Assimp::Importer}; + + /* If this is set to false (default), Assimp will return a transformation + in the root aiNode to rotate the scene to Y-Up. With the default settings + this transform is ignored, since we only look at the children of the + root node. But if the user sets the PreTransformVertices flag, Assimp + will apply this transformation. Since nobody needs that, switch it + off. */ + importer->SetPropertyBool(AI_CONFIG_IMPORT_COLLADA_IGNORE_UP_DIRECTION, true); + + return importer; +} + } -AssimpImporter::AssimpImporter(): _importer{new Assimp::Importer} { +AssimpImporter::AssimpImporter(): _importer{createImporter()} { /** @todo horrible workaround, fix this properly */ fillDefaultConfiguration(configuration()); } -AssimpImporter::AssimpImporter(PluginManager::Manager& manager): AbstractImporter(manager), _importer{new Assimp::Importer} { +AssimpImporter::AssimpImporter(PluginManager::Manager& manager): AbstractImporter(manager), _importer{createImporter()} { /** @todo horrible workaround, fix this properly */ fillDefaultConfiguration(configuration()); } -AssimpImporter::AssimpImporter(PluginManager::AbstractManager& manager, const std::string& plugin): AbstractImporter(manager, plugin), _importer{new Assimp::Importer} {} +AssimpImporter::AssimpImporter(PluginManager::AbstractManager& manager, const std::string& plugin): AbstractImporter(manager, plugin), _importer{createImporter()} {} AssimpImporter::~AssimpImporter() = default; diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index 38d894432..dd955edde 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -104,6 +104,7 @@ struct AssimpImporterTest: TestSuite::Tester { void emptyGltf(); void scene(); void sceneCollapsedNode(); + void pretransformedMesh(); void imageEmbedded(); void imageExternal(); @@ -170,6 +171,7 @@ AssimpImporterTest::AssimpImporterTest() { &AssimpImporterTest::emptyGltf, &AssimpImporterTest::scene, &AssimpImporterTest::sceneCollapsedNode, + &AssimpImporterTest::pretransformedMesh, &AssimpImporterTest::imageEmbedded, &AssimpImporterTest::imageExternal, @@ -714,6 +716,36 @@ void AssimpImporterTest::sceneCollapsedNode() { } } +void AssimpImporterTest::pretransformedMesh() { + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + + importer->configuration().group("postprocess")->setValue("PreTransformVertices", true); + + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, "line.dae"))); + + CORRADE_COMPARE(importer->meshCount(), 1); + CORRADE_COMPARE(importer->object3DCount(), 1); + + Containers::Optional mesh = importer->mesh(0); + CORRADE_VERIFY(mesh); + CORRADE_COMPARE(mesh->primitive(), MeshPrimitive::Lines); + + CORRADE_VERIFY(mesh->isIndexed()); + CORRADE_COMPARE_AS(mesh->indices(), + Containers::arrayView({0, 1}), + TestSuite::Compare::Container); + + CORRADE_COMPARE(mesh->attributeCount(), 1); + CORRADE_COMPARE_AS(mesh->attribute(MeshAttribute::Position), + Containers::arrayView({ + {-1.0f, 1.0f, 1.0f}, {-1.0f, -1.0f, 1.0f} + }), TestSuite::Compare::Container); + + Containers::Pointer meshObject = importer->object3D(0); + CORRADE_COMPARE(meshObject->instanceType(), ObjectInstanceType3D::Mesh); + CORRADE_COMPARE(meshObject->instance(), 0); +} + void AssimpImporterTest::imageEmbedded() { if(_manager.loadState("PngImporter") == PluginManager::LoadState::NotFound) CORRADE_SKIP("PngImporter plugin not found, cannot test"); diff --git a/src/MagnumPlugins/AssimpImporter/Test/line.dae b/src/MagnumPlugins/AssimpImporter/Test/line.dae index 138c68847..2fccb98d3 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/line.dae +++ b/src/MagnumPlugins/AssimpImporter/Test/line.dae @@ -1,5 +1,9 @@ + + + Z_UP +