X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Fsrc%2Fsynfig%2Fvaluenode_range.cpp;h=eb9ebfbf208a8de8e57726ba0989466f321fd63b;hb=8eed22b9657ac7cb1881eab5c7b5c3d1f0c69468;hp=c45f369aba1eff6a935ce37ed234237e3f58c5fd;hpb=a095981e18cc37a8ecc7cd237cc22b9c10329264;p=synfig.git diff --git a/synfig-core/src/synfig/valuenode_range.cpp b/synfig-core/src/synfig/valuenode_range.cpp index c45f369..eb9ebfb 100644 --- a/synfig-core/src/synfig/valuenode_range.cpp +++ b/synfig-core/src/synfig/valuenode_range.cpp @@ -90,8 +90,6 @@ synfig::ValueNode_Range::ValueNode_Range(const ValueBase &value): assert(max_->get_type()==id); assert(link_->get_type()==id); assert(get_type()==id); - - DCAST_HACK_ENABLE(); } LinkableValueNode* @@ -127,7 +125,9 @@ synfig::ValueNode_Range::operator()(Time t)const 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; @@ -136,6 +136,13 @@ synfig::ValueNode_Range::operator()(Time t)const 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()))); @@ -150,6 +157,63 @@ synfig::ValueNode_Range::operator()(Time t)const 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=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) { @@ -241,3 +305,26 @@ ValueNode_Range::check_type(ValueBase::Type type) || type==ValueBase::TYPE_REAL || type==ValueBase::TYPE_TIME; } + +LinkableValueNode::Vocab +ValueNode_Range::get_param_vocab()const +{ + LinkableValueNode::Vocab ret; + + ret.push_back(ParamDesc(ValueBase(),"min") + .set_local_name(_("Min")) + .set_description(_("Returned value when 'Link' is smaller")) + ); + + ret.push_back(ParamDesc(ValueBase(),"max") + .set_local_name(_("Max")) + .set_description(_("Returned value when 'Link' is greater")) + ); + + ret.push_back(ParamDesc(ValueBase(),"link") + .set_local_name(_("Link")) + .set_description(_("The value node to limit its range")) + ); + + return ret; +}