volray

changeset 5:0c3874aa717a

slice
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 04 Apr 2012 01:37:33 +0300
parents 3e53a16d4667
children 04316e9e95dc
files src/volray.c volray.p.glsl
diffstat 2 files changed, 140 insertions(+), 26 deletions(-) [+]
line diff
     1.1 --- a/src/volray.c	Mon Apr 02 17:59:46 2012 +0300
     1.2 +++ b/src/volray.c	Wed Apr 04 01:37:33 2012 +0300
     1.3 @@ -20,9 +20,16 @@
     1.4  	struct slice_file *next;
     1.5  };
     1.6  
     1.7 +enum {
     1.8 +	UIMODE_DEFAULT,
     1.9 +	UIMODE_XFER,
    1.10 +	UIMODE_CURSOR
    1.11 +};
    1.12 +
    1.13  int init(void);
    1.14  void disp(void);
    1.15  void render_volume(void);
    1.16 +void draw_slice(void);
    1.17  void draw_xfer_func(void);
    1.18  void reshape(int x, int y);
    1.19  void keyb(unsigned char key, int x, int y);
    1.20 @@ -42,7 +49,7 @@
    1.21  vec2_t tex_scale;
    1.22  struct slice_file *flist;
    1.23  int nslices;
    1.24 -unsigned int sdr, vol_tex, ray_tex;
    1.25 +unsigned int vol_sdr, slice_sdr, vol_tex, ray_tex;
    1.26  int win_xsz, win_ysz;
    1.27  int raytex_needs_recalc = 1;
    1.28  
    1.29 @@ -50,7 +57,8 @@
    1.30  float xfer_mean = 0.5, xfer_sdev = 1.0;
    1.31  int xfertex_needs_recalc = 1;
    1.32  
    1.33 -static int uimode_xfer;
    1.34 +static int uimode;
    1.35 +static float cur_z = 0.5;
    1.36  
    1.37  int main(int argc, char **argv)
    1.38  {
    1.39 @@ -85,12 +93,18 @@
    1.40  {
    1.41  	int i, vol_xsz, vol_ysz;
    1.42  
    1.43 -	if(!(sdr = create_program_load("volray.v.glsl", "volray.p.glsl"))) {
    1.44 +	if(!(vol_sdr = create_program_load("volray.v.glsl", "volray.p.glsl"))) {
    1.45  		return -1;
    1.46  	}
    1.47 -	set_uniform_int(sdr, "volume", 0);
    1.48 -	set_uniform_int(sdr, "ray_tex", 1);
    1.49 -	set_uniform_int(sdr, "xfer_tex", 2);
    1.50 +	set_uniform_int(vol_sdr, "volume", 0);
    1.51 +	set_uniform_int(vol_sdr, "ray_tex", 1);
    1.52 +	set_uniform_int(vol_sdr, "xfer_tex", 2);
    1.53 +
    1.54 +	if(!(slice_sdr = create_program_load(0, "slice.p.glsl"))) {
    1.55 +		return -1;
    1.56 +	}
    1.57 +	set_uniform_int(slice_sdr, "volume", 0);
    1.58 +	set_uniform_int(slice_sdr, "xfer_tex", 1);
    1.59  
    1.60  	glGenTextures(1, &vol_tex);
    1.61  	glBindTexture(GL_TEXTURE_3D, vol_tex);
    1.62 @@ -146,6 +160,7 @@
    1.63  	}
    1.64  
    1.65  	render_volume();
    1.66 +	draw_slice();
    1.67  	draw_xfer_func();
    1.68  
    1.69  	glutSwapBuffers();
    1.70 @@ -185,7 +200,7 @@
    1.71  	glBindTexture(GL_TEXTURE_1D, xfer_tex);
    1.72  	glEnable(GL_TEXTURE_1D);
    1.73  
    1.74 -	bind_program(sdr);
    1.75 +	bind_program(vol_sdr);
    1.76  	glBegin(GL_QUADS);
    1.77  	glColor3f(1, 1, 1);
    1.78  	glTexCoord2f(0, 1); glVertex2f(-1, -1);
    1.79 @@ -208,6 +223,41 @@
    1.80  	glPopMatrix();
    1.81  }
    1.82  
    1.83 +void draw_slice(void)
    1.84 +{
    1.85 +	glMatrixMode(GL_MODELVIEW);
    1.86 +	glPushMatrix();
    1.87 +	glTranslatef(0.9, 0.9, 0);
    1.88 +	glScalef(0.3, 0.3 * ((float)win_xsz / win_ysz), 1);
    1.89 +	glTranslatef(-1, -1, 0);
    1.90 +
    1.91 +	glActiveTexture(GL_TEXTURE0);
    1.92 +	glBindTexture(GL_TEXTURE_3D, vol_tex);
    1.93 +	glEnable(GL_TEXTURE_3D);
    1.94 +
    1.95 +	glActiveTexture(GL_TEXTURE1);
    1.96 +	glBindTexture(GL_TEXTURE_1D, xfer_tex);
    1.97 +	glEnable(GL_TEXTURE_1D);
    1.98 +
    1.99 +	bind_program(slice_sdr);
   1.100 +
   1.101 +	glBegin(GL_QUADS);
   1.102 +	glColor3f(1, 1, 1);
   1.103 +	glTexCoord3f(0, 1, cur_z); glVertex2f(-1, -1);
   1.104 +	glTexCoord3f(1, 1, cur_z); glVertex2f(1, -1);
   1.105 +	glTexCoord3f(1, 0, cur_z); glVertex2f(1, 1);
   1.106 +	glTexCoord3f(0, 0, cur_z); glVertex2f(-1, 1);
   1.107 +	glEnd();
   1.108 +
   1.109 +	bind_program(0);
   1.110 +
   1.111 +	glActiveTexture(GL_TEXTURE1);
   1.112 +	glDisable(GL_TEXTURE_1D);
   1.113 +	glActiveTexture(GL_TEXTURE0);
   1.114 +	glDisable(GL_TEXTURE_3D);
   1.115 +	glPopMatrix();
   1.116 +}
   1.117 +
   1.118  void draw_xfer_func(void)
   1.119  {
   1.120  	glMatrixMode(GL_MODELVIEW);
   1.121 @@ -232,7 +282,11 @@
   1.122  
   1.123  	glLineWidth(2.0);
   1.124  	glBegin(GL_LINE_LOOP);
   1.125 -	glColor3f(uimode_xfer ? 1 : 0, 0, uimode_xfer ? 0 : 1);
   1.126 +	if(uimode == UIMODE_XFER) {
   1.127 +		glColor3f(1, 0, 0);
   1.128 +	} else {
   1.129 +		glColor3f(0, 0, 1);
   1.130 +	}
   1.131  	glVertex2f(0, 0);
   1.132  	glVertex2f(1, 0);
   1.133  	glVertex2f(1, 1);
   1.134 @@ -260,9 +314,17 @@
   1.135  		exit(0);
   1.136  
   1.137  	case 'x':
   1.138 -		uimode_xfer = 1;
   1.139 +		uimode = UIMODE_XFER;
   1.140  		glutPostRedisplay();
   1.141  		break;
   1.142 +
   1.143 +	case 'c':
   1.144 +		uimode = UIMODE_CURSOR;
   1.145 +		glutPostRedisplay();
   1.146 +		break;
   1.147 +
   1.148 +	default:
   1.149 +		break;
   1.150  	}
   1.151  }
   1.152  
   1.153 @@ -270,8 +332,20 @@
   1.154  {
   1.155  	switch(key) {
   1.156  	case 'x':
   1.157 -		uimode_xfer = 0;
   1.158 -		glutPostRedisplay();
   1.159 +		if(uimode == UIMODE_XFER) {
   1.160 +			uimode = UIMODE_DEFAULT;
   1.161 +			glutPostRedisplay();
   1.162 +		}
   1.163 +		break;
   1.164 +
   1.165 +	case 'c':
   1.166 +		if(uimode == UIMODE_CURSOR) {
   1.167 +			uimode = UIMODE_DEFAULT;
   1.168 +			glutPostRedisplay();
   1.169 +		}
   1.170 +		break;
   1.171 +
   1.172 +	default:
   1.173  		break;
   1.174  	}
   1.175  }
   1.176 @@ -293,7 +367,8 @@
   1.177  	prev_x = x;
   1.178  	prev_y = y;
   1.179  
   1.180 -	if(uimode_xfer) {
   1.181 +	switch(uimode) {
   1.182 +	case UIMODE_XFER:
   1.183  		if(dx || dy) {
   1.184  			xfer_mean += dx / (float)win_xsz;
   1.185  			xfer_sdev += 0.5 * dy / (float)win_ysz;
   1.186 @@ -304,8 +379,20 @@
   1.187  			xfertex_needs_recalc = 1;
   1.188  			glutPostRedisplay();
   1.189  		}
   1.190 -	} else {
   1.191 +		break;
   1.192  
   1.193 +	case UIMODE_CURSOR:
   1.194 +		cur_z += 0.5 * dy / (float)win_ysz;
   1.195 +
   1.196 +		if(cur_z < 0.0)
   1.197 +			cur_z = 0.0;
   1.198 +		if(cur_z > 1.0)
   1.199 +			cur_z = 1.0;
   1.200 +		glutPostRedisplay();
   1.201 +		break;
   1.202 +
   1.203 +	default:
   1.204 +		/* view control */
   1.205  		if(bnstate[0]) {
   1.206  			cam_theta += dx * 0.5;
   1.207  			cam_phi += dy * 0.5;
     2.1 --- a/volray.p.glsl	Mon Apr 02 17:59:46 2012 +0300
     2.2 +++ b/volray.p.glsl	Wed Apr 04 01:37:33 2012 +0300
     2.3 @@ -21,19 +21,19 @@
     2.4  vec3 ray_march(Ray ray);
     2.5  vec3 shade(Ray ray, ISect isect);
     2.6  Ray get_primary_ray();
     2.7 -bool intersect_aabb(Ray ray, AABBox aabb, out float t);
     2.8 +ISect intersect_aabb(Ray ray, AABBox aabb);
     2.9  
    2.10  void main()
    2.11  {
    2.12 -	const AABBox aabb = AABBox(vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0));
    2.13 +	const AABBox aabb = AABBox(vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0));
    2.14  	Ray ray = get_primary_ray();
    2.15  
    2.16  	vec3 color = vec3(0.0, 0.0, 0.0);
    2.17  
    2.18 -	float start_t;
    2.19 -	if(intersect_aabb(ray, aabb, start_t)) {
    2.20 -		ray.origin += ray.dir * start_t;
    2.21 -		color = vec3(1.0, 0.0, 0.0);//ray_march(ray);
    2.22 +	ISect res = intersect_aabb(ray, aabb);
    2.23 +	if(res.hit) {
    2.24 +		ray.origin += ray.dir * res.t;
    2.25 +		color = ray_march(ray);
    2.26  	}
    2.27  
    2.28  	gl_FragColor = vec4(color, 1.0);
    2.29 @@ -50,7 +50,8 @@
    2.30  
    2.31  float eval(vec3 pos)
    2.32  {
    2.33 -	return texture1D(xfer_tex, texture3D(volume, pos).x).x;
    2.34 +	vec3 tc = pos * 0.5 + 0.5;
    2.35 +	return texture1D(xfer_tex, texture3D(volume, tc).x).x;
    2.36  }
    2.37  
    2.38  vec3 ray_march(Ray ray)
    2.39 @@ -97,11 +98,16 @@
    2.40  	return ray;
    2.41  }
    2.42  
    2.43 -bool intersect_aabb(Ray ray, AABBox aabb, out float t)
    2.44 +ISect intersect_aabb(Ray ray, AABBox aabb)
    2.45  {
    2.46 +	ISect res;
    2.47 +	res.hit = false;
    2.48 +
    2.49  	if(ray.origin.x >= aabb.min.x && ray.origin.y >= aabb.min.y && ray.origin.z >= aabb.min.z &&
    2.50  			ray.origin.x < aabb.max.x && ray.origin.y < aabb.max.y && ray.origin.z < aabb.max.z) {
    2.51 -		return true;
    2.52 +		res.t = 0.0;
    2.53 +		res.hit = true;
    2.54 +		return res;
    2.55  	}
    2.56  
    2.57  	vec4 bbox[2];
    2.58 @@ -119,7 +125,7 @@
    2.59  	float tymax = (bbox[1 - ysign].y - ray.origin.y) * invdiry;
    2.60  
    2.61  	if(tmin > tymax || tymin > tmax) {
    2.62 -		return false;
    2.63 +		return res;
    2.64  	}
    2.65  
    2.66  	if(tymin > tmin) tmin = tymin;
    2.67 @@ -131,10 +137,31 @@
    2.68  	float tzmax = (bbox[1 - zsign].z - ray.origin.z) * invdirz;
    2.69  
    2.70  	if(tmin > tzmax || tzmin > tmax) {
    2.71 -		return false;
    2.72 +		return res;
    2.73  	}
    2.74  
    2.75 -	t = tmin;
    2.76 -	return tmin < 1.0 && tmax > 0.0;
    2.77 +	res.t = tmin;
    2.78 +	res.hit = true;
    2.79 +	res.pos = ray.origin + ray.dir * res.t;
    2.80 +
    2.81 +	/*if(res.pos.x > res.pos.y && res.pos.x > res.pos.z) {
    2.82 +		res.normal = vec3(1.0, 0.0, 0.0);
    2.83 +	} else if(res.pos.x < res.pos.y && res.pos.x < res.pos.z) {
    2.84 +		res.normal = vec3(-1.0, 0.0, 0.0);
    2.85 +	} else if(res.pos.y > res.pos.x && res.pos.y > res.pos.z) {
    2.86 +		res.normal = vec3(0.0, 1.0, 0.0);
    2.87 +	} else if(res.pos.y < res.pos.x && res.pos.y < res.pos.z) {
    2.88 +		res.normal = vec3(0.0, -1.0, 0.0);
    2.89 +	} else if(res.pos.z > res.pos.x && res.pos.z > res.pos.y) {
    2.90 +		res.normal = vec3(0.0, 0.0, 1.0);
    2.91 +	} else {
    2.92 +		res.normal = vec3(0.0, 0.9, -1.0);
    2.93 +	}
    2.94 +	if(res.pos.x < 0.0) {
    2.95 +		res.normal = vec3(1.0, 0.0, 0.0);
    2.96 +	} else {
    2.97 +		res.normal = vec3(0.0, 0.0, 1.0);
    2.98 +	}*/
    2.99 +	return res;
   2.100  }
   2.101