qvolray

diff src/volray.c @ 3:6f275934717b

foon
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 02 Apr 2012 14:42:03 +0300
parents 0b73aa7317e1
children 3e53a16d4667
line diff
     1.1 --- a/src/volray.c	Mon Apr 02 14:00:28 2012 +0300
     1.2 +++ b/src/volray.c	Mon Apr 02 14:42:03 2012 +0300
     1.3 @@ -13,6 +13,8 @@
     1.4  #include <imago2.h>
     1.5  #include "sdr.h"
     1.6  
     1.7 +#define XFER_MAP_SZ	512
     1.8 +
     1.9  struct slice_file {
    1.10  	char *name;
    1.11  	struct slice_file *next;
    1.12 @@ -29,6 +31,7 @@
    1.13  static void create_ray_texture(int xsz, int ysz, float vfov, vec2_t *tex_scale);
    1.14  static vec3_t get_primary_ray_dir(int x, int y, int w, int h, float vfov_deg);
    1.15  static int round_pow2(int x);
    1.16 +static void create_transfer_map(float mean, float sdev);
    1.17  
    1.18  float cam_theta = 0, cam_phi = 0, cam_dist = 4.0;
    1.19  float cam_x, cam_y, cam_z;
    1.20 @@ -40,6 +43,10 @@
    1.21  int win_xsz, win_ysz;
    1.22  int raytex_needs_recalc = 1;
    1.23  
    1.24 +unsigned int xfer_tex;
    1.25 +float xfer_mean = 0.5, xfer_sdev = 1.0;
    1.26 +int xfertex_needs_recalc = 1;
    1.27 +
    1.28  int main(int argc, char **argv)
    1.29  {
    1.30  	glutInit(&argc, argv);
    1.31 @@ -77,6 +84,7 @@
    1.32  	}
    1.33  	set_uniform_int(sdr, "volume", 0);
    1.34  	set_uniform_int(sdr, "ray_tex", 1);
    1.35 +	set_uniform_int(sdr, "xfer_tex", 2);
    1.36  
    1.37  	glGenTextures(1, &vol_tex);
    1.38  	glBindTexture(GL_TEXTURE_3D, vol_tex);
    1.39 @@ -125,6 +133,9 @@
    1.40  	if(raytex_needs_recalc) {
    1.41  		create_ray_texture(win_xsz, win_ysz, 50.0, &tex_scale);
    1.42  	}
    1.43 +	if(xfertex_needs_recalc) {
    1.44 +		create_transfer_map(xfer_mean, xfer_sdev);
    1.45 +	}
    1.46  
    1.47  	glMatrixMode(GL_MODELVIEW);
    1.48  	glLoadIdentity();
    1.49 @@ -146,6 +157,10 @@
    1.50  	glBindTexture(GL_TEXTURE_2D, ray_tex);
    1.51  	glEnable(GL_TEXTURE_2D);
    1.52  
    1.53 +	glActiveTexture(GL_TEXTURE2);
    1.54 +	glBindTexture(GL_TEXTURE_1D, xfer_tex);
    1.55 +	glEnable(GL_TEXTURE_1D);
    1.56 +
    1.57  	bind_program(sdr);
    1.58  	glBegin(GL_QUADS);
    1.59  	glColor3f(1, 1, 1);
    1.60 @@ -156,6 +171,8 @@
    1.61  	glEnd();
    1.62  	bind_program(0);
    1.63  
    1.64 +	glActiveTexture(GL_TEXTURE2);
    1.65 +	glDisable(GL_TEXTURE_1D);
    1.66  	glActiveTexture(GL_TEXTURE1);
    1.67  	glDisable(GL_TEXTURE_2D);
    1.68  	glActiveTexture(GL_TEXTURE0);
    1.69 @@ -234,12 +251,30 @@
    1.70  {
    1.71  	int i;
    1.72  	struct slice_file *tail;
    1.73 +	char *endp;
    1.74  
    1.75  	for(i=1; i<argc; i++) {
    1.76  		if(argv[i][0] == '-' && argv[i][2] == 0) {
    1.77  			switch(argv[i][1]) {
    1.78 -			case 'r':
    1.79 +			case 'm':
    1.80 +				xfer_mean = strtod(argv[++i], &endp);
    1.81 +				if(endp == argv[i]) {
    1.82 +					fprintf(stderr, "-m must be followed by the transfer function mean\n");
    1.83 +					return -1;
    1.84 +				}
    1.85  				break;
    1.86 +
    1.87 +			case 'v':
    1.88 +				xfer_sdev = strtod(argv[++i], &endp);
    1.89 +				if(endp == argv[i]) {
    1.90 +					fprintf(stderr, "-v must be followed by the transfer function sdeviance\n");
    1.91 +					return -1;
    1.92 +				}
    1.93 +				break;
    1.94 +
    1.95 +			default:
    1.96 +				fprintf(stderr, "unrecognized option: %s\n", argv[i]);
    1.97 +				return -1;
    1.98  			}
    1.99  		} else {
   1.100  			struct slice_file *sfile;
   1.101 @@ -265,7 +300,6 @@
   1.102  		fprintf(stderr, "pass the slice filenames\n");
   1.103  		return -1;
   1.104  	}
   1.105 -
   1.106  	return 0;
   1.107  }
   1.108  
   1.109 @@ -346,3 +380,26 @@
   1.110  	return x + 1;
   1.111  }
   1.112  
   1.113 +static void create_transfer_map(float mean, float sdev)
   1.114 +{
   1.115 +	static float map[XFER_MAP_SZ];
   1.116 +	int i;
   1.117 +
   1.118 +	if(!xfer_tex) {
   1.119 +		glGenTextures(1, &xfer_tex);
   1.120 +		glBindTexture(GL_TEXTURE_1D, xfer_tex);
   1.121 +		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   1.122 +		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   1.123 +		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
   1.124 +		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   1.125 +		glTexImage1D(GL_TEXTURE_1D, 0, GL_LUMINANCE32F_ARB, XFER_MAP_SZ, 0, GL_LUMINANCE, GL_FLOAT, 0);
   1.126 +	}
   1.127 +
   1.128 +	for(i=0; i<XFER_MAP_SZ; i++) {
   1.129 +		float x = (float)i / (float)XFER_MAP_SZ;
   1.130 +		map[i] = gaussian(x, mean, sdev);
   1.131 +	}
   1.132 +
   1.133 +	glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, XFER_MAP_SZ, 1, GL_LUMINANCE, GL_FLOAT, map);
   1.134 +	xfertex_needs_recalc = 0;
   1.135 +}