From 1bf9169f09000cf160da623749287cbab5c1b26a Mon Sep 17 00:00:00 2001 From: Riku Avelar Date: Tue, 6 Dec 2016 20:28:35 -0500 Subject: [PATCH] Animated rotation --- src/viewer/simpleViewer.cpp | 52 ++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/src/viewer/simpleViewer.cpp b/src/viewer/simpleViewer.cpp index 8733e86..00e0046 100644 --- a/src/viewer/simpleViewer.cpp +++ b/src/viewer/simpleViewer.cpp @@ -75,7 +75,17 @@ namespace bool active; }; + struct RotateAnimation { + SceneGroup* target; + QVector3D axis; + float angle; + float currentAngle; + int length; + double startFrame; + }; + std::vector> particleSystems; + std::vector cubeSpinQueue; ToolAnimation swing; @@ -1274,6 +1284,23 @@ void Viewer::animate(){ double dt = 1/0.006;//time - startTime; frame += dt * 0.006 * frame_mult; // 60fps startTime = time; + + if(cubeSpinQueue.size() > 0) { + RotateAnimation* current = cubeSpinQueue.front(); + float angleIncrement = (dt * frame_mult) * 2 / current->angle; + bool clean = false; + if(fabs(current->currentAngle + angleIncrement) >= fabs(current->angle)) { + angleIncrement = (fabs(current->angle) - fabs(current->currentAngle)) * current->angle / fabs(current->angle); + clean = true; + } + current->currentAngle = angleIncrement + current->currentAngle; + current->target->transform.rotate(angleIncrement, current->axis); + + if(clean) { + cubeSpinQueue.erase(cubeSpinQueue.begin()); + } + } + update(); } @@ -1303,26 +1330,39 @@ void Viewer::animationSpeedChange(int val) { void Viewer::rotateSelected(RotateDirection dir) { if(selectedObj.shape == nullptr || selectedObj.shape->getParent() == nullptr) return; + RotateAnimation* r = new RotateAnimation(); + r->target = selectedObj.shape->getParent(); + r->currentAngle = 0; + switch(dir) { case X_CCW: - selectedObj.shape->getParent()->transform.rotate(90, 1, 0, 0); + r->angle = 90; + r->axis = QVector3D(1,0,0); break; case X_CW: - selectedObj.shape->getParent()->transform.rotate(-90, 1, 0, 0); + r->angle = -90; + r->axis = QVector3D(1,0,0); break; case Y_CCW: - selectedObj.shape->getParent()->transform.rotate(90, 0, 1, 0); + r->angle = 90; + r->axis = QVector3D(0,1,0); break; case Y_CW: - selectedObj.shape->getParent()->transform.rotate(-90, 0, 1, 0); + r->angle = -90; + r->axis = QVector3D(0,1,0); break; case Z_CCW: - selectedObj.shape->getParent()->transform.rotate(90, 0, 0, 1); + r->angle = 90; + r->axis = QVector3D(0,0,1); break; case Z_CW: - selectedObj.shape->getParent()->transform.rotate(-90, 0, 0, 1); + r->angle = -90; + r->axis = QVector3D(0,0,1); break; } + + cubeSpinQueue.push_back(r); + startSwingAnimation(); } PickedGeom Viewer::pickGeom(int x, int y){