Animations: Fix spin for Compositor lights

The 'spin' animation has a strange behaviour:
it pushes a temporary rotation matrix on the transformation stack during
cull traversal, and removes it thereafter.
Thus, the rotation matrix is missing outside of cull traversal, e.g.
when the position of Compositor lights is computed.

The same issue was fixed for the 'rotate' animation by commit
e202d4e4a5
(this mentions broken 'picking' animations as a different manifestation
of the same issue).

Fix this by setting the angle of the persistent SGRotateTransform,
instead of creating a temporary rotation matrix.
This commit is contained in:
Colin Geniet 2021-01-13 12:18:22 +01:00
parent 0b9849d232
commit d54e9b7675

View File

@ -1134,16 +1134,8 @@ void SpinAnimCallback::operator()(osg::Node* node, osg::NodeVisitor* nv)
double intPart; double intPart;
double rot = modf(rotation, &intPart); double rot = modf(rotation, &intPart);
double angle = rot * 2.0 * osg::PI; double angle = rot * 2.0 * osg::PI;
const SGVec3d& sgcenter = transform->getCenter(); transform->setAngleRad(angle);
const SGVec3d& sgaxis = transform->getAxis();
Matrixd mat = Matrixd::translate(-sgcenter[0], -sgcenter[1], -sgcenter[2])
* Matrixd::rotate(angle, sgaxis[0], sgaxis[1], sgaxis[2])
* Matrixd::translate(sgcenter[0], sgcenter[1], sgcenter[2])
* *cv->getModelViewMatrix();
ref_ptr<RefMatrix> refmat = new RefMatrix(mat);
cv->pushModelViewMatrix(refmat.get(), transform->getReferenceFrame());
traverse(transform, nv); traverse(transform, nv);
cv->popModelViewMatrix();
} else { } else {
traverse(transform, nv); traverse(transform, nv);
} }