Added copyright lines for files I've edited this year.
[synfig.git] / synfig-core / trunk / src / synfig / valuenode_blinecalctangent.cpp
index 778fb42..671ce59 100644 (file)
@@ -1,11 +1,12 @@
 /* === S Y N F I G ========================================================= */
 /*!    \file valuenode_blinecalctangent.cpp
-**     \brief Template File
+**     \brief Implementation of the "BLine Tangent" 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
@@ -57,8 +58,8 @@ using namespace synfig;
 ValueNode_BLineCalcTangent::ValueNode_BLineCalcTangent(const ValueBase::Type &x):
        LinkableValueNode(x)
 {
-       if(x!=ValueBase::TYPE_VECTOR)
-               throw Exception::BadType(ValueBase::type_name(x));
+       if(x!=ValueBase::TYPE_ANGLE && x!=ValueBase::TYPE_VECTOR)
+               throw Exception::BadType(ValueBase::type_local_name(x));
 
        ValueNode_BLine* value_node(new ValueNode_BLine());
        set_link("bline",value_node);
@@ -69,7 +70,7 @@ ValueNode_BLineCalcTangent::ValueNode_BLineCalcTangent(const ValueBase::Type &x)
 LinkableValueNode*
 ValueNode_BLineCalcTangent::create_new()const
 {
-       return new ValueNode_BLineCalcTangent(ValueBase::TYPE_VECTOR);
+       return new ValueNode_BLineCalcTangent(get_type());
 }
 
 ValueNode_BLineCalcTangent*
@@ -95,7 +96,13 @@ ValueNode_BLineCalcTangent::operator()(Time t)const
        BLinePoint blinepoint0, blinepoint1;
 
        if (!looped) size--;
-       if (size < 1) return Vector();
+       if (size < 1)
+               switch (get_type())
+               {
+                       case ValueBase::TYPE_ANGLE:  return Angle();
+                       case ValueBase::TYPE_VECTOR: return Vector();
+                       default: assert(0); return ValueBase();
+               }
        if (loop)
        {
                amount = amount - int(amount);
@@ -121,9 +128,19 @@ ValueNode_BLineCalcTangent::operator()(Time t)const
        etl::derivative< etl::hermite<Vector> > deriv(curve);
 
 #ifdef ETL_FIXED_DERIVATIVE
-       return deriv(amount-from_vertex)*(0.5);
+       switch (get_type())
+       {
+               case ValueBase::TYPE_ANGLE:  return (deriv(amount-from_vertex)*(0.5)).angle();
+               case ValueBase::TYPE_VECTOR: return deriv(amount-from_vertex)*(0.5);
+               default: assert(0); return ValueBase();
+       }
 #else
-       return deriv(amount-from_vertex)*(-0.5);
+       switch (get_type())
+       {
+               case ValueBase::TYPE_ANGLE:  return (deriv(amount-from_vertex)*(-0.5)).angle();
+               case ValueBase::TYPE_VECTOR: return deriv(amount-from_vertex)*(-0.5);
+               default: assert(0); return ValueBase();
+       }
 #endif
 }
 
@@ -140,23 +157,15 @@ ValueNode_BLineCalcTangent::get_local_name()const
 }
 
 bool
-ValueNode_BLineCalcTangent::set_link_vfunc(int i,ValueNode::Handle x)
+ValueNode_BLineCalcTangent::set_link_vfunc(int i,ValueNode::Handle value)
 {
        assert(i>=0 && i<link_count());
+
        switch(i)
        {
-               case 0:
-                       bline_=x;
-                       signal_child_changed()(i);signal_value_changed()();
-                       return true;
-               case 1:
-                       loop_=x;
-                       signal_child_changed()(i);signal_value_changed()();
-                       return true;
-               case 2:
-                       amount_=x;
-                       signal_child_changed()(i);signal_value_changed()();
-                       return true;
+       case 0: CHECK_TYPE_AND_SET_VALUE(bline_,  ValueBase::TYPE_LIST);
+       case 1: CHECK_TYPE_AND_SET_VALUE(loop_,   ValueBase::TYPE_BOOL);
+       case 2: CHECK_TYPE_AND_SET_VALUE(amount_, ValueBase::TYPE_REAL);
        }
        return false;
 }
@@ -165,6 +174,7 @@ ValueNode::LooseHandle
 ValueNode_BLineCalcTangent::get_link_vfunc(int i)const
 {
        assert(i>=0 && i<link_count());
+
        switch(i)
        {
                case 0: return bline_;
@@ -185,6 +195,7 @@ String
 ValueNode_BLineCalcTangent::link_name(int i)const
 {
        assert(i>=0 && i<link_count());
+
        switch(i)
        {
                case 0: return "bline";
@@ -198,6 +209,7 @@ String
 ValueNode_BLineCalcTangent::link_local_name(int i)const
 {
        assert(i>=0 && i<link_count());
+
        switch(i)
        {
                case 0: return _("BLine");
@@ -219,5 +231,6 @@ ValueNode_BLineCalcTangent::get_link_index_from_name(const String &name)const
 bool
 ValueNode_BLineCalcTangent::check_type(ValueBase::Type type)
 {
-       return type==ValueBase::TYPE_VECTOR;
+       return (type==ValueBase::TYPE_ANGLE ||
+                       type==ValueBase::TYPE_VECTOR);
 }