# # demo for engine data set, fixed classification, color # set demo_menu_name "CT Engine, Color" set demo_label_name "CT Engine (256 x 256 x 110)" #set demo_first 1 # load the volume and set parameters for rendering # ARG1: if true, load $directory/engine.den, classify it, # and store in $directory/engine.cv; # no value is returned # if false, try to load $directory/engine.cv; if that fails # then load $directory/engine.den and classify it; # in either case, return a context containing the # classified volume # ARG2: directory containing the volume data file engine.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/engine.cv]} { # load .den file set data [vpr_array #auto] vpr_load_den $data $directory/engine.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.02 $context config -scalar_opacity_ramp { 0 0.0 67 0.0 93 0.157 180 0.157 200 1.0 255 1.0 } $context config -grad_opacity_ramp { 0 0.0 60 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/engine.cv cvolume $context delete return } } else { # load classified volume from a file set context [vpr_byte_context #auto] $context load $directory/engine.cv cvolume } $context config -status_messages 0 -clamp 0 # set lighting parameters $context set_light 0 direction -0.3 1.0 1.0 $context config -light0 on $context config -light_both_sides off # set material parameters $context config -color_channels 3 -num_materials 2 set ambient 30 set diffuse 70 set specular 100 set scale0 2.0 set r0 99*$scale0 set g0 182*$scale0 set b0 255*$scale0 set scale1 1.5 set r1 22*$scale1 set g1 62*$scale1 set b1 255*$scale1 $context config -description \ "$ambient $diffuse $specular $r0 $g0 $b0 $r1 $g1 $b1" # set material parameters for engine block body $context set_composition 0 {0 0.0 67 0.0 93 1.0 180 1.0 200 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 valve fittings and side plate $context set_composition 1 {0 0.0 180 0.0 200 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.2 -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 rotate x 30 $context rotate y 30 $context rotate z -30 $context rotate y 30 $context config -view_model GL $context config -projection parallel $context config -frustum_left -0.5 -frustum_right 0.5 $context config -frustum_bottom -0.5 -frustum_top 0.5 $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 "engine_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 engine_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 material parameters for engine block body $context set_material 0 ambient both_sides \ [expr ($ambient/255.0)*($r0/255.0)*$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 valves and side plate $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 } } 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 destroy $demoframe.brightness } }