nuclear@4: #include nuclear@4: #include "opengl.h" nuclear@4: #include "xfer_view.h" nuclear@4: #include "dicomview.h" nuclear@4: nuclear@4: static Renderer *rend; nuclear@4: nuclear@4: static int act_color = 3; nuclear@5: static CurvePoint *cpsel; nuclear@4: nuclear@4: bool xfview_init(Renderer *rendarg) nuclear@4: { nuclear@4: rend = rendarg; nuclear@4: return true; nuclear@4: } nuclear@4: nuclear@4: void xfview_destroy() nuclear@4: { nuclear@4: } nuclear@4: nuclear@4: void xfview_draw() nuclear@4: { nuclear@4: float line_color[][3] = { nuclear@4: { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 }, { 1, 1, 1 } nuclear@4: }; nuclear@4: nuclear@4: glMatrixMode(GL_PROJECTION); nuclear@4: glLoadIdentity(); nuclear@4: glMatrixMode(GL_MODELVIEW); nuclear@4: glLoadIdentity(); nuclear@4: nuclear@4: int xsz, ysz; nuclear@4: get_window_size(&xsz, &ysz); nuclear@4: int nsamples = xsz / 4; nuclear@4: nuclear@4: // paint the background a faint version of the selected color nuclear@4: glBegin(GL_QUADS); nuclear@4: glColor3f(line_color[act_color][0] * 0.1, line_color[act_color][1] * 0.1, line_color[act_color][2] * 0.1); nuclear@4: glVertex2f(-1, -1); nuclear@4: glVertex2f(1, -1); nuclear@4: glVertex2f(1, 1); nuclear@4: glVertex2f(-1, 1); nuclear@4: glEnd(); nuclear@4: nuclear@4: glEnable(GL_POINT_SMOOTH); nuclear@4: glEnable(GL_LINE_SMOOTH); nuclear@4: nuclear@4: glEnable(GL_BLEND); nuclear@4: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); nuclear@4: nuclear@4: // draw selection outline nuclear@4: if(act_color < 3) { nuclear@4: glPointSize(13.0); nuclear@4: glLineWidth(5.0); nuclear@4: nuclear@4: const Curve &sel_curve = rend->transfer_curve(act_color); nuclear@4: glColor3f(0.7, 0.7, 0.7); nuclear@4: glBegin(GL_LINE_STRIP); nuclear@4: for(int i=0; it_int / 65535.0 - 1.0; nuclear@4: glVertex2f(x, p->value * 2.0 - 1.0); nuclear@4: } nuclear@4: glEnd(); nuclear@4: } nuclear@4: nuclear@4: nuclear@4: // draw curves and points nuclear@4: glPointSize(9.0); nuclear@4: glLineWidth(2.0); nuclear@4: nuclear@4: for(int i=0; i<3; i++) { nuclear@4: int idx; nuclear@4: if(act_color < 3) { nuclear@4: idx = (i + act_color + 1) % 3; nuclear@4: } else { nuclear@4: idx = i; nuclear@4: } nuclear@4: nuclear@4: const Curve &xfer = rend->transfer_curve(idx); nuclear@4: glColor3fv(line_color[idx]); nuclear@4: nuclear@4: glBegin(GL_LINE_STRIP); nuclear@4: for(int j=0; jt_int / 65535.0 - 1.0; nuclear@4: glVertex2f(x, p->value * 2.0 - 1.0); nuclear@4: } nuclear@4: glEnd(); nuclear@4: } nuclear@4: nuclear@4: glDisable(GL_BLEND); nuclear@4: } nuclear@4: nuclear@4: void xfview_button(int bn, int press, int x, int y) nuclear@4: { nuclear@5: if(bn == 2 && press && !cpsel) { nuclear@4: act_color = (act_color + 1) % 4; nuclear@4: redisplay(); nuclear@4: return; nuclear@4: } nuclear@4: nuclear@5: if(bn == 1) { nuclear@5: if(press) { nuclear@5: } else { nuclear@5: cpsel = 0; nuclear@5: } nuclear@4: } nuclear@4: } nuclear@4: nuclear@4: void xfview_motion(int x, int y) nuclear@4: { nuclear@4: }