1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-23 04:27:45 +00:00
novus/armoury/src/quaternionedit.cpp

80 lines
2.4 KiB
C++
Raw Normal View History

// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
// SPDX-License-Identifier: GPL-3.0-or-later
2023-07-06 17:37:14 -04:00
#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);
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(
2023-07-07 16:16:21 -04:00
spinBoxes.x, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), [this](double d) {
auto euler = glm::eulerAngles(this->quat);
euler.x = glm::radians(d);
2023-07-06 17:37:14 -04:00
2023-07-07 16:16:21 -04:00
this->quat = glm::quat(euler);
2023-07-06 17:37:14 -04:00
2023-07-07 16:16:21 -04:00
Q_EMIT onValueChanged();
});
2023-07-06 17:37:14 -04:00
connect(
2023-07-07 16:16:21 -04:00
spinBoxes.y, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), [this](double d) {
auto euler = glm::eulerAngles(this->quat);
euler.y = glm::radians(d);
2023-07-06 17:37:14 -04:00
2023-07-07 16:16:21 -04:00
this->quat = glm::quat(euler);
2023-07-06 17:37:14 -04:00
2023-07-07 16:16:21 -04:00
Q_EMIT onValueChanged();
});
2023-07-06 17:37:14 -04:00
connect(
2023-07-07 16:16:21 -04:00
spinBoxes.z, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), [this](double d) {
auto euler = glm::eulerAngles(this->quat);
euler.z = glm::radians(d);
2023-07-06 17:37:14 -04:00
2023-07-07 16:16:21 -04:00
this->quat = glm::quat(euler);
2023-07-06 17:37:14 -04:00
2023-07-07 16:16:21 -04:00
Q_EMIT onValueChanged();
});
2023-07-06 17:37:14 -04:00
}
2023-07-07 16:16:21 -04:00
void QuaternionEdit::setQuat(glm::quat& quat) {
2023-07-06 17:37:14 -04:00
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"