+
+VehicleType::RodConstraint::RodConstraint():
+ type(MOVE),
+ target(BODY),
+ target_index(0)
+{ }
+
+
+VehicleType::RodConstraint::Loader::Loader(RodConstraint &c, TagMap &t):
+ DataFile::ObjectLoader<RodConstraint>(c),
+ tags(t)
+{
+ add("axis", &Loader::axis);
+ add("local_position", &Loader::local_position);
+ add("target_axle", &Loader::target_axle);
+ add("target_position", &Loader::target_position);
+ add("target_rod", &Loader::target_rod);
+}
+
+void VehicleType::RodConstraint::Loader::axis(float x, float y, float z)
+{
+ obj.axis = Vector(x, y, z);
+ obj.axis.normalize();
+}
+
+void VehicleType::RodConstraint::Loader::local_position(float x, float y, float z)
+{
+ obj.local_position = Vector(x/1000, y/1000, z/1000);
+}
+
+void VehicleType::RodConstraint::Loader::target_axle(unsigned i)
+{
+ obj.target = AXLE;
+ obj.target_index = i;
+ // TODO check range
+}
+
+void VehicleType::RodConstraint::Loader::target_position(float x, float y, float z)
+{
+ obj.target_position = Vector(x/1000, y/1000, z/1000);
+}
+
+void VehicleType::RodConstraint::Loader::target_rod(const string &n)
+{
+ obj.target = ROD;
+ TagMap::iterator i = tags.find(n);
+ if(i!=tags.end())
+ obj.target_index = i->second;
+ else
+ {
+ obj.target_index = 0x10000+tags.size();
+ tags[n] = obj.target_index;
+ }
+}
+
+
+VehicleType::Rod::Loader::Loader(Rod &r, TagMap &t):
+ DataFile::ObjectLoader<Rod>(r),
+ tags(t)
+{
+ add("initial_position", &Loader::initial_position);
+ add("mirror_object", &Rod::mirror_object);
+ add("move", &Loader::constraint<RodConstraint::MOVE>);
+ add("object", &Rod::object);
+ add("rotate", &Loader::constraint<RodConstraint::ROTATE>);
+ add("slide", &Loader::constraint<RodConstraint::SLIDE>);
+}
+
+template<VehicleType::RodConstraint::Type t>
+void VehicleType::Rod::Loader::constraint()
+{
+ RodConstraint cns;
+ cns.type = t;
+ load_sub(cns, tags);
+ obj.constraints.push_back(cns);
+}
+
+void VehicleType::Rod::Loader::initial_position(float x, float y, float z)
+{
+ obj.initial_position = Vector(x/1000, y/1000, z/1000);
+}
+
+
+VehicleType::MirrorParametersLoader::MirrorParametersLoader()
+{
+ add("filter", &MirrorParametersLoader::filt);
+ add("phase_offset", &MirrorParametersLoader::phase_offs);
+}
+
+void VehicleType::MirrorParametersLoader::filt(const string &f)
+{
+ filter = f;
+}
+
+void VehicleType::MirrorParametersLoader::phase_offs(float o)
+{
+ phase_offset = Angle::from_degrees(o);
+}
+