From 24a04c6ee533b747f8ff6b128c86c6a01f390a88 Mon Sep 17 00:00:00 2001 From: dooglus Date: Thu, 6 Sep 2007 14:38:51 +0000 Subject: [PATCH] Allow the 'linear' convert type to work with colors and integers, like the 'timed swap' one does. Change the initial values when converting to 'linear' such that the 'rate' is zero and the 'offset' is the previous value of the parameter being converted. Also did some general tidying up. git-svn-id: http://svn.voria.com/code@617 1f10aa63-cdf2-0310-b900-c93c546f37ac --- synfig-core/trunk/src/synfig/valuenode_linear.cpp | 88 ++++++++++++---------- synfig-core/trunk/src/synfig/valuenode_linear.h | 2 +- .../trunk/src/synfig/valuenode_timedswap.cpp | 46 +++++------ synfig-core/trunk/src/synfig/valuenode_timedswap.h | 2 - 4 files changed, 74 insertions(+), 64 deletions(-) diff --git a/synfig-core/trunk/src/synfig/valuenode_linear.cpp b/synfig-core/trunk/src/synfig/valuenode_linear.cpp index b8ca108..df82057 100644 --- a/synfig-core/trunk/src/synfig/valuenode_linear.cpp +++ b/synfig-core/trunk/src/synfig/valuenode_linear.cpp @@ -32,6 +32,7 @@ #include "valuenode_linear.h" #include "valuenode_const.h" #include "general.h" +#include "color.h" #endif @@ -49,29 +50,37 @@ using namespace synfig; /* === 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_name(get_type())); } DCAST_HACK_ENABLE(); @@ -80,7 +89,7 @@ ValueNode_Linear::ValueNode_Linear(const ValueBase::Type &x): ValueNode_Linear* ValueNode_Linear::create(const ValueBase &x) { - return new ValueNode_Linear(x.get_type()); + return new ValueNode_Linear(x); } ValueNode_Linear::~ValueNode_Linear() @@ -93,14 +102,18 @@ ValueNode_Linear::operator()(Time t)const { 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 static_cast((*m_)(t).get(int())*t+(*b_)(t).get(int()) + 0.5f); 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; @@ -124,10 +137,13 @@ ValueNode_Linear::get_local_name()const 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 @@ -153,11 +169,8 @@ 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_; - + if(i==0) return m_; + if(i==1) return b_; return 0; } @@ -171,10 +184,8 @@ String ValueNode_Linear::link_name(int i)const { assert(i==0 || i==1); - if(i==0) - return "slope"; - if(i==1) - return "offset"; + if(i==0) return "slope"; + if(i==1) return "offset"; return String(); } @@ -185,10 +196,13 @@ ValueNode_Linear::link_local_name(int i)const 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"); } @@ -200,10 +214,8 @@ ValueNode_Linear::link_local_name(int i)const 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); } diff --git a/synfig-core/trunk/src/synfig/valuenode_linear.h b/synfig-core/trunk/src/synfig/valuenode_linear.h index b3d217c..51d13ee 100644 --- a/synfig-core/trunk/src/synfig/valuenode_linear.h +++ b/synfig-core/trunk/src/synfig/valuenode_linear.h @@ -40,7 +40,7 @@ class ValueNode_Linear : public LinkableValueNode ValueNode::RHandle m_; ValueNode::RHandle b_; - ValueNode_Linear(const ValueBase::Type &x); + ValueNode_Linear(const ValueBase &value); public: diff --git a/synfig-core/trunk/src/synfig/valuenode_timedswap.cpp b/synfig-core/trunk/src/synfig/valuenode_timedswap.cpp index b456bf9..c0011ea 100644 --- a/synfig-core/trunk/src/synfig/valuenode_timedswap.cpp +++ b/synfig-core/trunk/src/synfig/valuenode_timedswap.cpp @@ -56,14 +56,6 @@ ValueNode_TimedSwap::ValueNode_TimedSwap(const ValueBase &value): { switch(get_type()) { - case ValueBase::TYPE_REAL: - set_link("before",ValueNode_Const::create(value.get(Real()))); - set_link("after",ValueNode_Const::create(value.get(Real()))); - break; - case ValueBase::TYPE_VECTOR: - set_link("before",ValueNode_Const::create(value.get(Vector()))); - set_link("after",ValueNode_Const::create(value.get(Vector()))); - break; case ValueBase::TYPE_ANGLE: set_link("before",ValueNode_Const::create(value.get(Angle()))); set_link("after",ValueNode_Const::create(value.get(Angle()))); @@ -76,10 +68,18 @@ ValueNode_TimedSwap::ValueNode_TimedSwap(const ValueBase &value): set_link("before",ValueNode_Const::create(value.get(int()))); set_link("after",ValueNode_Const::create(value.get(int()))); break; + case ValueBase::TYPE_REAL: + set_link("before",ValueNode_Const::create(value.get(Real()))); + set_link("after",ValueNode_Const::create(value.get(Real()))); + break; case ValueBase::TYPE_TIME: set_link("before",ValueNode_Const::create(value.get(Time()))); set_link("after",ValueNode_Const::create(value.get(Time()))); break; + case ValueBase::TYPE_VECTOR: + set_link("before",ValueNode_Const::create(value.get(Vector()))); + set_link("after",ValueNode_Const::create(value.get(Vector()))); + break; default: throw Exception::BadType(ValueBase::type_name(get_type())); } @@ -202,18 +202,6 @@ synfig::ValueNode_TimedSwap::operator()(Time t)const switch(get_type()) { - case ValueBase::TYPE_REAL: - { - Real a=(*after)(t).get(Real()); - Real b=(*before)(t).get(Real()); - return (b-a)*amount+a; - } - case ValueBase::TYPE_VECTOR: - { - Vector a=(*after)(t).get(Vector()); - Vector b=(*before)(t).get(Vector()); - return (b-a)*amount+a; - } case ValueBase::TYPE_ANGLE: { Angle a=(*after)(t).get(Angle()); @@ -233,12 +221,24 @@ synfig::ValueNode_TimedSwap::operator()(Time t)const float b=(float)(*before)(t).get(int()); return static_cast((b-a)*amount+a+0.5f); } + case ValueBase::TYPE_REAL: + { + Real a=(*after)(t).get(Real()); + Real b=(*before)(t).get(Real()); + return (b-a)*amount+a; + } case ValueBase::TYPE_TIME: { Time a=(*after)(t).get(Time()); Time b=(*before)(t).get(Time()); return (b-a)*amount+a; } + case ValueBase::TYPE_VECTOR: + { + Vector a=(*after)(t).get(Vector()); + Vector b=(*before)(t).get(Vector()); + return (b-a)*amount+a; + } default: break; } @@ -342,10 +342,10 @@ bool ValueNode_TimedSwap::check_type(ValueBase::Type type) { return - type==ValueBase::TYPE_REAL || - type==ValueBase::TYPE_VECTOR || type==ValueBase::TYPE_ANGLE || type==ValueBase::TYPE_COLOR || type==ValueBase::TYPE_INTEGER || - type==ValueBase::TYPE_TIME; + type==ValueBase::TYPE_REAL || + type==ValueBase::TYPE_TIME || + type==ValueBase::TYPE_VECTOR; } diff --git a/synfig-core/trunk/src/synfig/valuenode_timedswap.h b/synfig-core/trunk/src/synfig/valuenode_timedswap.h index 5795f28..066e296 100644 --- a/synfig-core/trunk/src/synfig/valuenode_timedswap.h +++ b/synfig-core/trunk/src/synfig/valuenode_timedswap.h @@ -60,11 +60,9 @@ public: bool set_after(const ValueNode::Handle &a); ValueNode::Handle get_after()const; - void set_swap_time_real(Time x); bool set_swap_time(const ValueNode::Handle &x); ValueNode::Handle get_swap_time()const; - void set_swap_length_real(Time x); bool set_swap_length(const ValueNode::Handle &x); ValueNode::Handle get_swap_length()const; -- 2.7.4