prepare_keyframe(tkf);
}
-void Animation::add_event(const Time::TimeDelta &t, const string &n, const Variant &v)
-{
- Event event;
- event.time = t;
- event.name = n;
- event.value = v;
- events.push_back(event);
-}
-
-void Animation::set_looping(bool l)
-{
- looping = l;
-}
-
void Animation::prepare_keyframe(TimedKeyFrame &tkf)
{
const KeyFrame::UniformMap &kf_uniforms = tkf.keyframe->get_uniforms();
tkf.prepare(*this);
}
+void Animation::add_event(const Time::TimeDelta &t, const string &n, const Variant &v)
+{
+ Event event;
+ event.time = t;
+ event.name = n;
+ event.value = v;
+ events.push_back(event);
+}
+
+void Animation::set_looping(bool l)
+{
+ looping = l;
+}
+
Animation::AxisInterpolation::AxisInterpolation():
slope(0),
Animation::AxisInterpolation::AxisInterpolation(const float *axis1, const float *axis2)
{
// Compute a normalized vector halfway between the two endpoints
- float half[3];
float a1_len = 0;
float h_len = 0;
+ float cos_half = 0;
for(unsigned i=0; i<3; ++i)
{
- half[i] = (axis1[i]+axis2[i])/2;
+ float half_i = (axis1[i]+axis2[i])/2;
+ cos_half += axis1[i]*half_i;
a1_len += axis1[i]*axis1[i];
- h_len += half[i]*half[i];
+ h_len += half_i*half_i;
}
// Compute correction factors for smooth interpolation
- float cos_half = (axis1[0]*half[0]+axis1[1]*half[1]+axis1[2]*half[2])/sqrt(a1_len*h_len);
+ cos_half = min(max(cos_half/sqrt(a1_len*h_len), -1.0f), 1.0f);
float angle = acos(cos_half);
slope = (angle ? angle/tan(angle) : 1);
scale = cos_half;
return Matrix();
}
- // We must redo the base point correction since interpolation throws if off
+ // We must redo the base point correction since interpolation throws it off
// XXX This should probably be done on local matrices
Matrix result = iter->pose_matrices[link].get(time_since_keyframe/iter->delta_t);
const Vector3 &base = animation->armature->get_link(link).get_base();
obj.add_event(current_time, n, Vector4(v0, v1, v2, v3));
}
+void Animation::Loader::interval(float t)
+{
+ current_time += t*Time::sec;
+}
+
void Animation::Loader::keyframe(const string &n)
{
obj.add_keyframe(current_time, get_collection().get<KeyFrame>(n));
obj.add_keyframe(current_time, kf);
}
-void Animation::Loader::interval(float t)
-{
- current_time += t*Time::sec;
-}
-
} // namespace GL
} // namespace Msp