]> git.tdb.fi Git - r2c2.git/blobdiff - source/3d/overlay.cpp
Rename the project to R²C²
[r2c2.git] / source / 3d / overlay.cpp
index 5f07ac81a6d04ad97bb81ee696b629f8ab965c8a..ee9fea7892d465c8e439161cbf4bce17edd0c81f 100644 (file)
@@ -1,6 +1,6 @@
 /* $Id$
 
-This file is part of the MSP Märklin suite
+This file is part of R²C²
 Copyright © 2010 Mikkosoft Productions, Mikko Rasa
 Distributed under the GPL
 */
@@ -18,7 +18,7 @@ Distributed under the GPL
 using namespace std;
 using namespace Msp;
 
-namespace Marklin {
+namespace R2C2 {
 
 Overlay3D::Overlay3D(const Graphics::Window &w, const GL::Camera &c, const GL::Font &f):
        window(w),
@@ -30,15 +30,17 @@ Overlay3D::~Overlay3D()
 {
        for(map<string, GL::Mesh *>::iterator i=graphics.begin(); i!=graphics.end(); ++i)
                delete i->second;
+       for(map<const Object3D *, Icon *>::iterator i=icons.begin(); i!=icons.end(); ++i)
+               delete i->second;
 }
 
-void Overlay3D::set_label(const Track3D &track, const string &label)
+void Overlay3D::set_label(const Object3D &track, const string &label)
 {
        get_icon(track).label = label;
        update_icon(get_icon(track));
 }
 
-void Overlay3D::add_graphic(const Track3D &track, const string &grf_name)
+void Overlay3D::add_graphic(const Object3D &track, const string &grf_name)
 {
        const GL::Mesh *grf = get_graphic(grf_name);
        if(!grf)
@@ -51,7 +53,7 @@ void Overlay3D::add_graphic(const Track3D &track, const string &grf_name)
        update_icon(icon);
 }
 
-void Overlay3D::remove_graphic(const Track3D &track, const string &grf_name)
+void Overlay3D::remove_graphic(const Object3D &track, const string &grf_name)
 {
        const GL::Mesh *grf = get_graphic(grf_name);
        Icon &icon = get_icon(track);
@@ -60,15 +62,15 @@ void Overlay3D::remove_graphic(const Track3D &track, const string &grf_name)
        update_icon(icon);
 }
 
-void Overlay3D::clear_graphics(const Track3D &track)
+void Overlay3D::clear_graphics(const Object3D &track)
 {
        get_icon(track).graphics.clear();
        update_icon(get_icon(track));
 }
 
-void Overlay3D::clear(const Track3D &track)
+void Overlay3D::clear(const Object3D &track)
 {
-       map<const Track3D *, Icon *>::iterator i = icons.find(&track);
+       map<const Object3D *, Icon *>::iterator i = icons.find(&track);
        if(i!=icons.end())
        {
                delete i->second;
@@ -94,21 +96,15 @@ void Overlay3D::render(const GL::Tag &tag) const
                float spacing = round(size*1.1)/size;
                float baseline = round((0.5-font.get_ascent()*0.5-font.get_descent()*0.5)*size)/size;
 
-               for(map<const Track3D *, Icon *>::const_iterator i=icons.begin(); i!=icons.end(); ++i)
+               for(map<const Object3D *, Icon *>::const_iterator i=icons.begin(); i!=icons.end(); ++i)
                {
-                       const Icon &icon = *i->second;
+                       if(!i->first->is_visible())
+                               continue;
 
-                       const Point &pos = i->first->get_track().get_position();
-                       Point minp;
-                       Point maxp;
-                       i->first->get_type().get_bounds(0, minp, maxp);
-                       float rot = i->first->get_track().get_rotation();
-                       float c = cos(rot);
-                       float s = sin(rot);
+                       const Icon &icon = *i->second;
 
-                       GL::Vector3 p((minp.x+maxp.x)/2, (minp.y+maxp.y)/2, 0);
-                       p = GL::Vector3(pos.x+c*p.x-s*p.y, pos.y+s*p.x+c*p.y, pos.z+0.02);
-                       p = camera.project(p);
+                       Point node = i->first->get_node();
+                       GL::Vector3 p = camera.project(GL::Vector3(node.x, node.y, node.z));
 
                        GL::PushMatrix push_mat;
                        p.x = int(p.x*0.5*window.get_width()-icon.width*size/2);
@@ -137,7 +133,7 @@ void Overlay3D::render(const GL::Tag &tag) const
        }
 }
 
-Overlay3D::Icon &Overlay3D::get_icon(const Track3D &track)
+Overlay3D::Icon &Overlay3D::get_icon(const Object3D &track)
 {
        Icon *&icon = icons[&track];
        if(!icon)
@@ -199,4 +195,4 @@ Overlay3D::Icon::Icon():
        background((GL::COLOR4_UBYTE, GL::VERTEX2))
 { }
 
-} // namespace Marklin
+} // namespace R2C2