From f8f73d2cbba570fb0d5b211ada5a16996c38b2ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 17 May 2020 18:08:25 +0200 Subject: [PATCH] sceneconverter: print also reference count for each mesh. --- src/Magnum/MeshTools/sceneconverter.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Magnum/MeshTools/sceneconverter.cpp b/src/Magnum/MeshTools/sceneconverter.cpp index 1edcfbf39..110767b25 100644 --- a/src/Magnum/MeshTools/sceneconverter.cpp +++ b/src/Magnum/MeshTools/sceneconverter.cpp @@ -35,6 +35,7 @@ #include "Magnum/PixelFormat.h" #include "Magnum/Trade/AbstractImporter.h" #include "Magnum/Trade/MeshData.h" +#include "Magnum/Trade/MeshObjectData3D.h" #include "Magnum/Trade/AbstractSceneConverter.h" #include "Magnum/Trade/Implementation/converterUtilities.h" @@ -226,6 +227,7 @@ save its output; if no --converter is specified, AnySceneConverter is used.)") struct MeshInfo { UnsignedInt mesh, level; + UnsignedInt references; MeshPrimitive primitive; UnsignedInt indexCount, vertexCount; MeshIndexType indexType; @@ -235,6 +237,17 @@ save its output; if no --converter is specified, AnySceneConverter is used.)") }; /* Parse everything first to avoid errors interleaved with output */ + + /* Scene properties. Currently just counting how much is each mesh + shared. */ + Containers::Array meshReferenceCount{importer->meshCount()}; + for(UnsignedInt i = 0; i != importer->object3DCount(); ++i) { + Containers::Pointer object = importer->object3D(i); + if(object && object->instanceType() == Trade::ObjectInstanceType3D::Mesh && std::size_t(object->instance()) < meshReferenceCount.size()) + ++meshReferenceCount[object->instance()]; + } + + /* Mesh properties */ bool error = false; Containers::Array meshInfos; for(UnsignedInt i = 0; i != importer->meshCount(); ++i) { @@ -254,7 +267,10 @@ save its output; if no --converter is specified, AnySceneConverter is used.)") info.primitive = mesh->primitive(); info.vertexCount = mesh->vertexCount(); info.vertexDataSize = mesh->vertexData().size(); - if(!j) info.name = importer->meshName(i); + if(!j) { + info.name = importer->meshName(i); + info.references = meshReferenceCount[i]; + } if(mesh->isIndexed()) { info.indexCount = mesh->indexCount(); info.indexType = mesh->indexType(); @@ -286,7 +302,8 @@ save its output; if no --converter is specified, AnySceneConverter is used.)") for(const MeshInfo& info: meshInfos) { Debug d; if(info.level == 0) { - d << "Mesh" << info.mesh << Debug::nospace << ":"; + d << "Mesh" << info.mesh + << Utility::formatString("(referenced by {} objects):", info.references); if(!info.name.empty()) d << info.name; d << Debug::newline; }