1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-25 13:17:46 +00:00
novus/mdlviewer/src/boneeditor.cpp

129 lines
4.6 KiB
C++
Raw Normal View History

2023-07-06 17:36:58 -04:00
#include "boneeditor.h"
#include <QFormLayout>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QTreeWidget>
2023-07-06 17:36:58 -04:00
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtx/matrix_decompose.hpp>
2023-07-06 17:36:58 -04:00
#include "vec3edit.h"
#include "quaternionedit.h"
#include "gearview.h"
void addItem(physis_Skeleton& skeleton, physis_Bone& bone, QTreeWidget* widget, QTreeWidgetItem* parent_item = nullptr) {
auto item = new QTreeWidgetItem();
item->setText(0, bone.name);
if(parent_item == nullptr) {
widget->addTopLevelItem(item);
} else {
parent_item->addChild(item);
}
for(int i = 0; i < skeleton.num_bones; i++) {
if(skeleton.bones[i].parent_bone != nullptr && strcmp(skeleton.bones[i].parent_bone->name, bone.name) == 0)
addItem(skeleton, skeleton.bones[i], widget, item);
}
}
BoneEditor::BoneEditor(GearView *gearView, QWidget *parent)
: gearView(gearView) {
2023-07-06 17:36:58 -04:00
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);
});
2023-07-06 17:36:58 -04:00
boneListWidget->setMaximumWidth(200);
layout->addWidget(boneListWidget);
auto transformGroup = new QGroupBox("Bone Transform");
layout->addWidget(transformGroup);
auto transformGroupLayout = new QFormLayout();
transformGroup->setLayout(transformGroupLayout);
posEdit = new Vector3Edit(currentPosition);
2023-07-06 17:36:58 -04:00
connect(posEdit, &Vector3Edit::onValueChanged, [this, gearView] {
memcpy(currentEditedBone->position, glm::value_ptr(currentPosition),
sizeof(float) * 3);
gearView->part().reloadRenderer();
2023-07-06 17:36:58 -04:00
});
transformGroupLayout->addRow("Position", posEdit);
rotationEdit = new QuaternionEdit(currentRotation);
2023-07-06 17:36:58 -04:00
connect(rotationEdit, &QuaternionEdit::onValueChanged, [this, gearView] {
memcpy(currentEditedBone->rotation, glm::value_ptr(currentRotation),
sizeof(float) * 4);
gearView->part().reloadRenderer();
2023-07-06 17:36:58 -04:00
});
transformGroupLayout->addRow("Rotation", rotationEdit);
scaleEdit = new Vector3Edit(currentScale);
2023-07-06 17:36:58 -04:00
connect(scaleEdit, &Vector3Edit::onValueChanged, [this, gearView] {
memcpy(currentEditedBone->scale, glm::value_ptr(currentScale),
sizeof(float) * 3);
gearView->part().reloadRenderer();
2023-07-06 17:36:58 -04:00
});
transformGroupLayout->addRow("Scale", scaleEdit);
connect(boneListWidget, &QTreeWidget::itemClicked, this,
&BoneEditor::treeItemClicked);
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);
2023-07-06 17:36:58 -04:00
}
}
2023-07-06 17:36:58 -04:00
}
#include "moc_boneeditor.cpp"