X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fvehicletype.cpp;h=7b355ac105230458f5a5856abfb7677d687cc1de;hb=f8a7788cee0261babfc4c804a58515aad6dfbc3d;hp=3d695f82622ada1cf4e269ef6cb78dbfb10331ef;hpb=1ff06c5bc46a677fa389ef86c6b26664368f1653;p=r2c2.git diff --git a/source/libr2c2/vehicletype.cpp b/source/libr2c2/vehicletype.cpp index 3d695f8..7b355ac 100644 --- a/source/libr2c2/vehicletype.cpp +++ b/source/libr2c2/vehicletype.cpp @@ -27,6 +27,36 @@ unsigned VehicleType::get_max_function() const return (--functions.end())->first; } +const VehicleType::Axle &VehicleType::get_axle(unsigned i) const +{ + if(i>=axles.size()) + throw InvalidParameterValue("Axle index out of range"); + return axles[i]; +} + +const VehicleType::Bogie &VehicleType::get_bogie(unsigned i) const +{ + if(i>=bogies.size()) + throw InvalidParameterValue("Axle index out of range"); + return bogies[i]; +} + +const VehicleType::Axle &VehicleType::get_bogie_axle(unsigned i, unsigned j) const +{ + if(i>=bogies.size()) + throw InvalidParameterValue("Axle index out of range"); + if(j>=bogies[i].axles.size()) + throw InvalidParameterValue("Axle index out of range"); + return bogies[i].axles[j]; +} + +const VehicleType::Rod &VehicleType::get_rod(unsigned i) const +{ + if(i>=rods.size()) + throw InvalidParameterValue("Rod index out of range"); + return rods[i]; +} + float VehicleType::get_front_axle_offset() const { float front = length/2; @@ -67,6 +97,16 @@ VehicleType::Bogie::Bogie(): { } +VehicleType::Rod::Rod(): + pivot(BODY), + pivot_index(0), + pivot_index2(0), + limit(ROTATE), + connect_index(-1), + mirror_object(false) +{ } + + VehicleType::Loader::Loader(VehicleType &vt): DataFile::ObjectLoader(vt) { @@ -76,8 +116,9 @@ VehicleType::Loader::Loader(VehicleType &vt): add("height", &Loader::height); add("length", &Loader::length); add("locomotive", &VehicleType::locomotive); - add("object", &VehicleType::object); add("name", &VehicleType::name); + add("object", &VehicleType::object); + add("rod", &Loader::rod); add("width", &Loader::width); } @@ -110,6 +151,17 @@ void VehicleType::Loader::length(float l) obj.length = l/1000; } +void VehicleType::Loader::rod() +{ + Rod rd; + Rod::Loader ldr(rd, rod_tags); + load_sub_with(ldr); + obj.rods.push_back(rd); + if(!ldr.get_tag().empty()) + rod_tags[ldr.get_tag()] = obj.rods.size()-1; + rod_tags["previous"] = obj.rods.size()-1; +} + void VehicleType::Loader::width(float w) { obj.width = w/1000; @@ -157,4 +209,82 @@ void VehicleType::Bogie::Loader::position(float p) obj.position = p/1000; } + +VehicleType::Rod::Loader::Loader(Rod &r, const map &t): + DataFile::ObjectLoader(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::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::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"); +} + } // namespace R2C2