mirror of
https://github.com/redstrate/Novus.git
synced 2025-04-24 04:57:45 +00:00
Add a quaternion edit widget
This commit is contained in:
parent
0e216457c0
commit
5d1a78b961
2 changed files with 102 additions and 0 deletions
24
mdlviewer/include/quaternionedit.h
Normal file
24
mdlviewer/include/quaternionedit.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QSpinBox>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
|
class QuaternionEdit : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit QuaternionEdit(glm::quat& quat, QWidget* parent = nullptr);
|
||||||
|
|
||||||
|
void setQuat(glm::quat& quat);
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void onValueChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct {
|
||||||
|
QDoubleSpinBox *x, *y, *z;
|
||||||
|
} spinBoxes;
|
||||||
|
|
||||||
|
glm::quat& quat;
|
||||||
|
};
|
78
mdlviewer/src/quaternionedit.cpp
Normal file
78
mdlviewer/src/quaternionedit.cpp
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
#include "quaternionedit.h"
|
||||||
|
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <glm/gtc/quaternion.hpp>
|
||||||
|
|
||||||
|
QuaternionEdit::QuaternionEdit(glm::quat& quat, QWidget* parent) : QWidget(parent), quat(quat) {
|
||||||
|
auto itemsLayout = new QHBoxLayout(this);
|
||||||
|
itemsLayout->setMargin(0);
|
||||||
|
|
||||||
|
spinBoxes.x = new QDoubleSpinBox();
|
||||||
|
spinBoxes.y = new QDoubleSpinBox();
|
||||||
|
spinBoxes.z = new QDoubleSpinBox();
|
||||||
|
|
||||||
|
spinBoxes.x->setMinimum(-10000.0);
|
||||||
|
spinBoxes.x->setMaximum(10000.0);
|
||||||
|
|
||||||
|
spinBoxes.y->setMinimum(-10000.0);
|
||||||
|
spinBoxes.y->setMaximum(10000.0);
|
||||||
|
|
||||||
|
spinBoxes.z->setMinimum(-10000.0);
|
||||||
|
spinBoxes.z->setMaximum(10000.0);
|
||||||
|
|
||||||
|
itemsLayout->addWidget(spinBoxes.x);
|
||||||
|
itemsLayout->addWidget(spinBoxes.y);
|
||||||
|
itemsLayout->addWidget(spinBoxes.z);
|
||||||
|
|
||||||
|
auto euler = glm::eulerAngles(quat);
|
||||||
|
euler.x = glm::degrees(euler.x);
|
||||||
|
euler.y = glm::degrees(euler.y);
|
||||||
|
euler.z = glm::degrees(euler.z);
|
||||||
|
|
||||||
|
spinBoxes.x->setValue(euler.x);
|
||||||
|
spinBoxes.y->setValue(euler.y);
|
||||||
|
spinBoxes.z->setValue(euler.z);
|
||||||
|
|
||||||
|
connect(
|
||||||
|
spinBoxes.x, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), [this](double d) {
|
||||||
|
auto euler = glm::eulerAngles(this->quat);
|
||||||
|
euler.x = glm::radians(d);
|
||||||
|
|
||||||
|
this->quat = glm::quat(euler);
|
||||||
|
|
||||||
|
Q_EMIT onValueChanged();
|
||||||
|
});
|
||||||
|
connect(
|
||||||
|
spinBoxes.y, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), [this](double d) {
|
||||||
|
auto euler = glm::eulerAngles(this->quat);
|
||||||
|
euler.y = glm::radians(d);
|
||||||
|
|
||||||
|
this->quat = glm::quat(euler);
|
||||||
|
|
||||||
|
Q_EMIT onValueChanged();
|
||||||
|
});
|
||||||
|
connect(
|
||||||
|
spinBoxes.z, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), [this](double d) {
|
||||||
|
auto euler = glm::eulerAngles(this->quat);
|
||||||
|
euler.z = glm::radians(d);
|
||||||
|
|
||||||
|
this->quat = glm::quat(euler);
|
||||||
|
|
||||||
|
Q_EMIT onValueChanged();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void QuaternionEdit::setQuat(glm::quat &quat) {
|
||||||
|
this->quat = quat;
|
||||||
|
auto euler = glm::eulerAngles(quat);
|
||||||
|
euler.x = glm::degrees(euler.x);
|
||||||
|
euler.y = glm::degrees(euler.y);
|
||||||
|
euler.z = glm::degrees(euler.z);
|
||||||
|
|
||||||
|
spinBoxes.x->setValue(euler.x);
|
||||||
|
spinBoxes.y->setValue(euler.y);
|
||||||
|
spinBoxes.z->setValue(euler.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "moc_quaternionedit.cpp"
|
Loading…
Add table
Reference in a new issue