/** * @brief * Returns position, rotation and scale from a matrix */ void PLTools::GetPosRotScale(const GMatrix &mTransform, Point3 &vPos, Quat &qRot, Point3 &vScale, bool bFlip) { // Get the position vPos = mTransform.Translation(); // Get the rotation of the node as quaternion qRot = mTransform.Rotation(); // Flip 180 degree around the y-axis? (true for camera and spot lights) if (bFlip) { Quat qRotationOffset; // We have to add a rotation about the x-axis of -90 degree... is this a IGame transform bug or something other odd?? float fAngles[] = {static_cast<float>(HALFPI), 0.0f, 0.0f}; EulerToQuat(fAngles, qRotationOffset); qRot = qRotationOffset*qRot; // We have to 'invert the z-axis', this is no PixelLight bug or so, we decided to do so to make things more universal fAngles[0] = 0.0f; fAngles[2] = static_cast<float>(PI); EulerToQuat(fAngles, qRotationOffset); qRot = qRotationOffset*qRot; } // Look out! We REALLY need to take the parity of the transform matrix into account! vScale = mTransform.Scaling()*static_cast<float>(mTransform.Parity()); }