]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/vehicletype.cpp
Rename Point to Vector
[r2c2.git] / source / libr2c2 / vehicletype.cpp
index 3d695f82622ada1cf4e269ef6cb78dbfb10331ef..7b355ac105230458f5a5856abfb7677d687cc1de 100644 (file)
@@ -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<VehicleType>(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<string, unsigned> &t):
+       DataFile::ObjectLoader<Rod>(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<string, unsigned>::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<string, unsigned>::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