-#include <msp/gl/matrix.h>
-#include <msp/gl/meshbuilder.h>
-#include <msp/gl/renderer.h>
-#include "3d/tracktype.h"
-#include "selection.h"
-#include "trackwrap.h"
-
-using namespace std;
-using namespace Msp;
-using namespace R2C2;
-
-TrackWrap::TrackWrap(Layout3D &l, Selection &s):
- layout(l),
- selection(s)
-{
- selection.signal_changed.connect(sigc::mem_fun(this, &TrackWrap::selection_changed));
-}
-
-TrackWrap::~TrackWrap()
-{
- for(map<const TrackType *, GL::Mesh *>::iterator i=meshes.begin(); i!=meshes.end(); ++i)
- delete i->second;
-}
-
-void TrackWrap::render(GL::Renderer &renderer, const GL::Tag &) const
-{
- for(list<Wrap>::const_iterator i=wraps.begin(); i!=wraps.end(); ++i)
- {
- GL::MatrixStack::Push push(renderer.matrix_stack());
- const Vector &pos = i->track->get_position();
- renderer.matrix_stack() *= GL::Matrix::translation(pos);
- renderer.matrix_stack() *= GL::Matrix::rotation(i->track->get_rotation(), 0, 0, 1);
- i->mesh->draw(renderer);
- }
-}
-
-void TrackWrap::selection_changed()
-{
- wraps.clear();
- const set<Track *> &tracks = selection.get_objects<Track>();
- for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- {
- Wrap wrap;
- wrap.track = *i;
- wrap.mesh = &get_mesh((*i)->get_type());
- wraps.push_back(wrap);
- }
-}
-
-GL::Mesh &TrackWrap::get_mesh(const TrackType &type)
-{
- map<const TrackType *, GL::Mesh *>::iterator j = meshes.find(&type);
- if(j!=meshes.end())
- return *j->second;
-
- const TrackType3D &type3d = layout.get_catalogue().get_track(type);
-
- float min_area = -1;
- Angle angle;
- Vector center;
- float width = 0;
- float height = 0;
- for(Angle a; a<Angle::half_turn(); a+=Angle::from_radians(0.01))
- {
- Vector minp, maxp;
- type3d.get_bounds(a, minp, maxp);
- float area = (maxp.x-minp.x)*(maxp.y-minp.y);
- if(area<min_area || min_area<0)
- {
- center = rotated_vector((minp+maxp)/2.0f, a);
- center.z = minp.z;
- angle = a;
- width = maxp.x-minp.x+0.01;
- height = maxp.y-minp.y+0.01;
-
- min_area = area;
- }
- }
-
- GL::Mesh *mesh = new GL::Mesh((GL::COLOR4_UBYTE, GL::VERTEX2));
- GL::MeshBuilder bld(*mesh);
- bld.color(0.0f, 1.0f, 0.0f, 1.0f);
-
- float c = cos(angle);
- float s = sin(angle);
-
- bld.begin(GL::LINE_LOOP);
- bld.vertex(center.x-c*width/2+s*height/2, center.y-s*width/2-c*height/2);
- bld.vertex(center.x+c*width/2+s*height/2, center.y+s*width/2-c*height/2);
- bld.vertex(center.x+c*width/2-s*height/2, center.y+s*width/2+c*height/2);
- bld.vertex(center.x-c*width/2-s*height/2, center.y-s*width/2+c*height/2);
- bld.end();
-
- meshes[&type] = mesh;
-
- return *mesh;
-}