# HG changeset patch # User John Tsiombikas # Date 1419962612 -7200 # Node ID fb6d934713522579df3c2a6f1e25d24e8a274312 # Parent 71b479ffb9f7da7d62af71a2a156165fbfa78bba main thing done diff -r 71b479ffb9f7 -r fb6d93471352 Makefile --- a/Makefile Tue Dec 30 17:28:38 2014 +0200 +++ b/Makefile Tue Dec 30 20:03:32 2014 +0200 @@ -5,7 +5,7 @@ bin = dicomview -#opt = -O3 -ffast-math +opt = -O3 -ffast-math dbg = -g def = -DUSE_GLUT #inc = diff -r 71b479ffb9f7 -r fb6d93471352 sdr/fast.p.glsl --- a/sdr/fast.p.glsl Tue Dec 30 17:28:38 2014 +0200 +++ b/sdr/fast.p.glsl Tue Dec 30 20:03:32 2014 +0200 @@ -3,9 +3,17 @@ void main() { + vec3 tc = gl_TexCoord[0].xyz; + float max_manh_dist = max(tc.x, max(tc.y, tc.z)); + float min_manh_dist = min(tc.x, min(tc.y, tc.z)); + float border = step(0.0, min_manh_dist) * (1.0 - step(1.0, max_manh_dist)); + vec4 voxel = texture3D(vol_tex, gl_TexCoord[0].xyz); vec4 color = texture1D(xfer_tex, voxel.a); - gl_FragColor.rgb = color.rgb; - gl_FragColor.a = 1.0; + float alpha = color.a * border; + if(alpha < 0.001) discard; + + gl_FragColor.rgb = voxel.rgb; + gl_FragColor.a = alpha; } diff -r 71b479ffb9f7 -r fb6d93471352 sdr/fast.v.glsl --- a/sdr/fast.v.glsl Tue Dec 30 17:28:38 2014 +0200 +++ b/sdr/fast.v.glsl Tue Dec 30 20:03:32 2014 +0200 @@ -1,5 +1,10 @@ void main() { - gl_Position = ftransform(); - gl_TexCoord[0] = gl_MultiTexCoord0; + mat4 mvmat = gl_ModelViewMatrix; + mvmat[0][0] = mvmat[1][1] = mvmat[2][2] = 1.0; + mvmat[0][1] = mvmat[0][2] = mvmat[1][2] = mvmat[1][0] = mvmat[2][0] = mvmat[2][1] = 0.0; + + vec4 vertex = gl_Vertex; + gl_Position = gl_ProjectionMatrix * mvmat * vertex; + gl_TexCoord[0].xyz = gl_NormalMatrix * (vertex.xyz * vec3(1.0, 1.0, -1.0) * 1.732051) * 0.5 + 0.5; } diff -r 71b479ffb9f7 -r fb6d93471352 src/dicomview.cc --- a/src/dicomview.cc Tue Dec 30 17:28:38 2014 +0200 +++ b/src/dicomview.cc Tue Dec 30 20:03:32 2014 +0200 @@ -8,7 +8,8 @@ #include "xfer_view.h" static int win_width, win_height; -static float cam_theta, cam_phi, cam_dist = 6; +static float cam_theta, cam_phi, cam_dist = 4; +static float pre_rot = -90; static int splitter_y = -1; #define SPLITTER_WIDTH 5 @@ -81,7 +82,7 @@ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0, 0, -cam_dist); - glRotatef(cam_phi, 1, 0, 0); + glRotatef(cam_phi + pre_rot, 1, 0, 0); glRotatef(cam_theta, 0, 1, 0); rend->update(0); @@ -135,10 +136,40 @@ void ev_keyboard(int key, int press, int x, int y) { + RendererFast *fr; + if(press) { switch(key) { case 27: quit(); + + case '=': + if((fr = dynamic_cast(rend))) { + int n = fr->get_proxy_count(); + int add = n / 4; + n += add < 1 ? 1 : add; + printf("proxy count: %d\n", n); + fr->set_proxy_count(n); + } + redisplay(); + break; + + case '-': + if((fr = dynamic_cast(rend))) { + int n = fr->get_proxy_count(); + int sub = n / 4; + n -= sub < 1 ? 1 : sub; + + if(n < 1) n = 1; + + printf("proxy count: %d\n", n); + fr->set_proxy_count(n); + } + redisplay(); + break; + + default: + break; } } } diff -r 71b479ffb9f7 -r fb6d93471352 src/main.cc --- a/src/main.cc Tue Dec 30 17:28:38 2014 +0200 +++ b/src/main.cc Tue Dec 30 20:03:32 2014 +0200 @@ -95,6 +95,17 @@ static void key_down(unsigned char key, int x, int y) { mod = glutGetModifiers(); + + switch(key) { + case 'i': + { + static bool fullrate; + fullrate = !fullrate; + glutIdleFunc(fullrate ? glutPostRedisplay : 0); + } + break; + } + ev_keyboard(key, 1, x, y); } diff -r 71b479ffb9f7 -r fb6d93471352 src/rend_fast.cc --- a/src/rend_fast.cc Tue Dec 30 17:28:38 2014 +0200 +++ b/src/rend_fast.cc Tue Dec 30 20:03:32 2014 +0200 @@ -3,7 +3,7 @@ #include "rend_fast.h" #include "sdr.h" -#define XFER_MAP_SZ 1024 +#define XFER_MAP_SZ 512 static unsigned int sdr; static bool have_tex_float; @@ -12,6 +12,8 @@ { vol_tex = xfer_tex = 0; vol_tex_valid = xfer_tex_valid = false; + proxy_count = 256; + vbo_proxy_count = 0; } bool RendererFast::init() @@ -27,13 +29,18 @@ glBindTexture(GL_TEXTURE_3D, vol_tex); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glGenTextures(1, &xfer_tex); glBindTexture(GL_TEXTURE_1D, xfer_tex); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexImage1D(GL_TEXTURE_1D, 0, have_tex_float ? GL_RGBA16F : GL_RGBA, XFER_MAP_SZ, 0, GL_RGB, GL_FLOAT, 0); + glGenBuffers(1, &vbo); return true; } @@ -41,6 +48,7 @@ { glDeleteTextures(1, &vol_tex); glDeleteTextures(1, &xfer_tex); + glDeleteBuffers(1, &vbo); } void RendererFast::set_volume(Volume *vol) @@ -49,6 +57,16 @@ Renderer::set_volume(vol); } +void RendererFast::set_proxy_count(int n) +{ + proxy_count = n; +} + +int RendererFast::get_proxy_count() const +{ + return proxy_count; +} + void RendererFast::update(unsigned int msec) { if(!vol) return; @@ -127,6 +145,32 @@ xfer_tex_valid = true; } + + // make sure the proxy object is up to date + if(proxy_count != vbo_proxy_count) { + static const float pat[][3] = {{-1, -1}, {1, -1}, {1, 1}, {-1, 1}}; + + int nverts = proxy_count * 4; + float *verts = new float[nverts * 3]; + float *vptr = verts; + + for(int i=0; i