]> git.tdb.fi Git - r2c2.git/blob - source/designer/measure.cpp
Initial revision
[r2c2.git] / source / designer / measure.cpp
1 #include <cmath>
2 #include <GL/gl.h>
3 #include "designer.h"
4 #include "3d/layout.h"
5 #include "measure.h"
6
7 using namespace Marklin;
8 using namespace Msp;
9
10 Measure::Measure(Designer &d):
11         designer(d),
12         state(NONE)
13 { }
14
15 void Measure::start()
16 {
17         state=STARTING;
18 }
19
20 void Measure::snap_to_tracks(Point &pt, float &dir)
21 {
22         const TrackSeq &ltracks=designer.get_layout()->get_tracks();
23         for(TrackSeq::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i)
24                 if((*i)->snap(pt, dir))
25                         return;
26 }
27
28 void Measure::button_press(int, int, float gx, float gy, unsigned btn)
29 {
30         if(!state)
31                 return;
32
33         if(btn==1)
34         {
35                 spoint=Point(gx, gy, 0);
36                 sdir=0;
37                 snap_to_tracks(spoint, sdir);
38
39                 state=ACTIVE;
40         }
41         else if(btn==3)
42         {
43                 if(state==ACTIVE)
44                         state=STARTING;
45                 else
46                 {
47                         state=NONE;
48                         signal_done.emit();
49                 }
50         }
51 }
52
53 void Measure::pointer_motion(int, int, float gx, float gy)
54 {
55         if(!state)
56                 return;
57
58         pointer=Point(gx, gy, 0);
59         float dir=sdir;
60         snap_to_tracks(pointer, dir);
61
62         if(state!=STARTING)
63         {
64                 Point delta(pointer.x-spoint.x, pointer.y-spoint.y, 0);
65                 float c=cos(sdir);
66                 float s=sin(sdir);
67
68                 par_dist=delta.x*c+delta.y*s;
69                 perp_dist=delta.x*s-delta.y*c;
70
71                 adiff=dir-sdir+M_PI;
72                 while(adiff<-M_PI)
73                         adiff+=M_PI*2;
74                 while(adiff>M_PI)
75                         adiff-=M_PI*2;
76
77                 signal_changed.emit();
78         }
79 }
80
81 void Measure::render()
82 {
83         glPushMatrix();
84         if(state==ACTIVE)
85                 glTranslatef(spoint.x, spoint.y, spoint.z);
86         else if(state==STARTING)
87                 glTranslatef(pointer.x, pointer.y, pointer.z);
88
89         glDisable(GL_CULL_FACE);
90         glColor4f(1, 1, 1, 1);
91         glBegin(GL_QUAD_STRIP);
92         for(unsigned i=0; i<=16; ++i)
93         {
94                 float x=cos(i*M_PI/8)*0.005;
95                 float y=sin(i*M_PI/8)*0.005;
96                 glVertex3f(x, y, 0);
97                 glVertex3f(x, y, 0.01);
98         }
99         glEnd();
100
101         if(state==ACTIVE)
102         {
103                 float c=cos(sdir);
104                 float s=sin(sdir);
105                 glBegin(GL_QUAD_STRIP);
106                 glVertex3f(0, 0, 0);
107                 glVertex3f(0, 0, 0.01);
108                 glVertex3f(c*par_dist, s*par_dist, 0);
109                 glVertex3f(c*par_dist, s*par_dist, 0.01);
110                 glVertex3f(pointer.x-spoint.x, pointer.y-spoint.y, 0);
111                 glVertex3f(pointer.x-spoint.x, pointer.y-spoint.y, 0.01);
112                 /*glVertex3f(s*perp_dist, -c*perp_dist, 0);
113                 glVertex3f(s*perp_dist, -c*perp_dist, 0.01);*/
114                 glVertex3f(0, 0, 0);
115                 glVertex3f(0, 0, 0.01);
116                 glEnd();
117         }
118
119         glPopMatrix();
120 }