+
+VehicleType::Rod::Loader::Loader(Rod &r, const map<string, unsigned> &t):
+ DataFile::ObjectLoader<Rod>(r),
+ tags(t)
+{
+ add("connect", &Loader::connect);
+ add("limit", &Rod::limit);
+ add("mirror_object", &Rod::mirror_object);
+ add("object", &Rod::object);
+ add("pivot_body", &Loader::pivot_body);
+ add("pivot_axle", &Loader::pivot_axle);
+ add("pivot_axle", &Loader::pivot_bogie_axle);
+ add("pivot_rod", &Loader::pivot_rod);
+ add("position", &Loader::position);
+ add("tag", &Loader::set_tag);
+}
+
+void VehicleType::Rod::Loader::connect(const string &t, float px, float pz, float ox, float oz)
+{
+ map<string, unsigned>::const_iterator i = tags.find(t);
+ if(i==tags.end())
+ throw KeyError("Unknown rod tag", t);
+ obj.connect_index = i->second;
+ obj.connect_point = Vector(px/1000, 0, pz/1000);
+ obj.connect_offset = Vector(ox/1000, 0, oz/1000);
+}
+
+void VehicleType::Rod::Loader::pivot_body()
+{
+ obj.pivot = BODY;
+}
+
+void VehicleType::Rod::Loader::pivot_axle(unsigned i)
+{
+ obj.pivot = AXLE;
+ obj.pivot_index = i;
+}
+
+void VehicleType::Rod::Loader::pivot_bogie_axle(unsigned i, unsigned j)
+{
+ obj.pivot = BOGIE_AXLE;
+ obj.pivot_index = i;
+ obj.pivot_index2 = j;
+}
+
+void VehicleType::Rod::Loader::pivot_rod(const string &t)
+{
+ map<string, unsigned>::const_iterator i = tags.find(t);
+ if(i==tags.end())
+ throw KeyError("Unknown rod tag", t);
+ obj.pivot = ROD;
+ obj.pivot_index = i->second;
+}
+
+void VehicleType::Rod::Loader::position(float x, float y, float z)
+{
+ obj.pivot_point = Vector(x/1000, y/1000, z/1000);
+}
+
+void VehicleType::Rod::Loader::set_tag(const string &t)
+{
+ tag = t;
+}
+
+
+void operator>>(const LexicalConverter &c, VehicleType::Rod::Limit &l)
+{
+ const string &s = c.get();
+ if(s=="FIXED")
+ l = VehicleType::Rod::FIXED;
+ else if(s=="ROTATE")
+ l = VehicleType::Rod::ROTATE;
+ else if(s=="SLIDE_X")
+ l = VehicleType::Rod::SLIDE_X;
+ else
+ throw LexicalError("Invalid value for Rod::Limit");
+}
+