From: Nikita Kitaev Date: Sat, 28 Nov 2009 19:35:02 +0000 (-0800) Subject: Merge branch 'nikitakit_smoothbline' into nikitakit_ducks X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=c8dfc1fcfebdcc765fac4de28731a783b6099c35;hp=57cd3e7107bd9d70377782f62b2af0f0f0c9ebbf;p=synfig.git Merge branch 'nikitakit_smoothbline' into nikitakit_ducks 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 --- diff --git a/synfig-core/src/synfig/blinepoint.cpp b/synfig-core/src/synfig/blinepoint.cpp index 4291bbf..83e004d 100644 --- a/synfig-core/src/synfig/blinepoint.cpp +++ b/synfig-core/src/synfig/blinepoint.cpp @@ -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(); + } diff --git a/synfig-core/src/synfig/blinepoint.h b/synfig-core/src/synfig/blinepoint.h index 3a75d4b..9a07ba8 100644 --- a/synfig-core/src/synfig/blinepoint.h +++ b/synfig-core/src/synfig/blinepoint.h @@ -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(); diff --git a/synfig-core/src/synfig/loadcanvas.cpp b/synfig-core/src/synfig/loadcanvas.cpp index 3da37e9..099bba2 100644 --- a/synfig-core/src/synfig/loadcanvas.cpp +++ b/synfig-core/src/synfig/loadcanvas.cpp @@ -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 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; } } diff --git a/synfig-core/src/synfig/valuenode_composite.cpp b/synfig-core/src/synfig/valuenode_composite.cpp index 7e18ea0..fca9d1d 100644 --- a/synfig-core/src/synfig/valuenode_composite.cpp +++ b/synfig-core/src/synfig/valuenode_composite.cpp @@ -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: diff --git a/synfig-studio/src/gtkmm/canvasview.cpp b/synfig-studio/src/gtkmm/canvasview.cpp index 594ad39..95fe556 100644 --- a/synfig-studio/src/gtkmm/canvasview.cpp +++ b/synfig-studio/src/gtkmm/canvasview.cpp @@ -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())); diff --git a/synfig-studio/src/gtkmm/instance.cpp b/synfig-studio/src/gtkmm/instance.cpp index 9a247cb..947bd25 100644 --- a/synfig-studio/src/gtkmm/instance.cpp +++ b/synfig-studio/src/gtkmm/instance.cpp @@ -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); diff --git a/synfig-studio/src/gtkmm/state_draw.cpp b/synfig-studio/src/gtkmm/state_draw.cpp index 4d053bc..dbc5ace 100644 --- a/synfig-studio/src/gtkmm/state_draw.cpp +++ b/synfig-studio/src/gtkmm/state_draw.cpp @@ -961,10 +961,10 @@ StateDraw_Context::new_bline(std::list 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 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 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"); diff --git a/synfig-studio/src/gtkmm/state_normal.cpp b/synfig-studio/src/gtkmm/state_normal.cpp index f2bb3b9..a264423 100644 --- a/synfig-studio/src/gtkmm/state_normal.cpp +++ b/synfig-studio/src/gtkmm/state_normal.cpp @@ -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") ) ); } diff --git a/synfig-studio/src/synfigapp/actions/blinepointtangentmerge.cpp b/synfig-studio/src/synfigapp/actions/blinepointtangentmerge.cpp index 75d775e..491d517 100644 --- a/synfig-studio/src/synfigapp/actions/blinepointtangentmerge.cpp +++ b/synfig-studio/src/synfigapp/actions/blinepointtangentmerge.cpp @@ -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)); diff --git a/synfig-studio/src/synfigapp/actions/blinepointtangentsplit.cpp b/synfig-studio/src/synfigapp/actions/blinepointtangentsplit.cpp index 67cc22f..8e2e593 100644 --- a/synfig-studio/src/synfigapp/actions/blinepointtangentsplit.cpp +++ b/synfig-studio/src/synfigapp/actions/blinepointtangentsplit.cpp @@ -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)); diff --git a/synfig-studio/src/synfigapp/actions/valuedescset.cpp b/synfig-studio/src/synfigapp/actions/valuedescset.cpp index e3959ce..83b2646 100644 --- a/synfig-studio/src/synfigapp/actions/valuedescset.cpp +++ b/synfig-studio/src/synfigapp/actions/valuedescset.cpp @@ -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); diff --git a/synfig-studio/src/synfigapp/value_desc.h b/synfig-studio/src/synfigapp/value_desc.h index ccc562a..909e4cb 100644 --- a/synfig-studio/src/synfigapp/value_desc.h +++ b/synfig-studio/src/synfigapp/value_desc.h @@ -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; }