package require vtk
package require vtkinteraction
package require vtktesting

# use implicit modeller / interpolation to perform 3D morphing
#
# make the letter v
vtkVectorText letterV
  letterV SetText "v"

# read the geometry file containing the letter t
vtkVectorText letterT
  letterT SetText "t"

# read the geometry file containing the letter k
vtkVectorText letterK
  letterK SetText "k"

# create implicit models of each
vtkImplicitModeller blobbyV
  blobbyV SetInputConnection [letterV GetOutputPort]
  blobbyV SetMaximumDistance .2
  blobbyV SetSampleDimensions 50 50 12
  blobbyV SetModelBounds -0.5 1.5 -0.5 1.5 -0.5 0.5

# create implicit models of each
vtkImplicitModeller blobbyT
  blobbyT SetInputConnection [letterT GetOutputPort]
  blobbyT SetMaximumDistance .2
  blobbyT SetSampleDimensions 50 50 12
  blobbyT SetModelBounds -0.5 1.5 -0.5 1.5 -0.5 0.5

# create implicit models of each
vtkImplicitModeller blobbyK
  blobbyK SetInputConnection [letterK GetOutputPort]
  blobbyK SetMaximumDistance .2
  blobbyK SetSampleDimensions 50 50 12
  blobbyK SetModelBounds -0.5 1.5 -0.5 1.5 -0.5 0.5

# Interpolate the data
vtkInterpolateDataSetAttributes interpolate
  interpolate AddInputConnection [blobbyV GetOutputPort]
  interpolate AddInputConnection [blobbyT GetOutputPort]
  interpolate AddInputConnection [blobbyK GetOutputPort]
  interpolate SetT 0.0

# extract an iso surface
vtkContourFilter blobbyIso
  blobbyIso SetInputConnection [interpolate GetOutputPort]
  blobbyIso SetValue 0 0.1

# map to rendering primitives
vtkPolyDataMapper blobbyMapper
  blobbyMapper SetInputConnection [blobbyIso GetOutputPort]
  blobbyMapper ScalarVisibilityOff

# now an actor
vtkActor blobby
  blobby SetMapper blobbyMapper
  eval [blobby GetProperty] SetDiffuseColor $banana

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

vtkCamera camera
    camera SetClippingRange 0.265 13.2
    camera SetFocalPoint 0.539 0.47464 0
    camera SetPosition 0.539 0.474674 2.644
    camera SetViewUp 0 1 0
ren1 SetActiveCamera camera

#  now  make a renderer and tell it about lights and actors
renWin SetSize 300 350
  
ren1 AddActor blobby
ren1 SetBackground 1 1 1
renWin Render 

set subIters 4.0
for {set i 0} {$i < 2} {incr i} {
   for {set j 1} {$j <= $subIters} {incr j} {
      set t [expr $i + $j/$subIters]
      interpolate SetT $t
      renWin Render
   }
}


# render the image
#
iren AddObserver UserEvent {wm deiconify .vtkInteract}

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

