X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2F3d%2Fvehicle.cpp;h=5843c17998363f391025ecda5ba744726dd9fcaf;hb=a7ccbae5d5efd647a7f0c84f7e665e28c2892336;hp=50dbcb0d693134d969964ba31249bf71e3acc9c7;hpb=37af7970d9cefcf40ae58ca06ca8469f56b0cc13;p=r2c2.git diff --git a/source/3d/vehicle.cpp b/source/3d/vehicle.cpp index 50dbcb0..5843c17 100644 --- a/source/3d/vehicle.cpp +++ b/source/3d/vehicle.cpp @@ -1,13 +1,10 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - #include #include +#include +#include "axle.h" +#include "bogie.h" #include "layout.h" +#include "rod.h" #include "vehicle.h" #include "vehicletype.h" @@ -17,94 +14,73 @@ using namespace Msp; namespace R2C2 { Vehicle3D::Vehicle3D(Layout3D &l, Vehicle &v): - layout(l), + Object3D(l, v), + GL::ObjectInstance(*l.get_catalogue().get_3d(v.get_type()).get_body_object()), vehicle(v), - type(layout.get_catalogue().get_vehicle(vehicle.get_type())) + type(layout.get_catalogue().get_3d(vehicle.get_type())) { - layout.add_vehicle(*this); + unsigned n_axles = vehicle.get_type().get_axles().size(); + for(unsigned i=0; i::const_iterator i=children.begin(); i!=children.end(); ++i) + layout.get_scene().add(**i); } Vehicle3D::~Vehicle3D() { - layout.remove_vehicle(*this); layout.get_scene().remove(*this); + for(vector::iterator i=children.begin(); i!=children.end(); ++i) + { + layout.get_scene().remove(**i); + delete *i; + } } -Point Vehicle3D::get_node() const +Vector Vehicle3D::get_node() const { - Point p = vehicle.get_position(); - return Point(p.x, p.y, p.z+0.01+vehicle.get_type().get_height()); + Vector p = vehicle.get_position(); + return Vector(p.x, p.y, p.z+0.01+vehicle.get_type().get_height()); } bool Vehicle3D::is_visible() const { - return vehicle.get_track(); + return vehicle.is_placed(); } -void Vehicle3D::render(const GL::Tag &tag) const +void Vehicle3D::moved() { - if(!vehicle.get_track()) - return; - - if(tag==0) - { - GL::PushMatrix push_mat; + Object3D::moved(); - const Point &pos = vehicle.get_position(); - GL::translate(pos.x, pos.y, pos.z); - GL::rotate(vehicle.get_direction()*180/M_PI, 0, 0, 1); - - if(const GL::Object *obj = type.get_body_object()) - obj->render(tag); - - const vector &axles = vehicle.get_type().get_axles(); - for(unsigned i=0; irender(tag); - } - - const vector &bogies = vehicle.get_type().get_bogies(); - for(unsigned i=0; i::const_iterator i=children.begin(); i!=children.end(); ++i) + (*i)->update_matrix(); +} - for(unsigned j=0; jrender(tag); - } +void Vehicle3D::render(GL::Renderer &renderer, const GL::Tag &tag) const +{ + if(!is_visible()) + return; - if(bogies[i].rotate_object) - GL::rotate(180, 0, 0, 1); - if(const GL::Object *obj = type.get_bogie_object(i)) - obj->render(tag); - } + ObjectInstance::render(renderer, tag); +} - const vector &rods = vehicle.get_type().get_rods(); - for(unsigned i=0; irender(tag); - } - } +void Vehicle3D::setup_render(GL::Renderer &renderer, const GL::Tag &) const +{ + renderer.matrix_stack() *= matrix; + if(vehicle.get_type().get_rotate_object()) + renderer.matrix_stack() *= GL::Matrix::rotation(Angle::half_turn(), 0, 0, 1); } } // namespace R2C2