Animated rotation

This commit is contained in:
Riku Avelar 2016-12-06 20:28:35 -05:00
parent dbc433dbf7
commit 1bf9169f09

View File

@ -75,7 +75,17 @@ namespace
bool active; bool active;
}; };
struct RotateAnimation {
SceneGroup* target;
QVector3D axis;
float angle;
float currentAngle;
int length;
double startFrame;
};
std::vector<std::vector<Particle>> particleSystems; std::vector<std::vector<Particle>> particleSystems;
std::vector<RotateAnimation*> cubeSpinQueue;
ToolAnimation swing; ToolAnimation swing;
@ -1274,6 +1284,23 @@ void Viewer::animate(){
double dt = 1/0.006;//time - startTime; double dt = 1/0.006;//time - startTime;
frame += dt * 0.006 * frame_mult; // 60fps frame += dt * 0.006 * frame_mult; // 60fps
startTime = time; 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(); update();
} }
@ -1303,26 +1330,39 @@ void Viewer::animationSpeedChange(int val) {
void Viewer::rotateSelected(RotateDirection dir) { void Viewer::rotateSelected(RotateDirection dir) {
if(selectedObj.shape == nullptr || selectedObj.shape->getParent() == nullptr) return; if(selectedObj.shape == nullptr || selectedObj.shape->getParent() == nullptr) return;
RotateAnimation* r = new RotateAnimation();
r->target = selectedObj.shape->getParent();
r->currentAngle = 0;
switch(dir) { switch(dir) {
case X_CCW: case X_CCW:
selectedObj.shape->getParent()->transform.rotate(90, 1, 0, 0); r->angle = 90;
r->axis = QVector3D(1,0,0);
break; break;
case X_CW: case X_CW:
selectedObj.shape->getParent()->transform.rotate(-90, 1, 0, 0); r->angle = -90;
r->axis = QVector3D(1,0,0);
break; break;
case Y_CCW: case Y_CCW:
selectedObj.shape->getParent()->transform.rotate(90, 0, 1, 0); r->angle = 90;
r->axis = QVector3D(0,1,0);
break; break;
case Y_CW: case Y_CW:
selectedObj.shape->getParent()->transform.rotate(-90, 0, 1, 0); r->angle = -90;
r->axis = QVector3D(0,1,0);
break; break;
case Z_CCW: case Z_CCW:
selectedObj.shape->getParent()->transform.rotate(90, 0, 0, 1); r->angle = 90;
r->axis = QVector3D(0,0,1);
break; break;
case Z_CW: case Z_CW:
selectedObj.shape->getParent()->transform.rotate(-90, 0, 0, 1); r->angle = -90;
r->axis = QVector3D(0,0,1);
break; break;
} }
cubeSpinQueue.push_back(r);
startSwingAnimation();
} }
PickedGeom Viewer::pickGeom(int x, int y){ PickedGeom Viewer::pickGeom(int x, int y){