-/* $Id$
-
-This file is part of R²C²
-Copyright © 2010 Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
#ifndef LIBR2C2_VEHICLETYPE_H_
#define LIBR2C2_VEHICLETYPE_H_
#include <msp/datafile/objectloader.h>
-#include "articlenumber.h"
+#include "geometry.h"
+#include "objecttype.h"
namespace R2C2 {
-class VehicleType
+class VehicleType: public ObjectType
{
public:
- class Loader: public Msp::DataFile::ObjectLoader<VehicleType>
+ class Loader: public Msp::DataFile::DerivedObjectLoader<VehicleType, ObjectType::Loader>
{
+ private:
+ std::map<std::string, unsigned> rod_tags;
+
public:
Loader(VehicleType &);
private:
void function(unsigned, const std::string &);
void height(float);
void length(float);
+ void rod();
void width(float);
};
Axle();
};
+ typedef std::vector<Axle> AxleArray;
+
struct Bogie
{
class Loader: public Msp::DataFile::ObjectLoader<Bogie>
};
float position;
- std::vector<Axle> axles;
+ AxleArray axles;
std::string object;
bool rotate_object;
Bogie();
};
+ typedef std::vector<Bogie> BogieArray;
+
+ struct Rod
+ {
+ enum Anchor
+ {
+ BODY,
+ AXLE,
+ BOGIE_AXLE,
+ ROD
+ };
+
+ enum Limit
+ {
+ FIXED,
+ ROTATE,
+ SLIDE_X
+ };
+
+ class Loader: public Msp::DataFile::ObjectLoader<Rod>
+ {
+ private:
+ const std::map<std::string, unsigned> &tags;
+ std::string tag;
+
+ public:
+ Loader(Rod &, const std::map<std::string, unsigned> &);
+ const std::string &get_tag() const { return tag; }
+ private:
+ void connect(const std::string &, float, float, float, float);
+ void limit(Limit);
+ void pivot_body();
+ void pivot_axle(unsigned);
+ void pivot_bogie_axle(unsigned, unsigned);
+ void pivot_rod(const std::string &);
+ void position(float, float, float);
+ void set_tag(const std::string &);
+ };
+
+ Anchor pivot;
+ unsigned pivot_index;
+ unsigned pivot_index2;
+ Vector pivot_point;
+ Limit limit;
+ int connect_index;
+ Vector connect_point;
+ Vector connect_offset;
+ std::string object;
+ bool mirror_object;
+
+ Rod();
+ };
+
+ typedef std::vector<Rod> RodArray;
+
+ typedef std::map<unsigned, std::string> FunctionMap;
+
private:
- ArticleNumber art_nr;
- std::string name;
bool locomotive;
- std::map<unsigned, std::string> functions;
+ FunctionMap functions;
+ bool swap_direction;
float length;
float width;
float height;
- std::vector<Axle> axles;
- std::vector<Bogie> bogies;
+ AxleArray axles;
+ BogieArray bogies;
+ RodArray rods;
std::string object;
+ bool rotate_object;
public:
VehicleType(const ArticleNumber &);
- const ArticleNumber &get_article_number() const { return art_nr; }
- const std::string &get_name() const { return name; }
bool is_locomotive() const { return locomotive; }
unsigned get_max_function() const;
- const std::map<unsigned, std::string> &get_functions() const { return functions; }
+ const FunctionMap &get_functions() const { return functions; }
+ bool get_swap_direction() const { return swap_direction; }
float get_length() const { return length; }
float get_width() const { return width; }
float get_height() const { return height; }
- const std::vector<Axle> &get_axles() const { return axles; }
- const std::vector<Bogie> &get_bogies() const { return bogies; }
+ const AxleArray &get_fixed_axles() const { return axles; }
+ const Axle &get_fixed_axle(unsigned) const;
+ const BogieArray &get_bogies() const { return bogies; }
+ const Bogie &get_bogie(unsigned) const;
+ const Axle &get_bogie_axle(unsigned, unsigned) const;
+ const RodArray &get_rods() const { return rods; }
+ const Rod &get_rod(unsigned) const;
float get_front_axle_offset() const;
float get_back_axle_offset() const;
const std::string &get_object() const { return object; }
+ bool get_rotate_object() const { return rotate_object; }
};
} // namespace R2C2