From 2f4f212c862eb06b4e1bf1738e4777a8f588a4a3 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Tue, 12 Apr 2022 12:39:33 -0400 Subject: [PATCH] Add race selection combo box to mdlviewer --- mdlviewer/include/mainwindow.h | 44 +++++++++++++++++++++ mdlviewer/src/mainwindow.cpp | 72 ++++++++++++++++++---------------- 2 files changed, 82 insertions(+), 34 deletions(-) diff --git a/mdlviewer/include/mainwindow.h b/mdlviewer/include/mainwindow.h index bcabac1..0ea006d 100644 --- a/mdlviewer/include/mainwindow.h +++ b/mdlviewer/include/mainwindow.h @@ -4,14 +4,58 @@ #include "renderer.hpp" +enum class Slot { + Body, + Legs +}; + +enum class Race { + HyurMidlanderMale, + HyurMidlanderFemale +}; + +inline std::map raceNames = { + {Race::HyurMidlanderMale, "Hyur Midlander Male"}, + {Race::HyurMidlanderFemale, "Hyur Midlander Female"} +}; + +inline std::unordered_map raceIDs = { + {Race::HyurMidlanderMale, "0101"}, + {Race::HyurMidlanderFemale, "0201"} +}; + +struct ModelInfo { + +}; + +struct GearInfo { + std::string name; + Slot slot; + ModelInfo modelInfo; +}; + +inline std::unordered_map slotToName = { + {Slot::Body, "top"}, + {Slot::Legs, "dwn"} +}; + class GameData; +class VulkanWindow; class MainWindow : public QMainWindow { public: MainWindow(GameData& data); + void refreshModel(); + private: + std::vector gears; + std::vector loadedGears; + + Race currentRace; + GameData& data; Renderer* renderer; + VulkanWindow* vkWindow; }; \ No newline at end of file diff --git a/mdlviewer/src/mainwindow.cpp b/mdlviewer/src/mainwindow.cpp index 21a4225..7f5b708 100644 --- a/mdlviewer/src/mainwindow.cpp +++ b/mdlviewer/src/mainwindow.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "gamedata.h" #include "exhparser.h" @@ -62,26 +63,6 @@ private: QVulkanInstance* m_instance; }; -struct ModelInfo { - -}; - -enum class Slot { - Body, - Legs -}; - -struct GearInfo { - std::string name; - Slot slot; - ModelInfo modelInfo; -}; - -std::unordered_map slotToName = { - {Slot::Body, "top"}, - {Slot::Legs, "dwn"} -}; - MainWindow::MainWindow(GameData& data) : data(data) { setWindowTitle("mdlviewer"); setMinimumSize(QSize(640, 480)); @@ -92,8 +73,6 @@ MainWindow::MainWindow(GameData& data) : data(data) { auto layout = new QHBoxLayout(); dummyWidget->setLayout(layout); - std::vector gears; - // smallclothes body { GearInfo info = {}; @@ -122,26 +101,51 @@ MainWindow::MainWindow(GameData& data) : data(data) { renderer = new Renderer(); - QVulkanInstance* inst = new QVulkanInstance(); + auto inst = new QVulkanInstance(); inst->setVkInstance(renderer->instance); inst->setFlags(QVulkanInstance::Flag::NoDebugOutputRedirect); inst->create(); - VulkanWindow* vkWindow = new VulkanWindow(renderer, inst); + vkWindow = new VulkanWindow(renderer, inst); vkWindow->setVulkanInstance(inst); auto widget = QWidget::createWindowContainer(vkWindow); - layout->addWidget(widget); - connect(listWidget, &QListWidget::itemClicked, [this, &data, vkWindow, gears](QListWidgetItem* item) { - for(auto gear : gears) { - if(gear.name == item->text().toStdString()) { - QString resolvedModelPath = QString("chara/equipment/e0000/model/c0201e0000_%1.mdl"); - resolvedModelPath = resolvedModelPath.arg(slotToName[gear.slot].data()); + auto viewportLayout = new QVBoxLayout(); + viewportLayout->addWidget(widget); + layout->addLayout(viewportLayout); - data.extractFile(resolvedModelPath.toStdString(), "top.mdl"); - vkWindow->models.push_back(renderer->addModel(parseMDL("top.mdl"))); - } - } + QComboBox* raceCombo = new QComboBox(); + for(auto [race, raceName] : raceNames) { + raceCombo->addItem(raceName.data()); + } + raceCombo->setCurrentIndex(0); + + connect(raceCombo, qOverload(&QComboBox::currentIndexChanged), [this](int index) { + currentRace = (Race)index; + refreshModel(); }); + + viewportLayout->addWidget(raceCombo); + + connect(listWidget, &QListWidget::itemClicked, [this](QListWidgetItem* item) { + for(auto& gear : gears) { + if(gear.name == item->text().toStdString()) + loadedGears = {&gear}; + } + + refreshModel(); + }); +} + +void MainWindow::refreshModel() { + vkWindow->models.clear(); + + for(auto gear : loadedGears) { + QString resolvedModelPath = QString("chara/equipment/e0000/model/c%1e0000_%2.mdl"); + resolvedModelPath = resolvedModelPath.arg(raceIDs[currentRace].data(), slotToName[gear->slot].data()); + + data.extractFile(resolvedModelPath.toStdString(), "top.mdl"); + vkWindow->models.push_back(renderer->addModel(parseMDL("top.mdl"))); + } } \ No newline at end of file