X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2F3d%2Fvehicletype.cpp;h=be6b985be828df81ed6bdf8a1288af638686dc81;hb=9abaa89f495307c7e90cbef51ae0fedbaff001db;hp=a808185afd942776868de45f14d9646c5e9d545d;hpb=e5cd9e4fbc577036a0385c985b6b65df8218d0a2;p=r2c2.git diff --git a/source/3d/vehicletype.cpp b/source/3d/vehicletype.cpp index a808185..be6b985 100644 --- a/source/3d/vehicletype.cpp +++ b/source/3d/vehicletype.cpp @@ -7,45 +7,75 @@ Distributed under the GPL #include #include +#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 &axles = vt.get_axles(); + for(vector::const_iterator i=axles.begin(); i!=axles.end(); ++i) + axle_objects[0].push_back(get_object(i->object)); + + const vector &bogies = vt.get_bogies(); + for(vector::const_iterator i=bogies.begin(); i!=bogies.end(); ++i) + { + bogie_objects.push_back(get_object(i->object)); + axle_objects.push_back(vector()); + for(vector::const_iterator j=i->axles.begin(); j!=i->axles.end(); ++j) + axle_objects.back().push_back(get_object(j->object)); + } +} + +VehicleType3D::~VehicleType3D() +{ + for(map::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