X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fvehicletype.cpp;h=973070ceafc158fe2fddfd4fb966115c5c1ca2a6;hb=59bae8acd679127602cf35d22bcd37e316a5a056;hp=3d695f82622ada1cf4e269ef6cb78dbfb10331ef;hpb=1ff06c5bc46a677fa389ef86c6b26664368f1653;p=r2c2.git diff --git a/source/libr2c2/vehicletype.cpp b/source/libr2c2/vehicletype.cpp index 3d695f8..973070c 100644 --- a/source/libr2c2/vehicletype.cpp +++ b/source/libr2c2/vehicletype.cpp @@ -1,10 +1,5 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - +#include +#include #include "vehicletype.h" using namespace std; @@ -13,11 +8,13 @@ using namespace Msp; namespace R2C2 { VehicleType::VehicleType(const ArticleNumber &an): - art_nr(an), + ObjectType(an), locomotive(false), + swap_direction(false), length(0), width(0), - height(0) + height(0), + rotate_object(false) { } unsigned VehicleType::get_max_function() const @@ -27,6 +24,36 @@ unsigned VehicleType::get_max_function() const return (--functions.end())->first; } +const VehicleType::Axle &VehicleType::get_fixed_axle(unsigned i) const +{ + if(i>=axles.size()) + throw out_of_range("VehicleType::get_fixed_axle"); + return axles[i]; +} + +const VehicleType::Bogie &VehicleType::get_bogie(unsigned i) const +{ + if(i>=bogies.size()) + throw out_of_range("VehicleType::get_bogie"); + return bogies[i]; +} + +const VehicleType::Axle &VehicleType::get_bogie_axle(unsigned i, unsigned j) const +{ + if(i>=bogies.size()) + 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]; +} + +const VehicleType::Rod &VehicleType::get_rod(unsigned i) const +{ + if(i>=rods.size()) + throw out_of_range("VehicleType::get_rod"); + return rods[i]; +} + float VehicleType::get_front_axle_offset() const { float front = length/2; @@ -67,8 +94,18 @@ 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) + DataFile::DerivedObjectLoader(vt) { add("axle", &Loader::axle); add("bogie", &Loader::bogie); @@ -77,7 +114,9 @@ VehicleType::Loader::Loader(VehicleType &vt): add("length", &Loader::length); add("locomotive", &VehicleType::locomotive); add("object", &VehicleType::object); - add("name", &VehicleType::name); + add("rod", &Loader::rod); + add("rotate_object", &VehicleType::rotate_object); + add("swap_direction", &VehicleType::swap_direction); add("width", &Loader::width); } @@ -110,6 +149,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 +207,76 @@ 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) +{ + obj.connect_index = get_item(tags, t); + 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) +{ + obj.pivot_index = get_item(tags, t); + obj.pivot = ROD; +} + +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 lexical_error(format("conversion of '%s' to Rod::Limit", s)); +} + } // namespace R2C2