]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/trackwrap.cpp
Make use of the mspmath library
[r2c2.git] / source / designer / trackwrap.cpp
index 45ec19c85a8c1a33ac4b0bdfb1dbaac9c8c1ffe3..398285f7acf70b335c7089be5fc5162ab8b01dfa 100644 (file)
@@ -1,14 +1,7 @@
-/* $Id$
-
-This file is part of R²C²
-Copyright © 2010  Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
 #include <msp/gl/matrix.h>
 #include <msp/gl/meshbuilder.h>
+#include <msp/gl/renderer.h>
 #include "3d/tracktype.h"
-#include "designer.h"
 #include "selection.h"
 #include "trackwrap.h"
 
@@ -16,8 +9,8 @@ using namespace std;
 using namespace Msp;
 using namespace R2C2;
 
-TrackWrap::TrackWrap(Designer &d, Selection &s):
-       designer(d),
+TrackWrap::TrackWrap(Layout3D &l, Selection &s):
+       layout(l),
        selection(s)
 {
        selection.signal_changed.connect(sigc::mem_fun(this, &TrackWrap::selection_changed));
@@ -29,22 +22,22 @@ TrackWrap::~TrackWrap()
                delete i->second;
 }
 
-void TrackWrap::render(const GL::Tag &) const
+void TrackWrap::render(GL::Renderer &renderer, const GL::Tag &) const
 {
        for(list<Wrap>::const_iterator i=wraps.begin(); i!=wraps.end(); ++i)
        {
-               GL::PushMatrix _pushm;
+               GL::MatrixStack::Push push(renderer.matrix_stack());
                const Vector &pos = i->track->get_position();
-               GL::translate(pos.x, pos.y, pos.z);
-               GL::rotate(i->track->get_rotation()*180/M_PI, 0, 0, 1);
-               i->mesh->draw();
+               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_tracks();
+       const set<Track *> &tracks = selection.get_objects<Track>();
        for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
        {
                Wrap wrap;
@@ -60,25 +53,22 @@ GL::Mesh &TrackWrap::get_mesh(const TrackType &type)
        if(j!=meshes.end())
                return *j->second;
 
-       const TrackType3D &type3d = designer.get_layout_3d().get_catalogue().get_track(type);
+       const TrackType3D &type3d = layout.get_catalogue().get_track(type);
 
        float min_area = -1;
-       float angle = 0;
+       Angle angle;
        Vector center;
        float width = 0;
        float height = 0;
-       for(float a=0; a<M_PI; a+=0.01)
+       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)
                {
-                       float c = cos(a);
-                       float s = sin(a);
-                       float x = (minp.x+maxp.x)/2;
-                       float y = (minp.y+maxp.y)/2;
-                       center = Vector(c*x-s*y, s*x+c*y, minp.z);
+                       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;