Skip to content

Commit

Permalink
Merge b00a457 into 5beea61
Browse files Browse the repository at this point in the history
  • Loading branch information
costashatz committed Jan 18, 2018
2 parents 5beea61 + b00a457 commit b0324ec
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 7 deletions.
10 changes: 9 additions & 1 deletion src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp
Expand Up @@ -85,7 +85,7 @@ AssimpImporter::AssimpImporter(PluginManager::AbstractManager& manager, const st

AssimpImporter::~AssimpImporter() = default;

auto AssimpImporter::doFeatures() const -> Features { return Feature::OpenData; }
auto AssimpImporter::doFeatures() const -> Features { return Feature::OpenData | Feature::OpenState; }

bool AssimpImporter::doIsOpened() const { return _f && _f->_scene; }

Expand Down Expand Up @@ -164,6 +164,14 @@ void AssimpImporter::doOpenData(const Containers::ArrayView<const char> data) {
}
}

void AssimpImporter::doOpenState(const void* state, const std::string& filePath) {
_f.reset(new File);
_f->_scene = static_cast<const aiScene*>(state);
_f->_filePath = filePath;

doOpenData({});
}

void AssimpImporter::doOpenFile(const std::string& filename) {
_f.reset(new File);
/* Without aiProcess_JoinIdenticalVertices all meshes are deindexed (wtf?) */
Expand Down
3 changes: 3 additions & 0 deletions src/MagnumPlugins/AssimpImporter/AssimpImporter.h
Expand Up @@ -163,6 +163,8 @@ importer state methods:
- @ref LightData::importerState() returns `aiLight`
- @ref ImageData2D::importerState() may return `aiTexture`, if texture was embedded
into the loaded file.
- @ref openState() expects a pointer to an Assimp scene (i.e., `const aiScene*`)
and optionally a path (in order to be able to load textures, if needed)
@todo There are more formats mentioned at http://assimp.sourceforge.net/main_features_formats.html, add aliases for them?
*/
Expand Down Expand Up @@ -196,6 +198,7 @@ class MAGNUM_TRADE_ASSIMPIMPORTER_EXPORT AssimpImporter: public AbstractImporter

MAGNUM_TRADE_ASSIMPIMPORTER_LOCAL bool doIsOpened() const override;
MAGNUM_TRADE_ASSIMPIMPORTER_LOCAL void doOpenData(Containers::ArrayView<const char> data) override;
MAGNUM_TRADE_ASSIMPIMPORTER_LOCAL void doOpenState(const void* state, const std::string& filePath) override;
MAGNUM_TRADE_ASSIMPIMPORTER_LOCAL void doOpenFile(const std::string& filename) override;
MAGNUM_TRADE_ASSIMPIMPORTER_LOCAL void doClose() override;

Expand Down
98 changes: 92 additions & 6 deletions src/MagnumPlugins/AssimpImporter/Test/Test.cpp
Expand Up @@ -51,6 +51,9 @@
#include <assimp/DefaultLogger.hpp>
#endif
#include <assimp/defs.h> /* in assimp 3.0, version.h is missing this include for ASSIMP_API */
#include <assimp/Importer.hpp>
#include <assimp/postprocess.h>
#include <assimp/scene.h>
#include <assimp/version.h>

#include "configure.h"
Expand Down Expand Up @@ -86,6 +89,9 @@ struct AssimpImporterTest: public TestSuite::Tester {
void scene();
void texture();
void embeddedTexture();

void openState();
void openStateTexture();
};

AssimpImporterTest::AssimpImporterTest() {
Expand All @@ -108,7 +114,10 @@ AssimpImporterTest::AssimpImporterTest() {

&AssimpImporterTest::scene,
&AssimpImporterTest::texture,
&AssimpImporterTest::embeddedTexture});
&AssimpImporterTest::embeddedTexture,

&AssimpImporterTest::openState,
&AssimpImporterTest::openStateTexture});
}

void AssimpImporterTest::open() {
Expand Down Expand Up @@ -177,7 +186,7 @@ void AssimpImporterTest::lightUndefined() {

const UnsignedInt version = aiGetVersionMajor()*100 + aiGetVersionMinor();
/* @todo Possibly works with earlier versions (definitely not 3.0) */
if(version < 303)
if(version < 302)
CORRADE_SKIP("Current version of assimp cannot load lights with undefined light type yet.");

std::ostringstream out;
Expand Down Expand Up @@ -206,7 +215,7 @@ void AssimpImporterTest::material() {

const UnsignedInt version = aiGetVersionMajor()*100 + aiGetVersionMinor();
/* Ancient assimp version add "-material" suffix */
if(version < 303) {
if(version < 302) {
CORRADE_COMPARE(importer.materialForName("Material-material"), 0);
CORRADE_COMPARE(importer.materialName(0), "Material-material");
} else {
Expand Down Expand Up @@ -239,7 +248,7 @@ void AssimpImporterTest::mesh() {
{0.5f, 1.0f}, {0.75f, 0.5f}, {0.5f, 0.9f}}));
const UnsignedInt version = aiGetVersionMajor()*100 + aiGetVersionMinor();
/* Skip for assimp < 3.3, which loads some incorrect alpha value for the last color */
if(version >= 303) {
if(version >= 302) {
CORRADE_COMPARE(mesh->colors(0), (std::vector<Color4>{
{1.0f, 0.25f, 0.24f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f}, {0.1f, 0.2f, 0.3f, 1.0f}}));
}
Expand Down Expand Up @@ -333,7 +342,7 @@ void AssimpImporterTest::scene() {
void AssimpImporterTest::texture() {
const UnsignedInt version = aiGetVersionMajor()*100 + aiGetVersionMinor();
/* @todo Possibly works with earlier versions (definitely not 3.0) */
if(version < 303)
if(version < 302)
CORRADE_SKIP("Current version of assimp would SEGFAULT on this test.");


Expand Down Expand Up @@ -376,7 +385,7 @@ void AssimpImporterTest::embeddedTexture() {

const UnsignedInt version = aiGetVersionMajor()*100 + aiGetVersionMinor();
/* @todo Possibly works with earlier versions (definitely not 3.0) */
if(version < 303)
if(version < 302)
CORRADE_SKIP("Current version of assimp cannot load embedded textures from blender files.");

CORRADE_COMPARE(importer.textureCount(), 1);
Expand All @@ -399,6 +408,83 @@ void AssimpImporterTest::embeddedTexture() {
CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels), TestSuite::Compare::Container);
}

void AssimpImporterTest::openState() {
Assimp::Importer _importer;
const aiScene* sc = _importer.ReadFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, "scene.dae"), aiProcess_Triangulate | aiProcess_SortByPType | aiProcess_JoinIdenticalVertices);
CORRADE_VERIFY(sc != nullptr);

AssimpImporter importer;
importer.openState(sc);
CORRADE_VERIFY(importer.isOpened());

CORRADE_COMPARE(importer.sceneCount(), 1);
CORRADE_COMPARE(importer.defaultScene(), 0);
Containers::Optional<Trade::SceneData> data = importer.scene(0);
CORRADE_VERIFY(data);

CORRADE_COMPARE(data->children2D(), {});
CORRADE_COMPARE(data->children3D(), {1});

std::unique_ptr<Trade::ObjectData3D> explicitRootObject = importer.object3D(1);
CORRADE_COMPARE(explicitRootObject->children(), {2});
CORRADE_COMPARE(explicitRootObject->instanceType(), ObjectInstanceType3D::Empty);
CORRADE_COMPARE(explicitRootObject->transformation(), Matrix4());

std::unique_ptr<Trade::ObjectData3D> childObject = importer.object3D(2);
CORRADE_COMPARE(childObject->transformation(),
Matrix4({0.813798f, -0.44097f, 0.378522f, 1.0f},
{0.469846f, 0.882564f, 0.0180283f, 2.0f},
{-0.34202f, 0.163176f, 0.925417f, 3.0f},
{0.0f, 0.0f, 0.0f, 1.0f}));

CORRADE_COMPARE(importer.object3DForName("Root"), 1);
CORRADE_COMPARE(importer.object3DForName("Child"), 2);
CORRADE_COMPARE(importer.object3DName(1), "Root");
CORRADE_COMPARE(importer.object3DName(2), "Child");

CORRADE_COMPARE(importer.object3DForName("Ghost"), -1);
}

void AssimpImporterTest::openStateTexture() {
const UnsignedInt version = aiGetVersionMajor()*100 + aiGetVersionMinor();
/* @todo Possibly works with earlier versions (definitely not 3.0) */
if(version < 302)
CORRADE_SKIP("Current version of assimp would SEGFAULT on this test.");


PluginManager::Manager<AbstractImporter> manager{MAGNUM_PLUGINS_IMPORTER_DIR};

if(manager.loadState("PngImporter") == PluginManager::LoadState::NotFound)
CORRADE_SKIP("PngImporter plugin not found, cannot test");

Assimp::Importer _importer;
const aiScene* sc = _importer.ReadFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, "texture.dae"), aiProcess_Triangulate | aiProcess_SortByPType | aiProcess_JoinIdenticalVertices);
CORRADE_VERIFY(sc != nullptr);

AssimpImporter importer{manager};
importer.openState(sc, ASSIMPIMPORTER_TEST_DIR);
CORRADE_VERIFY(importer.isOpened());

CORRADE_COMPARE(importer.textureCount(), 1);
Containers::Optional<Trade::TextureData> texture = importer.texture(0);
CORRADE_VERIFY(texture);
CORRADE_COMPARE(texture->type(), Trade::TextureData::Type::Texture2D);
CORRADE_COMPARE(texture->wrapping(),
Array3D<Sampler::Wrapping>(Sampler::Wrapping::ClampToEdge, Sampler::Wrapping::ClampToEdge, Sampler::Wrapping::ClampToEdge));
CORRADE_COMPARE(texture->image(), 0);
CORRADE_COMPARE(texture->minificationFilter(), Sampler::Filter::Linear);
CORRADE_COMPARE(texture->magnificationFilter(), Sampler::Filter::Linear);

CORRADE_COMPARE(importer.image2DCount(), 1);
Containers::Optional<Trade::ImageData2D> image = importer.image2D(0);
CORRADE_VERIFY(image);
CORRADE_COMPARE(image->size(), Vector2i{1});
const char pixels[] = {
'\xb3', '\x69', '\x00', '\xff'
};
CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels), TestSuite::Compare::Container);
}

}}}

CORRADE_TEST_MAIN(Magnum::Trade::Test::AssimpImporterTest)

0 comments on commit b0324ec

Please sign in to comment.