assert(max_->get_type()==id);
assert(link_->get_type()==id);
assert(get_type()==id);
-
- DCAST_HACK_ENABLE();
}
LinkableValueNode*
Angle minimum = (* min_)(t).get(Angle());
Angle maximum = (* max_)(t).get(Angle());
Angle link = (*link_)(t).get(Angle());
-
+// This code was removed because it didn't work with link < minimum
+// It is sane to completely delete it if the replacement code is fine.
+/* ***********************************************
// if link is between min and max, use it
if (Angle::deg((link-minimum).mod()).get() < Angle::deg((maximum-minimum).mod()).get())
return link;
return minimum;
else
return maximum;
+*********************************************** */
+ if(Angle::rad(maximum).get()>=Angle::rad(link).get() && Angle::rad(link).get()>=Angle::rad(minimum).get())
+ return link;
+ else if (Angle::rad(minimum).get()>Angle::rad(link).get())
+ return minimum;
+ else
+ return maximum;
}
case ValueBase::TYPE_INTEGER:
return std::max((*min_)(t).get(int()), std::min((*max_)(t).get(int()), (*link_)(t).get(int())));
return ValueBase();
}
+synfig::ValueBase
+synfig::ValueNode_Range::get_inverse(Time t, const synfig::Vector &target_value) const
+{
+ switch (get_type())
+ {
+ case ValueBase::TYPE_INTEGER:
+ {
+ int max_value((*max_)(t).get(int()));
+ int min_value((*min_)(t).get(int()));
+ return std::max(min_value, std::min(max_value, int(target_value.mag())));
+ }
+ case ValueBase::TYPE_REAL:
+ {
+ Real max_value((*max_)(t).get(Real()));
+ Real min_value((*min_)(t).get(Real()));
+ return std::max(min_value, std::min(max_value, target_value.mag()));
+ }
+ case ValueBase::TYPE_ANGLE:
+ {
+ Angle max_value((*max_)(t).get(Angle()));
+ Angle min_value((*min_)(t).get(Angle()));
+ Angle target_angle(Angle::tan(target_value[1],target_value[0]));
+ return target_angle>max_value?max_value:target_angle<min_value?min_value:target_angle;
+ }
+ case ValueBase::TYPE_TIME:
+ {
+ Real max_value((*max_)(t).get(Time()));
+ Real min_value((*min_)(t).get(Time()));
+ return std::max(min_value, std::min(max_value, target_value.mag()));
+ }
+ default:
+ return target_value;
+ }
+ return ValueBase();
+}
+
+synfig::ValueBase
+synfig::ValueNode_Range::get_inverse(Time t, const synfig::Angle &target_value) const
+{
+ Angle minimum = (* min_)(t).get(Angle());
+ Angle maximum = (* max_)(t).get(Angle());
+ Angle link = (*link_)(t).get(Angle());
+ switch (get_type())
+ {
+ default:
+
+ if(Angle::rad(maximum).get()>=Angle::rad(target_value).get() && Angle::rad(target_value).get()>=Angle::rad(minimum).get())
+ return target_value;
+ else if (Angle::rad(minimum).get()>Angle::rad(target_value).get())
+ return minimum;
+ else
+ return maximum;
+ }
+ return ValueBase();
+}
+
+
bool
ValueNode_Range::set_link_vfunc(int i,ValueNode::Handle value)
{