#include MTS_NAMESPACE_BEGIN AnimatedTransform::AnimatedTransform(Stream *stream) { size_t nTracks = (size_t) stream->readUInt(); for (size_t i=0; ireadUInt(); AbstractAnimationTrack *track = NULL; switch (type) { case AbstractAnimationTrack::ETranslationX: case AbstractAnimationTrack::ETranslationY: case AbstractAnimationTrack::ETranslationZ: case AbstractAnimationTrack::EScaleX: case AbstractAnimationTrack::EScaleY: case AbstractAnimationTrack::EScaleZ: case AbstractAnimationTrack::ERotationX: case AbstractAnimationTrack::ERotationY: case AbstractAnimationTrack::ERotationZ: track = new FloatTrack(type, stream); break; case AbstractAnimationTrack::ETranslationXYZ: case AbstractAnimationTrack::EScaleXYZ: track = new VectorTrack(type, stream); break; case AbstractAnimationTrack::ERotationQuat: track = new QuatTrack(type, stream); break; default: Log(EError, "Encountered an unknown animation track type (%i)!", type); } track->incRef(); m_tracks.push_back(track); } } void AnimatedTransform::addTrack(AbstractAnimationTrack *track) { track->incRef(); m_tracks.push_back(track); } AnimatedTransform::~AnimatedTransform() { for (size_t i=0; idecRef(); } void AnimatedTransform::serialize(Stream *stream) const { stream->writeUInt((uint32_t) m_tracks.size()); for (size_t i=0; iserialize(stream); } /// Compute the transformation at the specified time value void AnimatedTransform::eval(Float t, Transform &trafo) const { Vector translation(0.0f); Vector scale(1.0f); Quaternion rotation; for (size_t i=0; igetType()) { case AbstractAnimationTrack::ETranslationX: translation.x = static_cast(track)->eval(t); break; case AbstractAnimationTrack::ETranslationY: translation.y = static_cast(track)->eval(t); break; case AbstractAnimationTrack::ETranslationZ: translation.z = static_cast(track)->eval(t); break; case AbstractAnimationTrack::ETranslationXYZ: translation = static_cast(track)->eval(t); break; case AbstractAnimationTrack::EScaleX: scale.x = static_cast(track)->eval(t); break; case AbstractAnimationTrack::EScaleY: scale.y = static_cast(track)->eval(t); break; case AbstractAnimationTrack::EScaleZ: scale.z = static_cast(track)->eval(t); break; case AbstractAnimationTrack::EScaleXYZ: scale = static_cast(track)->eval(t); break; case AbstractAnimationTrack::ERotationQuat: rotation = static_cast(track)->eval(t); break; default: Log(EError, "Encountered an unsupported " "animation track type: %i!", track->getType()); } } trafo = Transform::translate(translation) * rotation.toTransform() * Transform::scale(scale); } MTS_IMPLEMENT_CLASS(AbstractAnimationTrack, true, Object) MTS_IMPLEMENT_CLASS(AnimatedTransform, false, Object) MTS_NAMESPACE_END