/* === S Y N F I G ========================================================= */
/*! \file valuenode_animated.cpp
-** \brief Template File
+** \brief Implementation of the "Animated" valuenode conversion.
**
** $Id$
**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2007, 2008 Chris Moore
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
}
};
+#ifdef ANGLES_USE_LINEAR_INTERPOLATION
template <>
struct is_angle_type<Angle>
{
return true;
}
};
+#endif // ANGLES_USE_LINEAR_INTERPOLATION
/* === G L O B A L S ======================================================= */
Time r,s;
public:
- ValueNode* clone(const GUID& deriv_guid)const
+ ValueNode* clone(const synfig::GUID& deriv_guid)const
{
{ ValueNode* x(find_value_node(get_guid()^deriv_guid).get()); if(x)return x; }
_Hermite<T>* ret(new _Hermite<T>());
}
else
{
+ const Real& t(iter->get_tension()); // Tension
+ const Real& c(iter->get_continuity()); // Continuity
+ const Real& b(iter->get_bias()); // Bias
- const Real& t(iter->get_tension()); // Tension
- const Real& c(iter->get_continuity()); // Continuity
- const Real& b(iter->get_bias()); // Bias
+ // The following line works where the previous line fails.
+ value_type Pp; Pp=curve_list.back().second.p1(); // P_{i-1}
- // The folloing line works where the previous line fails.
- value_type Pp; Pp=curve_list.back().second.p1(); // P_{i-1}
+ const value_type& Pc(curve.second.p1()); // P_i
+ const value_type& Pn(curve.second.p2()); // P_{i+1}
- const value_type& Pc(curve.second.p1()); // P_i
- const value_type& Pn(curve.second.p2()); // P_{i+1}
+ // TCB
+ value_type vect(static_cast<value_type>
+ (subtract_func(Pc,Pp) *
+ (((1.0-t) * (1.0+c) * (1.0+b)) / 2.0) +
+ (Pn-Pc) * (((1.0-t) * (1.0-c) * (1.0-b)) / 2.0)));
- // TCB
- value_type vect(static_cast<value_type>(subtract_func(Pc,Pp)*(((1.0-t)*(1.0+c)*(1.0+b))/2.0)+(Pn-Pc)*(((1.0-t)*(1.0-c)*(1.0-b))/2.0)));
-
- // Tension Only
- //value_type vect=(value_type)((Pn-Pp)*(1.0-t));
+ // Tension Only
+ //value_type vect=(value_type)((Pn-Pp)*(1.0-t));
- // Linear
- //value_type vect=(value_type)(Pn-Pc);
+ // Linear
+ //value_type vect=(value_type)(Pn-Pc);
- // Debugging stuff
- //synfig::info("%d:t1: %s",i,tangent_info(Pp,Pn,vect).c_str());
+ // Debugging stuff
+ //synfig::info("%d:t1: %s",i,tangent_info(Pp,Pn,vect).c_str());
- // Adjust for time
- //vect=value_type(vect*(curve.second.get_dt()*2.0)/(curve.second.get_dt()+curve_list.back().second.get_dt()));
- //vect=value_type(vect*(curve.second.get_dt())/(curve_list.back().second.get_dt()));
+ // Adjust for time
+ //vect=value_type(vect*(curve.second.get_dt()*2.0)/(curve.second.get_dt()+curve_list.back().second.get_dt()));
+ //vect=value_type(vect*(curve.second.get_dt())/(curve_list.back().second.get_dt()));
- curve.second.t1()=vect;
+ curve.second.t1()=vect;
}
}
else if(
value_type Pn; Pn=after_next->get_value().get(T()); // P_{i+1}
// TCB
- value_type vect(static_cast<value_type>(subtract_func(Pc,Pp)*(((1.0-t)*(1.0-c)*(1.0+b))/2.0)+(Pn-Pc)*(((1.0-t)*(1.0+c)*(1.0-b))/2.0)));
+ value_type vect(static_cast<value_type>(subtract_func(Pc,Pp) * (((1.0-t)*(1.0-c)*(1.0+b))/2.0) +
+ (Pn-Pc) * (((1.0-t)*(1.0+c)*(1.0-b))/2.0)));
// Tension Only
//value_type vect((value_type)((Pn-Pp)*(1.0-t)));
if(iter_get_after==INTERPOLATION_HALT)
curve.second.t1()*=0;
+ // if this isn't the first curve
else if(iter_get_after != INTERPOLATION_LINEAR && !curve_list.empty())
- curve.second.t1()*=(curve.second.get_dt()*(timeadjust+1))/(curve.second.get_dt()*timeadjust+curve_list.back().second.get_dt());
+ // adjust it for the curve that came before it
+ curve.second.t1() = static_cast<T>(curve.second.t1() * // cast to prevent warning
+ // (time span of this curve) * 1.5
+ // -----------------------------------------------------------------
+ // ((time span of this curve) * 0.5) + (time span of previous curve)
+ (curve.second.get_dt()*(timeadjust+1)) /
+ (curve.second.get_dt()*timeadjust + curve_list.back().second.get_dt()));
if(next_get_before==INTERPOLATION_HALT)
curve.second.t2()*=0;
+ // if this isn't the last curve
else if(next_get_before != INTERPOLATION_LINEAR && after_next!=waypoint_list_.end())
- curve.second.t2()*=(curve.second.get_dt()*(timeadjust+1))/(curve.second.get_dt()*timeadjust+(after_next->get_time()-next->get_time()));
+ // adjust it for the curve that came after it
+ curve.second.t2() = static_cast<T>(curve.second.t2() * // cast to prevent warning
+ // (time span of this curve) * 1.5
+ // -------------------------------------------------------------
+ // ((time span of this curve) * 0.5) + (time span of next curve)
+ (curve.second.get_dt()*(timeadjust+1)) /
+ (curve.second.get_dt()*timeadjust+(after_next->get_time()-next->get_time())));
} // not CONSTANT
}
curve.first.set_rs(iter->get_time(), next->get_time());
curve.first.p1()=iter->get_time();
curve.first.p2()=next->get_time();
- curve.first.t1()=(curve.first.p2()-curve.first.p1())*(1.0f-iter->get_time_tension());
- curve.first.t2()=(curve.first.p2()-curve.first.p1())*(1.0f-next->get_time_tension());
+ curve.first.t1()=(curve.first.p2()-curve.first.p1())*(1.0f-iter->get_temporal_tension());
+ curve.first.t2()=(curve.first.p2()-curve.first.p1())*(1.0f-next->get_temporal_tension());
curve.first.sync();
Time r,s;
public:
- ValueNode* clone(const GUID& deriv_guid)const
+ ValueNode* clone(const synfig::GUID& deriv_guid)const
{
{ ValueNode* x(find_value_node(get_guid()^deriv_guid).get()); if(x)return x; }
_Constant<T>* ret(new _Constant<T>());
Time r,s;
public:
- ValueNode* clone(const GUID& deriv_guid)const
+ ValueNode* clone(const synfig::GUID& deriv_guid)const
{
{ ValueNode* x(find_value_node(get_guid()^deriv_guid).get()); if(x)return x; }
_AnimBool* ret(new _AnimBool());
default:
throw
Exception::BadType(strprintf(_("%s: You cannot use a %s in an animated ValueNode"),"synfig::ValueNode_Animated::create()",
- ValueBase::type_name(type).c_str())
+ ValueBase::type_local_name(type).c_str())
);
break;
}