glviewvol

annotate src/xfer_view.cc @ 4:04330eb80b36

lots of stuff
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 29 Dec 2014 05:41:36 +0200
parents
children 5417c25cb238
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@4 9 static CurvePoint *cpsel[3];
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@4 112 if(bn == 2 && press) {
nuclear@4 113 act_color = (act_color + 1) % 4;
nuclear@4 114 redisplay();
nuclear@4 115 return;
nuclear@4 116 }
nuclear@4 117
nuclear@4 118 if(press) {
nuclear@4 119 }
nuclear@4 120 }
nuclear@4 121
nuclear@4 122 void xfview_motion(int x, int y)
nuclear@4 123 {
nuclear@4 124 }