diff --git a/src/Magnum/MeshTools/sceneconverter.cpp b/src/Magnum/MeshTools/sceneconverter.cpp index e7c814b0c..7a04a5acd 100644 --- a/src/Magnum/MeshTools/sceneconverter.cpp +++ b/src/Magnum/MeshTools/sceneconverter.cpp @@ -45,6 +45,7 @@ #include "Magnum/Trade/MaterialData.h" #include "Magnum/Trade/MeshData.h" #include "Magnum/Trade/MeshObjectData3D.h" +#include "Magnum/Trade/SkinData.h" #include "Magnum/Trade/TextureData.h" #include "Magnum/Trade/AbstractSceneConverter.h" #include "Magnum/Trade/Implementation/converterUtilities.h" @@ -289,6 +290,13 @@ used.)") std::string name; }; + struct SkinInfo { + UnsignedInt skin; + UnsignedInt references; + Trade::SkinData3D data{{}, {}}; + std::string name; + }; + struct LightInfo { UnsignedInt light; UnsignedInt references; @@ -338,6 +346,7 @@ used.)") Containers::Array materialReferenceCount{importer->materialCount()}; Containers::Array lightReferenceCount{importer->lightCount()}; Containers::Array meshReferenceCount{importer->meshCount()}; + Containers::Array skinReferenceCount{importer->skin3DCount()}; for(UnsignedInt i = 0; i != importer->object3DCount(); ++i) { Containers::Pointer object = importer->object3D(i); if(!object) continue; @@ -347,6 +356,8 @@ used.)") ++meshReferenceCount[meshObject.instance()]; if(std::size_t(meshObject.material()) < materialReferenceCount.size()) ++materialReferenceCount[meshObject.material()]; + if(std::size_t(meshObject.skin()) < skinReferenceCount.size()) + ++skinReferenceCount[meshObject.skin()]; } else if(object->instanceType() == Trade::ObjectInstanceType3D::Light) { if(std::size_t(object->instance()) < lightReferenceCount.size()) ++lightReferenceCount[object->instance()]; @@ -374,6 +385,27 @@ used.)") arrayAppend(animationInfos, std::move(info)); } + /* Skin properties */ + Containers::Array skinInfos; + for(UnsignedInt i = 0; i != importer->skin3DCount(); ++i) { + Containers::Optional skin; + { + Duration d{importTime}; + if(!(skin = importer->skin3D(i))) { + error = true; + continue; + } + } + + SkinInfo info{}; + info.skin = i; + info.name = importer->skin3DName(i); + info.references = skinReferenceCount[i]; + info.data = *std::move(skin); + + arrayAppend(skinInfos, std::move(info)); + } + /* Light properties */ Containers::Array lightInfos; for(UnsignedInt i = 0; i != importer->lightCount(); ++i) { @@ -569,6 +601,19 @@ used.)") not so much for things like complex numbers or quats */ } } + for(const SkinInfo& info: skinInfos) { + Debug d; + d << "Skin" << info.skin; + /* Print reference count only if there actually is a scene, + otherwise this information is useless */ + if(importer->object3DCount()) + d << Utility::formatString("(referenced by {} objects)", info.references); + d << Debug::nospace << ":"; + if(!info.name.empty()) d << info.name; + + d << Debug::newline << " Joints:" << info.data.joints(); + } + for(const LightInfo& info: lightInfos) { Debug d; d << "Light" << info.light;