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

Reply via email to