Merge branch 'nikitakit_smoothbline' into nikitakit_ducks
authorNikita Kitaev <nikitakit@gmail.com>
Sat, 28 Nov 2009 19:35:02 +0000 (11:35 -0800)
committerNikita Kitaev <nikitakit@gmail.com>
Sat, 28 Nov 2009 19:35:02 +0000 (11:35 -0800)
Conflicts:
synfig-core/po/fr.po
synfig-core/po/ru.po
synfig-studio/po/es.po
synfig-studio/po/fr.po
synfig-studio/po/ru.po
synfig-studio/src/gtkmm/duckmatic.cpp

12 files changed:
synfig-core/src/synfig/blinepoint.cpp
synfig-core/src/synfig/blinepoint.h
synfig-core/src/synfig/loadcanvas.cpp
synfig-core/src/synfig/valuenode_composite.cpp
synfig-studio/src/gtkmm/canvasview.cpp
synfig-studio/src/gtkmm/instance.cpp
synfig-studio/src/gtkmm/state_draw.cpp
synfig-studio/src/gtkmm/state_normal.cpp
synfig-studio/src/synfigapp/actions/blinepointtangentmerge.cpp
synfig-studio/src/synfigapp/actions/blinepointtangentsplit.cpp
synfig-studio/src/synfigapp/actions/valuedescset.cpp
synfig-studio/src/synfigapp/value_desc.h

index 4291bbf..83e004d 100644 (file)
@@ -49,15 +49,22 @@ using namespace synfig;
 void
 synfig::BLinePoint::reverse()
 {
-       if(split_tangent_)
-       {
-               std::swap(tangent_[0],tangent_[1]);
-               tangent_[0]=-tangent_[0];
-               tangent_[1]=-tangent_[1];
-       }
-       else
-       {
-               tangent_[0]=-tangent_[0];
-               tangent_[1]=-tangent_[1];
-       }
+       std::swap(tangent_[0],tangent_[1]);
+       tangent_[0]=-tangent_[0];
+       tangent_[1]=-tangent_[1];
+}
+
+void
+synfig::BLinePoint::normalize(int i)
+{
+       //i is the number of the tangent to modify
+       //other tangent is (1-i)
+       split_tangent_=(!link_radius_ && !link_theta_);
+       if (link_radius_ && link_theta_)
+               tangent_[i]=tangent_[1-i];
+    else if (link_radius_)
+               tangent_[i]=tangent_[i].norm()*tangent_[1-i].mag();
+    else if (link_theta_)
+               tangent_[i]=tangent_[1-i].norm()*tangent_[i].mag();
+
 }
index 3a75d4b..9a07ba8 100644 (file)
@@ -47,6 +47,8 @@ private:
        float   width_;
        float   origin_;
        bool    split_tangent_;
+       bool    link_radius_;
+       bool    link_theta_;
 
 public:
 
@@ -54,7 +56,9 @@ public:
                vertex_(Point(0,0)),
                width_(0.01),
                origin_(0.0),
-               split_tangent_(false)
+               split_tangent_(false),
+               link_radius_(true),
+               link_theta_(true)
        { tangent_[0] = Point(0,0); tangent_[1] = Point(0,0); }
 
        const Point& get_vertex()const { return vertex_; }
@@ -62,10 +66,10 @@ public:
 
 
        const Vector& get_tangent1()const { return tangent_[0]; }
-       const Vector& get_tangent2()const { return split_tangent_?tangent_[1]:tangent_[0]; }
+       const Vector& get_tangent2()const { return tangent_[1]; }
        void set_tangent(const Vector& x) { tangent_[0]=tangent_[1]=x; }
-       void set_tangent1(const Vector& x) { tangent_[0]=x; }
-       void set_tangent2(const Vector& x) { tangent_[1]=x; }
+       void set_tangent1(const Vector& x) { tangent_[0]=x; normalize(1);}
+       void set_tangent2(const Vector& x) { tangent_[1]=x; normalize(0);}
 
 
        const float& get_width()const { return width_; }
@@ -79,7 +83,16 @@ public:
 
 
        const bool& get_split_tangent_flag()const { return split_tangent_; }
-       void set_split_tangent_flag(bool x=true) { split_tangent_=x; }
+       void set_split_tangent_flag(bool x=true) { link_radius_=link_theta_=!x; normalize();}
+
+       const bool& get_link_radius_flag()const { return link_radius_; }
+       void set_link_radius_flag(bool x=true) { link_radius_=x; normalize();}
+
+       const bool& get_link_theta_flag()const { return link_theta_; }
+       void set_link_theta_flag(bool x=true) { link_theta_=x; normalize();}
+
+       //normalize tangents, i.e. make sure their values correspond to the linkage
+       void normalize(int i=0);
 
        void reverse();
 
index 3da37e9..099bba2 100644 (file)
@@ -1340,8 +1340,8 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element *element,Canvas::Handle c
                if (version == "0.1" || version == "0.2" || version == "0.3")
                {
                        handle<LinkableValueNode> scale_value_node=LinkableValueNode::create("scale",type);
-                       scale_value_node->set_link(scale_value_node->get_link_index_from_name("link"), value_node);
-                       scale_value_node->set_link(scale_value_node->get_link_index_from_name("scalar"), ValueNode_Const::create(Real(0.5)));
+                       scale_value_node->set_link("link", value_node);
+                       scale_value_node->set_link("scalar", ValueNode_Const::create(Real(0.5)));
                        value_node = scale_value_node;
                }
        }
index 7e18ea0..fca9d1d 100644 (file)
@@ -80,12 +80,12 @@ synfig::ValueNode_Composite::ValueNode_Composite(const ValueBase &value):
                case ValueBase::TYPE_BLINEPOINT:
                {
                        BLinePoint bline_point(value);
-                       set_link(0,ValueNode_Const::create(bline_point.get_vertex()));
-                       set_link(1,ValueNode_Const::create(bline_point.get_width()));
-                       set_link(2,ValueNode_Const::create(bline_point.get_origin()));
-                       set_link(3,ValueNode_Const::create(bline_point.get_split_tangent_flag()));
-                       set_link(4,ValueNode_RadialComposite::create(bline_point.get_tangent1()));
-                       set_link(5,ValueNode_RadialComposite::create(bline_point.get_tangent2()));
+                       set_link("point",ValueNode_Const::create(bline_point.get_vertex()));
+                       set_link("width",ValueNode_Const::create(bline_point.get_width()));
+                       set_link("origin",ValueNode_Const::create(bline_point.get_origin()));
+                       set_link("split",ValueNode_Const::create(bline_point.get_split_tangent_flag()));
+                       set_link("t1",ValueNode_RadialComposite::create(bline_point.get_tangent1()));
+                       set_link("t2",ValueNode_RadialComposite::create(bline_point.get_tangent2()));
                        break;
                }
                default:
index 594ad39..95fe556 100644 (file)
@@ -2883,7 +2883,7 @@ CanvasView::on_duck_changed(const synfig::Point &value,const synfigapp::ValueDes
 
        if (ValueNode_BLineCalcVertex::Handle bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(value_desc.get_value_node()))
        {
-               ValueNode_BLine::Handle bline = ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline")));
+               ValueNode_BLine::Handle bline = ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link("bline"));
                Real radius = 0.0;
                if (((*(bline_vertex->get_link("loop")))(get_time()).get(bool()))){
                        Real amount_old((*(bline_vertex->get_link("amount")))(get_time()).get(Real()));
index 9a247cb..947bd25 100644 (file)
@@ -1024,7 +1024,8 @@ Instance::make_param_menu(Gtk::Menu *menu,synfig::Canvas::Handle canvas, synfiga
                param_list2=canvas_interface->generate_param_list(
                        synfigapp::ValueDesc(
                                ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())
-                               ,0
+                               ,ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())
+                                                           ->get_link_index_from_name("point")
                        )
                );
                param_list2.add("origin",location);
index 4d053bc..dbc5ace 100644 (file)
@@ -961,10 +961,10 @@ StateDraw_Context::new_bline(std::list<synfig::BLinePoint> bline,bool loop_bline
 
                if(extend_start_join_different)
                        LinkableValueNode::Handle::cast_dynamic(source.value_node)->
-                               set_link(0,finish_duck_value_desc.get_value_node());
+                               set_link("point",finish_duck_value_desc.get_value_node());
                else if(extend_start_join_same)
                        LinkableValueNode::Handle::cast_dynamic(source.value_node)->
-                               set_link(0,synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(start_duck_value_node_bline->
+                               set_link("point",synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(start_duck_value_node_bline->
                                                                                                        list[target_offset+finish_duck_index].value_node),0).get_value_node());
                return result;
        }
@@ -989,21 +989,21 @@ StateDraw_Context::new_bline(std::list<synfig::BLinePoint> bline,bool loop_bline
 
                if(extend_finish_join_different)
                        LinkableValueNode::Handle::cast_dynamic(source.value_node)->
-                               set_link(0,start_duck_value_desc.get_value_node());
+                               set_link("point",start_duck_value_desc.get_value_node());
                else if(extend_finish_join_same)
                        LinkableValueNode::Handle::cast_dynamic(source.value_node)->
-                               set_link(0,synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(finish_duck_value_node_bline->
+                               set_link("point",synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(finish_duck_value_node_bline->
                                                                                                        list[target_offset+start_duck_index].value_node),0).get_value_node());
                return result;
        }
 
        if (join_start_no_extend)
                LinkableValueNode::Handle::cast_dynamic(value_node->list.front().value_node)->
-                 set_link(0,start_duck_value_desc.get_value_node());
+                 set_link("point",start_duck_value_desc.get_value_node());
 
        if (join_finish_no_extend)
                LinkableValueNode::Handle::cast_dynamic(value_node->list.back().value_node)->
-                 set_link(0,finish_duck_value_desc.get_value_node());
+                 set_link("point",finish_duck_value_desc.get_value_node());
 
        if(get_auto_export_flag())
                if (!get_canvas_interface()->add_value_node(value_node,get_id()))
@@ -1678,8 +1678,8 @@ StateDraw_Context::new_region(std::list<synfig::BLinePoint> bline, synfig::Real
                                                                        continue;
                                                                }
                                                                // \todo if next isn't split, don't we want to copy its 'Tangent 1' instead?
-                                                               value_node->set_link(5,value_node_next->get_link(5)); // Tangent 2
-                                                               value_node->set_link(3,ValueNode_Const::create(true)); // Split Tangents
+                                                               value_node->set_link("t2",value_node_next->get_link("t2"));
+                                                               value_node->set_link("split",ValueNode_Const::create(true));
 
                                                                // get_canvas_interface()->auto_export(value_node);
                                                                printf("exporting\n");
index f2bb3b9..a264423 100644 (file)
@@ -387,7 +387,8 @@ StateNormal_Context::event_multiple_ducks_clicked_handler(const Smach::event& /*
                        value_desc_list.push_back(
                                synfigapp::ValueDesc(
                                        ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())
-                                       ,0
+                                       ,ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())
+                                                               ->get_link_index_from_name("point")
                                )
                        );
                }
index 75d775e..491d517 100644 (file)
@@ -157,7 +157,7 @@ Action::BLinePointTangentMerge::prepare()
 
        action->set_param("canvas",get_canvas());
        action->set_param("canvas_interface",get_canvas_interface());
-       action->set_param("value_desc",ValueDesc(value_node,3));
+       action->set_param("value_desc",ValueDesc(value_node,value_node->get_link_index_from_name("split")));
        action->set_param("time",time);
        action->set_param("new_value",synfig::ValueBase(false));
 
index 67cc22f..8e2e593 100644 (file)
@@ -157,7 +157,7 @@ Action::BLinePointTangentSplit::prepare()
 
        action->set_param("canvas",get_canvas());
        action->set_param("canvas_interface",get_canvas_interface());
-       action->set_param("value_desc",ValueDesc(value_node,3));
+       action->set_param("value_desc",ValueDesc(value_node,value_node->get_link_index_from_name("split")));
        action->set_param("time",time);
        action->set_param("new_value",synfig::ValueBase(true));
 
index e3959ce..83b2646 100644 (file)
@@ -156,7 +156,8 @@ Action::ValueDescSet::prepare()
        // tangent.
        if(     value_desc.parent_is_value_node() &&
                value_desc.get_parent_value_node()->get_type()==ValueBase::TYPE_BLINEPOINT &&
-               (value_desc.get_index()==4 || value_desc.get_index()==5) &&
+               (value_desc.get_name()=="t1" || value_desc.get_name()=="t2") &&
+               //(value_desc.get_index()==4 || value_desc.get_index()==5) &&
                (*value_desc.get_parent_value_node())(time).get(BLinePoint()).get_split_tangent_flag()==false)
        {
                {
@@ -168,7 +169,8 @@ Action::ValueDescSet::prepare()
                        Vector t2((*parent_value_node->get_link("t2"))(time));
                }
 
-               if (value_desc.get_index()==4) {
+               //if (value_desc.get_index()==4) {
+               if (value_desc.get_name()=="t1") {
                        ValueNode_Composite::Handle parent_value_node;
                        parent_value_node=parent_value_node.cast_dynamic(value_desc.get_parent_value_node());
 
@@ -183,7 +185,7 @@ Action::ValueDescSet::prepare()
                        action->set_param("canvas_interface",get_canvas_interface());
                        action->set_param("time",time);
                        action->set_param("new_value",value);
-                       action->set_param("value_desc",ValueDesc(parent_value_node,5));
+                       action->set_param("value_desc",ValueDesc(parent_value_node, parent_value_node->get_link_index_from_name("t2")));
 
                        if(!action->is_ready())
                                throw Error(Error::TYPE_NOTREADY);
@@ -300,7 +302,7 @@ Action::ValueDescSet::prepare()
                case ValueBase::TYPE_VECTOR:
                {
                        Angle old_angle = (*(ValueNode_RadialComposite::Handle::cast_dynamic(
-                                                                        value_desc.get_value_node())->get_link_vfunc(1)))(time).get(Angle());
+                                                                        value_desc.get_value_node())->get_link("theta")))(time).get(Angle());
                        Vector vect(value.get(Vector()));
                        components[0]=vect.mag();
                        Angle change = Angle(Angle::tan(vect[1],vect[0])) - old_angle;
@@ -370,8 +372,8 @@ Action::ValueDescSet::prepare()
                        action->set_param("canvas",get_canvas());
                        action->set_param("canvas_interface",get_canvas_interface());
                        action->set_param("time",time);
-                       action->set_param("new_value",(*parent_value_node->get_link(4))(time));
-                       action->set_param("value_desc",ValueDesc(parent_value_node,5));
+                       action->set_param("new_value",(*parent_value_node->get_link("t1"))(time));
+                       action->set_param("value_desc",ValueDesc(parent_value_node,parent_value_node->get_link_index_from_name("t2")));
 
                        if(!action->is_ready())
                                throw Error(Error::TYPE_NOTREADY);
@@ -396,7 +398,7 @@ Action::ValueDescSet::prepare()
                                action->set_param("canvas_interface",get_canvas_interface());
                                action->set_param("time",time);
                                action->set_param("new_value",average);
-                               action->set_param("value_desc",ValueDesc(parent_value_node,4));
+                               action->set_param("value_desc",ValueDesc(parent_value_node,parent_value_node->get_link_index_from_name("t1")));
 
                                if(!action->is_ready())
                                        throw Error(Error::TYPE_NOTREADY);
@@ -414,7 +416,7 @@ Action::ValueDescSet::prepare()
                                action->set_param("canvas_interface",get_canvas_interface());
                                action->set_param("time",time);
                                action->set_param("new_value",average);
-                               action->set_param("value_desc",ValueDesc(parent_value_node,5));
+                               action->set_param("value_desc",ValueDesc(parent_value_node,parent_value_node->get_link_index_from_name("t2")));
 
                                if(!action->is_ready())
                                        throw Error(Error::TYPE_NOTREADY);
index ccc562a..909e4cb 100644 (file)
@@ -130,6 +130,7 @@ public:
 
        synfig::ValueNode::Handle get_parent_value_node()const { assert(parent_is_value_node()); return parent_value_node; }
        int get_index()const { assert(parent_is_linkable_value_node()); return index; }
+       synfig::String get_name()const { assert(parent_is_linkable_value_node()); return (synfig::LinkableValueNode::Handle::cast_reinterpret(parent_value_node))->link_name(index); }
        synfig::Time get_waypoint_time()const { assert(parent_is_waypoint()); return waypoint_time; }
 
        const synfig::String& get_value_node_id()const { assert(parent_is_canvas()); return name; }