/* === S Y N F I G ========================================================= */
/*! \file valuenode_linear.cpp
-** \brief Template File
+** \brief Implementation of the "Linear" valuenode conversion.
**
-** $Id: valuenode_linear.cpp,v 1.1.1.1 2005/01/04 01:23:15 darco Exp $
+** $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
#include "valuenode_linear.h"
#include "valuenode_const.h"
#include "general.h"
+#include "color.h"
+#include <ETL/misc>
#endif
/* === M E T H O D S ======================================================= */
-ValueNode_Linear::ValueNode_Linear(const ValueBase::Type &x):
- LinkableValueNode(x)
+ValueNode_Linear::ValueNode_Linear(const ValueBase &value):
+ LinkableValueNode(value.get_type())
{
- switch(x)
+ switch(get_type())
{
+ case ValueBase::TYPE_ANGLE:
+ set_link("slope",ValueNode_Const::create(Angle::deg(0)));
+ set_link("offset",ValueNode_Const::create(value.get(Angle())));
+ break;
+ case ValueBase::TYPE_COLOR:
+ set_link("slope",ValueNode_Const::create(Color(0,0,0,0)));
+ set_link("offset",ValueNode_Const::create(value.get(Color())));
+ break;
+ case ValueBase::TYPE_INTEGER:
+ set_link("slope",ValueNode_Const::create(int(0)));
+ set_link("offset",ValueNode_Const::create(value.get(int())));
+ break;
case ValueBase::TYPE_REAL:
- set_link("slope",ValueNode_Const::create(Real(1)));
- set_link("offset",ValueNode_Const::create(Real(0)));
+ set_link("slope",ValueNode_Const::create(Real(0)));
+ set_link("offset",ValueNode_Const::create(value.get(Real())));
break;
case ValueBase::TYPE_TIME:
- set_link("slope",ValueNode_Const::create(Time(1)));
- set_link("offset",ValueNode_Const::create(Time(0)));
+ set_link("slope",ValueNode_Const::create(Time(0)));
+ set_link("offset",ValueNode_Const::create(value.get(Time())));
break;
case ValueBase::TYPE_VECTOR:
- set_link("slope",ValueNode_Const::create(Vector(1.0,1.0)));
- set_link("offset",ValueNode_Const::create(Vector(0.0,0.0)));
- break;
- case ValueBase::TYPE_ANGLE:
- set_link("slope",ValueNode_Const::create(Angle::deg(90)));
- set_link("offset",ValueNode_Const::create(Angle::deg(0)));
+ set_link("slope",ValueNode_Const::create(Vector(0,0)));
+ set_link("offset",ValueNode_Const::create(value.get(Vector())));
break;
default:
- throw Exception::BadType(ValueBase::type_name(x));
+ throw Exception::BadType(ValueBase::type_local_name(get_type()));
}
DCAST_HACK_ENABLE();
}
+LinkableValueNode*
+ValueNode_Linear::create_new()const
+{
+ return new ValueNode_Linear(get_type());
+}
+
ValueNode_Linear*
ValueNode_Linear::create(const ValueBase &x)
{
- return new ValueNode_Linear(x.get_type());
+ return new ValueNode_Linear(x);
}
ValueNode_Linear::~ValueNode_Linear()
ValueBase
ValueNode_Linear::operator()(Time t)const
{
+ if (getenv("SYNFIG_DEBUG_VALUENODE_OPERATORS"))
+ printf("%s:%d operator()\n", __FILE__, __LINE__);
+
switch(get_type())
{
- case ValueBase::TYPE_TIME:
- return (*m_)(t).get(Time())*t+(*b_)(t).get(Time());
+ case ValueBase::TYPE_ANGLE:
+ return (*m_)(t).get( Angle())*t+(*b_)(t).get( Angle());
+ case ValueBase::TYPE_COLOR:
+ return (*m_)(t).get( Color())*t+(*b_)(t).get( Color());
+ case ValueBase::TYPE_INTEGER:
+ return round_to_int((*m_)(t).get(int())*t+(*b_)(t).get(int()));
case ValueBase::TYPE_REAL:
- return (*m_)(t).get(Real())*t+(*b_)(t).get(Real());
+ return (*m_)(t).get( Real())*t+(*b_)(t).get( Real());
+ case ValueBase::TYPE_TIME:
+ return (*m_)(t).get( Time())*t+(*b_)(t).get( Time());
case ValueBase::TYPE_VECTOR:
return (*m_)(t).get(Vector())*t+(*b_)(t).get(Vector());
- case ValueBase::TYPE_ANGLE:
- return (*m_)(t).get(Angle())*t+(*b_)(t).get(Angle());
default:
assert(0);
break;
bool
ValueNode_Linear::check_type(ValueBase::Type type)
{
- return type==ValueBase::TYPE_REAL
- || type==ValueBase::TYPE_VECTOR
- || type==ValueBase::TYPE_TIME
- || type==ValueBase::TYPE_ANGLE;
+ return
+ type==ValueBase::TYPE_ANGLE ||
+ type==ValueBase::TYPE_COLOR ||
+ type==ValueBase::TYPE_INTEGER ||
+ type==ValueBase::TYPE_REAL ||
+ type==ValueBase::TYPE_TIME ||
+ type==ValueBase::TYPE_VECTOR ;
}
bool
-ValueNode_Linear::set_link_vfunc(int i,ValueNode::Handle x)
+ValueNode_Linear::set_link_vfunc(int i,ValueNode::Handle value)
{
- assert(i==0 || i==1);
- if(i==0)
- {
- m_=x;
- signal_child_changed()(i);signal_value_changed()();
- return true;
- }
- if(i==1)
+ assert(i>=0 && i<link_count());
+
+ switch(i)
{
- b_=x;
- signal_child_changed()(i);signal_value_changed()();
- return true;
+ case 0: CHECK_TYPE_AND_SET_VALUE(m_, get_type());
+ case 1: CHECK_TYPE_AND_SET_VALUE(b_, get_type());
}
return false;
}
ValueNode::LooseHandle
ValueNode_Linear::get_link_vfunc(int i)const
{
- assert(i==0 || i==1);
- if(i==0)
- return m_;
- if(i==1)
- return b_;
+ assert(i>=0 && i<link_count());
+ if(i==0) return m_;
+ if(i==1) return b_;
return 0;
}
String
ValueNode_Linear::link_name(int i)const
{
- assert(i==0 || i==1);
- if(i==0)
- return "slope";
- if(i==1)
- return "offset";
+ assert(i>=0 && i<link_count());
+
+ if(i==0) return "slope";
+ if(i==1) return "offset";
return String();
}
String
ValueNode_Linear::link_local_name(int i)const
{
- assert(i==0 || i==1);
+ assert(i>=0 && i<link_count());
+
if(i==0)
switch(get_type())
{
+ case ValueBase::TYPE_ANGLE:
+ case ValueBase::TYPE_COLOR:
+ case ValueBase::TYPE_INTEGER:
case ValueBase::TYPE_REAL:
case ValueBase::TYPE_TIME:
- case ValueBase::TYPE_ANGLE:
return _("Rate");
+ case ValueBase::TYPE_VECTOR:
default:
return _("Slope");
}
int
ValueNode_Linear::get_link_index_from_name(const String &name)const
{
- if(name=="slope")
- return 0;
- if(name=="offset")
- return 1;
+ if(name=="slope") return 0;
+ if(name=="offset") return 1;
throw Exception::BadLinkName(name);
}
-
-LinkableValueNode*
-ValueNode_Linear::create_new()const
-{
- return new ValueNode_Linear(get_type());
-}