From 1e9792b864c8565ac9d05796eb91fb03fb09a64d Mon Sep 17 00:00:00 2001 From: dooglus Date: Sun, 23 Sep 2007 18:50:21 +0000 Subject: [PATCH] Implemented feature request [ 1781903 ] make vertices/object move along paths. Added 'BLine Vector' and 'BLine Tangent' convert types to allow layers to move along arbitrary BLine paths. git-svn-id: http://svn.voria.com/code@744 1f10aa63-cdf2-0310-b900-c93c546f37ac --- synfig-core/trunk/src/synfig/Makefile.am | 4 +- synfig-core/trunk/src/synfig/valuenode.cpp | 4 + .../src/synfig/valuenode_blinecalctangent.cpp | 223 +++++++++++++++++++++ .../trunk/src/synfig/valuenode_blinecalctangent.h | 80 ++++++++ .../trunk/src/synfig/valuenode_blinecalcvertex.cpp | 223 +++++++++++++++++++++ .../trunk/src/synfig/valuenode_blinecalcvertex.h | 80 ++++++++ 6 files changed, 612 insertions(+), 2 deletions(-) create mode 100644 synfig-core/trunk/src/synfig/valuenode_blinecalctangent.cpp create mode 100644 synfig-core/trunk/src/synfig/valuenode_blinecalctangent.h create mode 100644 synfig-core/trunk/src/synfig/valuenode_blinecalcvertex.cpp create mode 100644 synfig-core/trunk/src/synfig/valuenode_blinecalcvertex.h diff --git a/synfig-core/trunk/src/synfig/Makefile.am b/synfig-core/trunk/src/synfig/Makefile.am index 2ae61f3..03658cf 100644 --- a/synfig-core/trunk/src/synfig/Makefile.am +++ b/synfig-core/trunk/src/synfig/Makefile.am @@ -16,8 +16,8 @@ TARGETSOURCES=target_scanline.cpp target_tile.cpp target_multi.cpp target_null.c IMPORTERHEADERS=listimporter.h IMPORTERSOURCES=listimporter.cpp -VALUENODEHEADERS=valuenode_exp.h valuenode_sine.h valuenode_radialcomposite.h valuenode_bline.h valuenode_segcalcvertex.h valuenode_segcalctangent.h valuenode_twotone.h valuenode_repeat_gradient.h valuenode_stripes.h valuenode_add.h valuenode_subtract.h valuenode_const.h valuenode_reference.h valuenode_linear.h valuenode_composite.h valuenode_dynamiclist.h valuenode_animated.h valuenode_scale.h valuenode_timedswap.h valuenode_gradientrotate.h -VALUENODESOURCES=valuenode_exp.cpp valuenode_sine.cpp valuenode_radialcomposite.cpp valuenode_bline.cpp valuenode_segcalcvertex.cpp valuenode_segcalctangent.cpp valuenode_twotone.cpp valuenode_repeat_gradient.cpp valuenode_stripes.cpp valuenode_add.cpp valuenode_subtract.cpp valuenode_const.cpp valuenode_reference.cpp valuenode_linear.cpp valuenode_composite.cpp valuenode_dynamiclist.cpp valuenode_animated.cpp valuenode_scale.cpp valuenode_timedswap.cpp valuenode_gradientrotate.cpp +VALUENODEHEADERS=valuenode_exp.h valuenode_sine.h valuenode_radialcomposite.h valuenode_bline.h valuenode_blinecalcvertex.h valuenode_blinecalctangent.h valuenode_segcalcvertex.h valuenode_segcalctangent.h valuenode_twotone.h valuenode_repeat_gradient.h valuenode_stripes.h valuenode_add.h valuenode_subtract.h valuenode_const.h valuenode_reference.h valuenode_linear.h valuenode_composite.h valuenode_dynamiclist.h valuenode_animated.h valuenode_scale.h valuenode_timedswap.h valuenode_gradientrotate.h +VALUENODESOURCES=valuenode_exp.cpp valuenode_sine.cpp valuenode_radialcomposite.cpp valuenode_bline.cpp valuenode_blinecalcvertex.cpp valuenode_blinecalctangent.cpp valuenode_segcalcvertex.cpp valuenode_segcalctangent.cpp valuenode_twotone.cpp valuenode_repeat_gradient.cpp valuenode_stripes.cpp valuenode_add.cpp valuenode_subtract.cpp valuenode_const.cpp valuenode_reference.cpp valuenode_linear.cpp valuenode_composite.cpp valuenode_dynamiclist.cpp valuenode_animated.cpp valuenode_scale.cpp valuenode_timedswap.cpp valuenode_gradientrotate.cpp VALUEHEADERS=blinepoint.h gradient.h value.h VALUESOURCES=blinepoint.cpp gradient.cpp value.cpp diff --git a/synfig-core/trunk/src/synfig/valuenode.cpp b/synfig-core/trunk/src/synfig/valuenode.cpp index 2bc08e7..eb652c6 100644 --- a/synfig-core/trunk/src/synfig/valuenode.cpp +++ b/synfig-core/trunk/src/synfig/valuenode.cpp @@ -42,6 +42,8 @@ #include "valuenode_composite.h" #include "valuenode_reference.h" #include "valuenode_scale.h" +#include "valuenode_blinecalctangent.h" +#include "valuenode_blinecalcvertex.h" #include "valuenode_segcalctangent.h" #include "valuenode_segcalcvertex.h" #include "valuenode_repeat_gradient.h" @@ -107,6 +109,8 @@ ValueNode::subsys_init() ADD_VALUENODE(ValueNode_Reference, "reference", _("Reference") ); ADD_VALUENODE(ValueNode_Repeat_Gradient,"repeat_gradient", _("Repeat Gradient") ); ADD_VALUENODE(ValueNode_Scale, "scale", _("Scale") ); + ADD_VALUENODE(ValueNode_BLineCalcTangent,"blinecalctangent",_("BLine Tangent") ); + ADD_VALUENODE(ValueNode_BLineCalcVertex,"blinecalcvertex", _("BLine Vertex") ); ADD_VALUENODE(ValueNode_SegCalcTangent, "segcalctangent", _("Segment Tangent") ); ADD_VALUENODE(ValueNode_SegCalcVertex, "segcalcvertex", _("Segment Vertex") ); ADD_VALUENODE(ValueNode_Stripes, "stripes", _("Stripes") ); diff --git a/synfig-core/trunk/src/synfig/valuenode_blinecalctangent.cpp b/synfig-core/trunk/src/synfig/valuenode_blinecalctangent.cpp new file mode 100644 index 0000000..778fb42 --- /dev/null +++ b/synfig-core/trunk/src/synfig/valuenode_blinecalctangent.cpp @@ -0,0 +1,223 @@ +/* === S Y N F I G ========================================================= */ +/*! \file valuenode_blinecalctangent.cpp +** \brief Template File +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "valuenode_blinecalctangent.h" +#include "valuenode_bline.h" +#include "valuenode_const.h" +#include "valuenode_composite.h" +#include "general.h" +#include "exception.h" +#include +#include + +#endif + +/* === U S I N G =========================================================== */ + +using namespace std; +using namespace etl; +using namespace synfig; + +/* === M A C R O S ========================================================= */ + +/* === G L O B A L S ======================================================= */ + +/* === P R O C E D U R E S ================================================= */ + +/* === M E T H O D S ======================================================= */ + +ValueNode_BLineCalcTangent::ValueNode_BLineCalcTangent(const ValueBase::Type &x): + LinkableValueNode(x) +{ + if(x!=ValueBase::TYPE_VECTOR) + throw Exception::BadType(ValueBase::type_name(x)); + + ValueNode_BLine* value_node(new ValueNode_BLine()); + set_link("bline",value_node); + set_link("loop",ValueNode_Const::create(bool(false))); + set_link("amount",ValueNode_Const::create(Real(0.5))); +} + +LinkableValueNode* +ValueNode_BLineCalcTangent::create_new()const +{ + return new ValueNode_BLineCalcTangent(ValueBase::TYPE_VECTOR); +} + +ValueNode_BLineCalcTangent* +ValueNode_BLineCalcTangent::create(const ValueBase &x) +{ + return new ValueNode_BLineCalcTangent(x.get_type()); +} + +ValueNode_BLineCalcTangent::~ValueNode_BLineCalcTangent() +{ + unlink_all(); +} + +ValueBase +ValueNode_BLineCalcTangent::operator()(Time t)const +{ + const std::vector bline((*bline_)(t)); + handle bline_value_node(bline_); + const bool looped(bline_value_node->get_loop()); + int size = bline.size(), from_vertex; + bool loop((*loop_)(t).get(bool())); + Real amount((*amount_)(t).get(Real())); + BLinePoint blinepoint0, blinepoint1; + + if (!looped) size--; + if (size < 1) return Vector(); + if (loop) + { + amount = amount - int(amount); + if (amount < 0) amount++; + } + else + { + if (amount < 0) amount = 0; + if (amount > 1) amount = 1; + } + + vector::const_iterator iter, next(bline.begin()); + + iter = looped ? --bline.end() : next++; + amount = amount * size; + from_vertex = int(amount); + if (from_vertex > size-1) from_vertex = size-1; + blinepoint0 = from_vertex ? *(next+from_vertex-1) : *iter; + blinepoint1 = *(next+from_vertex); + + etl::hermite curve(blinepoint0.get_vertex(), blinepoint1.get_vertex(), + blinepoint0.get_tangent2(), blinepoint1.get_tangent1()); + etl::derivative< etl::hermite > deriv(curve); + +#ifdef ETL_FIXED_DERIVATIVE + return deriv(amount-from_vertex)*(0.5); +#else + return deriv(amount-from_vertex)*(-0.5); +#endif +} + +String +ValueNode_BLineCalcTangent::get_name()const +{ + return "blinecalctangent"; +} + +String +ValueNode_BLineCalcTangent::get_local_name()const +{ + return _("BLine Tangent"); +} + +bool +ValueNode_BLineCalcTangent::set_link_vfunc(int i,ValueNode::Handle x) +{ + assert(i>=0 && i=0 && i=0 && i=0 && i Handle; + typedef etl::handle ConstHandle; + + virtual ValueBase operator()(Time t)const; + + virtual ~ValueNode_BLineCalcTangent(); + + virtual String get_name()const; + virtual String get_local_name()const; + + virtual ValueNode::LooseHandle get_link_vfunc(int i)const; + virtual int link_count()const; + virtual String link_name(int i)const; + + virtual String link_local_name(int i)const; + virtual int get_link_index_from_name(const String &name)const; + +protected: + virtual bool set_link_vfunc(int i,ValueNode::Handle x); + LinkableValueNode* create_new()const; + +public: + using synfig::LinkableValueNode::get_link_vfunc; + using synfig::LinkableValueNode::set_link_vfunc; + static bool check_type(ValueBase::Type type); + static ValueNode_BLineCalcTangent* create(const ValueBase &x=ValueBase::TYPE_VECTOR); +}; // END of class ValueNode_BLineCalcTangent + +}; // END of namespace synfig + +/* === E N D =============================================================== */ + +#endif diff --git a/synfig-core/trunk/src/synfig/valuenode_blinecalcvertex.cpp b/synfig-core/trunk/src/synfig/valuenode_blinecalcvertex.cpp new file mode 100644 index 0000000..074e41f --- /dev/null +++ b/synfig-core/trunk/src/synfig/valuenode_blinecalcvertex.cpp @@ -0,0 +1,223 @@ +/* === S Y N F I G ========================================================= */ +/*! \file valuenode_blinecalcvertex.cpp +** \brief Template File +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "valuenode_blinecalcvertex.h" +#include "valuenode_bline.h" +#include "valuenode_const.h" +#include "valuenode_composite.h" +#include "general.h" +#include "exception.h" +#include + +#endif + + +/* === U S I N G =========================================================== */ + +using namespace std; +using namespace etl; +using namespace synfig; + +/* === M A C R O S ========================================================= */ + +/* === G L O B A L S ======================================================= */ + +/* === P R O C E D U R E S ================================================= */ + +/* === M E T H O D S ======================================================= */ + +ValueNode_BLineCalcVertex::ValueNode_BLineCalcVertex(const ValueBase::Type &x): + LinkableValueNode(x) +{ + if(x!=ValueBase::TYPE_VECTOR) + throw Exception::BadType(ValueBase::type_name(x)); + + ValueNode_BLine* value_node(new ValueNode_BLine()); + set_link("bline",value_node); + set_link("loop",ValueNode_Const::create(bool(false))); + set_link("amount",ValueNode_Const::create(Real(0.5))); +} + +LinkableValueNode* +ValueNode_BLineCalcVertex::create_new()const +{ + return new ValueNode_BLineCalcVertex(ValueBase::TYPE_VECTOR); +} + +ValueNode_BLineCalcVertex* +ValueNode_BLineCalcVertex::create(const ValueBase &x) +{ + return new ValueNode_BLineCalcVertex(x.get_type()); +} + +ValueNode_BLineCalcVertex::~ValueNode_BLineCalcVertex() +{ + unlink_all(); +} + +ValueBase +ValueNode_BLineCalcVertex::operator()(Time t)const +{ + const std::vector bline((*bline_)(t)); + handle bline_value_node(bline_); + const bool looped(bline_value_node->get_loop()); + int size = bline.size(), from_vertex; + bool loop((*loop_)(t).get(bool())); + Real amount((*amount_)(t).get(Real())); + BLinePoint blinepoint0, blinepoint1; + + if (!looped) size--; + if (size < 1) return Vector(); + if (loop) + { + amount = amount - int(amount); + if (amount < 0) amount++; + } + else + { + if (amount < 0) amount = 0; + if (amount > 1) amount = 1; + } + + vector::const_iterator iter, next(bline.begin()); + + iter = looped ? --bline.end() : next++; + amount = amount * size; + from_vertex = int(amount); + if (from_vertex > size-1) from_vertex = size-1; + blinepoint0 = from_vertex ? *(next+from_vertex-1) : *iter; + blinepoint1 = *(next+from_vertex); + + etl::hermite curve(blinepoint0.get_vertex(), blinepoint1.get_vertex(), + blinepoint0.get_tangent2(), blinepoint1.get_tangent1()); + return curve(amount-from_vertex); +} + + + + + + + +String +ValueNode_BLineCalcVertex::get_name()const +{ + return "blinecalcvertex"; +} + +String +ValueNode_BLineCalcVertex::get_local_name()const +{ + return _("BLine Vertex"); +} + +bool +ValueNode_BLineCalcVertex::set_link_vfunc(int i,ValueNode::Handle x) +{ + assert(i>=0 && i=0 && i=0 && i=0 && i Handle; + typedef etl::handle ConstHandle; + + virtual ValueBase operator()(Time t)const; + + virtual ~ValueNode_BLineCalcVertex(); + + virtual String get_name()const; + virtual String get_local_name()const; + + virtual ValueNode::LooseHandle get_link_vfunc(int i)const; + virtual int link_count()const; + virtual String link_name(int i)const; + + virtual String link_local_name(int i)const; + virtual int get_link_index_from_name(const String &name)const; + +protected: + LinkableValueNode* create_new()const; + virtual bool set_link_vfunc(int i,ValueNode::Handle x); + +public: + using synfig::LinkableValueNode::get_link_vfunc; + using synfig::LinkableValueNode::set_link_vfunc; + static bool check_type(ValueBase::Type type); + static ValueNode_BLineCalcVertex* create(const ValueBase &x=ValueBase::TYPE_VECTOR); +}; // END of class ValueNode_BLineCalcVertex + +}; // END of namespace synfig + +/* === E N D =============================================================== */ + +#endif -- 2.7.4