]> git.tdb.fi Git - r2c2.git/blobdiff - source/3d/vehicletype.cpp
Render vehicles with real 3D models
[r2c2.git] / source / 3d / vehicletype.cpp
index a808185afd942776868de45f14d9646c5e9d545d..91c123866de22888bd67e8ed725bc92e6b080741 100644 (file)
@@ -7,45 +7,59 @@ 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),
+       bogie_objects(vt.get_bogies().size())
 {
-       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());
+
+       for(unsigned i=0; i<bogie_objects.size(); ++i)
+               bogie_objects[i] = get_object(vt.get_bogies()[i].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) const
+{
+       return 0;
+}
+
+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, unsigned) const
+{
+       return 0;
+}
+
+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