X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fvehicletype.cpp;h=59787455e3cf1a6c7e81da4bd076b09b4de7377b;hb=3dd660ffad729fbd6e75e6401f5c7f27b9013faf;hp=786d18aa40f1ac3abec97fa603b7ff120b9f5f56;hpb=dd05e8ed55a9072daaf18e4c63c3b66e386ba7f4;p=r2c2.git diff --git a/source/libr2c2/vehicletype.cpp b/source/libr2c2/vehicletype.cpp index 786d18a..5978745 100644 --- a/source/libr2c2/vehicletype.cpp +++ b/source/libr2c2/vehicletype.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #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 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(); itarget_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);