qvolray

changeset 3:6f275934717b

foon
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 02 Apr 2012 14:42:03 +0300
parents 0b73aa7317e1
children 3e53a16d4667
files Makefile src/volray.c
diffstat 2 files changed, 64 insertions(+), 5 deletions(-) [+]
line diff
     1.1 --- a/Makefile	Mon Apr 02 14:00:28 2012 +0300
     1.2 +++ b/Makefile	Mon Apr 02 14:42:03 2012 +0300
     1.3 @@ -4,11 +4,13 @@
     1.4  bin = volray
     1.5  
     1.6  CC = gcc
     1.7 -CFLAGS = -pedantic -Wall -g
     1.8 -LDFLAGS = $(libgl) -limago -lvmath -lm
     1.9 +CFLAGS = -pedantic -Wall -g $(incdir)
    1.10 +LDFLAGS = $(libdir) $(libgl) -limago -lvmath -lm
    1.11  
    1.12  ifeq ($(shell uname -s), Darwin)
    1.13 -	libgl = -framework OpenGL -framework GLUT
    1.14 +	libgl = -framework OpenGL -framework GLUT -lGLEW
    1.15 +	incdir = -I/opt/local/include
    1.16 +	libdir = -L/opt/local/lib
    1.17  else
    1.18  	libgl = -lGL -lglut -lGLEW
    1.19  endif
     2.1 --- a/src/volray.c	Mon Apr 02 14:00:28 2012 +0300
     2.2 +++ b/src/volray.c	Mon Apr 02 14:42:03 2012 +0300
     2.3 @@ -13,6 +13,8 @@
     2.4  #include <imago2.h>
     2.5  #include "sdr.h"
     2.6  
     2.7 +#define XFER_MAP_SZ	512
     2.8 +
     2.9  struct slice_file {
    2.10  	char *name;
    2.11  	struct slice_file *next;
    2.12 @@ -29,6 +31,7 @@
    2.13  static void create_ray_texture(int xsz, int ysz, float vfov, vec2_t *tex_scale);
    2.14  static vec3_t get_primary_ray_dir(int x, int y, int w, int h, float vfov_deg);
    2.15  static int round_pow2(int x);
    2.16 +static void create_transfer_map(float mean, float sdev);
    2.17  
    2.18  float cam_theta = 0, cam_phi = 0, cam_dist = 4.0;
    2.19  float cam_x, cam_y, cam_z;
    2.20 @@ -40,6 +43,10 @@
    2.21  int win_xsz, win_ysz;
    2.22  int raytex_needs_recalc = 1;
    2.23  
    2.24 +unsigned int xfer_tex;
    2.25 +float xfer_mean = 0.5, xfer_sdev = 1.0;
    2.26 +int xfertex_needs_recalc = 1;
    2.27 +
    2.28  int main(int argc, char **argv)
    2.29  {
    2.30  	glutInit(&argc, argv);
    2.31 @@ -77,6 +84,7 @@
    2.32  	}
    2.33  	set_uniform_int(sdr, "volume", 0);
    2.34  	set_uniform_int(sdr, "ray_tex", 1);
    2.35 +	set_uniform_int(sdr, "xfer_tex", 2);
    2.36  
    2.37  	glGenTextures(1, &vol_tex);
    2.38  	glBindTexture(GL_TEXTURE_3D, vol_tex);
    2.39 @@ -125,6 +133,9 @@
    2.40  	if(raytex_needs_recalc) {
    2.41  		create_ray_texture(win_xsz, win_ysz, 50.0, &tex_scale);
    2.42  	}
    2.43 +	if(xfertex_needs_recalc) {
    2.44 +		create_transfer_map(xfer_mean, xfer_sdev);
    2.45 +	}
    2.46  
    2.47  	glMatrixMode(GL_MODELVIEW);
    2.48  	glLoadIdentity();
    2.49 @@ -146,6 +157,10 @@
    2.50  	glBindTexture(GL_TEXTURE_2D, ray_tex);
    2.51  	glEnable(GL_TEXTURE_2D);
    2.52  
    2.53 +	glActiveTexture(GL_TEXTURE2);
    2.54 +	glBindTexture(GL_TEXTURE_1D, xfer_tex);
    2.55 +	glEnable(GL_TEXTURE_1D);
    2.56 +
    2.57  	bind_program(sdr);
    2.58  	glBegin(GL_QUADS);
    2.59  	glColor3f(1, 1, 1);
    2.60 @@ -156,6 +171,8 @@
    2.61  	glEnd();
    2.62  	bind_program(0);
    2.63  
    2.64 +	glActiveTexture(GL_TEXTURE2);
    2.65 +	glDisable(GL_TEXTURE_1D);
    2.66  	glActiveTexture(GL_TEXTURE1);
    2.67  	glDisable(GL_TEXTURE_2D);
    2.68  	glActiveTexture(GL_TEXTURE0);
    2.69 @@ -234,12 +251,30 @@
    2.70  {
    2.71  	int i;
    2.72  	struct slice_file *tail;
    2.73 +	char *endp;
    2.74  
    2.75  	for(i=1; i<argc; i++) {
    2.76  		if(argv[i][0] == '-' && argv[i][2] == 0) {
    2.77  			switch(argv[i][1]) {
    2.78 -			case 'r':
    2.79 +			case 'm':
    2.80 +				xfer_mean = strtod(argv[++i], &endp);
    2.81 +				if(endp == argv[i]) {
    2.82 +					fprintf(stderr, "-m must be followed by the transfer function mean\n");
    2.83 +					return -1;
    2.84 +				}
    2.85  				break;
    2.86 +
    2.87 +			case 'v':
    2.88 +				xfer_sdev = strtod(argv[++i], &endp);
    2.89 +				if(endp == argv[i]) {
    2.90 +					fprintf(stderr, "-v must be followed by the transfer function sdeviance\n");
    2.91 +					return -1;
    2.92 +				}
    2.93 +				break;
    2.94 +
    2.95 +			default:
    2.96 +				fprintf(stderr, "unrecognized option: %s\n", argv[i]);
    2.97 +				return -1;
    2.98  			}
    2.99  		} else {
   2.100  			struct slice_file *sfile;
   2.101 @@ -265,7 +300,6 @@
   2.102  		fprintf(stderr, "pass the slice filenames\n");
   2.103  		return -1;
   2.104  	}
   2.105 -
   2.106  	return 0;
   2.107  }
   2.108  
   2.109 @@ -346,3 +380,26 @@
   2.110  	return x + 1;
   2.111  }
   2.112  
   2.113 +static void create_transfer_map(float mean, float sdev)
   2.114 +{
   2.115 +	static float map[XFER_MAP_SZ];
   2.116 +	int i;
   2.117 +
   2.118 +	if(!xfer_tex) {
   2.119 +		glGenTextures(1, &xfer_tex);
   2.120 +		glBindTexture(GL_TEXTURE_1D, xfer_tex);
   2.121 +		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   2.122 +		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   2.123 +		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
   2.124 +		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   2.125 +		glTexImage1D(GL_TEXTURE_1D, 0, GL_LUMINANCE32F_ARB, XFER_MAP_SZ, 0, GL_LUMINANCE, GL_FLOAT, 0);
   2.126 +	}
   2.127 +
   2.128 +	for(i=0; i<XFER_MAP_SZ; i++) {
   2.129 +		float x = (float)i / (float)XFER_MAP_SZ;
   2.130 +		map[i] = gaussian(x, mean, sdev);
   2.131 +	}
   2.132 +
   2.133 +	glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, XFER_MAP_SZ, 1, GL_LUMINANCE, GL_FLOAT, map);
   2.134 +	xfertex_needs_recalc = 0;
   2.135 +}