package require vtk

# Simple volume rendering example.
vtkSLCReader reader
    reader SetFileName "$VTK_DATA_ROOT/Data/sphere.slc"

reader Update

# Create transfer functions for opacity and color
vtkPiecewiseFunction opacityTransferFunction
    opacityTransferFunction AddPoint  20   0.0
    opacityTransferFunction AddPoint  255  1.0

vtkColorTransferFunction colorTransferFunction

# Improve coverage
    colorTransferFunction SetColorSpaceToRGB
    colorTransferFunction AddRGBPoint 100 1 1 1
    colorTransferFunction AddRGBPoint   0 0 0 0
    colorTransferFunction AddRGBPoint 200 1 0 1
    colorTransferFunction AddRGBPoint 100 0 0 0
    colorTransferFunction RemovePoint 100 
    colorTransferFunction RemovePoint   0 
    colorTransferFunction RemovePoint 200 
    colorTransferFunction AddHSVPoint 100 1 1 1
    colorTransferFunction AddHSVPoint   0 0 0 0
    colorTransferFunction AddHSVPoint 200 1 0 1
    colorTransferFunction AddHSVPoint 100 0 0 0
    colorTransferFunction RemovePoint   0 
    colorTransferFunction RemovePoint 200 
    colorTransferFunction RemovePoint 100 
    colorTransferFunction AddRGBSegment   0 1 1 1 100 0 0 0 
    colorTransferFunction AddRGBSegment  50 1 1 1 150 0 0 0 
    colorTransferFunction AddRGBSegment  60 1 1 1  90 0 0 0 
    colorTransferFunction AddHSVSegment  90 1 1 1 105 0 0 0 
    colorTransferFunction AddHSVSegment  40 1 1 1 155 0 0 0 
    colorTransferFunction AddHSVSegment  30 1 1 1  95 0 0 0 
   

    colorTransferFunction RemoveAllPoints
    colorTransferFunction AddHSVPoint      0.0 0.01 1.0 1.0
    colorTransferFunction AddHSVPoint    127.5 0.50 1.0 1.0
    colorTransferFunction AddHSVPoint    255.0 0.99 1.0 1.0
    colorTransferFunction SetColorSpaceToHSV

# Create properties, mappers, volume actors, and ray cast function
vtkVolumeProperty volumeProperty
    volumeProperty SetColor colorTransferFunction
    volumeProperty SetScalarOpacity opacityTransferFunction
    volumeProperty SetInterpolationTypeToLinear

vtkVolumeRayCastCompositeFunction  compositeFunction

vtkVolumeRayCastMapper volumeMapper
    volumeMapper SetInput [reader GetOutput]
    volumeMapper SetVolumeRayCastFunction compositeFunction

vtkVolume volume
    volume SetMapper volumeMapper
    volume SetProperty volumeProperty

# Create geometric sphere
vtkSphereSource sphereSource
    sphereSource SetCenter  25 25 25
    sphereSource SetRadius  30
    sphereSource SetThetaResolution 15
    sphereSource SetPhiResolution 15

vtkPolyDataMapper sphereMapper
    sphereMapper SetInput [sphereSource GetOutput]

vtkActor sphereActor
    sphereActor SetMapper sphereMapper

# Set up the planes
vtkPlane plane1
plane1 SetOrigin 25 25 20
plane1 SetNormal 0 0 1

vtkPlane plane2
plane2 SetOrigin 25 25 30
plane2 SetNormal 0 0 -1

vtkPlane plane3
plane3 SetOrigin 20 25 25
plane3 SetNormal 1 0 0

vtkPlane plane4
plane4 SetOrigin 30 25 25
plane4 SetNormal -1 0 0

sphereMapper AddClippingPlane plane1
sphereMapper AddClippingPlane plane2

volumeMapper AddClippingPlane plane3
volumeMapper AddClippingPlane plane4


# Okay now the graphics stuff
vtkRenderer ren1
vtkRenderWindow renWin
    renWin AddRenderer ren1
    renWin SetSize 256 256
vtkRenderWindowInteractor iren
    iren SetRenderWindow renWin

[ren1 GetCullers] InitTraversal
set culler [[ren1 GetCullers] GetNextItem]
$culler SetSortingStyleToBackToFront

ren1 AddViewProp sphereActor
ren1 AddViewProp volume
ren1 SetBackground 0.1 0.2 0.4
renWin Render

[ren1 GetActiveCamera] Azimuth 45
[ren1 GetActiveCamera] Elevation 15
[ren1 GetActiveCamera] Roll 45
[ren1 GetActiveCamera] Zoom 2.0

wm withdraw .
 
iren Initialize
