1 #include <msp/gl/tests.h>
2 #include <msp/gltk/button.h>
3 #include <msp/gltk/image.h>
4 #include "libr2c2/vehicle.h"
5 #include "libr2c2/vehicletype.h"
12 TrainView::TrainView(Engineer &e, const Train &t):
17 pipeline(280, 280, false),
22 tex.set_min_filter(GL::LINEAR);
23 tex.storage(GL::RGB, 280, 280);
24 tex.image(0, GL::RGB, GL::UNSIGNED_BYTE, 0);
25 fbo.attach(GL::COLOR_ATTACHMENT0, tex, 0);
26 depth.storage(GL::DEPTH_COMPONENT, 280, 280);
27 fbo.attach(GL::DEPTH_ATTACHMENT, depth);
29 camera.set_up_direction(GL::Vector3(0, 0, 1));
30 camera.set_depth_clip(0.01, 10);
32 pipeline.set_camera(&camera);
34 pipeline.add_renderable(engineer.get_layout_3d().get_scene());
36 GL::Pipeline::Pass *pass = &pipeline.add_pass(0);
37 pass->set_depth_test(&GL::DepthTest::lequal());
38 pass->set_lighting(&engineer.get_lighting());
41 add(*(image = new GLtk::Image(&tex)));
42 image->set_geometry(GLtk::Geometry(10, 40, geom.w-20, geom.h-50));
46 add(*(btn = new GLtk::Button("Roof")));
47 btn->set_geometry(GLtk::Geometry(10, 10, 36, 25));
48 btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &TrainView::set_mode), ROOF));
50 add(*(btn = new GLtk::Button("Side")));
51 btn->set_geometry(GLtk::Geometry(46, 10, 36, 25));
52 btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &TrainView::set_mode), SIDE));
54 add(*(btn = new GLtk::Button("Head")));
55 btn->set_geometry(GLtk::Geometry(82, 10, 36, 25));
56 btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &TrainView::set_mode), HEAD));
58 add(*(tgl_forward = new GLtk::Toggle("Fwd")));
59 tgl_forward->set_geometry(GLtk::Geometry(118, 8, 36, 27));
60 tgl_forward->set_value(true);
61 tgl_forward->signal_toggled.connect(sigc::mem_fun(this, &TrainView::set_forward));
63 add(*(btn = new GLtk::Button("Close")));
64 btn->set_geometry(GLtk::Geometry(geom.w-46, 10, 36, 25));
65 btn->signal_clicked.connect(sigc::mem_fun(this, &TrainView::close_clicked));
67 engineer.add_train_view(*this);
70 TrainView::~TrainView()
72 engineer.remove_train_view(*this);
75 void TrainView::set_mode(Mode m)
80 void TrainView::set_forward(bool f)
85 void TrainView::prepare()
87 const Vehicle &veh = train.get_vehicle(0);
88 const Vector &pos = veh.get_position();
89 float angle = veh.get_rotation();
94 float l = veh.get_type().get_length();
99 camera.set_position(GL::Vector3(pos.x-l*c, pos.y-l*s, pos.z+0.07));
100 camera.set_look_direction(GL::Vector3(c, s, -0.2));
103 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));
104 camera.set_look_direction(GL::Vector3(c-0.2*s, s+0.2*c, 0));
107 camera.set_position(GL::Vector3(pos.x+l*0.55*c, pos.y+l*0.55*s, pos.z+0.03));
108 camera.set_look_direction(GL::Vector3(c, s, 0));
112 GL::Bind _bind_fbo(fbo);
113 fbo.clear(GL::COLOR_BUFFER_BIT|GL::DEPTH_BUFFER_BIT);
117 void TrainView::button_release(int x, int y, unsigned btn)
119 GLtk::Panel::button_release(x, y, btn);
124 void TrainView::close_clicked()