From: Mikko Rasa Date: Wed, 15 Dec 2010 06:14:55 +0000 (+0000) Subject: Derive Collection3D from Msp::DataFile and get GL::Objects through it X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=8dce175e31941c2f6e92ce52204e9b61a071d4f9;p=r2c2.git Derive Collection3D from Msp::DataFile and get GL::Objects through it --- diff --git a/source/3d/catalogue.cpp b/source/3d/catalogue.cpp index 8641013..99148f8 100644 --- a/source/3d/catalogue.cpp +++ b/source/3d/catalogue.cpp @@ -5,7 +5,11 @@ Copyright © 2010 Mikkosoft Productions, Mikko Rasa Distributed under the GPL */ +#include #include +#include +#include +#include #include "catalogue.h" #include "tracktype.h" #include "vehicletype.h" @@ -19,6 +23,12 @@ Catalogue3D::Catalogue3D(Catalogue &c): catalogue(c), endpoint_mesh((GL::NORMAL3, GL::VERTEX3)) { + add_creator(&Catalogue3D::create); + add_creator(&Catalogue3D::create); + add_creator(&Catalogue3D::create2); + add_creator(&Catalogue3D::create); + add_creator(&Catalogue3D::create2); + catalogue.signal_track_added.connect(sigc::mem_fun(this, &Catalogue3D::track_added)); catalogue.signal_vehicle_added.connect(sigc::mem_fun(this, &Catalogue3D::vehicle_added)); @@ -93,4 +103,32 @@ void Catalogue3D::build_endpoint_mesh() bld.end(); } +FS::Path Catalogue3D::locate_file(const string &name) +{ + if(FS::exists(name)) + return name; + + FS::Path path = FS::Path("data")/name; + if(FS::exists(path)) + return path; + + throw Exception("Can't locate "+name); +} + +template +T *Catalogue3D::create(const string &name) +{ + RefPtr obj = new T; + DataFile::load(*obj, locate_file(name).str()); + return obj.release(); +} + +template +T *Catalogue3D::create2(const string &name) +{ + RefPtr obj = new T; + DataFile::load(*obj, locate_file(name).str(), *this); + return obj.release(); +} + } // namespace R2C2 diff --git a/source/3d/catalogue.h b/source/3d/catalogue.h index bda1314..caf104e 100644 --- a/source/3d/catalogue.h +++ b/source/3d/catalogue.h @@ -8,6 +8,8 @@ Distributed under the GPL #ifndef R2C2_3D_CATALOGUE_H_ #define R2C2_3D_CATALOGUE_H_ +#include +#include #include #include #include "libr2c2/catalogue.h" @@ -17,7 +19,7 @@ namespace R2C2 { class TrackType3D; class VehicleType3D; -class Catalogue3D +class Catalogue3D: public Msp::DataFile::Collection { private: Catalogue &catalogue; @@ -41,6 +43,14 @@ private: void track_added(const TrackType &); void vehicle_added(const VehicleType &); void build_endpoint_mesh(); + + Msp::FS::Path locate_file(const std::string &); + + template + T *create(const std::string &); + + template + T *create2(const std::string &); }; } diff --git a/source/3d/vehicletype.cpp b/source/3d/vehicletype.cpp index 2ddd34d..27fb883 100644 --- a/source/3d/vehicletype.cpp +++ b/source/3d/vehicletype.cpp @@ -31,7 +31,7 @@ T get(const map ¶ms, const string &key, T def = T()) namespace R2C2 { -VehicleType3D::VehicleType3D(const Catalogue3D &c, const VehicleType &t): +VehicleType3D::VehicleType3D(Catalogue3D &c, const VehicleType &t): catalogue(c), type(t), body_object(0), @@ -144,10 +144,7 @@ GL::Object *VehicleType3D::get_object(const string &name) } } else - { - ptr = new GL::Object; - DataFile::load(*ptr, name); - } + return catalogue.get(name); } return ptr; } diff --git a/source/3d/vehicletype.h b/source/3d/vehicletype.h index bef461c..8be9f3a 100644 --- a/source/3d/vehicletype.h +++ b/source/3d/vehicletype.h @@ -19,7 +19,7 @@ class Catalogue3D; class VehicleType3D { private: - const Catalogue3D &catalogue; + Catalogue3D &catalogue; const VehicleType &type; std::map objects; Msp::GL::Object *body_object; @@ -28,7 +28,7 @@ private: std::vector rod_objects; public: - VehicleType3D(const Catalogue3D &, const VehicleType &); + VehicleType3D(Catalogue3D &, const VehicleType &); ~VehicleType3D(); const Msp::GL::Object *get_body_object() const { return body_object; }