3 This file is part of R²C²
4 Copyright © 2010 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
8 #include "vehicletype.h"
15 VehicleType::VehicleType(const ArticleNumber &an):
23 unsigned VehicleType::get_max_function() const
27 return (--functions.end())->first;
30 float VehicleType::get_front_axle_offset() const
32 float front = length/2;
34 front = axles.front().position;
37 const Bogie &bogie = bogies.front();
38 front = max(front, bogie.position+bogie.axles.front().position);
43 float VehicleType::get_back_axle_offset() const
45 float back = -length/2;
47 back = axles.back().position;
50 const Bogie &bogie = bogies.back();
51 back = min(back, bogie.position+bogie.axles.back().position);
57 VehicleType::Axle::Axle():
64 VehicleType::Bogie::Bogie():
70 VehicleType::Rod::Rod():
80 VehicleType::Loader::Loader(VehicleType &vt):
81 DataFile::ObjectLoader<VehicleType>(vt)
83 add("axle", &Loader::axle);
84 add("bogie", &Loader::bogie);
85 add("function", &Loader::function);
86 add("height", &Loader::height);
87 add("length", &Loader::length);
88 add("locomotive", &VehicleType::locomotive);
89 add("name", &VehicleType::name);
90 add("object", &VehicleType::object);
91 add("rod", &Loader::rod);
92 add("width", &Loader::width);
95 void VehicleType::Loader::axle()
99 obj.axles.push_back(axl);
102 void VehicleType::Loader::bogie()
106 obj.bogies.push_back(bog);
109 void VehicleType::Loader::function(unsigned i, const string &f)
111 obj.functions[i] = f;
114 void VehicleType::Loader::height(float h)
119 void VehicleType::Loader::length(float l)
124 void VehicleType::Loader::rod()
127 Rod::Loader ldr(rd, rod_tags);
129 obj.rods.push_back(rd);
130 if(!ldr.get_tag().empty())
131 rod_tags[ldr.get_tag()] = obj.rods.size()-1;
132 rod_tags["previous"] = obj.rods.size()-1;
135 void VehicleType::Loader::width(float w)
141 VehicleType::Axle::Loader::Loader(Axle &a):
142 DataFile::ObjectLoader<Axle>(a)
144 add("object", &Axle::object);
145 add("position", &Loader::position);
146 add("powered", &Axle::powered);
147 add("wheel_diameter", &Loader::wheel_diameter);
150 void VehicleType::Axle::Loader::position(float p)
152 obj.position = p/1000;
155 void VehicleType::Axle::Loader::wheel_diameter(float d)
157 obj.wheel_dia = d/1000;
161 VehicleType::Bogie::Loader::Loader(Bogie &b):
162 DataFile::ObjectLoader<Bogie>(b)
164 add("axle", &Loader::axle);
165 add("object", &Bogie::object);
166 add("position", &Loader::position);
167 add("rotate_object", &Bogie::rotate_object);
170 void VehicleType::Bogie::Loader::axle()
174 obj.axles.push_back(axl);
177 void VehicleType::Bogie::Loader::position(float p)
179 obj.position = p/1000;
183 VehicleType::Rod::Loader::Loader(Rod &r, const map<string, unsigned> &t):
184 DataFile::ObjectLoader<Rod>(r),
187 add("connect", &Loader::connect);
188 add("limit", &Rod::limit);
189 add("mirror_object", &Rod::mirror_object);
190 add("object", &Rod::object);
191 add("pivot_body", &Loader::pivot_body);
192 add("pivot_axle", &Loader::pivot_axle);
193 add("pivot_axle", &Loader::pivot_bogie_axle);
194 add("pivot_rod", &Loader::pivot_rod);
195 add("position", &Loader::position);
196 add("tag", &Loader::set_tag);
199 void VehicleType::Rod::Loader::connect(const string &t, float px, float pz, float ox, float oz)
201 map<string, unsigned>::const_iterator i = tags.find(t);
203 throw KeyError("Unknown rod tag", t);
204 obj.connect_index = i->second;
205 obj.connect_point = Point(px/1000, 0, pz/1000);
206 obj.connect_offset = Point(ox/1000, 0, oz/1000);
209 void VehicleType::Rod::Loader::pivot_body()
214 void VehicleType::Rod::Loader::pivot_axle(unsigned i)
220 void VehicleType::Rod::Loader::pivot_bogie_axle(unsigned i, unsigned j)
222 obj.pivot = BOGIE_AXLE;
224 obj.pivot_index2 = j;
227 void VehicleType::Rod::Loader::pivot_rod(const string &t)
229 map<string, unsigned>::const_iterator i = tags.find(t);
231 throw KeyError("Unknown rod tag", t);
233 obj.pivot_index = i->second;
236 void VehicleType::Rod::Loader::position(float x, float y, float z)
238 obj.pivot_point = Point(x/1000, y/1000, z/1000);
241 void VehicleType::Rod::Loader::set_tag(const string &t)
247 void operator>>(const LexicalConverter &c, VehicleType::Rod::Limit &l)
249 const string &s = c.get();
251 l = VehicleType::Rod::FIXED;
253 l = VehicleType::Rod::ROTATE;
254 else if(s=="SLIDE_X")
255 l = VehicleType::Rod::SLIDE_X;
257 throw LexicalError("Invalid value for Rod::Limit");