/* $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
*/
using namespace std;
using namespace Msp;
-#include <iostream>
-
namespace Marklin {
Track3D::Track3D(Track &t, unsigned q):
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();
}
}
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);
}
}