synfig::ValueNode_Range::ValueNode_Range(const ValueBase &value):
LinkableValueNode(value.get_type())
{
+ Vocab ret(get_children_vocab());
+ set_children_vocab(ret);
ValueBase::Type id(value.get_type());
switch(id)
assert(max_->get_type()==id);
assert(link_->get_type()==id);
assert(get_type()==id);
-
- DCAST_HACK_ENABLE();
}
LinkableValueNode*
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)
{
}
}
-int
-ValueNode_Range::link_count()const
-{
- return 3;
-}
-
-String
-ValueNode_Range::link_local_name(int i)const
-{
- assert(i>=0 && i<link_count());
-
- switch(i)
- {
- case 0: return _("Min");
- case 1: return _("Max");
- case 2: return _("Link");
- default: return String();
- }
-}
-
-String
-ValueNode_Range::link_name(int i)const
-{
- assert(i>=0 && i<link_count());
-
- switch(i)
- {
- case 0: return "min";
- case 1: return "max";
- case 2: return "link";
- default: return String();
- }
-}
-
-int
-ValueNode_Range::get_link_index_from_name(const String &name)const
-{
- if(name=="min") return 0;
- if(name=="max") return 1;
- if(name=="link") return 2;
- throw Exception::BadLinkName(name);
-}
-
String
ValueNode_Range::get_name()const
{
|| type==ValueBase::TYPE_REAL
|| type==ValueBase::TYPE_TIME;
}
+
+LinkableValueNode::Vocab
+ValueNode_Range::get_children_vocab_vfunc()const
+{
+ if(children_vocab.size())
+ return children_vocab;
+
+ 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;
+}