mitsuba/src/librender/track.cpp

100 lines
3.2 KiB
C++
Raw Normal View History

2010-11-16 08:00:37 +08:00
#include <mitsuba/render/track.h>
MTS_NAMESPACE_BEGIN
2010-11-16 17:36:49 +08:00
AnimatedTransform::AnimatedTransform(Stream *stream) {
size_t nTracks = (size_t) stream->readUInt();
for (size_t i=0; i<nTracks; ++i) {
AbstractAnimationTrack::EType type =
(AbstractAnimationTrack::EType) stream->readUInt();
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:
m_tracks.push_back(new FloatTrack(type, stream));
break;
case AbstractAnimationTrack::ETranslationXYZ:
case AbstractAnimationTrack::EScaleXYZ:
m_tracks.push_back(new VectorTrack(type, stream));
break;
case AbstractAnimationTrack::ERotationQuat:
m_tracks.push_back(new QuatTrack(type, stream));
break;
default:
Log(EError, "Encountered an unknown animation track type!");
}
}
}
void AnimatedTransform::addTrack(AbstractAnimationTrack *track) {
track->incRef();
m_tracks.push_back(track);
}
AnimatedTransform::~AnimatedTransform() {
for (size_t i=0; i<m_tracks.size(); ++i)
m_tracks[i]->decRef();
}
void AnimatedTransform::serialize(Stream *stream) const {
stream->writeUInt((uint32_t) m_tracks.size());
for (size_t i=0; i<m_tracks.size(); ++i)
m_tracks[i]->serialize(stream);
}
/// Compute the transformation at the specified time value
void AnimatedTransform::eval(Float t, Transform &trafo) {
Vector translation(0.0f);
Vector scale(1.0f);
Quaternion rotation;
for (size_t i=0; i<m_tracks.size(); ++i) {
AbstractAnimationTrack *track = m_tracks[i];
switch (track->getType()) {
case AbstractAnimationTrack::ETranslationX:
translation.x = static_cast<FloatTrack *>(track)->eval(t);
break;
case AbstractAnimationTrack::ETranslationY:
translation.y = static_cast<FloatTrack *>(track)->eval(t);
break;
case AbstractAnimationTrack::ETranslationZ:
translation.z = static_cast<FloatTrack *>(track)->eval(t);
break;
case AbstractAnimationTrack::ETranslationXYZ:
translation = static_cast<VectorTrack *>(track)->eval(t);
break;
case AbstractAnimationTrack::EScaleX:
scale.x = static_cast<FloatTrack *>(track)->eval(t);
break;
case AbstractAnimationTrack::EScaleY:
scale.y = static_cast<FloatTrack *>(track)->eval(t);
break;
case AbstractAnimationTrack::EScaleZ:
scale.z = static_cast<FloatTrack *>(track)->eval(t);
break;
case AbstractAnimationTrack::EScaleXYZ:
scale = static_cast<VectorTrack *>(track)->eval(t);
break;
case AbstractAnimationTrack::ERotationQuat:
rotation = static_cast<QuatTrack *>(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);
}
2010-11-16 08:00:37 +08:00
MTS_IMPLEMENT_CLASS(AbstractAnimationTrack, true, Object)
2010-11-16 17:36:49 +08:00
MTS_IMPLEMENT_CLASS(AnimatedTransform, false, Object)
2010-11-16 08:00:37 +08:00
MTS_NAMESPACE_END