# HG changeset patch # User John Tsiombikas # Date 1333366923 -10800 # Node ID 6f275934717b38154279218f1e52e028947b5053 # Parent 0b73aa7317e199782ed28d8941f1320ea8bc6fb9 foon diff -r 0b73aa7317e1 -r 6f275934717b Makefile --- a/Makefile Mon Apr 02 14:00:28 2012 +0300 +++ b/Makefile Mon Apr 02 14:42:03 2012 +0300 @@ -4,11 +4,13 @@ bin = volray CC = gcc -CFLAGS = -pedantic -Wall -g -LDFLAGS = $(libgl) -limago -lvmath -lm +CFLAGS = -pedantic -Wall -g $(incdir) +LDFLAGS = $(libdir) $(libgl) -limago -lvmath -lm ifeq ($(shell uname -s), Darwin) - libgl = -framework OpenGL -framework GLUT + libgl = -framework OpenGL -framework GLUT -lGLEW + incdir = -I/opt/local/include + libdir = -L/opt/local/lib else libgl = -lGL -lglut -lGLEW endif diff -r 0b73aa7317e1 -r 6f275934717b src/volray.c --- a/src/volray.c Mon Apr 02 14:00:28 2012 +0300 +++ b/src/volray.c Mon Apr 02 14:42:03 2012 +0300 @@ -13,6 +13,8 @@ #include #include "sdr.h" +#define XFER_MAP_SZ 512 + struct slice_file { char *name; struct slice_file *next; @@ -29,6 +31,7 @@ static void create_ray_texture(int xsz, int ysz, float vfov, vec2_t *tex_scale); static vec3_t get_primary_ray_dir(int x, int y, int w, int h, float vfov_deg); static int round_pow2(int x); +static void create_transfer_map(float mean, float sdev); float cam_theta = 0, cam_phi = 0, cam_dist = 4.0; float cam_x, cam_y, cam_z; @@ -40,6 +43,10 @@ int win_xsz, win_ysz; int raytex_needs_recalc = 1; +unsigned int xfer_tex; +float xfer_mean = 0.5, xfer_sdev = 1.0; +int xfertex_needs_recalc = 1; + int main(int argc, char **argv) { glutInit(&argc, argv); @@ -77,6 +84,7 @@ } set_uniform_int(sdr, "volume", 0); set_uniform_int(sdr, "ray_tex", 1); + set_uniform_int(sdr, "xfer_tex", 2); glGenTextures(1, &vol_tex); glBindTexture(GL_TEXTURE_3D, vol_tex); @@ -125,6 +133,9 @@ if(raytex_needs_recalc) { create_ray_texture(win_xsz, win_ysz, 50.0, &tex_scale); } + if(xfertex_needs_recalc) { + create_transfer_map(xfer_mean, xfer_sdev); + } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -146,6 +157,10 @@ glBindTexture(GL_TEXTURE_2D, ray_tex); glEnable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_1D, xfer_tex); + glEnable(GL_TEXTURE_1D); + bind_program(sdr); glBegin(GL_QUADS); glColor3f(1, 1, 1); @@ -156,6 +171,8 @@ glEnd(); bind_program(0); + glActiveTexture(GL_TEXTURE2); + glDisable(GL_TEXTURE_1D); glActiveTexture(GL_TEXTURE1); glDisable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); @@ -234,12 +251,30 @@ { int i; struct slice_file *tail; + char *endp; for(i=1; i