From fecb015ff2b9cb3afe76b0dde83f924fd687bc18 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Fri, 7 Jul 2023 16:01:07 -0400 Subject: [PATCH] Display racial scaling transforms in bone editor --- mdlviewer/include/boneeditor.h | 34 ++++++++--- mdlviewer/src/boneeditor.cpp | 100 +++++++++++++++++++++++---------- 2 files changed, 98 insertions(+), 36 deletions(-) diff --git a/mdlviewer/include/boneeditor.h b/mdlviewer/include/boneeditor.h index 6f69c58..b23fc68 100644 --- a/mdlviewer/include/boneeditor.h +++ b/mdlviewer/include/boneeditor.h @@ -1,22 +1,42 @@ #pragma once +#include "quaternionedit.h" +#include "vec3edit.h" #include +#include #include +#include #include #include -#include class GearView; class BoneEditor : public QWidget { - Q_OBJECT + Q_OBJECT public: - explicit BoneEditor(GearView* gearView, QWidget* parent = nullptr); + explicit BoneEditor(GearView *gearView, QWidget *parent = nullptr); private: - glm::vec3 currentPosition; - glm::quat currentRotation; - glm::vec3 currentScale; - physis_Bone* currentEditedBone; + void treeItemClicked(QTreeWidgetItem *item, int column); + + GearView *gearView; + + glm::vec3 currentPosition; + glm::quat currentRotation; + glm::vec3 currentScale; + + glm::vec3 currentRacePosition; + glm::quat currentRaceRotation; + glm::vec3 currentRaceScale; + + physis_Bone *currentEditedBone; + + Vector3Edit *posEdit; + QuaternionEdit *rotationEdit; + Vector3Edit *scaleEdit; + + Vector3Edit *raceDeformPosEdit; + QuaternionEdit *raceDeformRotationEdit; + Vector3Edit *raceDeformScaleEdit; }; diff --git a/mdlviewer/src/boneeditor.cpp b/mdlviewer/src/boneeditor.cpp index f1508ae..cb2679c 100644 --- a/mdlviewer/src/boneeditor.cpp +++ b/mdlviewer/src/boneeditor.cpp @@ -1,10 +1,11 @@ #include "boneeditor.h" -#include -#include #include #include +#include +#include #include +#include #include "vec3edit.h" #include "quaternionedit.h" @@ -26,16 +27,19 @@ void addItem(physis_Skeleton& skeleton, physis_Bone& bone, QTreeWidget* widget, } } -BoneEditor::BoneEditor(GearView* gearView, QWidget *parent) { +BoneEditor::BoneEditor(GearView *gearView, QWidget *parent) + : gearView(gearView) { auto layout = new QHBoxLayout(); setLayout(layout); auto boneListWidget = new QTreeWidget(); - connect(gearView, &GearView::modelReloaded, this, [this, boneListWidget, gearView] { - boneListWidget->clear(); - addItem(*gearView->part().skeleton, *gearView->part().skeleton->root_bone, boneListWidget); - }); + connect(gearView, &GearView::modelReloaded, this, + [this, boneListWidget, gearView] { + boneListWidget->clear(); + addItem(*gearView->part().skeleton, + *gearView->part().skeleton->root_bone, boneListWidget); + }); boneListWidget->setMaximumWidth(200); @@ -46,42 +50,80 @@ BoneEditor::BoneEditor(GearView* gearView, QWidget *parent) { auto transformGroupLayout = new QFormLayout(); transformGroup->setLayout(transformGroupLayout); - auto posEdit = new Vector3Edit(currentPosition); + posEdit = new Vector3Edit(currentPosition); connect(posEdit, &Vector3Edit::onValueChanged, [this, gearView] { - memcpy(currentEditedBone->position, glm::value_ptr(currentPosition), sizeof(float) * 3); - gearView->part().reloadRenderer(); + memcpy(currentEditedBone->position, glm::value_ptr(currentPosition), + sizeof(float) * 3); + gearView->part().reloadRenderer(); }); transformGroupLayout->addRow("Position", posEdit); - auto rotationEdit = new QuaternionEdit(currentRotation); + rotationEdit = new QuaternionEdit(currentRotation); connect(rotationEdit, &QuaternionEdit::onValueChanged, [this, gearView] { - memcpy(currentEditedBone->rotation, glm::value_ptr(currentRotation), sizeof(float) * 4); - gearView->part().reloadRenderer(); + memcpy(currentEditedBone->rotation, glm::value_ptr(currentRotation), + sizeof(float) * 4); + gearView->part().reloadRenderer(); }); transformGroupLayout->addRow("Rotation", rotationEdit); - auto scaleEdit = new Vector3Edit(currentScale); + scaleEdit = new Vector3Edit(currentScale); connect(scaleEdit, &Vector3Edit::onValueChanged, [this, gearView] { - memcpy(currentEditedBone->scale, glm::value_ptr(currentScale), sizeof(float) * 3); - gearView->part().reloadRenderer(); + memcpy(currentEditedBone->scale, glm::value_ptr(currentScale), + sizeof(float) * 3); + gearView->part().reloadRenderer(); }); transformGroupLayout->addRow("Scale", scaleEdit); - connect(boneListWidget, &QTreeWidget::itemClicked, [this, posEdit, rotationEdit, scaleEdit, gearView](QTreeWidgetItem* item, int column) { - auto& skeleton = *gearView->part().skeleton; - for(int i = 0; i < skeleton.num_bones; i++) { - if(strcmp(skeleton.bones[i].name, item->text(column).toStdString().c_str()) == 0) { - currentPosition = glm::make_vec3(skeleton.bones[i].position); - currentRotation = glm::make_quat(skeleton.bones[i].rotation); - currentScale = glm::make_vec3(skeleton.bones[i].scale); - currentEditedBone = &skeleton.bones[i]; + connect(boneListWidget, &QTreeWidget::itemClicked, this, + &BoneEditor::treeItemClicked); - posEdit->setVector(currentPosition); - rotationEdit->setQuat(currentRotation); - scaleEdit->setVector(currentScale); - } + auto raceDeformGroup = new QGroupBox("Race Deform"); + layout->addWidget(raceDeformGroup); + auto raceDeformGroupLayout = new QFormLayout(); + raceDeformGroup->setLayout(raceDeformGroupLayout); + + raceDeformPosEdit = new Vector3Edit(currentRacePosition); + raceDeformGroupLayout->addRow("Position", raceDeformPosEdit); + + raceDeformRotationEdit = new QuaternionEdit(currentRaceRotation); + raceDeformGroupLayout->addRow("Rotation", raceDeformRotationEdit); + + raceDeformScaleEdit = new Vector3Edit(currentRaceScale); + raceDeformGroupLayout->addRow("Scale", raceDeformScaleEdit); +} + +void BoneEditor::treeItemClicked(QTreeWidgetItem *item, int column) { + auto &skeleton = *gearView->part().skeleton; + for (int i = 0; i < skeleton.num_bones; i++) { + if (strcmp(skeleton.bones[i].name, + item->text(column).toStdString().c_str()) == 0) { + currentPosition = glm::make_vec3(skeleton.bones[i].position); + currentRotation = glm::make_quat(skeleton.bones[i].rotation); + currentScale = glm::make_vec3(skeleton.bones[i].scale); + currentEditedBone = &skeleton.bones[i]; + + posEdit->setVector(currentPosition); + rotationEdit->setQuat(currentRotation); + scaleEdit->setVector(currentScale); + + glm::mat4 transformation; // your transformation matrix. + glm::vec3 scale; + glm::quat rotation; + glm::vec3 translation; + glm::vec3 skew; + glm::vec4 perspective; + glm::decompose(gearView->part().boneData[i].deformRaceMatrix, scale, + rotation, translation, skew, perspective); + + currentRacePosition = translation; + currentRaceRotation = rotation; + currentRaceScale = scale; + + raceDeformPosEdit->setVector(currentRacePosition); + raceDeformRotationEdit->setQuat(currentRaceRotation); + raceDeformScaleEdit->setVector(currentRaceScale); } - }); + } } #include "moc_boneeditor.cpp" \ No newline at end of file