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