X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fvaluenode_animated.cpp;h=c2a32fccae628cc9dfa9dcc332438d211bb694a5;hb=2ca65d27048da3a0c8d64b1de572ea118ef6b47a;hp=1c37cbe185dea46ef8699fed2e29b6a3a0c16560;hpb=68dcfc249ef35fac4dadc60c3daa7433d212bc4b;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/valuenode_animated.cpp b/synfig-core/trunk/src/synfig/valuenode_animated.cpp index 1c37cbe..c2a32fc 100644 --- a/synfig-core/trunk/src/synfig/valuenode_animated.cpp +++ b/synfig-core/trunk/src/synfig/valuenode_animated.cpp @@ -1,11 +1,12 @@ /* === 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 @@ -160,6 +161,7 @@ struct is_angle_type } }; +#ifdef ANGLES_USE_LINEAR_INTERPOLATION template <> struct is_angle_type { @@ -168,6 +170,7 @@ struct is_angle_type return true; } }; +#endif // ANGLES_USE_LINEAR_INTERPOLATION /* === G L O B A L S ======================================================= */ @@ -234,7 +237,7 @@ private: 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* ret(new _Hermite()); @@ -374,34 +377,36 @@ public: } 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 + (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(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( @@ -428,7 +433,8 @@ public: value_type Pn; Pn=after_next->get_value().get(T()); // P_{i+1} // TCB - value_type vect(static_cast(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(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))); @@ -457,13 +463,27 @@ public: 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(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(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 } @@ -471,8 +491,8 @@ public: 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(); @@ -518,7 +538,7 @@ private: 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* ret(new _Constant()); @@ -616,7 +636,7 @@ private: 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()); @@ -1034,7 +1054,7 @@ synfig::ValueNode_Animated::create(ValueBase::Type type) 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; }