rev |
line source |
nuclear@4
|
1 #include <stdio.h>
|
nuclear@4
|
2 #include "opengl.h"
|
nuclear@4
|
3 #include "xfer_view.h"
|
nuclear@4
|
4 #include "dicomview.h"
|
nuclear@4
|
5
|
nuclear@4
|
6 static Renderer *rend;
|
nuclear@4
|
7
|
nuclear@4
|
8 static int act_color = 3;
|
nuclear@5
|
9 static CurvePoint *cpsel;
|
nuclear@4
|
10
|
nuclear@4
|
11 bool xfview_init(Renderer *rendarg)
|
nuclear@4
|
12 {
|
nuclear@4
|
13 rend = rendarg;
|
nuclear@4
|
14 return true;
|
nuclear@4
|
15 }
|
nuclear@4
|
16
|
nuclear@4
|
17 void xfview_destroy()
|
nuclear@4
|
18 {
|
nuclear@4
|
19 }
|
nuclear@4
|
20
|
nuclear@4
|
21 void xfview_draw()
|
nuclear@4
|
22 {
|
nuclear@4
|
23 float line_color[][3] = {
|
nuclear@4
|
24 { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 }, { 1, 1, 1 }
|
nuclear@4
|
25 };
|
nuclear@4
|
26
|
nuclear@4
|
27 glMatrixMode(GL_PROJECTION);
|
nuclear@4
|
28 glLoadIdentity();
|
nuclear@4
|
29 glMatrixMode(GL_MODELVIEW);
|
nuclear@4
|
30 glLoadIdentity();
|
nuclear@4
|
31
|
nuclear@4
|
32 int xsz, ysz;
|
nuclear@4
|
33 get_window_size(&xsz, &ysz);
|
nuclear@4
|
34 int nsamples = xsz / 4;
|
nuclear@4
|
35
|
nuclear@4
|
36 // paint the background a faint version of the selected color
|
nuclear@4
|
37 glBegin(GL_QUADS);
|
nuclear@4
|
38 glColor3f(line_color[act_color][0] * 0.1, line_color[act_color][1] * 0.1, line_color[act_color][2] * 0.1);
|
nuclear@4
|
39 glVertex2f(-1, -1);
|
nuclear@4
|
40 glVertex2f(1, -1);
|
nuclear@4
|
41 glVertex2f(1, 1);
|
nuclear@4
|
42 glVertex2f(-1, 1);
|
nuclear@4
|
43 glEnd();
|
nuclear@4
|
44
|
nuclear@4
|
45 glEnable(GL_POINT_SMOOTH);
|
nuclear@4
|
46 glEnable(GL_LINE_SMOOTH);
|
nuclear@4
|
47
|
nuclear@4
|
48 glEnable(GL_BLEND);
|
nuclear@4
|
49 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
nuclear@4
|
50
|
nuclear@4
|
51 // draw selection outline
|
nuclear@4
|
52 if(act_color < 3) {
|
nuclear@4
|
53 glPointSize(13.0);
|
nuclear@4
|
54 glLineWidth(5.0);
|
nuclear@4
|
55
|
nuclear@4
|
56 const Curve &sel_curve = rend->transfer_curve(act_color);
|
nuclear@4
|
57 glColor3f(0.7, 0.7, 0.7);
|
nuclear@4
|
58 glBegin(GL_LINE_STRIP);
|
nuclear@4
|
59 for(int i=0; i<nsamples; i++) {
|
nuclear@4
|
60 float t = (float)i / (float)(nsamples - 1);
|
nuclear@4
|
61 float val = sel_curve.value(t);
|
nuclear@4
|
62 glVertex2f(t * 2.0 - 1.0, val * 2.0 - 1.0);
|
nuclear@4
|
63 }
|
nuclear@4
|
64 glEnd();
|
nuclear@4
|
65 glBegin(GL_POINTS);
|
nuclear@4
|
66 for(int i=0; i<sel_curve.get_num_points(); i++) {
|
nuclear@4
|
67 const CurvePoint *p = sel_curve.get_point(i);
|
nuclear@4
|
68 float x = 2.0 * (float)p->t_int / 65535.0 - 1.0;
|
nuclear@4
|
69 glVertex2f(x, p->value * 2.0 - 1.0);
|
nuclear@4
|
70 }
|
nuclear@4
|
71 glEnd();
|
nuclear@4
|
72 }
|
nuclear@4
|
73
|
nuclear@4
|
74
|
nuclear@4
|
75 // draw curves and points
|
nuclear@4
|
76 glPointSize(9.0);
|
nuclear@4
|
77 glLineWidth(2.0);
|
nuclear@4
|
78
|
nuclear@4
|
79 for(int i=0; i<3; i++) {
|
nuclear@4
|
80 int idx;
|
nuclear@4
|
81 if(act_color < 3) {
|
nuclear@4
|
82 idx = (i + act_color + 1) % 3;
|
nuclear@4
|
83 } else {
|
nuclear@4
|
84 idx = i;
|
nuclear@4
|
85 }
|
nuclear@4
|
86
|
nuclear@4
|
87 const Curve &xfer = rend->transfer_curve(idx);
|
nuclear@4
|
88 glColor3fv(line_color[idx]);
|
nuclear@4
|
89
|
nuclear@4
|
90 glBegin(GL_LINE_STRIP);
|
nuclear@4
|
91 for(int j=0; j<nsamples; j++) {
|
nuclear@4
|
92 float t = (float)j / (float)(nsamples - 1);
|
nuclear@4
|
93 float val = xfer.value(t);
|
nuclear@4
|
94 glVertex2f(t * 2.0 - 1.0, val * 2.0 - 1.0);
|
nuclear@4
|
95 }
|
nuclear@4
|
96 glEnd();
|
nuclear@4
|
97
|
nuclear@4
|
98 glBegin(GL_POINTS);
|
nuclear@4
|
99 for(int j=0; j<xfer.get_num_points(); j++) {
|
nuclear@4
|
100 const CurvePoint *p = xfer.get_point(j);
|
nuclear@4
|
101 float x = 2.0 * (float)p->t_int / 65535.0 - 1.0;
|
nuclear@4
|
102 glVertex2f(x, p->value * 2.0 - 1.0);
|
nuclear@4
|
103 }
|
nuclear@4
|
104 glEnd();
|
nuclear@4
|
105 }
|
nuclear@4
|
106
|
nuclear@4
|
107 glDisable(GL_BLEND);
|
nuclear@4
|
108 }
|
nuclear@4
|
109
|
nuclear@4
|
110 void xfview_button(int bn, int press, int x, int y)
|
nuclear@4
|
111 {
|
nuclear@5
|
112 if(bn == 2 && press && !cpsel) {
|
nuclear@4
|
113 act_color = (act_color + 1) % 4;
|
nuclear@4
|
114 redisplay();
|
nuclear@4
|
115 return;
|
nuclear@4
|
116 }
|
nuclear@4
|
117
|
nuclear@5
|
118 if(bn == 1) {
|
nuclear@5
|
119 if(press) {
|
nuclear@5
|
120 } else {
|
nuclear@5
|
121 cpsel = 0;
|
nuclear@5
|
122 }
|
nuclear@4
|
123 }
|
nuclear@4
|
124 }
|
nuclear@4
|
125
|
nuclear@4
|
126 void xfview_motion(int x, int y)
|
nuclear@4
|
127 {
|
nuclear@4
|
128 }
|