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:
parent
6800c875b8
commit
47d2d5744a
1 changed files with 23 additions and 12 deletions
|
@ -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++) {
|
||||
|
|
Loading…
Add table
Reference in a new issue