X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2F3d%2Ftracktype.cpp;h=e402c89c5f597823e6daabde9943ef27b30d72bb;hb=0db89b665527609582df98854c9e3255d1017811;hp=243da7fc4830c5279d782dc4d76499ccc2eb5fff;hpb=621c5c938d70ba0d155e0eda91a708db0a52c0dc;p=r2c2.git diff --git a/source/3d/tracktype.cpp b/source/3d/tracktype.cpp index 243da7f..e402c89 100644 --- a/source/3d/tracktype.cpp +++ b/source/3d/tracktype.cpp @@ -7,67 +7,13 @@ using namespace std; using namespace Msp; -namespace { - -bool compare_z(const R2C2::Vector &p1, const R2C2::Vector &p2) -{ - return p1.z -Iter graham_scan(Iter begin, Iter end) -{ - // http://en.wikipedia.org/wiki/Graham_scan - - // Find point with lowest X coordinate - R2C2::Vector lowest = *begin; - for(Iter i=begin; i!=end; ++i) - if(i->xx==lowest.x && i->y>lowest.y)) - lowest = *i; - - // Compute tangents and sort points - for(Iter i=begin; i!=end; ++i) - i->z = (i->x==lowest.x ? 1e5/(i->y-lowest.y-1) : (i->y-lowest.y)/(i->x-lowest.x)); - sort(begin, end, compare_z); - - for(Iter k=begin, i=k++, j=k++;; ) - { - // Compute winding by cross product - float turn = (j->x-i->x)*(k->y-j->y) - (k->x-j->x)*(j->y-i->y); - - if(turn<1e-5) - { - // Right turn - throw the middle point away - // Special case for collinear vertices in the beginning - if(i==begin) - j = k++; - else - j = i--; - } - else - { - // Left turn - store the middle point and advance - if(++i!=j) - *i = *j; - j = k++; - } - - // Cycle back to beginning and terminate after checking the last point - if(k==end) - k = begin; - else if(j==begin) - return ++i; - } -} - -} - namespace R2C2 { TrackType3D::TrackType3D(Catalogue3D &cat3d, const TrackType &tt): catalogue(cat3d), mesh(0), - object(0) + object(0), + own_data(false) { const Catalogue &cat = cat3d.get_catalogue(); const vector &parts = tt.get_parts(); @@ -86,20 +32,7 @@ TrackType3D::TrackType3D(Catalogue3D &cat3d, const TrackType &tt): string obj_name = tt.get_object(); if(!obj_name.empty()) - { - object = catalogue.get(obj_name); - const GL::Mesh *m = object->get_mesh(); - const GL::VertexArray &vertices = m->get_vertices(); - int vertex_offs = vertices.get_format().offset(GL::VERTEX2); - if(vertex_offs>=0) - { - for(unsigned i=0; i(obj_name); else { mesh = new GL::Mesh((GL::NORMAL3, GL::TEXCOORD2, GL::VERTEX3)); @@ -109,18 +42,20 @@ TrackType3D::TrackType3D(Catalogue3D &cat3d, const TrackType &tt): unsigned index = 0; bld.texcoord(0.25, 0.5); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - build_part(*i, ballast_profile, Vector(0, -ballast_min.y), false, bld, index); + build_part(*i, ballast_profile, Vector(0, -ballast_min.y, 0), false, bld, index); bld.texcoord(0.75, 0.5); float y = ballast_h-rail_min.y; for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - build_part(*i, rail_profile, Vector(-gauge/2, y), true, bld, index); + build_part(*i, rail_profile, Vector(0, gauge/2, y), true, bld, index); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - build_part(*i, rail_profile, Vector(gauge/2, y), false, bld, index); + build_part(*i, rail_profile, Vector(0, -gauge/2, y), false, bld, index); object = new GL::Object; object->set_mesh(mesh); - object->set_technique(catalogue.get(cat.get_track_technique())); + object->set_technique(&catalogue.get(cat.get_track_technique())); + + own_data = true; } unsigned paths = tt.get_paths(); @@ -134,44 +69,20 @@ TrackType3D::TrackType3D(Catalogue3D &cat3d, const TrackType &tt): unsigned index = 0; for(vector::const_iterator j=parts.begin(); j!=parts.end(); ++j) if(j->get_path()==i) - build_part(*j, cat.get_path_profile(), Vector(0, ballast_h+1.5*rail_h), false, bld, index); + build_part(*j, cat.get_path_profile(), Vector(0, 0, ballast_h+1.5*rail_h), false, bld, index); } path_meshes.push_back(m); } - - min_z = max_z = border.front().z; - for(vector::iterator i=border.begin(); i!=border.end(); ++i) - { - min_z = min(min_z, i->z); - max_z = max(max_z, i->z); - } - border.erase(graham_scan(border.begin(), border.end()), border.end()); } TrackType3D::~TrackType3D() { for(vector::iterator i=path_meshes.begin(); i!=path_meshes.end(); ++i) delete *i; -} - -void TrackType3D::get_bounds(float angle, Vector &minp, Vector &maxp) const -{ - float c = cos(-angle); - float s = sin(-angle); - - minp = maxp = Vector(); - minp.z = min_z; - maxp.z = max_z; - - for(vector::const_iterator i=border.begin(); i!=border.end(); ++i) + if(own_data) { - float x = c*i->x-s*i->y; - float y = s*i->x+c*i->y; - - minp.x = min(minp.x, x); - minp.y = min(minp.y, y); - maxp.x = max(maxp.x, x); - maxp.y = max(maxp.y, y); + delete object; + delete mesh; } } @@ -193,27 +104,23 @@ void TrackType3D::build_part(const TrackPart &part, const Profile &profile, cons for(unsigned i=0; i<=nsegs; ++i) { TrackPoint basep = part.get_point(i*plen/nsegs); - float c = cos(basep.dir); - float s = sin(basep.dir); + Transform trans = Transform::rotation(basep.dir, Vector(0, 0, 1)); for(unsigned j=0; j