+void VehicleType::Loader::mirror_rods()
+{
+ MirrorParametersLoader params;
+ load_sub_with(params);
+ Regex r_filter(params.filter);
+
+ vector<unsigned> mirror_indices(obj.rods.size(), 0);
+ for(TagMap::const_iterator i=rod_tags.begin(); i!=rod_tags.end(); ++i)
+ if(i->second<0x10000 && r_filter.match(i->first))
+ mirror_indices[i->second] = 1;
+
+ for(unsigned i=0, j=obj.rods.size(); i<mirror_indices.size(); ++i)
+ if(mirror_indices[i])
+ mirror_indices[i] = j++;
+
+ Transform axle_trans = Transform::rotation(params.phase_offset, Vector(0, 1, 0));
+
+ for(unsigned i=0; i<mirror_indices.size(); ++i)
+ {
+ if(!mirror_indices[i])
+ continue;
+
+ Rod mr = obj.rods[i];
+ mr.initial_position.y = -mr.initial_position.y;
+ mr.mirror_object = !mr.mirror_object;
+ for(vector<RodConstraint>::iterator j=mr.constraints.begin(); j!=mr.constraints.end(); ++j)
+ {
+ j->target_position.y = -j->target_position.y;
+ j->local_position.y = -j->local_position.y;
+ j->axis.y = -j->axis.y;
+ if(j->target==RodConstraint::ROD && mirror_indices[j->target_index])
+ j->target_index = mirror_indices[j->target_index];
+ else if(j->target==RodConstraint::AXLE)
+ j->target_position = axle_trans.transform(j->target_position);
+ }
+
+ obj.rods.push_back(mr);
+ }
+}
+
+void VehicleType::Loader::rod(const string &t)