package require vtk
package require vtkinteraction

# create pipeline
#
# create sphere to color
vtkSphereSource sphere
    sphere SetThetaResolution 20
    sphere SetPhiResolution 40


proc colorCells {} {
    vtkMath randomColorGenerator
    set input [randomColors GetInput]
    set output [randomColors GetOutput]
    set numCells [$input GetNumberOfCells]
    vtkFloatArray colors
	colors SetNumberOfTuples $numCells

    for {set i 0} {$i < $numCells} {incr i} {
        colors SetValue $i [randomColorGenerator Random 0 1]
    }

    [$output GetCellData] CopyScalarsOff
    [$output GetCellData] PassData [$input GetCellData]
    [$output GetCellData] SetScalars colors

    colors Delete; #reference counting - it's ok
    randomColorGenerator Delete
}

# Compute random scalars (colors) for each cell
vtkProgrammableAttributeDataFilter randomColors
    randomColors SetInputConnection [sphere GetOutputPort]
    randomColors SetExecuteMethod colorCells

# mapper and actor
vtkPolyDataMapper mapper
    mapper SetInput [randomColors GetPolyDataOutput]
    eval mapper SetScalarRange [[randomColors GetPolyDataOutput] GetScalarRange]
vtkActor sphereActor
    sphereActor SetMapper mapper

# Create a scalar bar
vtkScalarBarActor scalarBar
    scalarBar SetLookupTable [mapper GetLookupTable]
    scalarBar SetTitle "Temperature"
    [scalarBar GetPositionCoordinate] SetCoordinateSystemToNormalizedViewport
    [scalarBar GetPositionCoordinate] SetValue 0.1 0.05
    scalarBar SetOrientationToVertical
    scalarBar SetWidth 0.8
    scalarBar SetHeight 0.9
    scalarBar SetLabelFormat "%-#6.3f"

# Test the Get/Set Position 
eval scalarBar SetPosition  [scalarBar GetPosition]

# Create graphics stuff
# Create the RenderWindow, Renderer and both Actors
#
vtkRenderer ren1
vtkRenderer ren2
vtkRenderWindow renWin
    renWin AddRenderer ren1
    renWin AddRenderer ren2
vtkRenderWindowInteractor iren
    iren SetRenderWindow renWin

ren1 AddActor sphereActor
ren2 AddActor2D scalarBar
renWin SetSize 160 160
ren1 SetViewport 0 0 0.75 1.0
ren2 SetViewport 0.75 0 1.0 1.0
ren2 SetBackground 0.3 0.3 0.3

# render the image
#
renWin Render
scalarBar SetNumberOfLabels 8
renWin Render


vtkWindowToImageFilter w2i
w2i SetInput renWin
w2i SetMagnification 2
w2i Update

# copy the output
set outputData [[w2i GetOutput] NewInstance]
$outputData DeepCopy [w2i GetOutput]

vtkImageMapper ia
ia SetInput $outputData
scalarBar ReleaseGraphicsResources renWin
sphereActor ReleaseGraphicsResources renWin
ia SetColorWindow 255
ia SetColorLevel 127.5

vtkActor2D ia2
ia2 SetMapper ia

renWin SetSize 320 320
ren2 RemoveViewProp scalarBar
ren1 RemoveViewProp sphereActor
ren1 AddActor ia2
renWin RemoveRenderer ren2 
ren1 SetViewport 0 0 1 1

renWin Render
iren AddObserver UserEvent {wm deiconify .vtkInteract}

# prevent the tk window from showing up then start the event loop
wm withdraw .

$outputData UnRegister {}
