Add group rotation
parent
8773ddd7ef
commit
8c37bc06dc
|
@ -1,11 +1,12 @@
|
|||
#include "modelwidget.h"
|
||||
#include "ds3file.h"
|
||||
#include "skeletongraphicswidget.h"
|
||||
#include <QMouseEvent>
|
||||
#include <QOpenGLShaderProgram>
|
||||
#include <QCoreApplication>
|
||||
#include <QGuiApplication>
|
||||
#include <math.h>
|
||||
#include "modelwidget.h"
|
||||
#include "ds3file.h"
|
||||
#include "skeletongraphicswidget.h"
|
||||
#include "modelwidget.h"
|
||||
|
||||
// Modifed from http://doc.qt.io/qt-5/qtopengl-hellogl2-glwidget-cpp.html
|
||||
|
||||
|
@ -63,14 +64,6 @@ ModelWidget::~ModelWidget()
|
|||
cleanup();
|
||||
}
|
||||
|
||||
static void qNormalizeAngle(int &angle)
|
||||
{
|
||||
while (angle < 0)
|
||||
angle += 360 * 16;
|
||||
while (angle > 360 * 16)
|
||||
angle -= 360 * 16;
|
||||
}
|
||||
|
||||
void ModelWidget::setXRotation(int angle)
|
||||
{
|
||||
qNormalizeAngle(angle);
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <QMenu>
|
||||
#include <QApplication>
|
||||
#include <QClipboard>
|
||||
#include <QMatrix4x4>
|
||||
#include "skeletongraphicswidget.h"
|
||||
#include "theme.h"
|
||||
#include "util.h"
|
||||
|
@ -29,7 +30,8 @@ SkeletonGraphicsWidget::SkeletonGraphicsWidget(const SkeletonDocument *document)
|
|||
m_lastAddedZ(0),
|
||||
m_selectionItem(nullptr),
|
||||
m_rangeSelectionStarted(false),
|
||||
m_mouseEventFromSelf(false)
|
||||
m_mouseEventFromSelf(false),
|
||||
m_lastRot(0)
|
||||
{
|
||||
setRenderHint(QPainter::Antialiasing, false);
|
||||
setBackgroundBrush(QBrush(QWidget::palette().color(QWidget::backgroundRole()), Qt::SolidPattern));
|
||||
|
@ -485,6 +487,29 @@ bool SkeletonGraphicsWidget::mouseMove(QMouseEvent *event)
|
|||
float byY = sceneRadiusToUnified(mouseScenePos.y() - m_lastScenePos.y());
|
||||
std::set<SkeletonGraphicsNodeItem *> nodeItems;
|
||||
readMergedSkeletonNodeSetFromRangeSelection(&nodeItems);
|
||||
if (QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier)) {
|
||||
QVector2D center = centerOfNodeItemSet(nodeItems);
|
||||
int degreeX = (mouseScenePos.x() - m_lastScenePos.x());
|
||||
qNormalizeAngle(degreeX);
|
||||
for (const auto &it: nodeItems) {
|
||||
SkeletonGraphicsNodeItem *nodeItem = it;
|
||||
QMatrix4x4 mat;
|
||||
QVector3D centerPoint(center.x(), center.y(), 0);
|
||||
QPointF nodeOrigin = nodeItem->origin();
|
||||
QVector3D nodeOriginPoint(nodeOrigin.x(), nodeOrigin.y(), 0);
|
||||
QVector3D p = nodeOriginPoint - centerPoint;
|
||||
mat.rotate(degreeX, 0, 0, 1);
|
||||
p = mat * p;
|
||||
QVector3D finalPoint = p + centerPoint;
|
||||
byX = sceneRadiusToUnified(finalPoint.x() - nodeOrigin.x());
|
||||
byY = sceneRadiusToUnified(finalPoint.y() - nodeOrigin.y());
|
||||
if (SkeletonProfile::Main == nodeItem->profile()) {
|
||||
emit moveNodeBy(nodeItem->id(), byX, byY, 0);
|
||||
} else {
|
||||
emit moveNodeBy(nodeItem->id(), 0, byY, byX);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (const auto &it: nodeItems) {
|
||||
SkeletonGraphicsNodeItem *nodeItem = it;
|
||||
if (SkeletonProfile::Main == nodeItem->profile()) {
|
||||
|
@ -493,6 +518,7 @@ bool SkeletonGraphicsWidget::mouseMove(QMouseEvent *event)
|
|||
emit moveNodeBy(nodeItem->id(), 0, byY, byX);
|
||||
}
|
||||
}
|
||||
}
|
||||
m_lastScenePos = mouseScenePos;
|
||||
m_moveHappened = true;
|
||||
return true;
|
||||
|
@ -609,6 +635,7 @@ bool SkeletonGraphicsWidget::mouseRelease(QMouseEvent *event)
|
|||
}
|
||||
if (m_moveStarted) {
|
||||
m_moveStarted = false;
|
||||
m_lastRot = 0;
|
||||
if (m_moveHappened)
|
||||
emit groupOperationAdded();
|
||||
}
|
||||
|
|
|
@ -363,6 +363,7 @@ private:
|
|||
std::set<QGraphicsItem *> m_rangeSelectionSet;
|
||||
bool m_mouseEventFromSelf;
|
||||
bool m_moveHappened;
|
||||
int m_lastRot;
|
||||
};
|
||||
|
||||
class SkeletonGraphicsContainerWidget : public QWidget
|
||||
|
|
|
@ -18,3 +18,12 @@ bool isFloatEqual(float a, float b)
|
|||
{
|
||||
return fabs(a - b) <= 0.000001;
|
||||
}
|
||||
|
||||
void qNormalizeAngle(int &angle)
|
||||
{
|
||||
while (angle < 0)
|
||||
angle += 360 * 16;
|
||||
while (angle > 360 * 16)
|
||||
angle -= 360 * 16;
|
||||
}
|
||||
|
||||
|
|
|
@ -11,5 +11,6 @@
|
|||
QString valueOfKeyInMapOrEmpty(const std::map<QString, QString> &map, const QString &key);
|
||||
bool isTrueValueString(const QString &str);
|
||||
bool isFloatEqual(float a, float b);
|
||||
void qNormalizeAngle(int &angle);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue