X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fvehicletype.cpp;h=9d929b328cbf6359d880715721cce898f16b0180;hb=d051af7264ee62d03473f1929414e262e918c30a;hp=2da44cc992f340f7c73e7f44e104fc4285327078;hpb=a993f204ba2cd282637814caec3ab115040fc0cc;p=r2c2.git diff --git a/source/libr2c2/vehicletype.cpp b/source/libr2c2/vehicletype.cpp index 2da44cc..9d929b3 100644 --- a/source/libr2c2/vehicletype.cpp +++ b/source/libr2c2/vehicletype.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include #include "vehicletype.h" @@ -8,7 +10,7 @@ using namespace Msp; namespace R2C2 { VehicleType::VehicleType(const ArticleNumber &an): - art_nr(an), + ObjectType(an), locomotive(false), swap_direction(false), length(0), @@ -24,13 +26,20 @@ unsigned VehicleType::get_max_function() const return (--functions.end())->first; } -const VehicleType::Axle &VehicleType::get_fixed_axle(unsigned i) const +const VehicleType::Axle &VehicleType::get_axle(unsigned i) const { if(i>=axles.size()) - throw out_of_range("VehicleType::get_fixed_axle"); + throw out_of_range("VehicleType::get_axle"); return axles[i]; } +const VehicleType::Axle &VehicleType::get_fixed_axle(unsigned i) const +{ + if(i>=fixed_axles.size()) + throw out_of_range("VehicleType::get_fixed_axle"); + return *fixed_axles[i]; +} + const VehicleType::Bogie &VehicleType::get_bogie(unsigned i) const { if(i>=bogies.size()) @@ -44,7 +53,7 @@ const VehicleType::Axle &VehicleType::get_bogie_axle(unsigned i, unsigned j) con throw out_of_range("VehicleType::get_bogie_axle"); if(j>=bogies[i].axles.size()) throw out_of_range("VehicleType::get_bogie_axle"); - return bogies[i].axles[j]; + return *bogies[i].axles[j]; } const VehicleType::Rod &VehicleType::get_rod(unsigned i) const @@ -56,32 +65,23 @@ const VehicleType::Rod &VehicleType::get_rod(unsigned i) const float VehicleType::get_front_axle_offset() const { - float front = length/2; if(!axles.empty()) - front = axles.front().position; - if(!bogies.empty()) - { - const Bogie &bogie = bogies.front(); - front = max(front, bogie.position+bogie.axles.front().position); - } - return front; + return axles.front().position; + return length/2; } float VehicleType::get_back_axle_offset() const { - float back = -length/2; if(!axles.empty()) - back = axles.back().position; - if(!bogies.empty()) - { - const Bogie &bogie = bogies.back(); - back = min(back, bogie.position+bogie.axles.back().position); - } - return back; + return axles.back().position; + return -length/2; } VehicleType::Axle::Axle(): + index(0), + bogie(0), + local_position(0), position(0), wheel_dia(0), powered(false) @@ -105,7 +105,7 @@ VehicleType::Rod::Rod(): VehicleType::Loader::Loader(VehicleType &vt): - DataFile::ObjectLoader(vt) + DataFile::DerivedObjectLoader(vt) { add("axle", &Loader::axle); add("bogie", &Loader::bogie); @@ -113,7 +113,6 @@ VehicleType::Loader::Loader(VehicleType &vt): add("height", &Loader::height); add("length", &Loader::length); add("locomotive", &VehicleType::locomotive); - add("name", &VehicleType::name); add("object", &VehicleType::object); add("rod", &Loader::rod); add("rotate_object", &VehicleType::rotate_object); @@ -121,6 +120,31 @@ VehicleType::Loader::Loader(VehicleType &vt): add("width", &Loader::width); } +void VehicleType::Loader::finish() +{ + for(unsigned i=0; ibogie = &obj.bogies[i]; + obj.bogies[i].axles[j]->position += obj.bogies[i].position; + } + } + + for(unsigned i=0; i( + Geometry::Box(obj.length, obj.width, obj.height), + Transform::translation(Vector(0, 0, obj.height/2))); +} + void VehicleType::Loader::axle() { Axle axl; @@ -131,7 +155,8 @@ void VehicleType::Loader::axle() void VehicleType::Loader::bogie() { Bogie bog; - load_sub(bog); + Bogie::Loader ldr(obj, bog); + load_sub_with(ldr); obj.bogies.push_back(bog); } @@ -178,7 +203,8 @@ VehicleType::Axle::Loader::Loader(Axle &a): void VehicleType::Axle::Loader::position(float p) { - obj.position = p/1000; + obj.local_position = p/1000; + obj.position = obj.local_position; } void VehicleType::Axle::Loader::wheel_diameter(float d) @@ -187,8 +213,9 @@ void VehicleType::Axle::Loader::wheel_diameter(float d) } -VehicleType::Bogie::Loader::Loader(Bogie &b): - DataFile::ObjectLoader(b) +VehicleType::Bogie::Loader::Loader(VehicleType &t, Bogie &b): + DataFile::ObjectLoader(b), + parent(t) { add("axle", &Loader::axle); add("object", &Bogie::object); @@ -200,7 +227,11 @@ void VehicleType::Bogie::Loader::axle() { Axle axl; load_sub(axl); - obj.axles.push_back(axl); + if(obj.axles.empty()) + obj.first_axle = parent.axles.size(); + parent.axles.push_back(axl); + // Actual pointers will be filled after everything is loaded + obj.axles.push_back(0); } void VehicleType::Bogie::Loader::position(float p)