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

Display racial scaling transforms in bone editor

This commit is contained in:
Joshua Goins 2023-07-07 16:01:07 -04:00
parent a6d0728e83
commit fecb015ff2
2 changed files with 98 additions and 36 deletions

View file

@ -1,22 +1,42 @@
#pragma once #pragma once
#include "quaternionedit.h"
#include "vec3edit.h"
#include <QSpinBox> #include <QSpinBox>
#include <QTreeWidgetItem>
#include <QWidget> #include <QWidget>
#include <glm/detail/type_quat.hpp>
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <physis.hpp> #include <physis.hpp>
#include <glm/detail/type_quat.hpp>
class GearView; class GearView;
class BoneEditor : public QWidget { class BoneEditor : public QWidget {
Q_OBJECT Q_OBJECT
public: public:
explicit BoneEditor(GearView* gearView, QWidget* parent = nullptr); explicit BoneEditor(GearView *gearView, QWidget *parent = nullptr);
private: private:
glm::vec3 currentPosition; void treeItemClicked(QTreeWidgetItem *item, int column);
glm::quat currentRotation;
glm::vec3 currentScale; GearView *gearView;
physis_Bone* currentEditedBone;
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;
}; };

View file

@ -1,10 +1,11 @@
#include "boneeditor.h" #include "boneeditor.h"
#include <QTreeWidget>
#include <QHBoxLayout>
#include <QFormLayout> #include <QFormLayout>
#include <QGroupBox> #include <QGroupBox>
#include <QHBoxLayout>
#include <QTreeWidget>
#include <glm/gtc/type_ptr.hpp> #include <glm/gtc/type_ptr.hpp>
#include <glm/gtx/matrix_decompose.hpp>
#include "vec3edit.h" #include "vec3edit.h"
#include "quaternionedit.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(); auto layout = new QHBoxLayout();
setLayout(layout); setLayout(layout);
auto boneListWidget = new QTreeWidget(); auto boneListWidget = new QTreeWidget();
connect(gearView, &GearView::modelReloaded, this, [this, boneListWidget, gearView] { connect(gearView, &GearView::modelReloaded, this,
boneListWidget->clear(); [this, boneListWidget, gearView] {
addItem(*gearView->part().skeleton, *gearView->part().skeleton->root_bone, boneListWidget); boneListWidget->clear();
}); addItem(*gearView->part().skeleton,
*gearView->part().skeleton->root_bone, boneListWidget);
});
boneListWidget->setMaximumWidth(200); boneListWidget->setMaximumWidth(200);
@ -46,42 +50,80 @@ BoneEditor::BoneEditor(GearView* gearView, QWidget *parent) {
auto transformGroupLayout = new QFormLayout(); auto transformGroupLayout = new QFormLayout();
transformGroup->setLayout(transformGroupLayout); transformGroup->setLayout(transformGroupLayout);
auto posEdit = new Vector3Edit(currentPosition); posEdit = new Vector3Edit(currentPosition);
connect(posEdit, &Vector3Edit::onValueChanged, [this, gearView] { connect(posEdit, &Vector3Edit::onValueChanged, [this, gearView] {
memcpy(currentEditedBone->position, glm::value_ptr(currentPosition), sizeof(float) * 3); memcpy(currentEditedBone->position, glm::value_ptr(currentPosition),
gearView->part().reloadRenderer(); sizeof(float) * 3);
gearView->part().reloadRenderer();
}); });
transformGroupLayout->addRow("Position", posEdit); transformGroupLayout->addRow("Position", posEdit);
auto rotationEdit = new QuaternionEdit(currentRotation); rotationEdit = new QuaternionEdit(currentRotation);
connect(rotationEdit, &QuaternionEdit::onValueChanged, [this, gearView] { connect(rotationEdit, &QuaternionEdit::onValueChanged, [this, gearView] {
memcpy(currentEditedBone->rotation, glm::value_ptr(currentRotation), sizeof(float) * 4); memcpy(currentEditedBone->rotation, glm::value_ptr(currentRotation),
gearView->part().reloadRenderer(); sizeof(float) * 4);
gearView->part().reloadRenderer();
}); });
transformGroupLayout->addRow("Rotation", rotationEdit); transformGroupLayout->addRow("Rotation", rotationEdit);
auto scaleEdit = new Vector3Edit(currentScale); scaleEdit = new Vector3Edit(currentScale);
connect(scaleEdit, &Vector3Edit::onValueChanged, [this, gearView] { connect(scaleEdit, &Vector3Edit::onValueChanged, [this, gearView] {
memcpy(currentEditedBone->scale, glm::value_ptr(currentScale), sizeof(float) * 3); memcpy(currentEditedBone->scale, glm::value_ptr(currentScale),
gearView->part().reloadRenderer(); sizeof(float) * 3);
gearView->part().reloadRenderer();
}); });
transformGroupLayout->addRow("Scale", scaleEdit); transformGroupLayout->addRow("Scale", scaleEdit);
connect(boneListWidget, &QTreeWidget::itemClicked, [this, posEdit, rotationEdit, scaleEdit, gearView](QTreeWidgetItem* item, int column) { connect(boneListWidget, &QTreeWidget::itemClicked, this,
auto& skeleton = *gearView->part().skeleton; &BoneEditor::treeItemClicked);
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); auto raceDeformGroup = new QGroupBox("Race Deform");
rotationEdit->setQuat(currentRotation); layout->addWidget(raceDeformGroup);
scaleEdit->setVector(currentScale); 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" #include "moc_boneeditor.cpp"