This allows you to explicitly select quaternion animations. These appear
to be the default for bone animations and were silently dropped on the
floor before this change. A selection of quaternion or axis angle
implicitly disables bezier interpolation. Also fix the assumption that
Eulers are always in XYZ order.
When an emitter is a random sound emitter, then it is no longer possible
to address the individual sounds on that emitter. Instead, you can now
only stop or resume the randomization OR set the volume of the active
sound.
The old code was objectively terrible and placed the burden of handling
missing values effectively on the user instead of just figuring it out.
This is objectively better in that we can now count on all values being
"known" at keyframe convert time. Whether that "known" is because it's a
real keyframe, we evaluated it, or we pulled it out of our @$$ is
another story, of course.
A few observed problems:
- In PotS, any physical parented to another object fell through the
floor on link in.
- In MOUL, physicals in a subworld were exported in the wrong coordinate
system. They were exported in local-to-world space, but MOUL expects
them in local-to-subworld space.
- In PotS, any scaled physical parented to another object wiped out the
visual (but not physical) scaling due to an improper flag setting.
Font objects were exported as a completely different SceneObject,
causing the parenting relationship to be broken. This ensures that the
drawable is properly attached to the correct SceneObject.
This was troublesome in that the Blender documentation implies that
`FCurve.range()` returns times when it actually returns frame numbers.
This superceeds and closes#216. Prefer this fix because
`functools.reduce` is not as readable and the formatting is closer to
what exists in the animation converter.