mirror of
https://github.com/redstrate/Novus.git
synced 2025-04-22 12:07:45 +00:00
Re-introduce standalone mdlviewer for viewin specific MDL files
This commit is contained in:
parent
589598b34c
commit
2ec31da272
8 changed files with 133 additions and 6 deletions
|
@ -44,3 +44,4 @@ add_subdirectory(explorer)
|
|||
add_subdirectory(bonedecomp)
|
||||
add_subdirectory(parts)
|
||||
add_subdirectory(common)
|
||||
add_subdirectory(mdlviewer)
|
|
@ -1,6 +1,3 @@
|
|||
find_package(assimp REQUIRED)
|
||||
set_target_properties(assimp::assimp PROPERTIES MAP_IMPORTED_CONFIG_DEBUG Release)
|
||||
|
||||
add_executable(armoury
|
||||
src/main.cpp
|
||||
src/mainwindow.cpp
|
||||
|
@ -25,7 +22,6 @@ target_link_libraries(armoury PUBLIC
|
|||
Qt5::Widgets
|
||||
Qt5::Concurrent
|
||||
renderer
|
||||
assimp::assimp
|
||||
magic_enum
|
||||
physis z
|
||||
mdlpart
|
||||
|
|
24
mdlviewer/CMakeLists.txt
Normal file
24
mdlviewer/CMakeLists.txt
Normal file
|
@ -0,0 +1,24 @@
|
|||
add_executable(mdlviewer
|
||||
src/main.cpp
|
||||
src/mainwindow.cpp)
|
||||
target_include_directories(mdlviewer
|
||||
PUBLIC
|
||||
include)
|
||||
target_link_libraries(mdlviewer PUBLIC physis z ${LIBRARIES} Qt5::Core Qt5::Widgets mdlpart NovusCommon)
|
||||
|
||||
install(TARGETS mdlviewer
|
||||
DESTINATION "${INSTALL_BIN_PATH}")
|
||||
|
||||
if(WIN32)
|
||||
get_target_property(QMAKE_EXE Qt5::qmake IMPORTED_LOCATION)
|
||||
get_filename_component(QT_BIN_DIR "${QMAKE_EXE}" DIRECTORY)
|
||||
|
||||
find_program(WINDEPLOYQT_ENV_SETUP qtenv2.bat HINTS "${QT_BIN_DIR}")
|
||||
find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${QT_BIN_DIR}")
|
||||
|
||||
# Run windeployqt immediately after build
|
||||
add_custom_command(TARGET mdlviewer
|
||||
POST_BUILD
|
||||
COMMAND "${WINDEPLOYQT_ENV_SETUP}" && "${WINDEPLOYQT_EXECUTABLE}" \"$<TARGET_FILE:mdlviewer>\"
|
||||
)
|
||||
endif()
|
18
mdlviewer/include/mainwindow.h
Normal file
18
mdlviewer/include/mainwindow.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
#pragma once
|
||||
|
||||
#include <QMainWindow>
|
||||
|
||||
#include "filecache.h"
|
||||
|
||||
struct GameData;
|
||||
class MDLPart;
|
||||
|
||||
class MainWindow : public QMainWindow {
|
||||
public:
|
||||
MainWindow(GameData* data);
|
||||
|
||||
private:
|
||||
GameData* data = nullptr;
|
||||
MDLPart* part = nullptr;
|
||||
FileCache cache;
|
||||
};
|
13
mdlviewer/src/main.cpp
Normal file
13
mdlviewer/src/main.cpp
Normal file
|
@ -0,0 +1,13 @@
|
|||
#include <QApplication>
|
||||
#include <physis.hpp>
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
|
||||
MainWindow w(physis_gamedata_initialize(argv[1]));
|
||||
w.show();
|
||||
|
||||
return app.exec();
|
||||
}
|
69
mdlviewer/src/mainwindow.cpp
Normal file
69
mdlviewer/src/mainwindow.cpp
Normal file
|
@ -0,0 +1,69 @@
|
|||
#include "mainwindow.h"
|
||||
|
||||
#include <QAction>
|
||||
#include <QApplication>
|
||||
#include <QDesktopServices>
|
||||
#include <QFileDialog>
|
||||
#include <QHBoxLayout>
|
||||
#include <QListWidget>
|
||||
#include <QMenuBar>
|
||||
#include <QTableWidget>
|
||||
#include <QUrl>
|
||||
#include <fmt/core.h>
|
||||
#include <physis.hpp>
|
||||
|
||||
#include "aboutwindow.h"
|
||||
#include "mdlpart.h"
|
||||
|
||||
MainWindow::MainWindow(GameData* data) : data(data), cache(FileCache{*data}) {
|
||||
setWindowTitle("Model Viewer");
|
||||
|
||||
auto fileMenu = menuBar()->addMenu("File");
|
||||
|
||||
auto openMDLFile = fileMenu->addAction("Open MDL...");
|
||||
connect(openMDLFile, &QAction::triggered, [=] {
|
||||
auto fileName = QFileDialog::getOpenFileName(nullptr,
|
||||
"Open MDL File",
|
||||
"~",
|
||||
"FFXIV Model File (*.mdl)");
|
||||
|
||||
auto buffer = physis_read_file(fileName.toStdString().c_str());
|
||||
|
||||
part->addModel(physis_mdl_parse(buffer.size, buffer.data), {}, 0);
|
||||
});
|
||||
|
||||
auto helpMenu = menuBar()->addMenu("Help");
|
||||
|
||||
auto donateAction = helpMenu->addAction("Donate");
|
||||
connect(donateAction, &QAction::triggered, this, [] {
|
||||
QDesktopServices::openUrl(QUrl("https://redstrate.com/fund"));
|
||||
});
|
||||
donateAction->setIcon(QIcon::fromTheme("help-donate"));
|
||||
|
||||
helpMenu->addSeparator();
|
||||
|
||||
auto aboutNovusAction = helpMenu->addAction("About Model Viewer");
|
||||
aboutNovusAction->setIcon(QIcon::fromTheme("help-about"));
|
||||
connect(aboutNovusAction, &QAction::triggered, this, [this] {
|
||||
auto window = new AboutWindow(this);
|
||||
window->show();
|
||||
});
|
||||
|
||||
auto aboutQtAction = helpMenu->addAction("About Qt");
|
||||
aboutQtAction->setIcon(QIcon(":/qt-project.org/qmessagebox/images/qtlogo-64.png"));
|
||||
connect(aboutQtAction, &QAction::triggered, QApplication::instance(), &QApplication::aboutQt);
|
||||
|
||||
auto dummyWidget = new QWidget();
|
||||
setCentralWidget(dummyWidget);
|
||||
|
||||
auto layout = new QHBoxLayout();
|
||||
dummyWidget->setLayout(layout);
|
||||
|
||||
part = new MDLPart(data, cache);
|
||||
|
||||
const int raceCode = physis_get_race_code(Race::Hyur, Subrace::Midlander, Gender::Male);
|
||||
QString skelName = QString{"c%1b0001.skel"}.arg(raceCode, 4, 10, QLatin1Char{'0'});
|
||||
part->setSkeleton(physis_skeleton_from_skel(physis_read_file(skelName.toStdString().c_str())));
|
||||
|
||||
layout->addWidget(part);
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
find_package(assimp REQUIRED)
|
||||
|
||||
add_library(mdlpart STATIC mdlpart.cpp)
|
||||
target_link_libraries(mdlpart PUBLIC physis z ${LIBRARIES} Qt5::Core Qt5::Widgets renderer NovusCommon)
|
||||
target_link_libraries(mdlpart PUBLIC physis z ${LIBRARIES} Qt5::Core Qt5::Widgets renderer NovusCommon assimp::assimp)
|
||||
target_include_directories(mdlpart PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
|
@ -338,6 +338,10 @@ void MDLPart::addModel(physis_MDL mdl, std::vector<physis_Material> materials, i
|
|||
return createMaterial(mat);
|
||||
});
|
||||
|
||||
if (materials.empty()) {
|
||||
model.materials.push_back(createMaterial(physis_Material{}));
|
||||
}
|
||||
|
||||
models.push_back(model);
|
||||
|
||||
Q_EMIT modelChanged();
|
||||
|
|
Loading…
Add table
Reference in a new issue