]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/vehicletype.cpp
Rework article numbers
[r2c2.git] / source / libr2c2 / vehicletype.cpp
index 786d18aa40f1ac3abec97fa603b7ff120b9f5f56..59787455e3cf1a6c7e81da4bd076b09b4de7377b 100644 (file)
@@ -1,6 +1,7 @@
 #include <msp/core/maputils.h>
 #include <msp/geometry/box.h>
 #include <msp/geometry/transformedshape.h>
+#include <msp/strings/regex.h>
 #include <msp/strings/format.h>
 #include "vehicletype.h"
 
@@ -9,14 +10,15 @@ using namespace Msp;
 
 namespace R2C2 {
 
-VehicleType::VehicleType(const ArticleNumber &an):
-       ObjectType(an),
+VehicleType::VehicleType():
        locomotive(false),
        swap_direction(false),
+       gauge(1.524),
        length(0),
        width(0),
        height(0),
-       rotate_object(false)
+       rotate_object(false),
+       max_speed(0)
 { }
 
 unsigned VehicleType::get_max_function() const
@@ -105,9 +107,11 @@ VehicleType::Loader::Loader(VehicleType &vt):
        add("axle",       &Loader::axle);
        add("bogie",      &Loader::bogie);
        add("function",   &Loader::function);
+       add("gauge",      &Loader::gauge);
        add("height",     &Loader::height);
        add("length",     &Loader::length);
        add("locomotive", &VehicleType::locomotive);
+       add("maximum_speed", &VehicleType::max_speed);
        add("mirror_rods", &Loader::mirror_rods);
        add("object",     &VehicleType::object);
        add("rod",        &Loader::rod);
@@ -165,6 +169,11 @@ void VehicleType::Loader::function(unsigned i, const string &f)
        obj.functions[i] = f;
 }
 
+void VehicleType::Loader::gauge(float g)
+{
+       obj.gauge = g/1000;
+}
+
 void VehicleType::Loader::height(float h)
 {
        obj.height = h/1000;
@@ -179,12 +188,24 @@ 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));
 
-       unsigned index_offset = obj.rods.size();
-       for(unsigned i=0; i<index_offset; ++i)
+       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;
@@ -193,8 +214,8 @@ void VehicleType::Loader::mirror_rods()
                        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)
-                               j->target_index += index_offset;
+                       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);
                }
@@ -360,9 +381,15 @@ void VehicleType::Rod::Loader::initial_position(float x, float y, float z)
 
 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);