From e556a9e73eaf9af70f65f197de762d3b507f5d7e Mon Sep 17 00:00:00 2001 From: dooglus Date: Wed, 26 Dec 2007 14:17:16 +0000 Subject: [PATCH] Add new convert type 'Time Loop' to allow individual parameters to be time looped. The parameters are different, but hopefully more intuitive than the existing "Time Loop" layer. The 'Time Loop' layer's parameters should be adjusted to match these some time soon. git-svn-id: http://svn.voria.com/code@1226 1f10aa63-cdf2-0310-b900-c93c546f37ac --- synfig-core/trunk/src/synfig/Makefile.am | 4 +- synfig-core/trunk/src/synfig/valuenode.cpp | 9 +- .../trunk/src/synfig/valuenode_timeloop.cpp | 196 +++++++++++++++++++++ synfig-core/trunk/src/synfig/valuenode_timeloop.h | 84 +++++++++ 4 files changed, 290 insertions(+), 3 deletions(-) create mode 100644 synfig-core/trunk/src/synfig/valuenode_timeloop.cpp create mode 100644 synfig-core/trunk/src/synfig/valuenode_timeloop.h diff --git a/synfig-core/trunk/src/synfig/Makefile.am b/synfig-core/trunk/src/synfig/Makefile.am index c25e993..613b45e 100644 --- a/synfig-core/trunk/src/synfig/Makefile.am +++ b/synfig-core/trunk/src/synfig/Makefile.am @@ -14,8 +14,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_cos.h valuenode_atan2.h valuenode_radialcomposite.h valuenode_bline.h valuenode_blinecalcvertex.h valuenode_blinecalctangent.h valuenode_blinereversetangent.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_range.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 valuenode_switch.h -VALUENODESOURCES=valuenode_exp.cpp valuenode_sine.cpp valuenode_cos.cpp valuenode_atan2.cpp valuenode_radialcomposite.cpp valuenode_bline.cpp valuenode_blinecalcvertex.cpp valuenode_blinecalctangent.cpp valuenode_blinereversetangent.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_range.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 valuenode_switch.cpp +VALUENODEHEADERS=valuenode_exp.h valuenode_sine.h valuenode_cos.h valuenode_atan2.h valuenode_radialcomposite.h valuenode_bline.h valuenode_blinecalcvertex.h valuenode_blinecalctangent.h valuenode_blinereversetangent.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_range.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 valuenode_switch.h valuenode_timeloop.h +VALUENODESOURCES=valuenode_exp.cpp valuenode_sine.cpp valuenode_cos.cpp valuenode_atan2.cpp valuenode_radialcomposite.cpp valuenode_bline.cpp valuenode_blinecalcvertex.cpp valuenode_blinecalctangent.cpp valuenode_blinereversetangent.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_range.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 valuenode_switch.cpp valuenode_timeloop.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 e46bf10..827ef4f 100644 --- a/synfig-core/trunk/src/synfig/valuenode.cpp +++ b/synfig-core/trunk/src/synfig/valuenode.cpp @@ -64,6 +64,7 @@ #include "valuenode_atan2.h" #include "valuenode_exp.h" #include "valuenode_switch.h" +#include "valuenode_timeloop.h" #include "layer.h" @@ -134,6 +135,7 @@ ValueNode::subsys_init() ADD_VALUENODE(ValueNode_Atan2, "atan2", _("aTan2") ); ADD_VALUENODE(ValueNode_Exp, "exp", _("Exponential") ); ADD_VALUENODE(ValueNode_Switch, "switch", _("Switch") ); + ADD_VALUENODE(ValueNode_TimeLoop, "timeloop", _("Time Loop") ); #undef ADD_VALUENODE #undef ADD_VALUENODE2 @@ -468,7 +470,12 @@ PlaceholderValueNode::PlaceholderValueNode(ValueBase::Type type): ValueNode* LinkableValueNode::clone(const GUID& deriv_guid)const { - { ValueNode* x(find_value_node(get_guid()^deriv_guid).get()); if(x)return x; } + // printf("%s:%d clone()\n", __FILE__, __LINE__); + { ValueNode* x(find_value_node(get_guid()^deriv_guid).get()); if(x) + { + printf("VALUENODE FOUND VALUENODE\n"); + return x; + }} int i; LinkableValueNode *ret=create_new(); diff --git a/synfig-core/trunk/src/synfig/valuenode_timeloop.cpp b/synfig-core/trunk/src/synfig/valuenode_timeloop.cpp new file mode 100644 index 0000000..913a4c6 --- /dev/null +++ b/synfig-core/trunk/src/synfig/valuenode_timeloop.cpp @@ -0,0 +1,196 @@ +/* === S Y N F I G ========================================================= */ +/*! \file valuenode_timeloop.cpp +** \brief Implementation of the "Time Loop" valuenode conversion. +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 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 +** 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_timeloop.h" +#include "valuenode_const.h" +#include "general.h" + +#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_TimeLoop::ValueNode_TimeLoop(const ValueBase::Type &x): + LinkableValueNode(x) +{ +} + +ValueNode_TimeLoop::ValueNode_TimeLoop(const ValueNode::Handle &x): + LinkableValueNode(x->get_type()) +{ + set_link("link", x); + set_link("link_time", ValueNode_Const::create(Time(0))); + set_link("local_time", ValueNode_Const::create(Time(1))); + set_link("duration", ValueNode_Const::create(Time(0))); +} + +ValueNode_TimeLoop* +ValueNode_TimeLoop::create(const ValueBase &x) +{ + return new ValueNode_TimeLoop(ValueNode_Const::create(x)); +} + +LinkableValueNode* +ValueNode_TimeLoop::create_new()const +{ + return new ValueNode_TimeLoop(get_type()); +} + +ValueNode_TimeLoop::~ValueNode_TimeLoop() +{ + unlink_all(); +} + +bool +ValueNode_TimeLoop::set_link_vfunc(int i,ValueNode::Handle x) +{ + assert(i >= 0 && i < link_count()); + switch(i) + { + case 0: link_ = x; break; + case 1: link_time_ = x; break; + case 2: local_time_ = x; break; + case 3: duration_ = x; break; + default: return false; + } + + signal_child_changed()(i); + signal_value_changed()(); + return true; +} + +ValueNode::LooseHandle +ValueNode_TimeLoop::get_link_vfunc(int i)const +{ + assert(i >= 0 && i < link_count()); + if(i==0) return link_; + if(i==1) return link_time_; + if(i==2) return local_time_; + if(i==3) return duration_; + + return 0; +} + +int +ValueNode_TimeLoop::link_count()const +{ + return 4; +} + +String +ValueNode_TimeLoop::link_local_name(int i)const +{ + assert(i >= 0 && i < link_count()); + if(i==0) return _("Link"); + if(i==1) return _("Link Time"); + if(i==2) return _("Local Time"); + if(i==3) return _("Duration"); + return String(); +} + +String +ValueNode_TimeLoop::link_name(int i)const +{ + assert(i >= 0 && i < link_count()); + if(i==0) return "link"; + if(i==1) return "link_time"; + if(i==2) return "local_time"; + if(i==3) return "duration"; + return String(); +} + +int +ValueNode_TimeLoop::get_link_index_from_name(const String &name)const +{ + if(name=="link") return 0; + if(name=="link_time") return 1; + if(name=="local_time") return 2; + if(name=="duration") return 3; + + throw Exception::BadLinkName(name); +} + +ValueBase +ValueNode_TimeLoop::operator()(Time t)const +{ + Time link_time = (*link_time_) (t).get(Time()); + Time local_time = (*local_time_)(t).get(Time()); + Time duration = (*duration_) (t).get(Time()); + + if (duration == 0) + t = link_time; + else if (duration > 0) + { + t -= local_time; + t -= floor(t / duration) * duration; + t = link_time + t; + } + else + { + t -= local_time; + t -= floor(t / duration) * duration; + t = link_time + duration - t; + } + + return (*link_)(t); +} + +String +ValueNode_TimeLoop::get_name()const +{ + return "timeloop"; +} + +String +ValueNode_TimeLoop::get_local_name()const +{ + return _("Time Loop"); +} + +bool +ValueNode_TimeLoop::check_type(ValueBase::Type type) +{ + if(type) + return true; + return false; +} diff --git a/synfig-core/trunk/src/synfig/valuenode_timeloop.h b/synfig-core/trunk/src/synfig/valuenode_timeloop.h new file mode 100644 index 0000000..f237d7b --- /dev/null +++ b/synfig-core/trunk/src/synfig/valuenode_timeloop.h @@ -0,0 +1,84 @@ +/* === S Y N F I G ========================================================= */ +/*! \file valuenode_timeloop.h +** \brief Header file for implementation of the "TimeLoop" valuenode conversion. +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 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 +** 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 +*/ +/* ========================================================================= */ + +/* === S T A R T =========================================================== */ + +#ifndef __SYNFIG_VALUENODE_TIMELOOP_H +#define __SYNFIG_VALUENODE_TIMELOOP_H + +/* === H E A D E R S ======================================================= */ + +#include "valuenode.h" + +/* === M A C R O S ========================================================= */ + +/* === C L A S S E S & S T R U C T S ======================================= */ + +namespace synfig { + +class ValueNode_TimeLoop : public LinkableValueNode +{ + ValueNode::RHandle link_; + ValueNode::RHandle link_time_; + ValueNode::RHandle local_time_; + ValueNode::RHandle duration_; + +public: + typedef etl::handle Handle; + typedef etl::handle ConstHandle; + + ValueNode_TimeLoop(const ValueBase::Type &x); + ValueNode_TimeLoop(const ValueNode::Handle &x); + + virtual ValueBase operator()(Time t)const; + + virtual ~ValueNode_TimeLoop(); + + 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_TimeLoop* create(const ValueBase &x); +}; // END of class ValueNode_TimeLoop + +}; // END of namespace synfig + +/* === E N D =============================================================== */ + +#endif -- 2.7.4