/* * Update each tick * Time is the percentage of the way through the duration */ void PageTurn3D::update(float time) { float tt = MAX(0, time - 0.25f); float deltaAy = (tt * tt * 500); float ay = -100 - deltaAy; float deltaTheta = sqrtf(time); float theta = deltaTheta>0.5?(float)M_PI_2*deltaTheta:(float)M_PI_2*(1-deltaTheta); float rotateByYAxis = (2-time)* M_PI; float sinTheta = sinf(theta); float cosTheta = cosf(theta); for (int i = 0; i <= _gridSize.width; ++i) { for (int j = 0; j <= _gridSize.height; ++j) { // Get original vertex Vec3 p = getOriginalVertex(Vec2(i ,j)); p.x -= getGridRect().origin.x; float R = sqrtf((p.x * p.x) + ((p.y - ay) * (p.y - ay))); float r = R * sinTheta; float alpha = asinf( p.x / R ); float beta = alpha / sinTheta; float cosBeta = cosf( beta ); // If beta > PI then we've wrapped around the cone // Reduce the radius to stop these points interfering with others if (beta <= M_PI) { p.x = ( r * sinf(beta)); } else { // Force X = 0 to stop wrapped // points p.x = 0; } p.y = ( R + ay - ( r * (1 - cosBeta) * sinTheta)); // We scale z here to avoid the animation being // too much bigger than the screen due to perspective transform p.z = (r * ( 1 - cosBeta ) * cosTheta);// "100" didn't work for p.x = p.z * sinf(rotateByYAxis) + p.x * cosf(rotateByYAxis); p.z = p.z * cosf(rotateByYAxis) - p.x * sinf(rotateByYAxis); p.z/=7; // Stop z coord from dropping beneath underlying page in a transition // issue #751 if( p.z < 0.5f ) { p.z = 0.5f; } // Set new coords p.x += getGridRect().origin.x; setVertex(Vec2(i, j), p); } } }
QRectF GraphicsGridItem::boundingRect() const { return getGridRect(); }