X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Fsrc%2Fgtkmm%2Fduck.cpp;h=da571f6c5ca0d5cf4fec87317c169a11ae533339;hb=254ff6880560954f7c1066ad4251a7118530912d;hp=e88306e1ebe5d31d70ffe48a338867b15348786f;hpb=a095981e18cc37a8ecc7cd237cc22b9c10329264;p=synfig.git diff --git a/synfig-studio/src/gtkmm/duck.cpp b/synfig-studio/src/gtkmm/duck.cpp index e88306e..da571f6 100644 --- a/synfig-studio/src/gtkmm/duck.cpp +++ b/synfig-studio/src/gtkmm/duck.cpp @@ -7,6 +7,7 @@ ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley ** Copyright (c) 2007, 2008 Chris Moore +** Copyright (c) 2009 Nikita Kitaev ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -33,8 +34,13 @@ #include "duck.h" #include -#include "general.h" +#include +#include +#include +#include +#include +#include "general.h" #endif /* === U S I N G =========================================================== */ @@ -153,6 +159,12 @@ Duck::set_trans_point(const synfig::Point &x) set_sub_trans_point(transform_stack_.unperform(x)); } +void +Duck::set_trans_point(const synfig::Point &x, const synfig::Time &time) +{ + set_sub_trans_point(transform_stack_.unperform(x), time); +} + //! Sets the origin point. void Duck::set_origin(const synfig::Point &x) @@ -195,7 +207,7 @@ Duck::get_sub_trans_point()const } void -Duck::set_sub_trans_point(const synfig::Point &x) +Duck::set_sub_trans_point(const synfig::Point &x, const synfig::Time &time) { if (get_type() == Duck::TYPE_TANGENT || get_type() == Duck::TYPE_ANGLE) @@ -205,16 +217,60 @@ Duck::set_sub_trans_point(const synfig::Point &x) Angle change = get_point().angle() - old_angle; while (change < Angle::deg(-180)) change += Angle::deg(360); while (change > Angle::deg(180)) change -= Angle::deg(360); - int old_halves = round_to_int(Angle::deg(rotations).get()/180); + //int old_halves = round_to_int(Angle::deg(rotations).get()/180); rotations += change; - int new_halves = round_to_int(Angle::deg(rotations).get()/180); - if (old_halves != new_halves && + //int new_halves = round_to_int(Angle::deg(rotations).get()/180); + /*if (old_halves != new_halves && (new_halves > 1 || new_halves < -1 || old_halves > 1 || old_halves < -1)) - synfig::info("rotation: %.2f turns", new_halves/2.0); + synfig::info("rotation: %.2f turns", new_halves/2.0)*/; + } else if(get_type() == Duck::TYPE_VERTEX || get_type() == Duck::TYPE_POSITION) + { + set_point((x-get_sub_trans_origin())/get_scalar()); + + ValueNode_BLineCalcVertex::Handle bline_vertex; + ValueNode_Composite::Handle composite; + + if ((bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(get_value_desc().get_value_node())) || + ((composite = ValueNode_Composite::Handle::cast_dynamic(get_value_desc().get_value_node())) && + composite->get_type() == ValueBase::TYPE_BLINEPOINT && + (bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point"))))) + { + synfig::Point closest_point = get_point(); + synfig::Real radius = 0.0; + ValueNode_BLine::Handle bline = ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline"))); + synfig::find_closest_point( + (*bline)(time), + get_point(), + radius, + bline->get_loop(), + &closest_point); + set_point(closest_point); + } } - else + else set_point((x-get_sub_trans_origin())/get_scalar()); +} + +void +Duck::set_sub_trans_point(const synfig::Point &x) +{ + if (get_type() == Duck::TYPE_TANGENT || + get_type() == Duck::TYPE_ANGLE) + { + Angle old_angle = get_point().angle(); set_point((x-get_sub_trans_origin())/get_scalar()); + Angle change = get_point().angle() - old_angle; + while (change < Angle::deg(-180)) change += Angle::deg(360); + while (change > Angle::deg(180)) change -= Angle::deg(360); + //int old_halves = round_to_int(Angle::deg(rotations).get()/180); + rotations += change; + //int new_halves = round_to_int(Angle::deg(rotations).get()/180); + /*if (old_halves != new_halves && + (new_halves > 1 || new_halves < -1 || + old_halves > 1 || old_halves < -1)) + synfig::info("rotation: %.2f turns", new_halves/2.0);*/ + } + else set_point((x-get_sub_trans_origin())/get_scalar()); } synfig::Point