# HG changeset patch # User John Tsiombikas # Date 1333378786 -10800 # Node ID 3e53a16d4667f37ff4a71ea808084ef27bc52af5 # Parent 6f275934717b38154279218f1e52e028947b5053 foo diff -r 6f275934717b -r 3e53a16d4667 src/volray.c --- a/src/volray.c Mon Apr 02 14:42:03 2012 +0300 +++ b/src/volray.c Mon Apr 02 17:59:46 2012 +0300 @@ -22,8 +22,11 @@ int init(void); void disp(void); +void render_volume(void); +void draw_xfer_func(void); void reshape(int x, int y); void keyb(unsigned char key, int x, int y); +void keyb_up(unsigned char key, int x, int y); void mouse(int bn, int state, int x, int y); void motion(int x, int y); int parse_args(int argc, char **argv); @@ -47,6 +50,8 @@ float xfer_mean = 0.5, xfer_sdev = 1.0; int xfertex_needs_recalc = 1; +static int uimode_xfer; + int main(int argc, char **argv) { glutInit(&argc, argv); @@ -62,6 +67,7 @@ glutDisplayFunc(disp); glutReshapeFunc(reshape); glutKeyboardFunc(keyb); + glutKeyboardUpFunc(keyb_up); glutMouseFunc(mouse); glutMotionFunc(motion); @@ -90,9 +96,9 @@ 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); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP); + 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); for(i=0; i= 90) cam_phi = 89; + xfer_mean = xfer_mean < 0.0 ? 0.0 : (xfer_mean > 1.0 ? 1.0 : xfer_mean); + xfer_sdev = xfer_sdev < 0.0 ? 0.0 : (xfer_sdev > 1.0 ? 1.0 : xfer_sdev); - glutPostRedisplay(); - } + xfertex_needs_recalc = 1; + glutPostRedisplay(); + } + } else { - if(bnstate[1]) { - cam_x += dx * 0.025; - cam_y += dy * 0.025; - glutPostRedisplay(); - } + if(bnstate[0]) { + cam_theta += dx * 0.5; + cam_phi += dy * 0.5; - if(bnstate[2]) { - cam_dist += dy * 0.025; - if(cam_dist < 0.0) cam_dist = 0.0; - glutPostRedisplay(); + if(cam_phi <= -90) cam_phi = -89; + if(cam_phi >= 90) cam_phi = 89; + + glutPostRedisplay(); + } + + if(bnstate[1]) { + cam_x += dx * 0.025; + cam_y += dy * 0.025; + glutPostRedisplay(); + } + + if(bnstate[2]) { + cam_dist += dy * 0.025; + if(cam_dist < 0.0) cam_dist = 0.0; + glutPostRedisplay(); + } } } @@ -264,10 +348,10 @@ } break; - case 'v': + case 'd': xfer_sdev = strtod(argv[++i], &endp); if(endp == argv[i]) { - fprintf(stderr, "-v must be followed by the transfer function sdeviance\n"); + fprintf(stderr, "-d must be followed by the transfer function std.deviation\n"); return -1; } break; @@ -396,10 +480,11 @@ } for(i=0; i= aabb.min.x && ray.origin.y >= aabb.min.y && ray.origin.z >= aabb.min.z && + ray.origin.x < aabb.max.x && ray.origin.y < aabb.max.y && ray.origin.z < aabb.max.z) { + return true; + } + + vec4 bbox[2]; + bbox[0] = vec4(aabb.min.x, aabb.min.y, aabb.min.z, 0); + bbox[1] = vec4(aabb.max.x, aabb.max.y, aabb.max.z, 0); + + int xsign = int(ray.dir.x < 0.0); + float invdirx = 1.0 / ray.dir.x; + float tmin = (bbox[xsign].x - ray.origin.x) * invdirx; + float tmax = (bbox[1 - xsign].x - ray.origin.x) * invdirx; + + int ysign = int(ray.dir.y < 0.0); + float invdiry = 1.0 / ray.dir.y; + float tymin = (bbox[ysign].y - ray.origin.y) * invdiry; + float tymax = (bbox[1 - ysign].y - ray.origin.y) * invdiry; + + if(tmin > tymax || tymin > tmax) { + return false; + } + + if(tymin > tmin) tmin = tymin; + if(tymax < tmax) tmax = tymax; + + int zsign = int(ray.dir.z < 0.0); + float invdirz = 1.0 / ray.dir.z; + float tzmin = (bbox[zsign].z - ray.origin.z) * invdirz; + float tzmax = (bbox[1 - zsign].z - ray.origin.z) * invdirz; + + if(tmin > tzmax || tzmin > tmax) { + return false; + } + + t = tmin; + return tmin < 1.0 && tmax > 0.0; +} +