From add966e0bd737ce048e07505494e628ee22391e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 19 May 2020 17:29:31 +0200 Subject: [PATCH] sceneconverter: add a --remove-duplicates option. --- src/Magnum/MeshTools/CMakeLists.txt | 1 + src/Magnum/MeshTools/sceneconverter.cpp | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/Magnum/MeshTools/CMakeLists.txt b/src/Magnum/MeshTools/CMakeLists.txt index 5fbbbf138..35fcf2fbe 100644 --- a/src/Magnum/MeshTools/CMakeLists.txt +++ b/src/Magnum/MeshTools/CMakeLists.txt @@ -123,6 +123,7 @@ if(WITH_SCENECONVERTER) add_executable(magnum-sceneconverter sceneconverter.cpp) target_link_libraries(magnum-sceneconverter PRIVATE Magnum + MagnumMeshTools MagnumTrade) set_target_properties(magnum-sceneconverter PROPERTIES FOLDER "Magnum/MeshTools") diff --git a/src/Magnum/MeshTools/sceneconverter.cpp b/src/Magnum/MeshTools/sceneconverter.cpp index 110767b25..abe7a81e2 100644 --- a/src/Magnum/MeshTools/sceneconverter.cpp +++ b/src/Magnum/MeshTools/sceneconverter.cpp @@ -33,6 +33,7 @@ #include #include "Magnum/PixelFormat.h" +#include "Magnum/MeshTools/RemoveDuplicates.h" #include "Magnum/Trade/AbstractImporter.h" #include "Magnum/Trade/MeshData.h" #include "Magnum/Trade/MeshObjectData3D.h" @@ -66,7 +67,7 @@ information. @code{.sh} magnum-sceneconverter [-h|--help] [--importer IMPORTER] - [--converter CONVERTER]... [--plugin-dir DIR] + [--converter CONVERTER]... [--plugin-dir DIR] [--remove-duplicates] [-i|--importer-options key=val,key2=val2,…] [-c|--converter-options key=val,key2=val2,…]... [--info] [-v|--verbose] [--profile] [--] input output @@ -81,6 +82,8 @@ Arguments: @ref Trade::AnySceneImporter "AnySceneImporter") - `--converter CONVERTER` --- scene converter plugin(s) - `--plugin-dir DIR` --- override base plugin dir +- `--remove-duplicates` --- remove duplicate vertices using + @ref MeshTools::removeDuplicates(const Trade::MeshData&) after import - `-i`, `--importer-options key=val,key2=val2,…` --- configuration options to pass to the importer - `-c`, `--converter-options key=val,key2=val2,…` --- configuration options @@ -154,6 +157,7 @@ int main(int argc, char** argv) { .addOption("importer", "AnySceneImporter").setHelp("importer", "scene importer plugin") .addArrayOption("converter").setHelp("converter", "scene converter plugin(s)") .addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR") + .addBooleanOption("remove-duplicates").setHelp("remove-duplicates", "remove duplicate vertices in the mesh after import") .addOption('i', "importer-options").setHelp("importer-options", "configuration options to pass to the importer", "key=val,key2=val2,…") .addArrayOption('c', "converter-options").setHelp("converter-options", "configuration options to pass to the converter(s)", "key=val,key2=val2,…") .addBooleanOption("info").setHelp("info", "print info about the input file and exit") @@ -361,13 +365,24 @@ save its output; if no --converter is specified, AnySceneConverter is used.)") } } + std::chrono::high_resolution_clock::duration conversionTime; + + /* Remove duplicates, if requested */ + if(args.isSet("remove-duplicates")) { + const UnsignedInt beforeVertexCount = mesh->vertexCount(); + { + Duration d{conversionTime}; + mesh = MeshTools::removeDuplicates(*std::move(mesh)); + } + if(args.isSet("verbose")) + Debug{} << "Duplicate removal:" << beforeVertexCount << "->" << mesh->vertexCount() << "vertices"; + } + /* Load converter plugin */ PluginManager::Manager converterManager{ args.value("plugin-dir").empty() ? std::string{} : Utility::Directory::join(args.value("plugin-dir"), Trade::AbstractSceneConverter::pluginSearchPaths()[0])}; - std::chrono::high_resolution_clock::duration conversionTime; - /* Assume there's always one passed --converter option less, and the last is implicitly AnySceneConverter. All converters except the last one are expected to support ConvertMesh and the mesh is "piped" from one to the