-/* === S I N F G =========================================================== */
+/* === S Y N F I G ========================================================= */
/*! \file duck.cpp
** \brief Template File
**
-** $Id: duck.cpp,v 1.1.1.1 2005/01/07 03:34:36 darco Exp $
+** $Id$
**
** \legal
-** Copyright (c) 2002 Robert B. Quattlebaum Jr.
+** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
**
-** This software and associated documentation
-** are CONFIDENTIAL and PROPRIETARY property of
-** the above-mentioned copyright holder.
+** This package is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 2 of
+** the License, or (at your option) any later version.
**
-** You may not copy, print, publish, or in any
-** other way distribute this software without
-** a prior written agreement with
-** the copyright holder.
+** This package is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
** \endlegal
*/
/* ========================================================================= */
#endif
#include "duck.h"
+#include <ETL/misc>
+
+#include "general.h"
#endif
using namespace std;
using namespace etl;
-using namespace sinfg;
+using namespace synfig;
using namespace studio;
/* === M A C R O S ========================================================= */
~_DuckCounter()
{
if(counter)
- sinfg::error("%d ducks not yet deleted!",counter);
+ synfig::error("%d ducks not yet deleted!",counter);
}
} _duck_counter;
/* === M E T H O D S ======================================================= */
Duck::Duck():
+ rotations(synfig::Angle::deg(0)),
origin(0,0),
scalar(1),
editable(false),
tangent_(false)
{ duck_count++; _DuckCounter::counter++; }
-Duck::Duck(const sinfg::Point &point):
+Duck::Duck(const synfig::Point &point):
type_(TYPE_NONE),
point(point),
+ rotations(synfig::Angle::deg(0)),
origin(0,0),
scalar(1),
guid_(0),
tangent_(false)
{ duck_count++; _DuckCounter::counter++;}
-Duck::Duck(const sinfg::Point &point,const sinfg::Point &origin):
+Duck::Duck(const synfig::Point &point,const synfig::Point &origin):
point(point),
+ rotations(synfig::Angle::deg(0)),
origin(origin),
scalar(1),
guid_(0),
Duck::~Duck() { duck_count--; _DuckCounter::counter--;}
-sinfg::GUID
+synfig::GUID
Duck::get_data_guid()const
{
if(value_desc_.is_value_node())
}
void
-Duck::set_name(const sinfg::String &x)
+Duck::set_name(const synfig::String &x)
{
name=x;
if(guid_==GUID::zero())
//(shared_point?*shared_point==*rhs.shared_point:point==rhs.point) ;
}
-sinfg::Point
+synfig::Point
Duck::get_trans_point()const
{
return transform_stack_.perform(get_sub_trans_point());
}
-
+
void
-Duck::set_trans_point(const sinfg::Point &x)
+Duck::set_trans_point(const synfig::Point &x)
{
set_sub_trans_point(transform_stack_.unperform(x));
}
//! Sets the origin point.
void
-Duck::set_origin(const sinfg::Point &x)
+Duck::set_origin(const synfig::Point &x)
{
origin=x; origin_duck=0;
}
}
//! Retrieves the origin location
-sinfg::Point
+synfig::Point
Duck::get_origin()const
{
return origin_duck?origin_duck->get_point():origin;
}
//! Retrieves the origin location
-sinfg::Point
+synfig::Point
Duck::get_trans_origin()const
{
return transform_stack_.perform(get_sub_trans_origin());
}
-sinfg::Point
+synfig::Point
Duck::get_sub_trans_point()const
{
return get_point()*get_scalar()+get_sub_trans_origin();
}
void
-Duck::set_sub_trans_point(const sinfg::Point &x)
+Duck::set_sub_trans_point(const synfig::Point &x)
{
- set_point((x-get_sub_trans_origin())/get_scalar());
+ 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_quarters = round_to_int(Angle::deg(rotations).get()/90);
+ rotations += change;
+ int new_quarters = round_to_int(Angle::deg(rotations).get()/90);
+ if (old_quarters != new_quarters)
+ synfig::info("rotation: %.2f turns", new_quarters/4.0);
+ }
+ else
+ set_point((x-get_sub_trans_origin())/get_scalar());
}
-sinfg::Point
+synfig::Point
Duck::get_sub_trans_origin()const
{
return origin_duck?origin_duck->get_sub_trans_point():origin;