package require vtk
package require vtkinteraction

#
# Test butterfly subdivision of point data
#




vtkSphereSource sphere
    sphere SetPhiResolution 11
    sphere SetThetaResolution 11

vtkElevationFilter colorIt
  colorIt SetInputConnection [sphere GetOutputPort]
  colorIt SetLowPoint 0 0 -.5
  colorIt SetHighPoint 0 0 .5

vtkButterflySubdivisionFilter butterfly
  butterfly SetInput [colorIt GetPolyDataOutput]
  butterfly SetNumberOfSubdivisions 3

vtkLookupTable lut
  lut SetNumberOfColors 256
  lut Build

vtkPolyDataMapper mapper
  mapper SetInputConnection [butterfly GetOutputPort] 
  mapper SetLookupTable lut

vtkActor actor
  actor SetMapper mapper

vtkLinearSubdivisionFilter linear
  linear SetInput [colorIt GetPolyDataOutput]
  linear SetNumberOfSubdivisions 3

vtkPolyDataMapper mapper2
  mapper2 SetInputConnection [linear GetOutputPort] 
  mapper2 SetLookupTable lut

vtkActor actor2
  actor2 SetMapper mapper2

vtkPolyDataMapper mapper3
  mapper3 SetInputConnection [colorIt GetOutputPort] 
  mapper3 SetLookupTable lut

vtkActor actor3
  actor3 SetMapper mapper3

vtkRenderer ren1
vtkRenderer ren2
vtkRenderer ren3

vtkRenderWindow renWin
    renWin AddRenderer ren1
    renWin AddRenderer ren2
    renWin AddRenderer ren3

vtkRenderWindowInteractor iren
    iren SetRenderWindow renWin

ren1 AddActor actor
ren1 SetBackground 1 1 1

ren2 AddActor actor2
ren2 SetBackground 1 1 1

ren3 AddActor actor3
ren3 SetBackground 1 1 1

renWin SetSize 600 200
vtkCamera aCamera
  aCamera Azimuth 70
vtkLight aLight
eval aLight SetPosition [aCamera GetPosition]
eval aLight SetFocalPoint [aCamera GetFocalPoint]

ren1 SetActiveCamera aCamera
ren1 AddLight aLight
ren1 ResetCamera
aCamera Dolly 1.4
ren1 ResetCameraClippingRange

ren2 SetActiveCamera aCamera
ren2 AddLight aLight

ren3 SetActiveCamera aCamera
ren3 AddLight aLight

ren3 SetViewport 0 0 .33 1
ren2 SetViewport .33 0 .67 1
ren1 SetViewport .67 0 1 1

iren AddObserver UserEvent {wm deiconify .vtkInteract}
iren Initialize

proc flat {} {
    [actor GetProperty] SetInterpolationToFlat
    [actor2 GetProperty] SetInterpolationToFlat
    [actor3 GetProperty] SetInterpolationToFlat
    renWin Render
}

proc smooth {} {
    [actor GetProperty] SetInterpolationToGouraud
    [actor2 GetProperty] SetInterpolationToGouraud
    [actor3 GetProperty] SetInterpolationToGouraud
    renWin Render
}


wm withdraw .
