]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/designer.cpp
Support using a mesh as a background
[r2c2.git] / source / designer / designer.cpp
index eb5a0efca455ecd40379ddd34e5c0ca3af2e6c68..2913aea1e43ec00dff88536869259ed7e523a6b9 100644 (file)
@@ -1,16 +1,25 @@
+/* $Id$
+
+This file is part of the MSP Märklin suite
+Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa
+Distributed under the GPL
+*/
+
 #include <signal.h>
 #include <cmath>
 #include <iostream>
 #include <GL/gl.h>
-#include <SDL.h>
 #include <msp/gl/rendermode.h>
 #include <msp/gl/select.h>
+#include <msp/gl/texture2d.h>
+#include <msp/input/keys.h>
 #include <msp/strings/codec.h>
 #include <msp/strings/lexicalcast.h>
 #include <msp/strings/utf8.h>
 #include <msp/strings/utils.h>
 #include <msp/time/units.h>
 #include <msp/time/utils.h>
+#include "libmarklin/tracktype.h"
 #include "designer.h"
 #include "input.h"
 #include "manipulator.h"
@@ -24,6 +33,7 @@ using namespace Msp;
 Designer::Designer(int argc, char **argv):
        screen_w(1280),
        screen_h(960),
+       base_mesh(0),
        input(0),
        mode(SELECT),
        cam_yaw(M_PI/2),
@@ -36,21 +46,19 @@ Designer::Designer(int argc, char **argv):
        rotate(0),
        pitch(0)
 {
-       cout<<"blah?\n";
        catalogue.load("tracks.dat");
-       cout<<catalogue.get_tracks().size()<<'\n';
 
        cat_layout=new Layout(catalogue);
        cat_layout_3d=new Layout3D(*cat_layout);
 
-       const Catalogue::TrackMap &ctracks=catalogue.get_tracks();
+       const map<unsigned, TrackType *> &ctracks=catalogue.get_tracks();
        unsigned n=0;
-       for(Catalogue::TrackMap::const_iterator i=ctracks.begin(); i!=ctracks.end(); ++i, ++n)
+       for(map<unsigned, TrackType *>::const_iterator i=ctracks.begin(); i!=ctracks.end(); ++i, ++n)
        {
-               Track *track=i->second->copy();
+               Track *track=new Track(*i->second);
                track->set_position(Point((n%11)*0.1-0.5, 0.2-n/11*0.3, 0));
                track->set_rotation(M_PI/2);
-               cat_layout->add_track(track);
+               cat_layout->add_track(*track);
        }
 
        manipulator=new Manipulator(*this);
@@ -63,15 +71,21 @@ Designer::Designer(int argc, char **argv):
        if(argc>1)
        {
                layout->load(argv[1]);
-               const Track3DSeq &ltracks=layout_3d->get_tracks();
-               for(Track3DSeq::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i)
+               const list<Track3D *> &ltracks=layout_3d->get_tracks();
+               for(list<Track3D *>::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i)
                {
                        if((*i)->get_track().get_sensor_id())
-                               (*i)->set_color(Color(1, 1, 0.5));
+                               (*i)->set_color(GL::Color(1, 1, 0.5));
                        else if((*i)->get_track().get_turnout_id())
-                               (*i)->set_color(Color(0.5, 1, 1));
+                               (*i)->set_color(GL::Color(0.5, 1, 1));
                        else if((*i)->get_track().get_flex())
-                               (*i)->set_color(Color(1, 0.5, 1));
+                               (*i)->set_color(GL::Color(1, 0.5, 1));
+               }
+
+               if(!layout->get_base().empty())
+               {
+                       base_mesh=new GL::Mesh;
+                       DataFile::load(*base_mesh, layout->get_base());
                }
        }
 
@@ -83,14 +97,30 @@ Designer::Designer(int argc, char **argv):
        measure->signal_done.connect(sigc::mem_fun(this, &Designer::measure_done));
 }
 
+Designer::~Designer()
+{
+       delete manipulator;
+       delete selection;
+       delete layout;
+       delete layout_3d;
+       delete cat_layout;
+       delete cat_layout_3d;
+       delete measure;
+}
+
 int Designer::main()
 {
-       setenv("__GL_SYNC_TO_VBLANK", "1", 0);
-       SDL_Init(SDL_INIT_VIDEO);
-       SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
-       SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
-       SDL_SetVideoMode(screen_w, screen_h, 32, SDL_OPENGL);
-       SDL_EnableUNICODE(1);
+       dpy=new Graphics::Display;
+       wnd=new Graphics::Window(*dpy, screen_w, screen_h);
+       glc=new Graphics::GLContext(*wnd);
+
+       wnd->signal_close.connect(sigc::bind(sigc::mem_fun(this, &Designer::exit), 0));
+       wnd->signal_key_press.connect(sigc::mem_fun(this, &Designer::key_press));
+       wnd->signal_key_release.connect(sigc::mem_fun(this, &Designer::key_release));
+       wnd->signal_button_press.connect(sigc::mem_fun(this, &Designer::button_press));
+       wnd->signal_pointer_motion.connect(sigc::mem_fun(this, &Designer::pointer_motion));
+
+       wnd->show();
 
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnable(GL_DEPTH_TEST);
@@ -98,17 +128,24 @@ int Designer::main()
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glEnable(GL_CULL_FACE);
 
+       GL::Texture2D *font_tex=new GL::Texture2D;
+       font_tex->set_min_filter(GL::LINEAR);
+       font_tex->load_image("dejavu-20.png");
        font=new GL::Font();
-       Parser::load(*font, "dejavu.font");
+       font->set_texture(*font_tex);
+       DataFile::load(*font, "dejavu-20.font");
 
        mode=SELECT;
 
        Application::main();
 
        delete font;
+       delete font_tex;
        delete input;
 
-       SDL_Quit();
+       delete glc;
+       delete wnd;
+       delete dpy;
 
        return exit_code;
 }
@@ -127,8 +164,8 @@ void Designer::map_pointer_coords(int x, int y, float &gx, float &gy)
        float uy=sin_yaw*-sin_pitch*0.41421;
        float uz=cos_pitch*0.41421;
 
-       float xf=(float)x*2/screen_w-1;
-       float yf=1-(float)y*2/screen_h;
+       float xf=static_cast<float>(x)*2/screen_w-1;
+       float yf=static_cast<float>(y)*2/screen_h-1;
 
        float vx=cos_yaw*cos_pitch + xf*rx + yf*ux;
        float vy=sin_yaw*cos_pitch + xf*ry + yf*uy;
@@ -140,36 +177,12 @@ void Designer::map_pointer_coords(int x, int y, float &gx, float &gy)
 
 void Designer::tick()
 {
-       SDL_Event event;
-       while(SDL_PollEvent(&event))
-       {
-               float gx,gy;
-               switch(event.type)
-               {
-               case SDL_MOUSEBUTTONDOWN:
-                       map_pointer_coords(event.button.x, event.button.y, gx, gy);
-                       button_press(event.button.x, screen_h-1-event.button.y, gx, gy, event.button.button);
-                       break;
-               case SDL_MOUSEMOTION:
-                       map_pointer_coords(event.motion.x, event.motion.y, gx, gy);
-                       pointer_motion(event.motion.x, screen_h-1-event.motion.y, gx, gy);
-                       break;
-               case SDL_KEYDOWN:
-                       key_press(event.key.keysym.sym, event.key.keysym.mod, event.key.keysym.unicode);
-                       break;
-               case SDL_KEYUP:
-                       key_release(event.key.keysym.sym, event.key.keysym.mod);
-                       break;
-               case SDL_QUIT:
-                       exit(0);
-                       break;
-               }
-       }
-
-       const Time::TimeStamp t=Time::now();
-       float dt=(t-last_tick)/Time::sec;
+       const Msp::Time::TimeStamp t=Msp::Time::now();
+       float dt=(t-last_tick)/Msp::Time::sec;
        last_tick=t;
 
+       dpy->tick();
+
        if(move_y)
        {
                cam_pos.x+=cos(cam_yaw)*dt*move_y;
@@ -226,102 +239,94 @@ void Designer::tick()
                if(t3d)
                {
                        const Track &track=t3d->get_track();
+                       const TrackType &ttype=track.get_type();
                        ostringstream ss;
                        ss.precision(2);
-                       ss<<track.get_article_number()<<' '<<track.get_description();
+                       ss<<ttype.get_article_number()<<' '<<ttype.get_description();
                        if(mode!=CATALOGUE)
-                               ss<<" (slope "<<track.get_slope()/track.get_length()*100<<"%)";
+                               ss<<" (slope "<<track.get_slope()/ttype.get_total_length()*100<<"%)";
                        if(track.get_turnout_id())
                                ss<<" (turnout "<<track.get_turnout_id()<<')';
                        else if(track.get_sensor_id())
                                ss<<" (sensor "<<track.get_sensor_id()<<')';
-                       tooltip=decode<Utf8>(ss.str());
+                       tooltip=ss.str();
 
                        move_tooltip(pointer_x, pointer_y);
                }
                else
-                       tooltip=L"";
+                       tooltip="";
 
-               tooltip_timeout=Time::TimeStamp();
+               tooltip_timeout=Msp::Time::TimeStamp();
        }
 
        render();
 
-       SDL_GL_SwapBuffers();
-}
-
-Designer::~Designer()
-{
-       delete manipulator;
-       delete selection;
-       delete layout;
-       delete layout_3d;
-       delete cat_layout;
-       delete cat_layout_3d;
-       delete measure;
+       glc->swap_buffers();
 }
 
 /*** private ***/
 
-void Designer::key_press(unsigned key, unsigned mod, wchar_t ch)
+void Designer::key_press(unsigned code, unsigned mod, wchar_t ch)
 {
+       unsigned key=Msp::Input::key_from_sys(code);
+
        if(mode==INPUT)
        {
                input->key_press(key, mod, ch);
                return;
        }
 
-       if(key==SDLK_RSHIFT || key==SDLK_LSHIFT)
+       if(key==Msp::Input::KEY_SHIFT_L || key==Msp::Input::KEY_SHIFT_R)
                shift=true;
 
-       if(key==SDLK_n)
+       if(key==Msp::Input::KEY_N)
                mode=CATALOGUE;
-       else if(key==SDLK_g)
+       else if(key==Msp::Input::KEY_G)
        {
                manipulator->start_move();
                mode=MANIPULATE;
        }
-       else if(key==SDLK_r)
+       else if(key==Msp::Input::KEY_R)
        {
                manipulator->start_rotate();
                mode=MANIPULATE;
        }
-       else if(key==SDLK_d)
+       else if(key==Msp::Input::KEY_D)
        {
                manipulator->duplicate();
                manipulator->start_move();
                mode=MANIPULATE;
        }
-       else if(key==SDLK_w)
+       else if(key==Msp::Input::KEY_W)
        {
-               input=new Input(*this, "Filename");
+               input=new ::Input(*this, "Filename");
                input->signal_cancel.connect(sigc::mem_fun(this, &Designer::input_dismiss));
                input->signal_accept.connect(sigc::mem_fun(this, &Designer::save_accept));
                mode=INPUT;
        }
-       else if(key==SDLK_PLUS)
+       else if(key==Msp::Input::KEY_PLUS)
                selection->select_more();
-       else if(key==SDLK_l && (mod&KMOD_SHIFT))
+       else if(key==Msp::Input::KEY_L && (mod&1))
        {
-               const TrackSeq &tracks=layout->get_tracks();
+               const set<Track *> &tracks=layout->get_tracks();
                float len=0;
-               for(TrackSeq::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
-                       len+=(*i)->get_total_length();
+               for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
+                       len+=(*i)->get_type().get_total_length();
                cout<<"Total length: "<<len<<"m\n";
        }
-       else if(key==SDLK_l)
+       else if(key==Msp::Input::KEY_L)
                selection->select_linked();
-       else if(key==SDLK_m)
+       else if(key==Msp::Input::KEY_M)
        {
                measure->start();
                mode=MEASURE;
        }
-       else if(key==SDLK_z)
+       else if(key==Msp::Input::KEY_Z)
        {
                manipulator->start_elevate();
                mode=MANIPULATE;
        }
-       else if(key==SDLK_ESCAPE)
+       else if(key==Msp::Input::KEY_ESC)
        {
                if(mode==MANIPULATE)
                        manipulator->cancel();
@@ -330,110 +335,117 @@ void Designer::key_press(unsigned key, unsigned mod, wchar_t ch)
                else
                        selection->clear();
        }
-       else if(key==SDLK_x)
+       else if(key==Msp::Input::KEY_X)
        {
-               Selection::TrackSet tracks=selection->get_tracks();
+               set<Track *> tracks=selection->get_tracks();
                selection->clear();
-               for(Selection::TrackSet::iterator i=tracks.begin(); i!=tracks.end(); ++i)
+               for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
                {
-                       layout->remove_track(*i);
+                       layout->remove_track(**i);
                        delete *i;
                }
        }
-       else if(key==SDLK_f && (mod&KMOD_SHIFT))
+       else if(key==Msp::Input::KEY_F && (mod&1))
        {
-               const Selection::TrackSet &tracks=selection->get_tracks();
-               const TrackSeq &ltracks=layout->get_tracks();
-               for(Selection::TrackSet::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
+               const set<Track *> &tracks=selection->get_tracks();
+               const set<Track *> &ltracks=layout->get_tracks();
+               for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
                {
                        (*i)->set_flex(!(*i)->get_flex());
                        (*i)->break_links();
-                       for(TrackSeq::const_iterator j=ltracks.begin(); j!=ltracks.end(); ++j)
+                       for(set<Track *>::const_iterator j=ltracks.begin(); j!=ltracks.end(); ++j)
                                if(*j!=*i)
                                        (*i)->snap_to(**j, true);
 
-                       Track3D *t3d=layout_3d->get_track(*i);
+                       Track3D &t3d=layout_3d->get_track(**i);
                        if((*i)->get_flex())
-                               t3d->set_color(Color(1, 0.5, 1));
+                               t3d.set_color(GL::Color(1, 0.5, 1));
                        else
-                               t3d->set_color(Color(1, 1, 1));
+                               t3d.set_color(GL::Color(1, 1, 1));
                }
        }
-       else if(key==SDLK_f)
+       else if(key==Msp::Input::KEY_F)
                manipulator->flatten();
-       else if(key==SDLK_e && (mod&KMOD_SHIFT))
+       else if(key==Msp::Input::KEY_E && (mod&1))
                manipulator->even_slope(true);
-       else if(key==SDLK_e)
+       else if(key==Msp::Input::KEY_E)
                manipulator->even_slope();
-       else if(key==SDLK_t)
+       else if(key==Msp::Input::KEY_T)
        {
                Track *track=selection->get_track();
-               if(selection->size()==1 && track->get_n_routes()>1)
+               if(selection->size()==1 && track->get_type().get_n_routes()>1)
                {
                        ostringstream ss;
                        ss<<track->get_turnout_id();
-                       input=new Input(*this, "Turnout ID", ss.str());
+                       input=new ::Input(*this, "Turnout ID", ss.str());
                        input->signal_cancel.connect(sigc::mem_fun(this, &Designer::input_dismiss));
                        input->signal_accept.connect(sigc::mem_fun(this, &Designer::turnout_id_accept));
                        mode=INPUT;
                }
        }
-       else if(key==SDLK_s)
+       else if(key==Msp::Input::KEY_S)
        {
                Track *track=selection->get_track();
-               if(selection->size()==1 && track->get_n_routes()==1)
+               if(selection->size()==1 && track->get_type().get_n_routes()==1)
                {
                        ostringstream ss;
                        ss<<track->get_sensor_id();
-                       input=new Input(*this, "Sensor ID", ss.str());
+                       input=new ::Input(*this, "Sensor ID", ss.str());
                        input->signal_cancel.connect(sigc::mem_fun(this, &Designer::input_dismiss));
                        input->signal_accept.connect(sigc::mem_fun(this, &Designer::sensor_id_accept));
                        mode=INPUT;
                }
        }
-       else if(key==SDLK_RIGHT)
+       else if(key==Msp::Input::KEY_RIGHT)
                rotate=-1;
-       else if(key==SDLK_LEFT)
+       else if(key==Msp::Input::KEY_LEFT)
                rotate=1;
-       else if(key==SDLK_UP)
+       else if(key==Msp::Input::KEY_UP)
                move_y=1;
-       else if(key==SDLK_DOWN)
+       else if(key==Msp::Input::KEY_DOWN)
                move_y=-1;
-       else if(key==SDLK_INSERT)
+       else if(key==Msp::Input::KEY_INSERT)
                zoom=-1;
-       else if(key==SDLK_PAGEUP)
+       else if(key==Msp::Input::KEY_PGUP)
                zoom=1;
-       else if(key==SDLK_HOME)
+       else if(key==Msp::Input::KEY_HOME)
                pitch=1;
-       else if(key==SDLK_END)
+       else if(key==Msp::Input::KEY_END)
                pitch=-1;
-       else if(key==SDLK_DELETE)
+       else if(key==Msp::Input::KEY_DELETE)
                move_x=-1;
-       else if(key==SDLK_PAGEDOWN)
+       else if(key==Msp::Input::KEY_PGDN)
                move_x=1;
 }
 
-void Designer::key_release(unsigned key, unsigned)
+void Designer::key_release(unsigned code, unsigned)
 {
+       unsigned key=Msp::Input::key_from_sys(code);
+
        if(mode==INPUT)
                return;
 
-       if(key==SDLK_RSHIFT || key==SDLK_LSHIFT)
+       if(key==Msp::Input::KEY_SHIFT_L || key==Msp::Input::KEY_SHIFT_R)
                shift=false;
-       else if(key==SDLK_RIGHT || key==SDLK_LEFT)
+       else if(key==Msp::Input::KEY_RIGHT || key==Msp::Input::KEY_LEFT)
                rotate=0;
-       else if(key==SDLK_UP || key==SDLK_DOWN)
+       else if(key==Msp::Input::KEY_UP || key==Msp::Input::KEY_DOWN)
                move_y=0;
-       else if(key==SDLK_INSERT || key==SDLK_PAGEUP)
+       else if(key==Msp::Input::KEY_INSERT || key==Msp::Input::KEY_PGUP)
                zoom=0;
-       else if(key==SDLK_HOME || key==SDLK_END)
+       else if(key==Msp::Input::KEY_HOME || key==Msp::Input::KEY_END)
                pitch=0;
-       else if(key==SDLK_DELETE || key==SDLK_PAGEDOWN)
+       else if(key==Msp::Input::KEY_DELETE || key==Msp::Input::KEY_PGDN)
                move_x=0;
 }
 
-void Designer::button_press(int x, int y, float gx, float gy, unsigned btn)
+void Designer::button_press(int x, int y, unsigned btn, unsigned)
 {
+       y=screen_h-y-1;
+
+       float gx, gy;
+       map_pointer_coords(x, y, gx, gy);
+
        if(mode==CATALOGUE)
        {
                if(btn==1)
@@ -443,7 +455,7 @@ void Designer::button_press(int x, int y, float gx, float gy, unsigned btn)
                        {
                                Track *track=ctrack->get_track().copy();
                                track->set_position(Point(gx, gy, 0));
-                               layout->add_track(track);
+                               layout->add_track(*track);
 
                                selection->clear();
                                selection->add_track(track);
@@ -473,13 +485,18 @@ void Designer::button_press(int x, int y, float gx, float gy, unsigned btn)
                measure->button_press(x, y, gx, gy, btn);
 }
 
-void Designer::pointer_motion(int x, int y, float gx, float gy)
+void Designer::pointer_motion(int x, int y)
 {
+       y=screen_h-y-1;
+
+       float gx, gy;
+       map_pointer_coords(x, y, gx, gy);
+
        if(mode==SELECT || mode==CATALOGUE)
        {
                pointer_x=x;
                pointer_y=y;
-               tooltip_timeout=Time::now()+100*Time::msec;
+               tooltip_timeout=Msp::Time::now()+100*Msp::Time::msec;
        }
 
        if(mode!=INPUT)
@@ -524,24 +541,17 @@ void Designer::render()
                cat_layout_3d->render();
        else
        {
+               if(base_mesh)
+               {
+                       GL::Texture::unbind();
+                       base_mesh->draw();
+               }
                layout_3d->render(true);
                manipulator->render();
                if(mode==MEASURE)
                        measure->render();
        }
 
-       /*glBegin(GL_LINES);
-       glColor4f(1, 0, 0, 1);
-       glVertex3f(0, 0, 0);
-       glVertex3f(0.5, 0, 0);
-       glColor4f(0, 1, 0, 1);
-       glVertex3f(0, 0, 0);
-       glVertex3f(0, 0.5, 0);
-       glColor4f(0, 0, 1, 1);
-       glVertex3f(0, 0, 0);
-       glVertex3f(0, 0, 0.5);
-       glEnd();*/
-
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, screen_w, 0, screen_h, 0, 1);
@@ -576,9 +586,9 @@ Track3D *Designer::pick_track(int x, int y)
        if(mode==CATALOGUE)
                l=cat_layout_3d;
 
-       float xx=((float)(x-(int)screen_w/2)/screen_h)*0.82843;
-       float yy=((float)y/screen_h-0.5)*0.82843;
-       float size=(float)4/screen_h*0.82843;
+       float xx=(static_cast<float>(x-static_cast<int>(screen_w)/2)/screen_h)*0.82843;
+       float yy=(static_cast<float>(y)/screen_h-0.5)*0.82843;
+       float size=4.0/screen_h*0.82843;
 
        project_3d();
        apply_camera();
@@ -588,7 +598,7 @@ Track3D *Designer::pick_track(int x, int y)
 
 void Designer::manipulation_status(const string &status)
 {
-       tooltip=decode<Utf8>(status);
+       tooltip=status;
 }
 
 void Designer::manipulation_done(bool)
@@ -605,7 +615,7 @@ void Designer::measure_changed()
        ostringstream ss;
        ss.precision(3);
        ss<<"Par "<<pard<<"mm - Perp "<<perpd<<"mm - Total "<<d<<"mm - Angle "<<adiff<<"°";
-       tooltip=decode<Utf8>(ss.str());
+       tooltip=ss.str();
 }
 
 void Designer::measure_done()
@@ -615,9 +625,9 @@ void Designer::measure_done()
 
 void Designer::move_tooltip(int x, int y)
 {
-       int w=(int)(font->get_string_width(tooltip)*20);
-       tooltip_x=max(min((int)screen_w-w, x), 0);
-       tooltip_y=max(min((int)screen_h-20, y), 0);
+       int w=static_cast<int>(font->get_string_width(tooltip)*20);
+       tooltip_x=max(min(static_cast<int>(screen_w)-w, x), 0);
+       tooltip_y=max(min(static_cast<int>(screen_h)-20, y), 0);
 }
 
 void Designer::save_accept()
@@ -633,11 +643,11 @@ void Designer::turnout_id_accept()
        unsigned id=lexical_cast<unsigned>(input->get_text());
        track->set_turnout_id(id);
 
-       Track3D *t3d=layout_3d->get_track(track);
+       Track3D &t3d=layout_3d->get_track(*track);
        if(id)
-               t3d->set_color(Color(0.5, 1, 1));
+               t3d.set_color(GL::Color(0.5, 1, 1));
        else
-               t3d->set_color(Color(1, 1, 1));
+               t3d.set_color(GL::Color(1, 1, 1));
 
        input_dismiss();
 }
@@ -648,11 +658,11 @@ void Designer::sensor_id_accept()
        unsigned id=lexical_cast<unsigned>(input->get_text());
        track->set_sensor_id(id);
 
-       Track3D *t3d=layout_3d->get_track(track);
+       Track3D &t3d=layout_3d->get_track(*track);
        if(id)
-               t3d->set_color(Color(1, 1, 0.5));
+               t3d.set_color(GL::Color(1, 1, 0.5));
        else
-               t3d->set_color(Color(1, 1, 1));
+               t3d.set_color(GL::Color(1, 1, 1));
 
        input_dismiss();
 }