From 5d1a78b96141e50a900f5a600e8383a00cf7e01f Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Thu, 6 Jul 2023 17:37:14 -0400 Subject: [PATCH] Add a quaternion edit widget --- mdlviewer/include/quaternionedit.h | 24 +++++++++ mdlviewer/src/quaternionedit.cpp | 78 ++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 mdlviewer/include/quaternionedit.h create mode 100644 mdlviewer/src/quaternionedit.cpp diff --git a/mdlviewer/include/quaternionedit.h b/mdlviewer/include/quaternionedit.h new file mode 100644 index 0000000..ee3e4b0 --- /dev/null +++ b/mdlviewer/include/quaternionedit.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +#include + +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; +}; diff --git a/mdlviewer/src/quaternionedit.cpp b/mdlviewer/src/quaternionedit.cpp new file mode 100644 index 0000000..bd412f7 --- /dev/null +++ b/mdlviewer/src/quaternionedit.cpp @@ -0,0 +1,78 @@ +#include "quaternionedit.h" + +#include +#include +#include + +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(&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(&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(&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" \ No newline at end of file