mirror of
https://github.com/redstrate/Novus.git
synced 2025-04-25 05:17:44 +00:00
Display racial scaling transforms in bone editor
This commit is contained in:
parent
a6d0728e83
commit
fecb015ff2
2 changed files with 98 additions and 36 deletions
|
@ -1,22 +1,42 @@
|
|||
#pragma once
|
||||
|
||||
#include "quaternionedit.h"
|
||||
#include "vec3edit.h"
|
||||
#include <QSpinBox>
|
||||
#include <QTreeWidgetItem>
|
||||
#include <QWidget>
|
||||
#include <glm/detail/type_quat.hpp>
|
||||
#include <glm/glm.hpp>
|
||||
#include <physis.hpp>
|
||||
#include <glm/detail/type_quat.hpp>
|
||||
|
||||
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;
|
||||
};
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
#include "boneeditor.h"
|
||||
|
||||
#include <QTreeWidget>
|
||||
#include <QHBoxLayout>
|
||||
#include <QFormLayout>
|
||||
#include <QGroupBox>
|
||||
#include <QHBoxLayout>
|
||||
#include <QTreeWidget>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include <glm/gtx/matrix_decompose.hpp>
|
||||
|
||||
#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"
|
Loading…
Add table
Reference in a new issue