X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2F3d%2Foverlay.cpp;h=ee9fea7892d465c8e439161cbf4bce17edd0c81f;hb=1ff06c5bc46a677fa389ef86c6b26664368f1653;hp=5f07ac81a6d04ad97bb81ee696b629f8ab965c8a;hpb=a861c2729a356173059177a0b800de2b31c9b49c;p=r2c2.git diff --git a/source/3d/overlay.cpp b/source/3d/overlay.cpp index 5f07ac8..ee9fea7 100644 --- a/source/3d/overlay.cpp +++ b/source/3d/overlay.cpp @@ -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::iterator i=graphics.begin(); i!=graphics.end(); ++i) delete i->second; + for(map::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::iterator i = icons.find(&track); + map::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_iterator i=icons.begin(); i!=icons.end(); ++i) + for(map::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