-/* $Id$
-
-This file is part of R²C²
-Copyright © 2010 Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
+#include <msp/core/maputils.h>
#include <msp/gl/tests.h>
#include <msp/gltk/button.h>
#include <msp/gltk/image.h>
+#include <msp/gltk/label.h>
+#include <msp/strings/format.h>
#include "libr2c2/vehicle.h"
#include "libr2c2/vehicletype.h"
#include "engineer.h"
train(t),
mode(SIDE),
forward(true),
- pipeline(280, 280, false),
- stale(false)
+ view(engineer.get_layout_3d(), 400, 300)
{
- set_size(300, 330);
+ Loader::WidgetMap widgets;
+ DataFile::load(*this, "data/trainview.ui", widgets);
+
+ dynamic_cast<GLtk::Label *>(get_item(widgets, "lbl_title"))->set_text(format("View of %s", train.get_name()));
+ dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_forward"))->signal_toggled.connect(sigc::mem_fun(this, &TrainView::set_forward));
+ dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_roof"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainView::ui_mode_toggled), ROOF));
+ dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_side"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainView::ui_mode_toggled), SIDE));
+ dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_head"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainView::ui_mode_toggled), HEAD));
tex.set_min_filter(GL::LINEAR);
- tex.storage(GL::RGB, 280, 280);
+ tex.storage(GL::RGB, 400, 300);
tex.image(0, GL::RGB, GL::UNSIGNED_BYTE, 0);
fbo.attach(GL::COLOR_ATTACHMENT0, tex, 0);
- depth.storage(GL::DEPTH_COMPONENT, 280, 280);
+ depth.storage(GL::DEPTH_COMPONENT, 400, 300);
fbo.attach(GL::DEPTH_ATTACHMENT, depth);
- camera.set_up_direction(GL::Vector3(0, 0, 1));
- camera.set_depth_clip(0.01, 10);
- camera.set_aspect(1);
- pipeline.set_camera(&camera);
-
- pipeline.add_renderable(engineer.get_layout_3d().get_scene());
-
- GL::PipelinePass *pass = &pipeline.add_pass(0);
- pass->depth_test = &GL::DepthTest::lequal();
- pass->lighting = &engineer.get_lighting();
-
- GLtk::Image *image;
- add(*(image = new GLtk::Image(&tex)));
- image->set_geometry(GLtk::Geometry(10, 40, geom.w-20, geom.h-50));
-
- GLtk::Button *btn;
-
- add(*(btn = new GLtk::Button("Roof")));
- btn->set_geometry(GLtk::Geometry(10, 10, 36, 25));
- btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &TrainView::set_mode), ROOF));
-
- add(*(btn = new GLtk::Button("Side")));
- btn->set_geometry(GLtk::Geometry(46, 10, 36, 25));
- btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &TrainView::set_mode), SIDE));
-
- add(*(btn = new GLtk::Button("Head")));
- btn->set_geometry(GLtk::Geometry(82, 10, 36, 25));
- btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &TrainView::set_mode), HEAD));
+ view.get_camera().set_depth_clip(0.01, 10);
- add(*(tgl_forward = new GLtk::Toggle("Fwd")));
- tgl_forward->set_geometry(GLtk::Geometry(118, 8, 36, 27));
- tgl_forward->set_value(true);
- tgl_forward->signal_toggled.connect(sigc::mem_fun(this, &TrainView::set_forward));
-
- add(*(btn = new GLtk::Button("Close")));
- btn->set_geometry(GLtk::Geometry(geom.w-46, 10, 36, 25));
- btn->signal_clicked.connect(sigc::mem_fun(this, &TrainView::close_clicked));
+ dynamic_cast<GLtk::Image *>(get_item(widgets, "img_view"))->set_image(&tex);
engineer.add_train_view(*this);
}
mode = m;
}
+void TrainView::ui_mode_toggled(bool v, Mode m)
+{
+ if(v)
+ set_mode(m);
+}
+
void TrainView::set_forward(bool f)
{
forward = f;
void TrainView::prepare()
{
const Vehicle &veh = train.get_vehicle(0);
- const Point &pos = veh.get_position();
- float angle = veh.get_direction();
+ const Vector &pos = veh.get_position();
+ Angle angle = veh.get_rotation();
if(!forward)
- angle += M_PI;
- float c = cos(angle);
- float s = sin(angle);
+ angle += Angle::half_turn();
+ Vector fwd_vec = rotated_vector(Vector(1, 0, 0), angle);
+ Vector side_vec = rotated_vector(Vector(0, -1, 0), angle);
float l = veh.get_type().get_length();
+ GL::Camera &camera = view.get_camera();
switch(mode)
{
case ROOF:
- camera.set_position(GL::Vector3(pos.x-l*c, pos.y-l*s, pos.z+0.07));
- camera.set_look_direction(GL::Vector3(c, s, -0.2));
+ camera.set_position(pos-l*fwd_vec+Vector(0, 0, 0.07));
+ camera.set_look_direction(fwd_vec-Vector(0, 0, 0.2));
break;
case SIDE:
- camera.set_position(GL::Vector3(pos.x-l*0.8*c+0.05*s, pos.y-l*0.8*s-0.05*c, pos.z+0.03));
- camera.set_look_direction(GL::Vector3(c-0.2*s, s+0.2*c, 0));
+ camera.set_position(pos-0.08f*fwd_vec+0.05f*side_vec+Vector(0, 0, 0.03));
+ camera.set_look_direction(fwd_vec-side_vec*0.2f);
break;
case HEAD:
- camera.set_position(GL::Vector3(pos.x+l*0.55*c, pos.y+l*0.55*s, pos.z+0.03));
- camera.set_look_direction(GL::Vector3(c, s, 0));
+ camera.set_position(pos+fwd_vec*(l*0.55f)+Vector(0, 0, 0.03));
+ camera.set_look_direction(fwd_vec);
break;
}
GL::Bind _bind_fbo(fbo);
fbo.clear(GL::COLOR_BUFFER_BIT|GL::DEPTH_BUFFER_BIT);
- pipeline.render_all();
-}
-
-void TrainView::button_release(int x, int y, unsigned btn)
-{
- GLtk::Panel::button_release(x, y, btn);
- if(stale)
- delete this;
-}
-
-void TrainView::close_clicked()
-{
- stale = true;
+ view.render();
}