package require vtk
package require vtkinteraction

# create tensor ellipsoids
# Create the RenderWindow, Renderer and interactive renderer
#
vtkRenderer ren1
vtkRenderWindow renWin
    renWin SetMultiSamples 0
    renWin AddRenderer ren1
vtkRenderWindowInteractor iren
    iren SetRenderWindow renWin

#
# Create tensor ellipsoids
#
# generate tensors
vtkPointLoad ptLoad
    ptLoad SetLoadValue 100.0
    ptLoad SetSampleDimensions 6 6 6
    ptLoad ComputeEffectiveStressOn
    ptLoad SetModelBounds -10 10 -10 10 -10 10

# extract plane of data
vtkImageDataGeometryFilter plane
    plane SetInputConnection [ptLoad GetOutputPort]
    plane SetExtent 2 2 0 99 0 99

# Generate ellipsoids
vtkSphereSource sphere
    sphere SetThetaResolution 8
    sphere SetPhiResolution 8
vtkTensorGlyph ellipsoids
    ellipsoids SetInputConnection [ptLoad GetOutputPort]
    ellipsoids SetSourceConnection [sphere GetOutputPort]
    ellipsoids SetScaleFactor 10
    ellipsoids ClampScalingOn
  
vtkPolyDataNormals ellipNormals
  ellipNormals SetInputConnection [ellipsoids GetOutputPort]

# Map contour
vtkLogLookupTable lut
    lut SetHueRange .6667 0.0
vtkPolyDataMapper ellipMapper
    ellipMapper SetInputConnection [ellipNormals GetOutputPort]
    ellipMapper SetLookupTable lut
    plane Update;#force update for scalar range
    eval ellipMapper SetScalarRange [[plane GetOutput] GetScalarRange]

vtkActor ellipActor
    ellipActor SetMapper ellipMapper
#
# Create outline around data
#
vtkOutlineFilter outline
    outline SetInputConnection [ptLoad GetOutputPort]

vtkPolyDataMapper outlineMapper
    outlineMapper SetInputConnection [outline GetOutputPort]

vtkActor outlineActor
    outlineActor SetMapper outlineMapper
    eval [outlineActor GetProperty] SetColor 0 0 0

#
# Create cone indicating application of load
#
vtkConeSource coneSrc
    coneSrc  SetRadius .5
    coneSrc  SetHeight 2
vtkPolyDataMapper coneMap
    coneMap SetInputConnection [coneSrc GetOutputPort]
vtkActor coneActor
    coneActor SetMapper coneMap;    
    coneActor SetPosition 0 0 11
    coneActor RotateY 90
    eval [coneActor GetProperty] SetColor 1 0 0

vtkCamera camera
    camera SetFocalPoint 0.113766 -1.13665 -1.01919
    camera SetPosition -29.4886 -63.1488 26.5807
    camera SetViewAngle 24.4617
    camera SetViewUp 0.17138 0.331163 0.927879
    camera SetClippingRange 1 100

ren1 AddActor ellipActor
ren1 AddActor outlineActor
ren1 AddActor coneActor
ren1 SetBackground 1.0 1.0 1.0
ren1 SetActiveCamera camera

renWin SetSize 400 400
renWin Render
iren AddObserver UserEvent {wm deiconify .vtkInteract}

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