# Amjidanutpan Ramanujam
# amjith.r@gmail.com
# cs6630 - prj 4


catch {load vtktcl}
if { [catch {set VTK_TCL $env(VTK_TCL)}] != 0} { set VTK_TCL ".." }
if { [catch {set VTK_DATA $env(VTK_DATA)}] != 0} { set VTK_DATA "../vtkdata" }


#################Standard Tk stuff*********************

source $VTK_TCL/vtkInt.tcl


################ read the data file ********************

vtkStructuredPointsReader reader
    reader SetFileName $VTK_DATA/mummy.128.vtk


#######################Transfer Functions********************

vtkPiecewiseFunction opacityTransferFunction
    opacityTransferFunction AddPoint 0 0.0
    opacityTransferFunction AddPoint 75 0.0
    opacityTransferFunction AddPoint 95 0.0
    opacityTransferFunction AddPoint 110 0.4
     opacityTransferFunction AddPoint 120 0.6
     opacityTransferFunction AddPoint 145 1.0
     opacityTransferFunction AddPoint 255 1.0

 vtkColorTransferFunction colorTransferFunction
     colorTransferFunction AddRGBPoint     75.0 0.4 0.4 0.4
     colorTransferFunction AddRGBPoint     95.0 .8 .8 .8
     colorTransferFunction AddRGBPoint    110.0 .6 .6 .6

     colorTransferFunction AddRGBPoint    120.0 .6 .6 .6
     colorTransferFunction AddRGBPoint    145.0 .4 .4 .4 
     colorTransferFunction AddRGBPoint    255.0 .2 .2 .2



########################Volume Properties************************
vtkVolumeProperty volumeProperty
    volumeProperty SetScalarOpacity opacityTransferFunction
    volumeProperty SetColor colorTransferFunction
    volumeProperty ShadeOn




# set raycasting variables
vtkVolumeRayCastMIPFunction  MIPFunction

vtkVolumeRayCastMapper volumeMapper
    volumeMapper SetInput [reader GetOutput]
    volumeMapper SetVolumeRayCastFunction MIPFunction


volumeMapper SetSampleDistance 0.5  
#volumeMapper SetSampleDistance 1.0     
#volumeMapper SetSampleDistance 2.0     
#volumeMapper SetSampleDistance 4.0             


############ create volume ***************

vtkVolume volume
    volume SetMapper volumeMapper
    volume SetProperty volumeProperty


############# renderer, window, interactor *****************

vtkRenderer ren1
    ren1 SetBackground 0 0 0 
vtkRenderWindow renWin
    renWin AddRenderer ren1
    renWin SetSize 512 512
vtkRenderWindowInteractor iren
    iren SetRenderWindow renWin


#############################From camframe.tcl *****************************

set frame 0

vtkWindowToImageFilter w2if

vtkPNGWriter writer



proc saveFrame {} {
  global frame
  set name [format "frame%03d.png" $frame]
  w2if SetInput renWin
  writer SetInput [w2if GetOutput]
  writer SetFileName $name
  writer Write
  incr frame
  set name [format "frame%03d.png" $frame]
  .save configure -text [format "save %s" $name]
}

proc saveView {} {
  set chan [open "saveView.tcl" w]
  set cam [ren1 GetActiveCamera]
  puts $chan "set cam \[ren1 GetActiveCamera\]"
  puts $chan [format "\$cam SetPosition %s" [$cam GetPosition]]
  puts $chan [format "\$cam SetViewUp %s" [$cam GetViewUp]]
  puts $chan [format "\$cam SetFocalPoint %s" [$cam GetFocalPoint]]
  puts $chan [format "\$cam SetViewAngle %s" [$cam GetViewAngle]]
  puts $chan [format "renWin SetSize %s" [renWin GetSize]]
  puts $chan "ren1 ResetCameraClippingRange"
  close $chan
}

# if a previous run of this program generated the camera information file,
# then read it in now, before the first rendering
if {[file exists "saveView.tcl"]} {
    source "saveView.tcl"
}

button .save -text "Save 'frame000.ppm'" -command saveFrame
button .view -text "Save View" -command saveView
button .quit -text "Quit" -command {exit}

######################### pack GUI objects***********************************

pack .save .view .quit -side bottom

ren1 AddVolume volume
renWin Render
iren SetUserMethod {wm deiconify .vtkInteract}
iren SetDesiredUpdateRate 1
iren Initialize


