From 4a1d0cb0a152ca29eceba3863dc5e5eba2f8b58b Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Tue, 12 Apr 2022 20:02:50 -0400 Subject: [PATCH] Add model export support --- CMakeLists.txt | 2 +- mdlviewer/CMakeLists.txt | 10 ++++++- mdlviewer/include/mainwindow.h | 2 ++ mdlviewer/src/mainwindow.cpp | 50 +++++++++++++++++++++++++++++++++- 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c9c9ed..6816d02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ else() endif() # macos -if(UNIX AND NOT LINUX) +if(APPLE) set(USE_STANDALONE_WINDOW TRUE) endif() diff --git a/mdlviewer/CMakeLists.txt b/mdlviewer/CMakeLists.txt index 3289a57..d798547 100644 --- a/mdlviewer/CMakeLists.txt +++ b/mdlviewer/CMakeLists.txt @@ -1,10 +1,18 @@ +find_package(assimp REQUIRED) + add_executable(mdlviewer src/main.cpp src/mainwindow.cpp) target_include_directories(mdlviewer PUBLIC include) -target_link_libraries(mdlviewer PUBLIC libxiv ${LIBRARIES} Qt5::Core Qt5::Widgets renderer) +target_link_libraries(mdlviewer PUBLIC + libxiv + ${LIBRARIES} + Qt5::Core + Qt5::Widgets + renderer + assimp::assimp) install(TARGETS mdlviewer DESTINATION "${INSTALL_BIN_PATH}") diff --git a/mdlviewer/include/mainwindow.h b/mdlviewer/include/mainwindow.h index 1bce0dd..32e2427 100644 --- a/mdlviewer/include/mainwindow.h +++ b/mdlviewer/include/mainwindow.h @@ -50,6 +50,8 @@ public: void refreshModel(); + void exportModel(Model& model); + private: std::vector gears; std::vector loadedGears; diff --git a/mdlviewer/src/mainwindow.cpp b/mdlviewer/src/mainwindow.cpp index 1d01461..a13edc7 100644 --- a/mdlviewer/src/mainwindow.cpp +++ b/mdlviewer/src/mainwindow.cpp @@ -11,6 +11,9 @@ #include #include #include +#include +#include +#include #include "gamedata.h" #include "exhparser.h" @@ -197,4 +200,49 @@ void MainWindow::refreshModel() { standaloneWindow->models.push_back(renderer->addModel(parseMDL("top.mdl"))); #endif } -} \ No newline at end of file +} + +void MainWindow::exportModel(Model& model) { + Assimp::Exporter exporter; + + aiScene scene; + scene.mRootNode = new aiNode(); + + scene.mNumMaterials = 1; + scene.mMaterials = new aiMaterial*[1]; + scene.mMaterials[0] = new aiMaterial(); + + scene.mNumMeshes = 1; + scene.mMeshes = new aiMesh*[scene.mNumMeshes]; + scene.mMeshes[0] = new aiMesh(); + scene.mMeshes[0]->mMaterialIndex = 0; + + scene.mRootNode->mNumMeshes = 1; + scene.mRootNode->mMeshes = new unsigned int [scene.mRootNode->mNumMeshes]; + scene.mRootNode->mMeshes[0] = 0; + + auto mesh = scene.mMeshes[0]; + mesh->mNumVertices = model.lods[0].parts[0].vertices.size(); + mesh->mVertices = new aiVector3D [mesh->mNumVertices]; + for(int i = 0; i < mesh->mNumVertices; i++) { + auto vertex = model.lods[0].parts[0].vertices[i]; + mesh->mVertices[i] = aiVector3D(vertex.position[0], vertex.position[1], vertex.position[2]); + } + + mesh->mNumFaces = model.lods[0].parts[0].indices.size() / 3; + mesh->mFaces = new aiFace[mesh->mNumFaces]; + + int lastFace = 0; + for(int i = 0; i < model.lods[0].parts[0].indices.size(); i += 3) { + aiFace& face = mesh->mFaces[lastFace++]; + + face.mNumIndices = 3; + face.mIndices = new unsigned int[face.mNumIndices]; + + face.mIndices[0] = model.lods[0].parts[0].indices[i]; + face.mIndices[1] = model.lods[0].parts[0].indices[i + 1]; + face.mIndices[2] = model.lods[0].parts[0].indices[i + 2]; + } + + exporter.Export(&scene, "fbx", "test.fbx"); +}