Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add openState feature to AssimpImporter #37

Merged
merged 2 commits into from Jan 18, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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)