1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-21 19:57:44 +00:00
novus/mdlviewer/include/mainwindow.h

80 lines
2 KiB
C
Raw Normal View History

2022-04-11 21:59:37 -04:00
#pragma once
#include <QComboBox>
#include <QMainWindow>
#include <fmt/format.h>
2022-08-10 14:52:28 -04:00
#include <physis.hpp>
#include <unordered_map>
2022-04-11 21:59:37 -04:00
#include "renderer.hpp"
struct ModelInfo {
int primaryID;
int gearVersion = 1;
};
struct GearInfo {
std::string name;
Slot slot;
ModelInfo modelInfo;
std::string getMtrlPath(int raceID) {
return fmt::format("chara/equipment/e{gearId:04d}/material/v{gearVersion:04d}/mt_c{raceId:04d}e{gearId:04d}_{slot}_a.mtrl",
fmt::arg("gearId", modelInfo.primaryID),
fmt::arg("gearVersion", modelInfo.gearVersion),
fmt::arg("raceId", raceID),
fmt::arg("slot", physis_get_slot_name(slot)));
}
};
2022-04-11 21:59:37 -04:00
class GameData;
class VulkanWindow;
class StandaloneWindow;
2022-04-11 21:59:37 -04:00
class MainWindow : public QMainWindow {
public:
2022-08-10 14:52:28 -04:00
MainWindow(GameData* data);
2022-04-11 21:59:37 -04:00
2022-08-10 14:52:28 -04:00
void exportModel(physis_MDL& model, physis_Skeleton& skeleton, QString fileName);
2022-04-12 20:02:50 -04:00
2022-04-11 21:59:37 -04:00
private:
void loadInitialGearInfo(GearInfo& info);
void reloadGearModel();
void reloadGearAppearance();
2022-08-10 14:52:28 -04:00
void calculate_bone_inverse_pose(physis_Skeleton& skeleton, physis_Bone& bone, physis_Bone* parent_bone);
void calculate_bone(physis_Skeleton& skeleton, physis_Bone& bone, const physis_Bone* parent_bone);
std::vector<GearInfo> gears;
struct LoadedGear {
GearInfo* gearInfo;
2022-08-10 14:52:28 -04:00
physis_MDL model;
physis_Material material;
RenderModel renderModel;
RenderTexture renderTexture;
};
2022-08-10 14:52:28 -04:00
struct BoneExtra {
glm::mat4 localTransform, finalTransform, inversePose;
};
LoadedGear loadedGear;
QComboBox* raceCombo, *lodCombo;
2022-08-10 14:52:28 -04:00
Race currentRace = Race::Hyur;
Subrace currentSubrace = Subrace::Midlander;
Gender currentGender = Gender::Male;
int currentLod = 0;
glm::vec3 currentScale = glm::vec3(1);
2022-08-10 14:52:28 -04:00
physis_Bone* currentEditedBone = nullptr;
2022-04-11 21:59:37 -04:00
GameData& data;
Renderer* renderer;
VulkanWindow* vkWindow;
StandaloneWindow* standaloneWindow;
2022-08-10 14:52:28 -04:00
physis_Skeleton skeleton;
std::vector<BoneExtra> extraBone;
2022-04-11 21:59:37 -04:00
};