1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-23 20:47:45 +00:00

Add "Edit" button to open the model quickly in Blender

This commit is contained in:
Joshua Goins 2024-01-29 22:25:23 -05:00
parent d8487c36f6
commit c376362d25
4 changed files with 73 additions and 1 deletions

View file

@ -16,4 +16,5 @@ private:
QLineEdit *m_sourcesLineEdit = nullptr;
QLineEdit *m_outputLineEdit = nullptr;
QLineEdit *m_blenderPath = nullptr;
};

View file

@ -57,7 +57,7 @@ private:
GearView *gearView = nullptr;
QComboBox *raceCombo, *subraceCombo, *genderCombo, *lodCombo;
QPushButton *addToFMVButton, *importButton, *exportButton;
QPushButton *addToFMVButton, *editButton, *importButton, *exportButton;
bool loadingComboData = false;
bool fmvAvailable = false;

View file

@ -74,6 +74,32 @@ SettingsWindow::SettingsWindow(QWidget *parent)
penumbraLayout->addRow(QStringLiteral("Output Directory"), outputBoxLayoutContainer);
auto blenderBox = new QGroupBox(QStringLiteral("Blender"));
layout->addWidget(blenderBox);
auto blenderLayout = new QFormLayout();
blenderBox->setLayout(blenderLayout);
auto blenderBoxLayoutContainer = new QWidget(this);
auto blenderBoxLayout = new QHBoxLayout(blenderBoxLayoutContainer);
blenderBoxLayout->setContentsMargins(0, 0, 0, 0);
m_blenderPath = new QLineEdit();
m_blenderPath->setText(game.readEntry("BlenderPath"));
m_blenderPath->setClearButtonEnabled(true);
blenderBoxLayout->addWidget(m_blenderPath);
auto selectBlenderButton = new QPushButton(QIcon::fromTheme(QStringLiteral("folder-open")), QString());
connect(selectBlenderButton, &QPushButton::clicked, this, [this] {
QUrl url = QFileDialog::getOpenFileUrl(this, QString());
if (!url.isEmpty()) {
m_blenderPath->setText(url.toDisplayString(QUrl::PreferLocalFile));
}
});
blenderBoxLayout->addWidget(selectBlenderButton);
blenderLayout->addRow(QStringLiteral("Blender Path"), blenderBoxLayoutContainer);
auto bottomButtonLayout = new QHBoxLayout();
layout->addLayout(bottomButtonLayout);
@ -96,4 +122,5 @@ void SettingsWindow::applySettings()
KConfigGroup game = config.group(QStringLiteral("Armoury"));
game.writeEntry("PenumbraOutputDirectory", m_outputLineEdit->text());
game.writeEntry("SourcesOutputDirectory", m_sourcesLineEdit->text());
game.writeEntry("BlenderPath", m_blenderPath->text());
}

View file

@ -9,6 +9,7 @@
#include <QFileDialog>
#include <QLineEdit>
#include <QMenu>
#include <QProcess>
#include <QPushButton>
#include <QVBoxLayout>
@ -90,6 +91,49 @@ SingleGearView::SingleGearView(GameData *data, FileCache &cache, QWidget *parent
}
});
editButton = new QPushButton(QStringLiteral("Edit..."));
editButton->setIcon(QIcon::fromTheme(QStringLiteral("document-import")));
connect(editButton, &QPushButton::clicked, this, [this](bool) {
// Export in default location
// TODO: deduplicate
const auto sanitizeMdlPath = [](const QString &mdlPath) -> QString {
return QString(mdlPath).section(QLatin1Char('/'), -1).remove(QStringLiteral(".mdl"));
};
KConfig config(QStringLiteral("novusrc"));
KConfigGroup game = config.group(QStringLiteral("Armoury"));
QString sourceDirectory = game.readEntry(QStringLiteral("SourcesOutputDirectory"));
QString newFilename = QStringLiteral("%1.glb").arg(sanitizeMdlPath(gearView->getLoadedGearPath()));
QString path = QStringLiteral("%1/%2/%3/%4")
.arg(sourceDirectory)
.arg(QString::fromStdString(magic_enum::enum_name(currentGear->slot).data()))
.arg(QString::fromStdString(currentGear->name))
.arg(QStringLiteral("3D"));
if (!QDir().exists(path))
QDir().mkpath(path);
const QString fileName = QStringLiteral("%1/%2").arg(path, newFilename);
gearView->exportModel(fileName);
QFileInfo info(fileName);
QProcess *blenderProcess = new QProcess(this);
blenderProcess->setProgram(game.readEntry(QStringLiteral("BlenderPath")));
blenderProcess->setArguments(
{QStringLiteral("--python-expr"),
QStringLiteral("import bpy\nbpy.ops.import_scene.gltf(filepath=\"%1\", files=[{\"name\":\"%2\", \"name\":\"%3\"}], bone_heuristic='TEMPERANCE')")
.arg(info.filePath(), info.fileName(), info.fileName())});
blenderProcess->start();
blenderProcess->waitForFinished();
importButton->click();
});
topControlLayout->addWidget(editButton);
importButton = new QPushButton(QStringLiteral("Import..."));
importButton->setIcon(QIcon::fromTheme(QStringLiteral("document-import")));
connect(importButton, &QPushButton::clicked, this, [this](bool) {