]> git.tdb.fi Git - r2c2.git/blobdiff - source/3d/vehicletype.cpp
Fix some GL function calls
[r2c2.git] / source / 3d / vehicletype.cpp
index a808185afd942776868de45f14d9646c5e9d545d..be6b985be828df81ed6bdf8a1288af638686dc81 100644 (file)
@@ -7,45 +7,75 @@ Distributed under the GPL
 
 #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