}
synfig::ValueBase
-synfig::ValueNode_Scale::operator()(Time t, const synfig::Point &target_value)const
+synfig::ValueNode_Scale::get_inverse(Time t, const synfig::Vector &target_value) const
{
Real scalar_value((*scalar)(t).get(Real()));
if(scalar_value==0)
- return (*value_node)(t).get(value_node->get_type());
- switch (get_type())
- case ValueBase::TYPE_REAL:
- return target_value.mag() / scalar_value;
- case ValueBase::TYPE_ANGLE:
- return Angle::tan(target_value[1] / scalar_value ,target_value[0] / scalar_value);
- default:
- return target_value / scalar_value;
+ throw runtime_error(strprintf("ValueNode_Scale: %s",_("Attempting to get the inverse of a non invertible Valuenode")));
+ else
+ {
+ switch (get_type())
+ {
+ case ValueBase::TYPE_REAL:
+ return target_value.mag() / scalar_value;
+ case ValueBase::TYPE_ANGLE:
+ return Angle::tan(target_value[1] / scalar_value ,target_value[0] / scalar_value);
+ default:
+ return target_value / scalar_value;
+ }
+ }
+ return ValueBase();
}
+synfig::ValueBase
+synfig::ValueNode_Scale::get_inverse(Time t, const synfig::Angle &target_value) const
+{
+ Real scalar_value((*scalar)(t).get(Real()));
+ if(scalar_value==0)
+ throw runtime_error(strprintf("ValueNode_Scale: %s",_("Attempting to get the inverse of a non invertible Valuenode")));
+ else
+ {
+ switch (get_type())
+ {
+ default:
+ return (*value_node)(t).get(Angle()) + target_value / scalar_value;
+ }
+ }
+ return ValueBase();
+}
+
+bool
+synfig::ValueNode_Scale::is_invertible(Time t) const
+{
+ Real scalar_value((*scalar)(t).get(Real()));
+ return (!scalar_value==0);
+}
bool
ValueNode_Scale::set_link_vfunc(int i,ValueNode::Handle value)
virtual ValueBase operator()(Time t)const;
//! Returns the modified Link to match the target value at time t
- virtual ValueBase operator()(Time t, const synfig::Point &target_value) const;
+ ValueBase get_inverse(Time t, const synfig::Vector &target_value) const;
+ ValueBase get_inverse(Time t, const synfig::Angle &target_value) const;
+
+ bool is_invertible(Time t)const;
virtual String get_name()const;
if (ValueNode_Scale::Handle scale_value_node = ValueNode_Scale::Handle::cast_dynamic(value_desc.get_value_node()))
{
int link_index(scale_value_node->get_link_index_from_name("link"));
- return canvas_interface()->change_value(synfigapp::ValueDesc(scale_value_node,link_index), scale_value_node(t, value));
+ if(scale_value_node->is_invertible(get_time()))
+ return canvas_interface()->change_value(
+ synfigapp::ValueDesc(scale_value_node,link_index),
+ scale_value_node->get_inverse(get_time(), value)
+ );
+ else
+ return false;
}
switch(value_desc.get_value_type())
return canvas_interface()->change_value(synfigapp::ValueDesc(bline_tangent,offset_index), old_offset + rotation);
}
+ if (ValueNode_Scale::Handle scale_value_node = ValueNode_Scale::Handle::cast_dynamic(value_desc.get_value_node()))
+ {
+ int link_index(scale_value_node->get_link_index_from_name("link"));
+ if(scale_value_node->is_invertible(get_time()))
+ return canvas_interface()->change_value(
+ synfigapp::ValueDesc(scale_value_node,link_index),
+ scale_value_node->get_inverse(get_time(), rotation)
+ );
+ else
+ return false;
+
+ }
// \todo will this really always be the case?
assert(value_desc.get_value_type() == ValueBase::TYPE_ANGLE);
return canvas_interface()->change_value(value_desc, value_desc.get_value(get_time()).get(Angle()) + rotation);