1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-25 21:27:45 +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 <QAction>
#include <glm/gtc/type_ptr.hpp>
#include <QTreeWidget>
#include "gamedata.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) {
setWindowTitle("mdlviewer");
setMinimumSize(QSize(640, 480));
@ -249,18 +266,18 @@ MainWindow::MainWindow(GameData& data) : data(data) {
skeleton = parseHavokXML("test.xml");
calculate_bone_inverse_pose(skeleton, *skeleton.root_bone, nullptr);
auto boneListWidget = new QListWidget();
auto boneListWidget = new QTreeWidget();
for(auto& bone : skeleton.bones) {
bone.inversePose = glm::inverse(bone.inversePose);
boneListWidget->addItem(bone.name.c_str());
}
addItem(skeleton, *skeleton.root_bone, boneListWidget);
boneListWidget->setMaximumWidth(200);
connect(boneListWidget, &QListWidget::itemClicked, [this](QListWidgetItem* item) {
connect(boneListWidget, &QTreeWidget::itemClicked, [this](QTreeWidgetItem* item, int column) {
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());
currentEditedBone = &bone;
}
@ -360,9 +377,7 @@ void MainWindow::reloadGearModel() {
}
void calculate_bone(Skeleton& skeleton, Bone& bone, const Bone* parent_bone) {
glm::mat4 parent_matrix = glm::mat4(1.0f);
if(parent_bone != nullptr)
parent_matrix = parent_bone->localTransform;
const glm::mat4 parent_matrix = parent_bone == nullptr ? glm::mat4(1.0f) : parent_bone->localTransform;
glm::mat4 local = glm::mat4(1.0f);
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);
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
std::map<int, int> boneMapping;
for(int i = 0; i < loadedGear.model.affectedBoneNames.size(); i++) {