1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "converterthread.h"
5
6#include <QtQuick3DAssetImport/private/qssgassetimportmanager_p.h>
7
8#include <QFuture>
9#include <QtConcurrent/QtConcurrent>
10
11ConverterThread::ConverterThread(QObject *parent) : QThread(parent) { }
12
13ConverterThread::~ConverterThread()
14{
15 mutex.lock();
16 abort = true;
17 condition.wakeOne();
18 mutex.unlock();
19 wait();
20}
21
22void ConverterThread::convert(QStringList filenames, QDir outputPath, QJsonObject options)
23{
24 QMutexLocker locker(&mutex);
25
26 // Write settings
27 m_filenames = filenames;
28 m_outputPath = outputPath;
29 m_options = options;
30
31 if (!isRunning()) {
32 start(LowPriority);
33 } else {
34 condition.wakeOne();
35 }
36}
37
38void ConverterThread::run()
39{
40 forever {
41 if (abort)
42 return;
43
44 // Copy settings
45 mutex.lock();
46 auto filenames = m_filenames;
47 auto outputPath = m_outputPath;
48 auto options = m_options;
49 mutex.unlock();
50
51 emit convertStart(text: QString("Converting %1 files...").arg(a: filenames.size()));
52
53 std::atomic<int> failCounter = 0;
54 std::atomic<int> fileCounter = 0;
55 const int numFiles = filenames.size();
56
57 auto convertFile = [&](const QString &filename) {
58 if (abort)
59 return;
60 QString error;
61 QSSGAssetImportManager assetImporter;
62 assetImporter.importFile(filename, outputPath, options, error: &error);
63 const size_t ctr = ++fileCounter;
64 failCounter += error.isEmpty() ? 0 : 1;
65
66 if (!error.isEmpty())
67 emit convertUpdate(
68 text: QString("[%1/%2] Failed to convert '%3': %4").arg(args: QString::number(ctr), args: QString::number(numFiles), args: filename, args&: error));
69 else
70 emit convertUpdate(
71 text: QString("[%1/%2] Successfully converted '%3'").arg(args: QString::number(ctr), args: QString::number(numFiles), args: filename));
72 };
73
74 // Convert in parallel
75 QtConcurrent::blockingMap(sequence&: filenames, map&: convertFile);
76
77 if (failCounter > 0)
78 emit convertDone(text: QString("\nConversion done, failed to convert %1 of %2 files")
79 .arg(args: QString::number(failCounter), args: QString::number(numFiles)));
80 else
81 emit convertDone(text: QString("\nSuccessfully converted all files!"));
82
83 // Abort or wait for signal
84 mutex.lock();
85 if (!abort)
86 condition.wait(lockedMutex: &mutex);
87 mutex.unlock();
88 }
89}
90

source code of qtquick3d/tools/balsamui/converterthread.cpp