X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fengineer%2Ftrainview.cpp;h=c76e123bce7450e12d4a065f08ed47f2bb93a2aa;hb=c0e076401ee76fd9a5a96ff919a8e7b4d058c51b;hp=b27136c59a7e9d6887b0e278f5ac83445e4b8935;hpb=fcaa883538f98bac71ba1a90f98950bb2aa08d88;p=r2c2.git diff --git a/source/engineer/trainview.cpp b/source/engineer/trainview.cpp index b27136c..c76e123 100644 --- a/source/engineer/trainview.cpp +++ b/source/engineer/trainview.cpp @@ -1,123 +1,90 @@ -/* $Id$ - -This file is part of the MSP Märklin suite -Copyright © 2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - +#include #include #include #include -#include "libmarklin/vehicle.h" -#include "libmarklin/vehicletype.h" +#include +#include +#include "libr2c2/vehicle.h" +#include "libr2c2/vehicletype.h" #include "engineer.h" #include "trainview.h" using namespace Msp; -using namespace Marklin; +using namespace R2C2; -TrainView::TrainView(Engineer &e, const Train &t): - GLtk::Widget(e.get_ui_resources()), - GLtk::Panel(e.get_ui_resources()), - engineer(e), +TrainView::TrainView(Engineer &engineer, const Train &t): + DynamicDialog(engineer.get_user_interface()), train(t), mode(SIDE), - pipeline(280, 280, false), - stale(false) + forward(true), + view(engineer.get_layout_3d(), 400, 300) { - set_size(300, 330); + Loader::WidgetMap widgets; + DataFile::load(*this, "data/trainview.ui", widgets); + + dynamic_cast(get_item(widgets, "lbl_title"))->set_text(format("View of %s", train.get_name())); + dynamic_cast(get_item(widgets, "tgl_forward"))->signal_toggled.connect(sigc::mem_fun(this, &TrainView::set_forward)); + dynamic_cast(get_item(widgets, "tgl_roof"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainView::ui_mode_toggled), ROOF)); + dynamic_cast(get_item(widgets, "tgl_side"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainView::ui_mode_toggled), SIDE)); + dynamic_cast(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, 0); + 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(res, &tex))); - image->set_geometry(GLtk::Geometry(10, 40, geom.w-20, geom.h-50)); + view.get_camera().set_depth_clip(0.01, 10); - GLtk::Button *btn; - - add(*(btn = new GLtk::Button(res, "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(res, "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(res, "Head"))); - btn->set_geometry(GLtk::Geometry(82, 10, 36, 25)); - btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &TrainView::set_mode), HEAD)); - - add(*(btn = new GLtk::Button(res, "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(get_item(widgets, "img_view"))->set_image(&tex); +} - engineer.add_train_view(*this); +void TrainView::set_mode(Mode m) +{ + mode = m; } -TrainView::~TrainView() +void TrainView::ui_mode_toggled(bool v, Mode m) { - engineer.remove_train_view(*this); + if(v) + set_mode(m); } -void TrainView::set_mode(Mode m) +void TrainView::set_forward(bool f) { - mode = m; + forward = f; } -void TrainView::prepare() +void TrainView::update() { const Vehicle &veh = train.get_vehicle(0); - const Point &pos = veh.get_position(); - float angle = veh.get_direction(); - float c = cos(angle); - float s = sin(angle); + const Vector &pos = veh.get_position(); + Angle angle = veh.get_rotation(); + if(!forward) + 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(); }