1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-28 06:37:44 +00:00

Convert bone list widget to a tree widget

This makes it a lot easier to see the hierarchy of bones.
This commit is contained in:
Joshua Goins 2022-05-03 13:19:48 -04:00
parent 6800c875b8
commit 47d2d5744a

View file

@ -21,6 +21,7 @@
#include <QMenuBar> #include <QMenuBar>
#include <QAction> #include <QAction>
#include <glm/gtc/type_ptr.hpp> #include <glm/gtc/type_ptr.hpp>
#include <QTreeWidget>
#include "gamedata.h" #include "gamedata.h"
#include "exhparser.h" #include "exhparser.h"
@ -101,6 +102,22 @@ void calculate_bone_inverse_pose(Skeleton& skeleton, Bone& bone, Bone* parent_bo
} }
} }
void addItem(Skeleton& skeleton, Bone& bone, QTreeWidget* widget, QTreeWidgetItem* parent_item = nullptr) {
auto item = new QTreeWidgetItem();
item->setText(0, bone.name.c_str());
if(parent_item == nullptr) {
widget->addTopLevelItem(item);
} else {
parent_item->addChild(item);
}
for(auto& b : skeleton.bones) {
if(b.parent != nullptr && b.parent->name == bone.name)
addItem(skeleton, b, widget, item);
}
}
MainWindow::MainWindow(GameData& data) : data(data) { MainWindow::MainWindow(GameData& data) : data(data) {
setWindowTitle("mdlviewer"); setWindowTitle("mdlviewer");
setMinimumSize(QSize(640, 480)); setMinimumSize(QSize(640, 480));
@ -249,18 +266,18 @@ MainWindow::MainWindow(GameData& data) : data(data) {
skeleton = parseHavokXML("test.xml"); skeleton = parseHavokXML("test.xml");
calculate_bone_inverse_pose(skeleton, *skeleton.root_bone, nullptr); calculate_bone_inverse_pose(skeleton, *skeleton.root_bone, nullptr);
auto boneListWidget = new QListWidget(); auto boneListWidget = new QTreeWidget();
for(auto& bone : skeleton.bones) { for(auto& bone : skeleton.bones) {
bone.inversePose = glm::inverse(bone.inversePose); bone.inversePose = glm::inverse(bone.inversePose);
boneListWidget->addItem(bone.name.c_str());
} }
addItem(skeleton, *skeleton.root_bone, boneListWidget);
boneListWidget->setMaximumWidth(200); boneListWidget->setMaximumWidth(200);
connect(boneListWidget, &QListWidget::itemClicked, [this](QListWidgetItem* item) { connect(boneListWidget, &QTreeWidget::itemClicked, [this](QTreeWidgetItem* item, int column) {
for(auto& bone : skeleton.bones) { for(auto& bone : skeleton.bones) {
if(bone.name == item->text().toStdString()) { if(bone.name == item->text(column).toStdString()) {
currentScale = glm::make_vec3(bone.scale.data()); currentScale = glm::make_vec3(bone.scale.data());
currentEditedBone = &bone; currentEditedBone = &bone;
} }
@ -360,9 +377,7 @@ void MainWindow::reloadGearModel() {
} }
void calculate_bone(Skeleton& skeleton, Bone& bone, const Bone* parent_bone) { void calculate_bone(Skeleton& skeleton, Bone& bone, const Bone* parent_bone) {
glm::mat4 parent_matrix = glm::mat4(1.0f); const glm::mat4 parent_matrix = parent_bone == nullptr ? glm::mat4(1.0f) : parent_bone->localTransform;
if(parent_bone != nullptr)
parent_matrix = parent_bone->localTransform;
glm::mat4 local = glm::mat4(1.0f); glm::mat4 local = glm::mat4(1.0f);
local = glm::translate(local, glm::vec3(bone.position[0], bone.position[1], bone.position[2])); local = glm::translate(local, glm::vec3(bone.position[0], bone.position[1], bone.position[2]));
@ -383,10 +398,6 @@ void MainWindow::reloadGearAppearance() {
calculate_bone(skeleton, *skeleton.root_bone, nullptr); calculate_bone(skeleton, *skeleton.root_bone, nullptr);
for(int i = 0; i < 128; i++) {
loadedGear.renderModel.boneData[i] = glm::mat4(1.0f);
}
// we want to map the actual affected bones to bone ids // we want to map the actual affected bones to bone ids
std::map<int, int> boneMapping; std::map<int, int> boneMapping;
for(int i = 0; i < loadedGear.model.affectedBoneNames.size(); i++) { for(int i = 0; i < loadedGear.model.affectedBoneNames.size(); i++) {