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;
};
struct RotateAnimation {
SceneGroup* target;
QVector3D axis;
float angle;
float currentAngle;
int length;
double startFrame;
};
std::vector<std::vector<Particle>> particleSystems;
std::vector<RotateAnimation*> 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){