1 #include <msp/core/maputils.h>
2 #include "vehicletype.h"
9 VehicleType::VehicleType(const ArticleNumber &an):
12 swap_direction(false),
18 unsigned VehicleType::get_max_function() const
22 return (--functions.end())->first;
25 const VehicleType::Axle &VehicleType::get_fixed_axle(unsigned i) const
28 throw InvalidParameterValue("Axle index out of range");
32 const VehicleType::Bogie &VehicleType::get_bogie(unsigned i) const
35 throw InvalidParameterValue("Axle index out of range");
39 const VehicleType::Axle &VehicleType::get_bogie_axle(unsigned i, unsigned j) const
42 throw InvalidParameterValue("Axle index out of range");
43 if(j>=bogies[i].axles.size())
44 throw InvalidParameterValue("Axle index out of range");
45 return bogies[i].axles[j];
48 const VehicleType::Rod &VehicleType::get_rod(unsigned i) const
51 throw InvalidParameterValue("Rod index out of range");
55 float VehicleType::get_front_axle_offset() const
57 float front = length/2;
59 front = axles.front().position;
62 const Bogie &bogie = bogies.front();
63 front = max(front, bogie.position+bogie.axles.front().position);
68 float VehicleType::get_back_axle_offset() const
70 float back = -length/2;
72 back = axles.back().position;
75 const Bogie &bogie = bogies.back();
76 back = min(back, bogie.position+bogie.axles.back().position);
82 VehicleType::Axle::Axle():
89 VehicleType::Bogie::Bogie():
95 VehicleType::Rod::Rod():
105 VehicleType::Loader::Loader(VehicleType &vt):
106 DataFile::ObjectLoader<VehicleType>(vt)
108 add("axle", &Loader::axle);
109 add("bogie", &Loader::bogie);
110 add("function", &Loader::function);
111 add("height", &Loader::height);
112 add("length", &Loader::length);
113 add("locomotive", &VehicleType::locomotive);
114 add("name", &VehicleType::name);
115 add("object", &VehicleType::object);
116 add("rod", &Loader::rod);
117 add("swap_direction", &VehicleType::swap_direction);
118 add("width", &Loader::width);
121 void VehicleType::Loader::axle()
125 obj.axles.push_back(axl);
128 void VehicleType::Loader::bogie()
132 obj.bogies.push_back(bog);
135 void VehicleType::Loader::function(unsigned i, const string &f)
137 obj.functions[i] = f;
140 void VehicleType::Loader::height(float h)
145 void VehicleType::Loader::length(float l)
150 void VehicleType::Loader::rod()
153 Rod::Loader ldr(rd, rod_tags);
155 obj.rods.push_back(rd);
156 if(!ldr.get_tag().empty())
157 rod_tags[ldr.get_tag()] = obj.rods.size()-1;
158 rod_tags["previous"] = obj.rods.size()-1;
161 void VehicleType::Loader::width(float w)
167 VehicleType::Axle::Loader::Loader(Axle &a):
168 DataFile::ObjectLoader<Axle>(a)
170 add("object", &Axle::object);
171 add("position", &Loader::position);
172 add("powered", &Axle::powered);
173 add("wheel_diameter", &Loader::wheel_diameter);
176 void VehicleType::Axle::Loader::position(float p)
178 obj.position = p/1000;
181 void VehicleType::Axle::Loader::wheel_diameter(float d)
183 obj.wheel_dia = d/1000;
187 VehicleType::Bogie::Loader::Loader(Bogie &b):
188 DataFile::ObjectLoader<Bogie>(b)
190 add("axle", &Loader::axle);
191 add("object", &Bogie::object);
192 add("position", &Loader::position);
193 add("rotate_object", &Bogie::rotate_object);
196 void VehicleType::Bogie::Loader::axle()
200 obj.axles.push_back(axl);
203 void VehicleType::Bogie::Loader::position(float p)
205 obj.position = p/1000;
209 VehicleType::Rod::Loader::Loader(Rod &r, const map<string, unsigned> &t):
210 DataFile::ObjectLoader<Rod>(r),
213 add("connect", &Loader::connect);
214 add("limit", &Rod::limit);
215 add("mirror_object", &Rod::mirror_object);
216 add("object", &Rod::object);
217 add("pivot_body", &Loader::pivot_body);
218 add("pivot_axle", &Loader::pivot_axle);
219 add("pivot_axle", &Loader::pivot_bogie_axle);
220 add("pivot_rod", &Loader::pivot_rod);
221 add("position", &Loader::position);
222 add("tag", &Loader::set_tag);
225 void VehicleType::Rod::Loader::connect(const string &t, float px, float pz, float ox, float oz)
227 obj.connect_index = get_item(tags, t);
228 obj.connect_point = Vector(px/1000, 0, pz/1000);
229 obj.connect_offset = Vector(ox/1000, 0, oz/1000);
232 void VehicleType::Rod::Loader::pivot_body()
237 void VehicleType::Rod::Loader::pivot_axle(unsigned i)
243 void VehicleType::Rod::Loader::pivot_bogie_axle(unsigned i, unsigned j)
245 obj.pivot = BOGIE_AXLE;
247 obj.pivot_index2 = j;
250 void VehicleType::Rod::Loader::pivot_rod(const string &t)
252 obj.pivot_index = get_item(tags, t);
256 void VehicleType::Rod::Loader::position(float x, float y, float z)
258 obj.pivot_point = Vector(x/1000, y/1000, z/1000);
261 void VehicleType::Rod::Loader::set_tag(const string &t)
267 void operator>>(const LexicalConverter &c, VehicleType::Rod::Limit &l)
269 const string &s = c.get();
271 l = VehicleType::Rod::FIXED;
273 l = VehicleType::Rod::ROTATE;
274 else if(s=="SLIDE_X")
275 l = VehicleType::Rod::SLIDE_X;
277 throw LexicalError("Invalid value for Rod::Limit");