Module: synfig/synfig Branch: genete_width_outline Commit: e2b59ec90a9883bc4226298444fbd61e0c07ebc6 URL: http://synfig.git.sourceforge.net/git/gitweb.cgi?p=synfig/synfig;a=commit;h=e2b59ec90a9883bc4226298444fbd61e0c07ebc6
Author: Carlos Lopez <genet...@gmail.com> Date: Wed Jan 26 21:27:15 2011 +0100 Make the position's duck manipulable and when edited, modify the width point position subparameter --- synfig-studio/src/gui/duck.cpp | 22 +++++++ synfig-studio/src/gui/duckmatic.cpp | 6 +- .../src/synfigapp/actions/valuedescset.cpp | 62 +++++++++++++++++++- synfig-studio/src/synfigapp/instance.cpp | 1 + 4 files changed, 86 insertions(+), 5 deletions(-) diff --git a/synfig-studio/src/gui/duck.cpp b/synfig-studio/src/gui/duck.cpp index ad6d7f2..ddc928c 100644 --- a/synfig-studio/src/gui/duck.cpp +++ b/synfig-studio/src/gui/duck.cpp @@ -35,6 +35,7 @@ #include <ETL/misc> #include <synfig/valuenode_bline.h> +#include <synfig/valuenode_wplist.h> #include <synfig/valuenode_blinecalctangent.h> #include <synfig/valuenode_blinecalcvertex.h> #include <synfig/valuenode_blinecalcwidth.h> @@ -247,6 +248,27 @@ Duck::set_sub_trans_point(const synfig::Point &x, const synfig::Time &time) &closest_point); set_point(closest_point); } + ValueNode_Composite::Handle wpoint_composite; + ValueNode_WPList::Handle wplist; + wpoint_composite=ValueNode_Composite::Handle::cast_dynamic(get_value_desc().get_value_node()); + if(wpoint_composite && wpoint_composite->get_type() == ValueBase::TYPE_WIDTHPOINT) + if(get_value_desc().parent_is_value_node()) + { + wplist=ValueNode_WPList::Handle::cast_dynamic(get_value_desc().get_parent_value_node()); + if(wplist) + { + ValueNode_BLine::Handle bline(ValueNode_BLine::Handle::cast_dynamic(wplist->get_bline())); + synfig::Point closest_point = get_point(); + synfig::Real radius = 0.0; + synfig::find_closest_point( + (*bline)(time), + get_point(), + radius, + bline->get_loop(), + &closest_point); + set_point(closest_point); + } + } } else set_point((x-get_sub_trans_origin())/get_scalar()); } diff --git a/synfig-studio/src/gui/duckmatic.cpp b/synfig-studio/src/gui/duckmatic.cpp index 3b64d24..2291c2b 100644 --- a/synfig-studio/src/gui/duckmatic.cpp +++ b/synfig-studio/src/gui/duckmatic.cpp @@ -1880,10 +1880,10 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva bline_calc_vertex->set_link("amount", ValueNode_Const::create(width_point.get_position())); pduck->set_point((*bline_calc_vertex)(get_time())); // hack end - pduck->set_guid(calc_duck_guid(wpoint_value_desc,transform_stack)^synfig::GUID::hasher(".position")); + pduck->set_guid(calc_duck_guid(wpoint_value_desc,transform_stack)^synfig::GUID::hasher(".wpoint")); pduck->set_editable(synfigapp::is_editable(wpoint_value_desc.get_value_node())); pduck->signal_edited().clear(); - pduck->signal_edited().connect(sigc::bind(sigc::mem_fun(*this, &studio::Duckmatic::on_duck_changed), value_desc)); + pduck->signal_edited().connect(sigc::bind(sigc::mem_fun(*this, &studio::Duckmatic::on_duck_changed), wpoint_value_desc)); pduck->signal_user_click(2).clear(); pduck->signal_user_click(2).connect( sigc::bind( @@ -1894,7 +1894,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva &studio::CanvasView::popup_param_menu), false), 1.0f), - value_desc)); + wpoint_value_desc)); add_duck(pduck); if(param_desc) { diff --git a/synfig-studio/src/synfigapp/actions/valuedescset.cpp b/synfig-studio/src/synfigapp/actions/valuedescset.cpp index 90264c8..bb08bc6 100644 --- a/synfig-studio/src/synfigapp/actions/valuedescset.cpp +++ b/synfig-studio/src/synfigapp/actions/valuedescset.cpp @@ -38,6 +38,7 @@ #include "valuedescset.h" #include <synfigapp/canvasinterface.h> #include <synfig/valuenode_bline.h> +#include <synfig/valuenode_wplist.h> #include <synfig/valuenode_blinecalctangent.h> #include <synfig/valuenode_blinecalcvertex.h> #include <synfig/valuenode_blinecalcwidth.h> @@ -229,7 +230,9 @@ Action::ValueDescSet::prepare() // If we are a composite value node, then // we need to distribute the changes to the // individual parts - if(value_desc.is_value_node() && ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())) + // except if we are TYPE WIDTHPOINT + if(value_desc.is_value_node() && ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node()) + && value_desc.get_value_node()->get_type()!=ValueBase::TYPE_WIDTHPOINT) { ValueBase components[6]; int n_components(0); @@ -605,7 +608,62 @@ Action::ValueDescSet::prepare() } return; } - + + // WidthPoint Composite: adjust the width point position + // to achieve the desired point + // Code copied from BLineCalcVertex above + if (value_desc.parent_is_linkable_value_node() && value_desc.get_parent_value_node()->get_type() == ValueBase::TYPE_LIST) + { + if(ValueNode_DynamicList::Handle::cast_dynamic(value_desc.get_parent_value_node())->get_contained_type() == ValueBase::TYPE_WIDTHPOINT) + { + ValueNode_WPList::Handle wplist=ValueNode_WPList::Handle::cast_dynamic(value_desc.get_parent_value_node()); + if(wplist) + { + ValueNode_BLine::Handle bline(ValueNode_BLine::Handle::cast_dynamic(wplist->get_bline())); + ValueNode_Composite::Handle wpoint_composite(ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())); + if(wpoint_composite) + { + Real radius = 0.0; + ValueBase new_amount; + if (wplist->get_loop()){ + // The wplist is looped. Animation may require a position parameter + // outside the range of 0-1, so make sure that the amount does + // not change drastically. + Real amount_old((*(wpoint_composite->get_link("position")))(time).get(Real())); + Real amount_new = synfig::find_closest_point((*bline)(time), value, radius, bline->get_loop()); + Real difference = fmod( fmod(amount_new - amount_old, 1.0) + 1.0 , 1.0); + //fmod is called twice to avoid negative values + if (difference > 0.5) difference=difference-1.0; + + new_amount = amount_old+difference; + } else { + new_amount = synfig::find_closest_point((*bline)(time), value, radius, bline->get_loop()); + } + + Action::Handle action(Action::create("ValueDescSet")); + + if(!action) + throw Error(_("Unable to find action ValueDescSet (bug)")); + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("time",time); + action->set_param("new_value",new_amount); + action->set_param("value_desc",ValueDesc(wpoint_composite, wpoint_composite->get_link_index_from_name("position"))); + + if(!action->is_ready()) + throw Error(Error::TYPE_NOTREADY); + + add_action(action); + return; + } + else synfig::info("not wpoint composite"); + } + else synfig::info("not wplist"); + } + } + + // end reverse manipulations diff --git a/synfig-studio/src/synfigapp/instance.cpp b/synfig-studio/src/synfigapp/instance.cpp index 69dfb84..88ca877 100644 --- a/synfig-studio/src/synfigapp/instance.cpp +++ b/synfig-studio/src/synfigapp/instance.cpp @@ -42,6 +42,7 @@ #include <synfig/valuenode_blinecalctangent.h> #include <synfig/valuenode_blinecalcvertex.h> #include <synfig/valuenode_blinecalcwidth.h> +#include <synfig/valuenode_wplist.h> #include <synfig/valuenode_scale.h> #include <synfig/valuenode_range.h> #include <map> ------------------------------------------------------------------------------ Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)! Finally, a world-class log management solution at an even better price-free! Download using promo code Free_Logger_4_Dev2Dev. Offer expires February 28th, so secure your free ArcSight Logger TODAY! http://p.sf.net/sfu/arcsight-sfd2d _______________________________________________ Synfig-devl mailing list Synfig-devl@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/synfig-devl