#include <msp/gl/meshbuilder.h>
#include <msp/gl/vector.h>
+#include "catalogue.h"
#include "vehicletype.h"
+using namespace std;
using namespace Msp;
namespace Marklin {
VehicleType3D::VehicleType3D(Catalogue3D &, const VehicleType &vt):
- body_mesh((GL::NORMAL3, GL::VERTEX3))
+ body_object(0),
+ axle_objects(1)
{
- GL::Vector3 corner(vt.get_length()/2, vt.get_width()/2, vt.get_height());
-
- GL::MeshBuilder bld(body_mesh);
- bld.begin(GL::QUADS);
- bld.normal(1, 0, 0);
- bld.vertex(corner.x, -corner.y, 0);
- bld.vertex(corner.x, corner.y, 0);
- bld.vertex(corner.x, corner.y, corner.z);
- bld.vertex(corner.x, -corner.y, corner.z);
- bld.normal(-1, 0, 0);
- bld.vertex(-corner.x, corner.y, 0);
- bld.vertex(-corner.x, -corner.y, 0);
- bld.vertex(-corner.x, -corner.y, corner.z);
- bld.vertex(-corner.x, corner.y, corner.z);
- bld.normal(0, 1, 0);
- bld.vertex(corner.x, corner.y, 0);
- bld.vertex(-corner.x, corner.y, 0);
- bld.vertex(-corner.x, corner.y, corner.z);
- bld.vertex(corner.x, corner.y, corner.z);
- bld.normal(0, -1, 0);
- bld.vertex(-corner.x, -corner.y, 0);
- bld.vertex(corner.x, -corner.y, 0);
- bld.vertex(corner.x, -corner.y, corner.z);
- bld.vertex(-corner.x, -corner.y, corner.z);
- bld.normal(0, 0, 1);
- bld.vertex(-corner.x, -corner.y, corner.z);
- bld.vertex(corner.x, -corner.y, corner.z);
- bld.vertex(corner.x, corner.y, corner.z);
- bld.vertex(-corner.x, corner.y, corner.z);
- bld.end();
+ body_object = get_object(vt.get_object());
+
+ const vector<VehicleType::Axle> &axles = vt.get_axles();
+ for(vector<VehicleType::Axle>::const_iterator i=axles.begin(); i!=axles.end(); ++i)
+ axle_objects[0].push_back(get_object(i->object));
+
+ const vector<VehicleType::Bogie> &bogies = vt.get_bogies();
+ for(vector<VehicleType::Bogie>::const_iterator i=bogies.begin(); i!=bogies.end(); ++i)
+ {
+ bogie_objects.push_back(get_object(i->object));
+ axle_objects.push_back(vector<GL::Object *>());
+ for(vector<VehicleType::Axle>::const_iterator j=i->axles.begin(); j!=i->axles.end(); ++j)
+ axle_objects.back().push_back(get_object(j->object));
+ }
+}
+
+VehicleType3D::~VehicleType3D()
+{
+ for(map<string, GL::Object *>::iterator i=objects.begin(); i!=objects.end(); ++i)
+ delete i->second;
+}
+
+const GL::Object *VehicleType3D::get_axle_object(unsigned i) const
+{
+ if(i>=axle_objects[0].size())
+ throw InvalidParameterValue("Axle index out of range");
+ return axle_objects[0][i];
+}
+
+const GL::Object *VehicleType3D::get_bogie_object(unsigned i) const
+{
+ if(i>=bogie_objects.size())
+ throw InvalidParameterValue("Bogie index out of range");
+ return bogie_objects[i];
+}
+
+const GL::Object *VehicleType3D::get_bogie_axle_object(unsigned i, unsigned j) const
+{
+ if(i>=bogie_objects.size())
+ throw InvalidParameterValue("Bogie index out of range");
+ if(j>=axle_objects[i+1].size())
+ throw InvalidParameterValue("Axle index out of range");
+ return axle_objects[i+1][j];
+}
+
+GL::Object *VehicleType3D::get_object(const string &name)
+{
+ if(name.empty())
+ return 0;
+
+ GL::Object *&ptr = objects[name];
+ if(!ptr)
+ {
+ ptr = new GL::Object;
+ DataFile::load(*ptr, name);
+ }
+ return ptr;
}
} // namespace Marklin