# # demo for bighead data set, fixed classification (skin/bone), color # set demo_menu_name "256^3 CT Head, Color" set demo_label_name "CT Head (256 x 256 x 225)" #set demo_first 1 # load the volume and set parameters for rendering # ARG1: if true, load $directory/head_skin.den, classify it, # and store in $directory/head_skin.cv; # no value is returned # if false, try to load $directory/head_skin.cv; if that fails # then load $directory/head_skin.den and classify it; # in either case, return a context containing the # classified volume # ARG2: directory containing the volume data file head_skin.cv (default: ".") # ARG3: frame for adding widgets specific to this demo # ARG4: font # RETURN: context or {} depending on ARG1 proc demo_load {reclassify {directory "."} {demoframe {}} \ {font "*-helvetica-medium-r-normal--14-100-*"}} { # get the classified volume if {$reclassify || ![file exists $directory/head_skin.cv]} { # load .den file set data [vpr_array #auto] vpr_load_den $data $directory/bighead.den # create a rendering context and attach the volume data to it set context [vpr_byte_context #auto] $context config -data $data -source data # set the classification function $context config -min_voxel_opacity 0.05 $context config -scalar_opacity_ramp { 0 0.0 80 0.38 135 1.0 255 1.0 } $context config -grad_opacity_ramp { 0 0.0 70 1.0 221 1.0 } # classify the volume $context classify # clean up $context config -data {} $data delete if {$reclassify} { # store the classified volume and return $context store $directory/head_skin.cv cvolume $context delete return } } else { # load classified volume from a file set context [vpr_byte_context #auto] $context load $directory/head_skin.cv cvolume } $context config -status_messages 0 -clamp 1 # set lighting parameters $context set_light 0 direction -0.3 0.5 1.0 $context config -light0 on $context config -light_both_sides on # set material parameters $context config -color_channels 3 -num_materials 2 set ambient 30 set diffuse 100 set specular 130 set r0 255 set g0 191 set b0 128 set r1 238 set g1 238 set b1 142 $context config -description \ "$ambient $diffuse $specular $r0 $g0 $b0 $r1 $g1 $b1" # set material parameters for skin $context set_composition 0 {0 1.0 90 1.0 130 0.0 255 0.0} $context set_material 0 ambient both_sides \ [expr ($ambient/255.0)*($r0/255.0)] \ [expr ($ambient/255.0)*($g0/255.0)] \ [expr ($ambient/255.0)*($b0/255.0)] $context set_material 0 diffuse both_sides \ [expr ($diffuse/255.0)*($r0/255.0)] \ [expr ($diffuse/255.0)*($g0/255.0)] \ [expr ($diffuse/255.0)*($b0/255.0)] $context set_material 0 specular both_sides \ [expr ($specular/255.0)*($r0/255.0)] \ [expr ($specular/255.0)*($g0/255.0)] \ [expr ($specular/255.0)*($b0/255.0)] $context set_material 0 shinyness both_sides 10 # set material parameters for bone $context set_composition 1 {0 0.0 90 0.0 130 1.0 255 1.0} $context set_material 1 ambient both_sides \ [expr ($ambient/255.0)*($r1/255.0)] \ [expr ($ambient/255.0)*($g1/255.0)] \ [expr ($ambient/255.0)*($b1/255.0)] $context set_material 1 diffuse both_sides \ [expr ($diffuse/255.0)*($r1/255.0)] \ [expr ($diffuse/255.0)*($g1/255.0)] \ [expr ($diffuse/255.0)*($b1/255.0)] $context set_material 1 specular both_sides \ [expr ($specular/255.0)*($r1/255.0)] \ [expr ($specular/255.0)*($g1/255.0)] \ [expr ($specular/255.0)*($b1/255.0)] $context set_material 1 shinyness both_sides 10 # set depth cueing options $context config -depth_cue_front_factor 1.1 -depth_cue_density 0.8 $context config -depth_cue on # set shadow options, but leave shadows disabled $context config -shadow_light light0 $context config -shadow_bias 8 $context config -shadow off # set the initial view parameters $context scale 1 -1 1 $context rotate x 90 $context rotate y 15 $context rotate x 15 $context rotate y 45 $context config -view_model GL $context config -projection parallel $context config -frustum_left -0.6 -frustum_right 0.55 $context config -frustum_bottom -0.55 -frustum_top 0.6 $context config -frustum_near -0.5 -frustum_far 0.5 $context config -current_matrix project $context identity_matrix $context window $context config -current_matrix model # set other rendering parameters $context config -max_ray_opacity 0.95 $context config -render_from cvolume # allocate an image set image [vpr_array #auto] $image resize -dimens {256 256} -type unsigned_3 global vpr_color_pixel_type $context config -pixel_type $vpr_color_pixel_type -image $image if {$demoframe != {}} { # create brightness slider frame $demoframe.brightness -borderwidth 2 -relief sunken pack $demoframe.brightness -side top -fill x -in $demoframe.widgets vpr_slider $demoframe.brightness.s -minval 0.5 -maxval 1.5 \ -command "head_skin_brightness $context $demoframe" \ -display_value 0 $demoframe.brightness.s set_value 1.0 pack $demoframe.brightness.s -side top -expand true -fill x frame $demoframe.brightness.f pack $demoframe.brightness.f -side top -expand true -fill x label $demoframe.brightness.l1 -text "darker" -font $font label $demoframe.brightness.l2 -text "lighter" -font $font pack $demoframe.brightness.l1 -side left -in $demoframe.brightness.f pack $demoframe.brightness.l2 -side right -in $demoframe.brightness.f proc head_skin_brightness {context demo_widget brightness} { set params [$context info public description -value] set ambient [lindex $params 0] set diffuse [lindex $params 1] set specular [lindex $params 2] set r0 [lindex $params 3] set g0 [lindex $params 4] set b0 [lindex $params 5] set r1 [lindex $params 6] set g1 [lindex $params 7] set b1 [lindex $params 8] set color [$demo_widget.color.s get_value] set ambient_r0 [expr ($ambient/255.0)*($r0/255.0)*\ (1.0-$color)+$color] # set material parameters for skin $context set_material 0 ambient both_sides \ [expr $ambient_r0*$brightness] \ [expr ($ambient/255.0)*($g0/255.0)*$brightness] \ [expr ($ambient/255.0)*($b0/255.0)*$brightness] $context set_material 0 diffuse both_sides \ [expr ($diffuse/255.0)*($r0/255.0)*$brightness] \ [expr ($diffuse/255.0)*($g0/255.0)*$brightness] \ [expr ($diffuse/255.0)*($b0/255.0)*$brightness] $context set_material 0 specular both_sides \ [expr ($specular/255.0)*($r0/255.0)*$brightness] \ [expr ($specular/255.0)*($g0/255.0)*$brightness] \ [expr ($specular/255.0)*($b0/255.0)*$brightness] # set material parameters for bone $context set_material 1 ambient both_sides \ [expr ($ambient/255.0)*($r1/255.0)*$brightness] \ [expr ($ambient/255.0)*($g1/255.0)*$brightness] \ [expr ($ambient/255.0)*($b1/255.0)*$brightness] $context set_material 1 diffuse both_sides \ [expr ($diffuse/255.0)*($r1/255.0)*$brightness] \ [expr ($diffuse/255.0)*($g1/255.0)*$brightness] \ [expr ($diffuse/255.0)*($b1/255.0)*$brightness] $context set_material 1 specular both_sides \ [expr ($specular/255.0)*($r1/255.0)*$brightness] \ [expr ($specular/255.0)*($g1/255.0)*$brightness] \ [expr ($specular/255.0)*($b1/255.0)*$brightness] $demo_widget render } # create color slider frame $demoframe.color -borderwidth 2 -relief sunken pack $demoframe.color -side top -fill x -in $demoframe.widgets vpr_slider $demoframe.color.s -minval 0.0 -maxval 1.0 \ -command "head_skin_color $context $demoframe" \ -display_value 0 pack $demoframe.color.s -side top -expand true -fill x frame $demoframe.color.f pack $demoframe.color.f -side top -expand true -fill x label $demoframe.color.l1 -text "bronze" -font $font label $demoframe.color.l2 -text "neon" -font $font pack $demoframe.color.l1 -side left -in $demoframe.color.f pack $demoframe.color.l2 -side right -in $demoframe.color.f proc head_skin_color {context demo_widget color} { set params [$context info public description -value] set ambient [lindex $params 0] set r0 [lindex $params 3] set g0 [lindex $params 4] set b0 [lindex $params 5] set ambient_r0 [expr ($ambient/255.0)*($r0/255.0)*\ (1.0-$color)+$color] set brightness [$demo_widget.brightness.s get_value] $context set_material 0 ambient both_sides \ [expr $ambient_r0*$brightness] \ [expr ($ambient/255.0)*($g0/255.0)*$brightness] \ [expr ($ambient/255.0)*($b0/255.0)*$brightness] $demo_widget render } } return $context } # clean up memory and widgets associated with the demo # ARG1: rendering context # ARG2: frame containing widgets specific to this demo # RETURN: none proc demo_cleanup {context {demoframe {}}} { set image [$context info public image -value] $image delete $context delete if {$demoframe != {}} { $demoframe.brightness.s delete $demoframe.color.s delete destroy $demoframe.brightness destroy $demoframe.color } }