]> git.tdb.fi Git - r2c2.git/blobdiff - source/3d/track.cpp
Attempt to estimate the exact positions of trains from measured speed data
[r2c2.git] / source / 3d / track.cpp
index d4b7079099406d016cee98e5406e0fb68ec17e48..5857e52d8813b8c29053e7dd107d882d7bf0f35c 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of the MSP Märklin suite
-Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa
+Copyright © 2006-2009 Mikkosoft Productions, Mikko Rasa
 Distributed under the GPL
 */
 
@@ -14,8 +14,6 @@ Distributed under the GPL
 using namespace std;
 using namespace Msp;
 
-#include <iostream>
-
 namespace Marklin {
 
 Track3D::Track3D(Track &t, unsigned q):
@@ -96,10 +94,10 @@ void Track3D::render_endpoints() const
                float s=sin(ep.dir);
 
                glBegin(GL_QUADS);
-               glVertex3f(ep.x-s*0.025, ep.y+c*0.025, 0);
-               glVertex3f(ep.x+s*0.025, ep.y-c*0.025, 0);
-               glVertex3f(ep.x+s*0.025, ep.y-c*0.025, 0.02);
-               glVertex3f(ep.x-s*0.025, ep.y+c*0.025, 0.02);
+               glVertex3f(ep.pos.x-s*0.025, ep.pos.y+c*0.025, 0);
+               glVertex3f(ep.pos.x+s*0.025, ep.pos.y-c*0.025, 0);
+               glVertex3f(ep.pos.x+s*0.025, ep.pos.y-c*0.025, 0.02);
+               glVertex3f(ep.pos.x-s*0.025, ep.pos.y+c*0.025, 0.02);
                glEnd();
        }
 
@@ -173,63 +171,30 @@ void Track3D::build_part(const TrackPart &part, GL::VertexArrayBuilder &va_build
        }
        static unsigned psize=profile.size();
 
-       const float &radius=part.radius;
-       const float &x=part.x;
-       const float &y=part.y;
-       const float &length=part.length;
-       const float &dir=part.dir;
+       unsigned nsegs=(part.radius ? static_cast<unsigned>(part.length*(1<<quality))+1 : 1);
+       float plen=part.length;
+       if(part.radius)
+               plen*=abs(part.radius);
 
-       unsigned nsegs;
-       if(radius)
-       {
-               nsegs=static_cast<unsigned>(part.length*(1<<quality))+1;
-               Point center(x-sin(dir)*radius, y+cos(dir)*radius, 0);
-               float r=fabs(radius);
-               float start=((radius<0)?M_PI:0)+dir;
-               float angle=(radius<0)?-length:length;
-               int inv=(radius<0)?-1:1;
-               for(unsigned i=0; i<=nsegs; ++i)
-               {
-                       float a=start+i*angle/nsegs;
-                       float c=cos(a);
-                       float s=sin(a);
-
-                       for(unsigned j=0; j<profile.size(); ++j)
-                       {
-                               unsigned k=j&~1;
-                               float dy=profile[k+1].y-profile[k].y;
-                               float dz=profile[k+1].z-profile[k].z;
-                               float d=sqrt(dy*dy+dz*dz);
-                               va_builder.normal(s*dz/d, -c*dz/d, dy/d);
-
-                               Point p(center.x+s*(r-profile[j].y*inv), center.y-c*(r-profile[j].y*inv), profile[j].z+i*track.get_slope()/nsegs);
-                               va_builder.vertex(p.x, p.y, p.z);
-                               if(profile[j].z==0)
-                                       border.push_back(p);
-                       }
-               }
-       }
-       else
+       for(unsigned i=0; i<=nsegs; ++i)
        {
-               nsegs=1;
-               float c=cos(dir);
-               float s=sin(dir);
-               for(unsigned i=0; i<2; ++i)
+               float a=part.dir+(part.radius ? i*plen/nsegs/part.radius : 0);
+               float c=cos(a);
+               float s=sin(a);
+               Point p=part.get_point(i*plen/nsegs);
+
+               for(unsigned j=0; j<profile.size(); ++j)
                {
-                       for(unsigned j=0; j<profile.size(); ++j)
-                       {
-                               unsigned k=j&~1;
-                               float dy=profile[k+1].y-profile[k].y;
-                               float dz=profile[k+1].z-profile[k].z;
-                               float d=sqrt(dy*dy+dz*dz);
-                               va_builder.normal(s*dz/d, -c*dz/d, dy/d);
-
-                               float len=(part.dead_end && i==1 && j>=6) ? length/2 : length;
-                               Point p(x+c*len*i-s*profile[j].y, y+s*len*i+c*profile[j].y, profile[j].z+i*track.get_slope());
-                               va_builder.vertex(p.x, p.y, p.z);
-                               if(profile[j].z==0)
-                                       border.push_back(p);
-                       }
+                       unsigned k=j&~1;
+                       float dy=profile[k+1].y-profile[k].y;
+                       float dz=profile[k+1].z-profile[k].z;
+                       float d=sqrt(dy*dy+dz*dz);
+                       va_builder.normal(s*dz/d, -c*dz/d, dy/d);
+
+                       Point v(p.x+c*profile[j].x-s*profile[j].y, p.y+c*profile[j].y+s*profile[j].x, profile[j].z+i*track.get_slope()/nsegs);
+                       va_builder.vertex(v.x, v.y, v.z);
+                       if(profile[j].z==0)
+                               border.push_back(v);
                }
        }