volray
diff src/volray.c @ 9:a6765984e057
moved the volume loading to volume.c
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 08 Apr 2012 07:11:54 +0300 |
parents | f40e4edfee7e |
children |
line diff
1.1 --- a/src/volray.c Sat Apr 07 16:07:12 2012 +0300 1.2 +++ b/src/volray.c Sun Apr 08 07:11:54 2012 +0300 1.3 @@ -12,14 +12,10 @@ 1.4 #include <vmath/vmath.h> 1.5 #include <imago2.h> 1.6 #include "sdr.h" 1.7 +#include "volume.h" 1.8 1.9 #define XFER_MAP_SZ 512 1.10 1.11 -struct slice_file { 1.12 - char *name; 1.13 - struct slice_file *next; 1.14 -}; 1.15 - 1.16 enum { 1.17 UIMODE_DEFAULT, 1.18 UIMODE_XFER, 1.19 @@ -43,24 +39,26 @@ 1.20 static int round_pow2(int x); 1.21 static void create_transfer_map(float mean, float sdev); 1.22 1.23 -float cam_theta = 0, cam_phi = 0, cam_dist = 4.0; 1.24 -float cam_x, cam_y, cam_z; 1.25 +static float cam_theta = 0, cam_phi = 0, cam_dist = 4.0; 1.26 +static float cam_x, cam_y, cam_z; 1.27 1.28 -vec2_t tex_scale; 1.29 -struct slice_file *flist; 1.30 -int nslices; 1.31 -unsigned int vol_sdr, slice_sdr, vol_tex, ray_tex; 1.32 -int win_xsz, win_ysz; 1.33 -int raytex_needs_recalc = 1; 1.34 +static vec2_t tex_scale; 1.35 +static struct volume *volume; 1.36 +static unsigned int vol_sdr, slice_sdr, ray_tex; 1.37 +static int win_xsz, win_ysz; 1.38 +static int raytex_needs_recalc = 1; 1.39 1.40 -unsigned int xfer_tex; 1.41 -float xfer_mean = 0.7, xfer_sdev = 0.1; 1.42 -int xfertex_needs_recalc = 1; 1.43 +static unsigned int xfer_tex; 1.44 +static float xfer_mean = 0.7, xfer_sdev = 0.1; 1.45 +static int xfertex_needs_recalc = 1; 1.46 1.47 static int uimode; 1.48 static float cur_z = 0.0; 1.49 static float ray_step = 0.01; 1.50 1.51 +static const char *fname; 1.52 + 1.53 + 1.54 int main(int argc, char **argv) 1.55 { 1.56 glutInit(&argc, argv); 1.57 @@ -92,9 +90,7 @@ 1.58 1.59 int init(void) 1.60 { 1.61 - int i, vol_xsz, vol_ysz; 1.62 - 1.63 - if(!(vol_sdr = create_program_load("volray.v.glsl", "volray.p.glsl"))) { 1.64 + if(!(vol_sdr = create_program_load("sdr/volray.v.glsl", "sdr/volray.p.glsl"))) { 1.65 return -1; 1.66 } 1.67 set_uniform_int(vol_sdr, "volume", 0); 1.68 @@ -103,51 +99,16 @@ 1.69 set_uniform_float(vol_sdr, "ray_step", ray_step); 1.70 set_uniform_float(vol_sdr, "zclip", cur_z); 1.71 1.72 - if(!(slice_sdr = create_program_load(0, "slice.p.glsl"))) { 1.73 + if(!(slice_sdr = create_program_load(0, "sdr/slice.p.glsl"))) { 1.74 return -1; 1.75 } 1.76 set_uniform_int(slice_sdr, "volume", 0); 1.77 set_uniform_int(slice_sdr, "xfer_tex", 1); 1.78 1.79 - glGenTextures(1, &vol_tex); 1.80 - glBindTexture(GL_TEXTURE_3D, vol_tex); 1.81 - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1.82 - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 1.83 - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1.84 - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1.85 - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 1.86 + if(!(volume = load_volume(fname))) { 1.87 + return -1; 1.88 + } 1.89 1.90 - for(i=0; i<nslices; i++) { 1.91 - int xsz, ysz; 1.92 - void *pix; 1.93 - struct slice_file *sfile = flist; 1.94 - flist = flist->next; 1.95 - 1.96 - if(!(pix = img_load_pixels(sfile->name, &xsz, &ysz, IMG_FMT_RGBA32))) { 1.97 - fprintf(stderr, "failed to load image: %s\n", sfile->name); 1.98 - return -1; 1.99 - } 1.100 - 1.101 - if(i == 0) { 1.102 - /* allocate storage for the texture */ 1.103 - glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32F, xsz, ysz, nslices, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 1.104 - 1.105 - vol_xsz = xsz; 1.106 - vol_ysz = ysz; 1.107 - 1.108 - } else { 1.109 - if(xsz != vol_xsz || ysz != vol_ysz) { 1.110 - fprintf(stderr, "%s: inconsistent slice size: %dx%d. expected: %dx%d\n", 1.111 - sfile->name, xsz, ysz, vol_xsz, vol_ysz); 1.112 - img_free_pixels(pix); 1.113 - return -1; 1.114 - } 1.115 - } 1.116 - free(sfile); 1.117 - 1.118 - glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, i, xsz, ysz, 1, GL_RGBA, GL_UNSIGNED_BYTE, pix); 1.119 - img_free_pixels(pix); 1.120 - } 1.121 return 0; 1.122 } 1.123 1.124 @@ -190,7 +151,7 @@ 1.125 1.126 /* tex unit0: volume data 3D texture */ 1.127 glActiveTexture(GL_TEXTURE0); 1.128 - glBindTexture(GL_TEXTURE_3D, vol_tex); 1.129 + glBindTexture(GL_TEXTURE_3D, volume->tex_vol); 1.130 glEnable(GL_TEXTURE_3D); 1.131 1.132 /* tex unit1: primary rays in view space */ 1.133 @@ -235,7 +196,7 @@ 1.134 glTranslatef(-1, -1, 0); 1.135 1.136 glActiveTexture(GL_TEXTURE0); 1.137 - glBindTexture(GL_TEXTURE_3D, vol_tex); 1.138 + glBindTexture(GL_TEXTURE_3D, volume->tex_vol); 1.139 glEnable(GL_TEXTURE_3D); 1.140 1.141 glActiveTexture(GL_TEXTURE1); 1.142 @@ -426,7 +387,6 @@ 1.143 int parse_args(int argc, char **argv) 1.144 { 1.145 int i; 1.146 - struct slice_file *tail; 1.147 char *endp; 1.148 1.149 for(i=1; i<argc; i++) { 1.150 @@ -453,27 +413,16 @@ 1.151 return -1; 1.152 } 1.153 } else { 1.154 - struct slice_file *sfile; 1.155 - 1.156 - if(!(sfile = malloc(sizeof *sfile))) { 1.157 - perror("failed to allocate memory"); 1.158 + if(fname) { 1.159 + fprintf(stderr, "unexpected argument: %s\n", argv[i]); 1.160 return -1; 1.161 } 1.162 - sfile->name = argv[i]; 1.163 - sfile->next = 0; 1.164 - 1.165 - if(!flist) { 1.166 - flist = tail = sfile; 1.167 - } else { 1.168 - tail->next = sfile; 1.169 - tail = sfile; 1.170 - } 1.171 - nslices++; 1.172 + fname = argv[i]; 1.173 } 1.174 } 1.175 1.176 - if(!nslices) { 1.177 - fprintf(stderr, "pass the slice filenames\n"); 1.178 + if(!fname) { 1.179 + fprintf(stderr, "pass the volume descriptor filename\n"); 1.180 return -1; 1.181 } 1.182 return 0;