#!/usr/bin/env python
import vtk
import vtk.test.Testing
from vtk.util.misc import vtkGetDataRoot
VTK_DATA_ROOT = vtkGetDataRoot()

# This script exercises vtkInteractorStyleUser. It creates some
# simple bindings for the mouse bottons and scroll wheel.

# Helper math stuff
import math
def magnitude(v):
    return math.sqrt(sum(v[i]*v[i] for i in range(0,3)))
def dot(u, v):
    return sum(u[i]*v[i] for i in range(0,3))
def normalize(v):
    vmag = magnitude(v)
    return [ v[i]/vmag  for i in range(0,3) ]

# Variables local to this module
left = 0
middle = 0
right = 0

oldPickD = []
newPickD = []
oldPickW = [0,0,0,0]
newPickW = [0,0,0,0]
fpD = [0,0,0]
motionD = [0,0]
motionW = [0,0,0]
cam = ""

# The binding actions are defined below
# This general method computes some common information from mouse
# motion and button presses.
def getMotion(iRen,ren):
    global oldPickD, newPickD, oldPickW, newPickW, fpD, fpW, posW
    global motionD, motionW, cam
    style = iRen.GetInteractorStyle()
    oldPickD = iRen.GetLastEventPosition()
    newPickD = iRen.GetEventPosition()
    motionD[0] = newPickD[0] - oldPickD[0];
    motionD[1] = newPickD[1] - oldPickD[1];
    cam = ren.GetActiveCamera()
    fpW = cam.GetFocalPoint()
    posW = cam.GetPosition()
    style.ComputeWorldToDisplay(ren, fpW[0], fpW[1], fpW[2], fpD)
    focalDepth = fpD[2]
    style.ComputeDisplayToWorld(ren,oldPickD[0],oldPickD[1],focalDepth,oldPickW)
    style.ComputeDisplayToWorld(ren,newPickD[0],newPickD[1],focalDepth,newPickW)
    motionW[0] = oldPickW[0] - newPickW[0]
    motionW[1] = oldPickW[1] - newPickW[1]
    motionW[2] = oldPickW[2] - newPickW[2]

# Left mouse button is pan
def mouseLeftMove(iRen,ren):
    getMotion(iRen,ren)
    cam.SetFocalPoint(fpW[0]+motionW[0],fpW[1]+motionW[1],fpW[2]+motionW[2])
    cam.SetPosition(posW[0]+motionW[0],posW[1]+motionW[1],posW[2]+motionW[2])
    iRen.Render()

# Mouse middle button up/down is elevation, and left and right is azimuth
def mouseMiddleMove(iRen,ren):
    getMotion(iRen,ren)
    if abs(motionD[0]) > abs(motionD[1]):
        cam.Azimuth(-2.0*motionD[0])
    else:
        vup = cam.GetViewUp()
        normalize(vup)
        dop = cam.GetDirectionOfProjection();
        normalize(dop)
        theta = math.degrees( math.acos(-dot(vup,dop)) )
        cam.Elevation(-motionD[1])
    iRen.Render()

# Right mouse button is rotate (left/right movement) and zoom in/out (up/down
# movement)
def mouseRightMove(iRen,ren):
    getMotion(iRen,ren)
    if abs(motionD[0]) > abs(motionD[1]):
        cam.Azimuth(-2.0*motionD[0])
    else:
        cam.Zoom(1 + motionD[1]/100.0)
    iRen.Render()

# Mouse scroll wheel is zoom in/out
def mouseWheelForward(iRen,ren):
    cam = ren.GetActiveCamera()
    cam.Zoom(1.1)
    iRen.Render()
def mouseWheelBackward(iRen,ren):
    cam = ren.GetActiveCamera()
    cam.Zoom(0.9)
    iRen.Render()

# The events to be played back
Recording = \
    "# StreamVersion 1\n\
    EnterEvent 299 92 0 0 0 0 0\n\
    MouseMoveEvent 299 92 0 0 0 0 0\n\
    MouseMoveEvent 296 98 0 0 0 0 0\n\
    MouseMoveEvent 293 104 0 0 0 0 0\n\
    MouseMoveEvent 290 108 0 0 0 0 0\n\
    MouseMoveEvent 287 112 0 0 0 0 0\n\
    MouseMoveEvent 285 116 0 0 0 0 0\n\
    MouseMoveEvent 282 120 0 0 0 0 0\n\
    MouseMoveEvent 281 122 0 0 0 0 0\n\
    MouseMoveEvent 279 124 0 0 0 0 0\n\
    MouseMoveEvent 277 126 0 0 0 0 0\n\
    MouseMoveEvent 276 127 0 0 0 0 0\n\
    MouseMoveEvent 275 128 0 0 0 0 0\n\
    MouseMoveEvent 273 129 0 0 0 0 0\n\
    MouseMoveEvent 272 130 0 0 0 0 0\n\
    MouseMoveEvent 271 131 0 0 0 0 0\n\
    MouseMoveEvent 269 132 0 0 0 0 0\n\
    LeftButtonPressEvent 269 132 0 0 0 0 0\n\
    MouseMoveEvent 268 132 0 0 0 0 0\n\
    MouseMoveEvent 267 132 0 0 0 0 0\n\
    MouseMoveEvent 267 132 0 0 0 0 0\n\
    MouseMoveEvent 265 132 0 0 0 0 0\n\
    MouseMoveEvent 263 132 0 0 0 0 0\n\
    MouseMoveEvent 260 132 0 0 0 0 0\n\
    MouseMoveEvent 258 132 0 0 0 0 0\n\
    MouseMoveEvent 255 133 0 0 0 0 0\n\
    MouseMoveEvent 250 134 0 0 0 0 0\n\
    MouseMoveEvent 246 135 0 0 0 0 0\n\
    MouseMoveEvent 245 136 0 0 0 0 0\n\
    MouseMoveEvent 243 136 0 0 0 0 0\n\
    MouseMoveEvent 242 136 0 0 0 0 0\n\
    MouseMoveEvent 241 136 0 0 0 0 0\n\
    MouseMoveEvent 240 136 0 0 0 0 0\n\
    MouseMoveEvent 239 136 0 0 0 0 0\n\
    MouseMoveEvent 238 136 0 0 0 0 0\n\
    MouseMoveEvent 237 136 0 0 0 0 0\n\
    MouseMoveEvent 235 136 0 0 0 0 0\n\
    MouseMoveEvent 231 136 0 0 0 0 0\n\
    MouseMoveEvent 230 136 0 0 0 0 0\n\
    MouseMoveEvent 227 136 0 0 0 0 0\n\
    MouseMoveEvent 224 136 0 0 0 0 0\n\
    MouseMoveEvent 219 136 0 0 0 0 0\n\
    MouseMoveEvent 215 136 0 0 0 0 0\n\
    MouseMoveEvent 211 136 0 0 0 0 0\n\
    MouseMoveEvent 208 136 0 0 0 0 0\n\
    MouseMoveEvent 205 136 0 0 0 0 0\n\
    MouseMoveEvent 203 136 0 0 0 0 0\n\
    MouseMoveEvent 201 136 0 0 0 0 0\n\
    MouseMoveEvent 199 136 0 0 0 0 0\n\
    MouseMoveEvent 197 136 0 0 0 0 0\n\
    MouseMoveEvent 194 136 0 0 0 0 0\n\
    MouseMoveEvent 191 136 0 0 0 0 0\n\
    MouseMoveEvent 189 136 0 0 0 0 0\n\
    MouseMoveEvent 187 136 0 0 0 0 0\n\
    MouseMoveEvent 185 136 0 0 0 0 0\n\
    MouseMoveEvent 181 136 0 0 0 0 0\n\
    MouseMoveEvent 178 136 0 0 0 0 0\n\
    MouseMoveEvent 175 136 0 0 0 0 0\n\
    MouseMoveEvent 172 136 0 0 0 0 0\n\
    MouseMoveEvent 168 136 0 0 0 0 0\n\
    MouseMoveEvent 163 136 0 0 0 0 0\n\
    MouseMoveEvent 159 136 0 0 0 0 0\n\
    MouseMoveEvent 157 136 0 0 0 0 0\n\
    MouseMoveEvent 155 136 0 0 0 0 0\n\
    MouseMoveEvent 154 136 0 0 0 0 0\n\
    MouseMoveEvent 153 136 0 0 0 0 0\n\
    MouseMoveEvent 152 136 0 0 0 0 0\n\
    MouseMoveEvent 151 136 0 0 0 0 0\n\
    MouseMoveEvent 151 136 0 0 0 0 0\n\
    MouseMoveEvent 153 135 0 0 0 0 0\n\
    MouseMoveEvent 157 135 0 0 0 0 0\n\
    MouseMoveEvent 163 133 0 0 0 0 0\n\
    MouseMoveEvent 173 133 0 0 0 0 0\n\
    MouseMoveEvent 180 133 0 0 0 0 0\n\
    MouseMoveEvent 187 132 0 0 0 0 0\n\
    MouseMoveEvent 197 132 0 0 0 0 0\n\
    MouseMoveEvent 206 132 0 0 0 0 0\n\
    MouseMoveEvent 212 131 0 0 0 0 0\n\
    MouseMoveEvent 216 131 0 0 0 0 0\n\
    MouseMoveEvent 218 131 0 0 0 0 0\n\
    MouseMoveEvent 221 131 0 0 0 0 0\n\
    MouseMoveEvent 221 131 0 0 0 0 0\n\
    MouseMoveEvent 222 131 0 0 0 0 0\n\
    MouseMoveEvent 223 131 0 0 0 0 0\n\
    MouseMoveEvent 225 130 0 0 0 0 0\n\
    MouseMoveEvent 225 130 0 0 0 0 0\n\
    MouseMoveEvent 227 130 0 0 0 0 0\n\
    MouseMoveEvent 227 130 0 0 0 0 0\n\
    MouseMoveEvent 229 130 0 0 0 0 0\n\
    MouseMoveEvent 231 130 0 0 0 0 0\n\
    MouseMoveEvent 233 130 0 0 0 0 0\n\
    MouseMoveEvent 234 130 0 0 0 0 0\n\
    MouseMoveEvent 235 130 0 0 0 0 0\n\
    MouseMoveEvent 237 130 0 0 0 0 0\n\
    MouseMoveEvent 238 130 0 0 0 0 0\n\
    MouseMoveEvent 239 130 0 0 0 0 0\n\
    MouseMoveEvent 239 130 0 0 0 0 0\n\
    MouseMoveEvent 239 130 0 0 0 0 0\n\
    MouseMoveEvent 238 130 0 0 0 0 0\n\
    MouseMoveEvent 237 130 0 0 0 0 0\n\
    MouseMoveEvent 235 130 0 0 0 0 0\n\
    MouseMoveEvent 234 130 0 0 0 0 0\n\
    MouseMoveEvent 233 130 0 0 0 0 0\n\
    LeftButtonReleaseEvent 233 130 0 0 0 0 0\n\
    MouseMoveEvent 233 130 0 0 0 0 0\n\
    MouseMoveEvent 231 129 0 0 0 0 0\n\
    MouseMoveEvent 228 128 0 0 0 0 0\n\
    MouseMoveEvent 227 126 0 0 0 0 0\n\
    MouseMoveEvent 226 126 0 0 0 0 0\n\
    MouseMoveEvent 224 125 0 0 0 0 0\n\
    MouseMoveEvent 219 124 0 0 0 0 0\n\
    MouseMoveEvent 217 124 0 0 0 0 0\n\
    MouseMoveEvent 216 123 0 0 0 0 0\n\
    MouseMoveEvent 215 122 0 0 0 0 0\n\
    MouseMoveEvent 213 122 0 0 0 0 0\n\
    MouseMoveEvent 212 122 0 0 0 0 0\n\
    MouseMoveEvent 209 121 0 0 0 0 0\n\
    MouseMoveEvent 208 120 0 0 0 0 0\n\
    MouseMoveEvent 207 120 0 0 0 0 0\n\
    MouseMoveEvent 205 118 0 0 0 0 0\n\
    MouseMoveEvent 204 117 0 0 0 0 0\n\
    MouseMoveEvent 204 118 0 0 0 0 0\n\
    MouseMoveEvent 204 122 0 0 0 0 0\n\
    MouseMoveEvent 204 125 0 0 0 0 0\n\
    MouseMoveEvent 204 129 0 0 0 0 0\n\
    MouseMoveEvent 204 133 0 0 0 0 0\n\
    MouseMoveEvent 204 136 0 0 0 0 0\n\
    MouseMoveEvent 204 140 0 0 0 0 0\n\
    MouseMoveEvent 204 142 0 0 0 0 0\n\
    MouseMoveEvent 204 145 0 0 0 0 0\n\
    MouseMoveEvent 204 147 0 0 0 0 0\n\
    MouseMoveEvent 204 149 0 0 0 0 0\n\
    MouseMoveEvent 204 152 0 0 0 0 0\n\
    MouseMoveEvent 205 154 0 0 0 0 0\n\
    MouseMoveEvent 205 156 0 0 0 0 0\n\
    MouseMoveEvent 205 158 0 0 0 0 0\n\
    MouseMoveEvent 206 160 0 0 0 0 0\n\
    MouseMoveEvent 206 162 0 0 0 0 0\n\
    MouseMoveEvent 207 163 0 0 0 0 0\n\
    MouseMoveEvent 207 166 0 0 0 0 0\n\
    MouseMoveEvent 207 168 0 0 0 0 0\n\
    MouseMoveEvent 207 169 0 0 0 0 0\n\
    MouseMoveEvent 208 169 0 0 0 0 0\n\
    MouseMoveEvent 208 170 0 0 0 0 0\n\
    MouseMoveEvent 208 172 0 0 0 0 0\n\
    MiddleButtonPressEvent 208 172 0 0 0 0 0\n\
    MouseMoveEvent 209 172 0 0 0 0 0\n\
    MouseMoveEvent 209 173 0 0 0 0 0\n\
    MouseMoveEvent 209 174 0 0 0 0 0\n\
    MouseMoveEvent 209 174 0 0 0 0 0\n\
    MouseMoveEvent 209 176 0 0 0 0 0\n\
    MouseMoveEvent 209 177 0 0 0 0 0\n\
    MouseMoveEvent 209 178 0 0 0 0 0\n\
    MouseMoveEvent 209 179 0 0 0 0 0\n\
    MouseMoveEvent 209 180 0 0 0 0 0\n\
    MouseMoveEvent 210 182 0 0 0 0 0\n\
    MouseMoveEvent 211 184 0 0 0 0 0\n\
    MouseMoveEvent 211 186 0 0 0 0 0\n\
    MouseMoveEvent 212 188 0 0 0 0 0\n\
    MouseMoveEvent 212 190 0 0 0 0 0\n\
    MouseMoveEvent 213 192 0 0 0 0 0\n\
    MouseMoveEvent 214 196 0 0 0 0 0\n\
    MouseMoveEvent 214 198 0 0 0 0 0\n\
    MouseMoveEvent 215 201 0 0 0 0 0\n\
    MouseMoveEvent 215 204 0 0 0 0 0\n\
    MouseMoveEvent 216 206 0 0 0 0 0\n\
    MouseMoveEvent 217 209 0 0 0 0 0\n\
    MouseMoveEvent 217 212 0 0 0 0 0\n\
    MouseMoveEvent 218 213 0 0 0 0 0\n\
    MouseMoveEvent 218 214 0 0 0 0 0\n\
    MouseMoveEvent 218 216 0 0 0 0 0\n\
    MouseMoveEvent 218 217 0 0 0 0 0\n\
    MouseMoveEvent 218 218 0 0 0 0 0\n\
    MouseMoveEvent 218 218 0 0 0 0 0\n\
    MouseMoveEvent 218 219 0 0 0 0 0\n\
    MouseMoveEvent 218 218 0 0 0 0 0\n\
    MouseMoveEvent 218 215 0 0 0 0 0\n\
    MouseMoveEvent 218 212 0 0 0 0 0\n\
    MouseMoveEvent 218 210 0 0 0 0 0\n\
    MouseMoveEvent 218 206 0 0 0 0 0\n\
    MouseMoveEvent 218 203 0 0 0 0 0\n\
    MouseMoveEvent 218 200 0 0 0 0 0\n\
    MouseMoveEvent 218 197 0 0 0 0 0\n\
    MouseMoveEvent 218 194 0 0 0 0 0\n\
    MouseMoveEvent 218 192 0 0 0 0 0\n\
    MouseMoveEvent 218 189 0 0 0 0 0\n\
    MouseMoveEvent 218 186 0 0 0 0 0\n\
    MouseMoveEvent 218 183 0 0 0 0 0\n\
    MouseMoveEvent 218 182 0 0 0 0 0\n\
    MouseMoveEvent 218 179 0 0 0 0 0\n\
    MouseMoveEvent 218 178 0 0 0 0 0\n\
    MouseMoveEvent 218 176 0 0 0 0 0\n\
    MouseMoveEvent 218 175 0 0 0 0 0\n\
    MouseMoveEvent 218 174 0 0 0 0 0\n\
    MouseMoveEvent 218 172 0 0 0 0 0\n\
    MouseMoveEvent 218 171 0 0 0 0 0\n\
    MouseMoveEvent 218 169 0 0 0 0 0\n\
    MouseMoveEvent 218 168 0 0 0 0 0\n\
    MouseMoveEvent 218 167 0 0 0 0 0\n\
    MouseMoveEvent 218 166 0 0 0 0 0\n\
    MouseMoveEvent 218 166 0 0 0 0 0\n\
    MouseMoveEvent 218 164 0 0 0 0 0\n\
    MouseMoveEvent 218 163 0 0 0 0 0\n\
    MouseMoveEvent 218 162 0 0 0 0 0\n\
    MouseMoveEvent 218 161 0 0 0 0 0\n\
    MouseMoveEvent 218 160 0 0 0 0 0\n\
    MouseMoveEvent 218 159 0 0 0 0 0\n\
    MouseMoveEvent 218 158 0 0 0 0 0\n\
    MouseMoveEvent 218 157 0 0 0 0 0\n\
    MouseMoveEvent 218 156 0 0 0 0 0\n\
    MouseMoveEvent 218 156 0 0 0 0 0\n\
    MiddleButtonReleaseEvent 218 156 0 0 0 0 0\n\
    MouseMoveEvent 218 156 0 0 0 0 0\n\
    MouseMoveEvent 217 156 0 0 0 0 0\n\
    MouseMoveEvent 214 156 0 0 0 0 0\n\
    MouseMoveEvent 210 156 0 0 0 0 0\n\
    MouseMoveEvent 204 156 0 0 0 0 0\n\
    MouseMoveEvent 197 158 0 0 0 0 0\n\
    MouseMoveEvent 193 158 0 0 0 0 0\n\
    MouseMoveEvent 183 161 0 0 0 0 0\n\
    MouseMoveEvent 173 163 0 0 0 0 0\n\
    MiddleButtonPressEvent 173 163 0 0 0 0 0\n\
    MouseMoveEvent 165 164 0 0 0 0 0\n\
    MouseMoveEvent 155 166 0 0 0 0 0\n\
    MouseMoveEvent 147 167 0 0 0 0 0\n\
    MouseMoveEvent 137 169 0 0 0 0 0\n\
    MouseMoveEvent 131 171 0 0 0 0 0\n\
    MouseMoveEvent 124 172 0 0 0 0 0\n\
    MouseMoveEvent 121 173 0 0 0 0 0\n\
    MouseMoveEvent 119 173 0 0 0 0 0\n\
    MouseMoveEvent 118 173 0 0 0 0 0\n\
    MouseMoveEvent 117 174 0 0 0 0 0\n\
    MouseMoveEvent 116 174 0 0 0 0 0\n\
    MouseMoveEvent 115 174 0 0 0 0 0\n\
    MouseMoveEvent 113 174 0 0 0 0 0\n\
    MouseMoveEvent 110 174 0 0 0 0 0\n\
    MouseMoveEvent 108 174 0 0 0 0 0\n\
    MouseMoveEvent 106 174 0 0 0 0 0\n\
    MouseMoveEvent 105 174 0 0 0 0 0\n\
    MouseMoveEvent 103 174 0 0 0 0 0\n\
    MouseMoveEvent 103 174 0 0 0 0 0\n\
    MouseMoveEvent 101 175 0 0 0 0 0\n\
    MouseMoveEvent 101 175 0 0 0 0 0\n\
    MouseMoveEvent 100 175 0 0 0 0 0\n\
    MouseMoveEvent 101 175 0 0 0 0 0\n\
    MouseMoveEvent 104 175 0 0 0 0 0\n\
    MouseMoveEvent 107 175 0 0 0 0 0\n\
    MouseMoveEvent 112 175 0 0 0 0 0\n\
    MouseMoveEvent 118 175 0 0 0 0 0\n\
    MouseMoveEvent 122 175 0 0 0 0 0\n\
    MouseMoveEvent 128 175 0 0 0 0 0\n\
    MouseMoveEvent 132 175 0 0 0 0 0\n\
    MouseMoveEvent 136 175 0 0 0 0 0\n\
    MouseMoveEvent 142 175 0 0 0 0 0\n\
    MouseMoveEvent 145 175 0 0 0 0 0\n\
    MouseMoveEvent 148 175 0 0 0 0 0\n\
    MouseMoveEvent 151 175 0 0 0 0 0\n\
    MouseMoveEvent 153 175 0 0 0 0 0\n\
    MouseMoveEvent 154 175 0 0 0 0 0\n\
    MouseMoveEvent 155 175 0 0 0 0 0\n\
    MouseMoveEvent 155 174 0 0 0 0 0\n\
    MouseMoveEvent 156 174 0 0 0 0 0\n\
    MouseMoveEvent 157 174 0 0 0 0 0\n\
    MouseMoveEvent 157 174 0 0 0 0 0\n\
    MouseMoveEvent 158 174 0 0 0 0 0\n\
    MouseMoveEvent 159 174 0 0 0 0 0\n\
    MouseMoveEvent 159 174 0 0 0 0 0\n\
    MouseMoveEvent 161 174 0 0 0 0 0\n\
    MouseMoveEvent 164 174 0 0 0 0 0\n\
    MouseMoveEvent 166 174 0 0 0 0 0\n\
    MouseMoveEvent 169 174 0 0 0 0 0\n\
    MouseMoveEvent 172 174 0 0 0 0 0\n\
    MouseMoveEvent 174 174 0 0 0 0 0\n\
    MouseMoveEvent 177 174 0 0 0 0 0\n\
    MouseMoveEvent 178 174 0 0 0 0 0\n\
    MouseMoveEvent 179 174 0 0 0 0 0\n\
    MouseMoveEvent 181 174 0 0 0 0 0\n\
    MouseMoveEvent 181 174 0 0 0 0 0\n\
    MouseMoveEvent 182 174 0 0 0 0 0\n\
    MouseMoveEvent 183 175 0 0 0 0 0\n\
    MouseMoveEvent 183 175 0 0 0 0 0\n\
    MouseMoveEvent 184 175 0 0 0 0 0\n\
    MouseMoveEvent 185 175 0 0 0 0 0\n\
    MiddleButtonReleaseEvent 185 175 0 0 0 0 0\n\
    MouseMoveEvent 185 175 0 0 0 0 0\n\
    RightButtonPressEvent 185 175 0 0 0 0 0\n\
    MouseMoveEvent 185 176 0 0 0 0 0\n\
    MouseMoveEvent 185 178 0 0 0 0 0\n\
    MouseMoveEvent 183 181 0 0 0 0 0\n\
    MouseMoveEvent 183 183 0 0 0 0 0\n\
    MouseMoveEvent 183 185 0 0 0 0 0\n\
    MouseMoveEvent 182 188 0 0 0 0 0\n\
    MouseMoveEvent 182 189 0 0 0 0 0\n\
    MouseMoveEvent 182 191 0 0 0 0 0\n\
    MouseMoveEvent 182 193 0 0 0 0 0\n\
    MouseMoveEvent 182 194 0 0 0 0 0\n\
    MouseMoveEvent 182 195 0 0 0 0 0\n\
    MouseMoveEvent 182 196 0 0 0 0 0\n\
    MouseMoveEvent 182 198 0 0 0 0 0\n\
    MouseMoveEvent 182 199 0 0 0 0 0\n\
    MouseMoveEvent 182 200 0 0 0 0 0\n\
    MouseMoveEvent 182 201 0 0 0 0 0\n\
    MouseMoveEvent 182 202 0 0 0 0 0\n\
    MouseMoveEvent 182 203 0 0 0 0 0\n\
    MouseMoveEvent 182 204 0 0 0 0 0\n\
    MouseMoveEvent 182 204 0 0 0 0 0\n\
    MouseMoveEvent 182 206 0 0 0 0 0\n\
    MouseMoveEvent 182 206 0 0 0 0 0\n\
    MouseMoveEvent 182 207 0 0 0 0 0\n\
    MouseMoveEvent 182 208 0 0 0 0 0\n\
    MouseMoveEvent 182 210 0 0 0 0 0\n\
    MouseMoveEvent 182 212 0 0 0 0 0\n\
    MouseMoveEvent 182 213 0 0 0 0 0\n\
    MouseMoveEvent 182 215 0 0 0 0 0\n\
    MouseMoveEvent 182 216 0 0 0 0 0\n\
    MouseMoveEvent 182 218 0 0 0 0 0\n\
    MouseMoveEvent 182 221 0 0 0 0 0\n\
    MouseMoveEvent 183 224 0 0 0 0 0\n\
    MouseMoveEvent 184 226 0 0 0 0 0\n\
    MouseMoveEvent 184 228 0 0 0 0 0\n\
    MouseMoveEvent 185 230 0 0 0 0 0\n\
    MouseMoveEvent 185 232 0 0 0 0 0\n\
    MouseMoveEvent 185 233 0 0 0 0 0\n\
    MouseMoveEvent 185 234 0 0 0 0 0\n\
    MouseMoveEvent 185 237 0 0 0 0 0\n\
    MouseMoveEvent 186 238 0 0 0 0 0\n\
    MouseMoveEvent 187 240 0 0 0 0 0\n\
    MouseMoveEvent 187 241 0 0 0 0 0\n\
    MouseMoveEvent 187 242 0 0 0 0 0\n\
    MouseMoveEvent 187 244 0 0 0 0 0\n\
    MouseMoveEvent 188 245 0 0 0 0 0\n\
    MouseMoveEvent 188 246 0 0 0 0 0\n\
    MouseMoveEvent 188 247 0 0 0 0 0\n\
    MouseMoveEvent 189 248 0 0 0 0 0\n\
    MouseMoveEvent 189 249 0 0 0 0 0\n\
    MouseMoveEvent 189 250 0 0 0 0 0\n\
    MouseMoveEvent 189 250 0 0 0 0 0\n\
    MouseMoveEvent 189 251 0 0 0 0 0\n\
    MouseMoveEvent 190 252 0 0 0 0 0\n\
    MouseMoveEvent 190 252 0 0 0 0 0\n\
    MouseMoveEvent 190 254 0 0 0 0 0\n\
    MouseMoveEvent 191 255 0 0 0 0 0\n\
    MouseMoveEvent 191 256 0 0 0 0 0\n\
    MouseMoveEvent 192 258 0 0 0 0 0\n\
    MouseMoveEvent 192 259 0 0 0 0 0\n\
    MouseMoveEvent 193 261 0 0 0 0 0\n\
    MouseMoveEvent 193 264 0 0 0 0 0\n\
    MouseMoveEvent 193 265 0 0 0 0 0\n\
    MouseMoveEvent 194 267 0 0 0 0 0\n\
    MouseMoveEvent 194 269 0 0 0 0 0\n\
    MouseMoveEvent 194 270 0 0 0 0 0\n\
    MouseMoveEvent 195 273 0 0 0 0 0\n\
    MouseMoveEvent 196 275 0 0 0 0 0\n\
    MouseMoveEvent 196 276 0 0 0 0 0\n\
    MouseMoveEvent 197 278 0 0 0 0 0\n\
    MouseMoveEvent 197 279 0 0 0 0 0\n\
    MouseMoveEvent 197 280 0 0 0 0 0\n\
    MouseMoveEvent 197 280 0 0 0 0 0\n\
    MouseMoveEvent 197 282 0 0 0 0 0\n\
    MouseMoveEvent 197 282 0 0 0 0 0\n\
    MouseMoveEvent 197 284 0 0 0 0 0\n\
    MouseMoveEvent 197 284 0 0 0 0 0\n\
    MouseMoveEvent 197 286 0 0 0 0 0\n\
    MouseMoveEvent 197 287 0 0 0 0 0\n\
    MouseMoveEvent 198 288 0 0 0 0 0\n\
    MouseMoveEvent 198 288 0 0 0 0 0\n\
    MouseMoveEvent 198 289 0 0 0 0 0\n\
    MouseMoveEvent 198 288 0 0 0 0 0\n\
    MouseMoveEvent 198 287 0 0 0 0 0\n\
    MouseMoveEvent 198 286 0 0 0 0 0\n\
    MouseMoveEvent 197 283 0 0 0 0 0\n\
    MouseMoveEvent 197 280 0 0 0 0 0\n\
    MouseMoveEvent 196 278 0 0 0 0 0\n\
    MouseMoveEvent 195 276 0 0 0 0 0\n\
    MouseMoveEvent 193 272 0 0 0 0 0\n\
    MouseMoveEvent 193 269 0 0 0 0 0\n\
    MouseMoveEvent 193 266 0 0 0 0 0\n\
    MouseMoveEvent 192 262 0 0 0 0 0\n\
    MouseMoveEvent 191 258 0 0 0 0 0\n\
    MouseMoveEvent 191 256 0 0 0 0 0\n\
    MouseMoveEvent 190 253 0 0 0 0 0\n\
    MouseMoveEvent 189 251 0 0 0 0 0\n\
    MouseMoveEvent 189 249 0 0 0 0 0\n\
    MouseMoveEvent 189 248 0 0 0 0 0\n\
    MouseMoveEvent 189 246 0 0 0 0 0\n\
    MouseMoveEvent 189 246 0 0 0 0 0\n\
    MouseMoveEvent 189 244 0 0 0 0 0\n\
    MouseMoveEvent 189 244 0 0 0 0 0\n\
    MouseMoveEvent 189 243 0 0 0 0 0\n\
    MouseMoveEvent 189 242 0 0 0 0 0\n\
    MouseMoveEvent 189 242 0 0 0 0 0\n\
    MouseMoveEvent 188 241 0 0 0 0 0\n\
    MouseMoveEvent 188 240 0 0 0 0 0\n\
    MouseMoveEvent 188 238 0 0 0 0 0\n\
    MouseMoveEvent 188 237 0 0 0 0 0\n\
    MouseMoveEvent 188 236 0 0 0 0 0\n\
    MouseMoveEvent 188 235 0 0 0 0 0\n\
    MouseMoveEvent 187 234 0 0 0 0 0\n\
    MouseMoveEvent 187 233 0 0 0 0 0\n\
    MouseMoveEvent 187 231 0 0 0 0 0\n\
    MouseMoveEvent 187 230 0 0 0 0 0\n\
    MouseMoveEvent 187 228 0 0 0 0 0\n\
    MouseMoveEvent 187 227 0 0 0 0 0\n\
    MouseMoveEvent 187 226 0 0 0 0 0\n\
    MouseMoveEvent 186 225 0 0 0 0 0\n\
    MouseMoveEvent 185 224 0 0 0 0 0\n\
    MouseMoveEvent 185 222 0 0 0 0 0\n\
    MouseMoveEvent 185 221 0 0 0 0 0\n\
    MouseMoveEvent 185 220 0 0 0 0 0\n\
    MouseMoveEvent 185 218 0 0 0 0 0\n\
    MouseMoveEvent 185 217 0 0 0 0 0\n\
    MouseMoveEvent 185 216 0 0 0 0 0\n\
    MouseMoveEvent 184 215 0 0 0 0 0\n\
    MouseMoveEvent 184 214 0 0 0 0 0\n\
    MouseMoveEvent 184 212 0 0 0 0 0\n\
    MouseMoveEvent 184 212 0 0 0 0 0\n\
    MouseMoveEvent 184 210 0 0 0 0 0\n\
    MouseMoveEvent 184 209 0 0 0 0 0\n\
    MouseMoveEvent 183 208 0 0 0 0 0\n\
    MouseMoveEvent 183 208 0 0 0 0 0\n\
    MouseMoveEvent 183 207 0 0 0 0 0\n\
    MouseMoveEvent 183 206 0 0 0 0 0\n\
    MouseMoveEvent 183 204 0 0 0 0 0\n\
    MouseMoveEvent 183 204 0 0 0 0 0\n\
    MouseMoveEvent 183 202 0 0 0 0 0\n\
    MouseMoveEvent 183 202 0 0 0 0 0\n\
    MouseMoveEvent 183 200 0 0 0 0 0\n\
    MouseMoveEvent 183 198 0 0 0 0 0\n\
    MouseMoveEvent 183 198 0 0 0 0 0\n\
    MouseMoveEvent 183 196 0 0 0 0 0\n\
    MouseMoveEvent 183 195 0 0 0 0 0\n\
    MouseMoveEvent 183 193 0 0 0 0 0\n\
    MouseMoveEvent 183 192 0 0 0 0 0\n\
    MouseMoveEvent 183 192 0 0 0 0 0\n\
    MouseMoveEvent 183 190 0 0 0 0 0\n\
    MouseMoveEvent 183 189 0 0 0 0 0\n\
    MouseMoveEvent 183 188 0 0 0 0 0\n\
    MouseMoveEvent 183 188 0 0 0 0 0\n\
    MouseMoveEvent 182 186 0 0 0 0 0\n\
    MouseMoveEvent 182 185 0 0 0 0 0\n\
    MouseMoveEvent 182 184 0 0 0 0 0\n\
    MouseMoveEvent 182 183 0 0 0 0 0\n\
    MouseMoveEvent 182 182 0 0 0 0 0\n\
    MouseMoveEvent 181 182 0 0 0 0 0\n\
    MouseMoveEvent 181 181 0 0 0 0 0\n\
    MouseMoveEvent 181 180 0 0 0 0 0\n\
    MouseMoveEvent 181 180 0 0 0 0 0\n\
    MouseMoveEvent 181 179 0 0 0 0 0\n\
    MouseMoveEvent 181 178 0 0 0 0 0\n\
    MouseMoveEvent 181 178 0 0 0 0 0\n\
    MouseMoveEvent 181 176 0 0 0 0 0\n\
    MouseMoveEvent 181 175 0 0 0 0 0\n\
    MouseMoveEvent 181 174 0 0 0 0 0\n\
    MouseMoveEvent 181 172 0 0 0 0 0\n\
    MouseMoveEvent 181 172 0 0 0 0 0\n\
    MouseMoveEvent 181 170 0 0 0 0 0\n\
    MouseMoveEvent 181 170 0 0 0 0 0\n\
    MouseMoveEvent 181 168 0 0 0 0 0\n\
    MouseMoveEvent 181 168 0 0 0 0 0\n\
    MouseMoveEvent 181 167 0 0 0 0 0\n\
    MouseMoveEvent 181 166 0 0 0 0 0\n\
    MouseMoveEvent 181 165 0 0 0 0 0\n\
    MouseMoveEvent 181 164 0 0 0 0 0\n\
    MouseMoveEvent 181 163 0 0 0 0 0\n\
    MouseMoveEvent 181 162 0 0 0 0 0\n\
    MouseMoveEvent 181 160 0 0 0 0 0\n\
    MouseMoveEvent 181 159 0 0 0 0 0\n\
    MouseMoveEvent 181 158 0 0 0 0 0\n\
    MouseMoveEvent 181 158 0 0 0 0 0\n\
    MouseMoveEvent 180 157 0 0 0 0 0\n\
    MouseMoveEvent 180 156 0 0 0 0 0\n\
    MouseMoveEvent 180 156 0 0 0 0 0\n\
    MouseMoveEvent 180 155 0 0 0 0 0\n\
    MouseMoveEvent 180 154 0 0 0 0 0\n\
    MouseMoveEvent 179 154 0 0 0 0 0\n\
    MouseMoveEvent 177 154 0 0 0 0 0\n\
    MouseMoveEvent 173 154 0 0 0 0 0\n\
    MouseMoveEvent 169 154 0 0 0 0 0\n\
    MouseMoveEvent 166 154 0 0 0 0 0\n\
    MouseMoveEvent 163 154 0 0 0 0 0\n\
    MouseMoveEvent 159 154 0 0 0 0 0\n\
    MouseMoveEvent 155 154 0 0 0 0 0\n\
    MouseMoveEvent 152 154 0 0 0 0 0\n\
    MouseMoveEvent 148 154 0 0 0 0 0\n\
    MouseMoveEvent 145 155 0 0 0 0 0\n\
    MouseMoveEvent 141 155 0 0 0 0 0\n\
    MouseMoveEvent 137 156 0 0 0 0 0\n\
    MouseMoveEvent 135 156 0 0 0 0 0\n\
    MouseMoveEvent 132 156 0 0 0 0 0\n\
    MouseMoveEvent 130 156 0 0 0 0 0\n\
    MouseMoveEvent 129 156 0 0 0 0 0\n\
    MouseMoveEvent 128 156 0 0 0 0 0\n\
    MouseMoveEvent 127 156 0 0 0 0 0\n\
    MouseMoveEvent 126 156 0 0 0 0 0\n\
    MouseMoveEvent 125 156 0 0 0 0 0\n\
    MouseMoveEvent 123 157 0 0 0 0 0\n\
    MouseMoveEvent 123 157 0 0 0 0 0\n\
    MouseMoveEvent 121 157 0 0 0 0 0\n\
    MouseMoveEvent 121 157 0 0 0 0 0\n\
    MouseMoveEvent 119 158 0 0 0 0 0\n\
    MouseMoveEvent 119 158 0 0 0 0 0\n\
    MouseMoveEvent 118 158 0 0 0 0 0\n\
    MouseMoveEvent 117 158 0 0 0 0 0\n\
    MouseMoveEvent 117 158 0 0 0 0 0\n\
    MouseMoveEvent 116 158 0 0 0 0 0\n\
    MouseMoveEvent 115 158 0 0 0 0 0\n\
    MouseMoveEvent 114 158 0 0 0 0 0\n\
    MouseMoveEvent 113 158 0 0 0 0 0\n\
    MouseMoveEvent 111 158 0 0 0 0 0\n\
    MouseMoveEvent 110 158 0 0 0 0 0\n\
    MouseMoveEvent 109 158 0 0 0 0 0\n\
    MouseMoveEvent 107 158 0 0 0 0 0\n\
    MouseMoveEvent 106 158 0 0 0 0 0\n\
    MouseMoveEvent 105 158 0 0 0 0 0\n\
    MouseMoveEvent 103 158 0 0 0 0 0\n\
    MouseMoveEvent 103 158 0 0 0 0 0\n\
    MouseMoveEvent 102 158 0 0 0 0 0\n\
    MouseMoveEvent 101 158 0 0 0 0 0\n\
    MouseMoveEvent 101 158 0 0 0 0 0\n\
    MouseMoveEvent 100 158 0 0 0 0 0\n\
    MouseMoveEvent 99 158 0 0 0 0 0\n\
    MouseMoveEvent 99 158 0 0 0 0 0\n\
    MouseMoveEvent 98 158 0 0 0 0 0\n\
    MouseMoveEvent 97 158 0 0 0 0 0\n\
    MouseMoveEvent 97 158 0 0 0 0 0\n\
    MouseMoveEvent 97 159 0 0 0 0 0\n\
    MouseMoveEvent 97 160 0 0 0 0 0\n\
    MouseMoveEvent 96 161 0 0 0 0 0\n\
    MouseMoveEvent 96 162 0 0 0 0 0\n\
    MouseMoveEvent 96 163 0 0 0 0 0\n\
    MouseMoveEvent 96 164 0 0 0 0 0\n\
    MouseMoveEvent 96 165 0 0 0 0 0\n\
    MouseMoveEvent 96 166 0 0 0 0 0\n\
    MouseMoveEvent 96 167 0 0 0 0 0\n\
    MouseMoveEvent 96 168 0 0 0 0 0\n\
    MouseMoveEvent 96 168 0 0 0 0 0\n\
    MouseMoveEvent 96 170 0 0 0 0 0\n\
    MouseMoveEvent 96 170 0 0 0 0 0\n\
    MouseMoveEvent 96 171 0 0 0 0 0\n\
    MouseMoveEvent 97 171 0 0 0 0 0\n\
    MouseMoveEvent 97 172 0 0 0 0 0\n\
    MouseMoveEvent 97 172 0 0 0 0 0\n\
    MouseMoveEvent 98 173 0 0 0 0 0\n\
    MouseMoveEvent 99 174 0 0 0 0 0\n\
    MouseMoveEvent 99 174 0 0 0 0 0\n\
    MouseMoveEvent 99 175 0 0 0 0 0\n\
    MouseMoveEvent 100 176 0 0 0 0 0\n\
    MouseMoveEvent 100 176 0 0 0 0 0\n\
    MouseMoveEvent 101 177 0 0 0 0 0\n\
    MouseMoveEvent 101 178 0 0 0 0 0\n\
    MouseMoveEvent 103 179 0 0 0 0 0\n\
    MouseMoveEvent 103 180 0 0 0 0 0\n\
    MouseMoveEvent 103 180 0 0 0 0 0\n\
    MouseMoveEvent 104 181 0 0 0 0 0\n\
    MouseMoveEvent 105 182 0 0 0 0 0\n\
    MouseMoveEvent 105 183 0 0 0 0 0\n\
    MouseMoveEvent 105 184 0 0 0 0 0\n\
    MouseMoveEvent 106 185 0 0 0 0 0\n\
    MouseMoveEvent 107 186 0 0 0 0 0\n\
    MouseMoveEvent 107 187 0 0 0 0 0\n\
    MouseMoveEvent 108 188 0 0 0 0 0\n\
    MouseMoveEvent 108 188 0 0 0 0 0\n\
    MouseMoveEvent 108 189 0 0 0 0 0\n\
    MouseMoveEvent 108 190 0 0 0 0 0\n\
    MouseMoveEvent 109 190 0 0 0 0 0\n\
    MouseMoveEvent 109 190 0 0 0 0 0\n\
    MouseMoveEvent 110 192 0 0 0 0 0\n\
    MouseMoveEvent 110 192 0 0 0 0 0\n\
    MouseMoveEvent 111 194 0 0 0 0 0\n\
    MouseMoveEvent 111 195 0 0 0 0 0\n\
    MouseMoveEvent 111 196 0 0 0 0 0\n\
    MouseMoveEvent 112 198 0 0 0 0 0\n\
    MouseMoveEvent 112 198 0 0 0 0 0\n\
    MouseMoveEvent 113 199 0 0 0 0 0\n\
    MouseMoveEvent 113 200 0 0 0 0 0\n\
    MouseMoveEvent 113 201 0 0 0 0 0\n\
    MouseMoveEvent 113 202 0 0 0 0 0\n\
    MouseMoveEvent 113 202 0 0 0 0 0\n\
    MouseMoveEvent 114 203 0 0 0 0 0\n\
    MouseMoveEvent 114 204 0 0 0 0 0\n\
    MouseMoveEvent 114 204 0 0 0 0 0\n\
    MouseMoveEvent 114 205 0 0 0 0 0\n\
    MouseMoveEvent 114 206 0 0 0 0 0\n\
    MouseMoveEvent 114 206 0 0 0 0 0\n\
    MouseMoveEvent 114 207 0 0 0 0 0\n\
    MouseMoveEvent 114 208 0 0 0 0 0\n\
    MouseMoveEvent 114 210 0 0 0 0 0\n\
    RightButtonReleaseEvent 114 210 0 0 0 0 0\n\
"

# Now define a script to build a pipeline
# Start by loading some data.
#
dem = vtk.vtkDEMReader()
dem.SetFileName(VTK_DATA_ROOT + "/Data/SainteHelens.dem")
dem.Update()

Scale = 2
lut = vtk.vtkLookupTable()
lut.SetHueRange(0.6, 0)
lut.SetSaturationRange(1.0, 0)
lut.SetValueRange(0.5, 1.0)
lo = Scale * dem.GetElevationBounds()[0]
hi = Scale * dem.GetElevationBounds()[1]

shrink = vtk.vtkImageShrink3D()
shrink.SetShrinkFactors(4, 4, 1)
shrink.SetInputConnection(dem.GetOutputPort())
shrink.AveragingOn()

geom = vtk.vtkImageDataGeometryFilter()
geom.SetInputConnection(shrink.GetOutputPort())
geom.ReleaseDataFlagOn()

warp = vtk.vtkWarpScalar()
warp.SetInputConnection(geom.GetOutputPort())
warp.SetNormal(0, 0, 1)
warp.UseNormalOn()
warp.SetScaleFactor(Scale)
warp.ReleaseDataFlagOn()

elevation = vtk.vtkElevationFilter()
elevation.SetInputConnection(warp.GetOutputPort())
elevation.SetLowPoint(0, 0, lo)
elevation.SetHighPoint(0, 0, hi)
elevation.SetScalarRange(lo, hi)
elevation.ReleaseDataFlagOn()

normals = vtk.vtkPolyDataNormals()
normals.SetInputConnection(elevation.GetOutputPort())
normals.SetFeatureAngle(60)
normals.ConsistencyOff()
normals.SplittingOff()
normals.ReleaseDataFlagOn()
normals.Update()

demMapper = vtk.vtkPolyDataMapper()
demMapper.SetInputConnection(normals.GetOutputPort())
demMapper.SetScalarRange(lo, hi)
demMapper.SetLookupTable(lut)

demActor = vtk.vtkActor()
demActor.SetMapper(demMapper)

# Create the RenderWindow, Renderer and both Actors
#
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.SetMultiSamples(0)
renWin.AddRenderer(ren)
iRen = vtk.vtkRenderWindowInteractor()
iRen.SetRenderWindow(renWin)
iRen.LightFollowCameraOff()

recorder = vtk.vtkInteractorEventRecorder()
recorder.SetInteractor(iRen)
#recorder.SetFileName("c:/d/VTK/record.log")
#recorder.Record()
recorder.ReadFromInputStringOn()
recorder.SetInputString(Recording)

# Add the actors to the renderer, set the background and size
#
ren.AddActor(demActor)
ren.SetBackground(1, 1, 1)
renWin.SetSize(300, 300)
ren.SetBackground(0.1, 0.2, 0.4)

cam1 = ren.GetActiveCamera()
cam1.SetViewUp(0, 0, 1)
cam1.SetFocalPoint(dem.GetOutput().GetCenter())
cam1.SetPosition(1, 0, 0)
ren.ResetCamera()
cam1.Elevation(25)
cam1.Azimuth(125)
cam1.Zoom(1.25)

# This is where the bindings are set up

# The callback stubs are defined here.  The callback takes two arguments.
# The first being the object that generates the event and the second argument
# the event name (which is a string).

def leftDown(widget, event_string):
    global left
    left = 1
def leftUp(widget, event_string):
    global left
    left = 0

def middleDown(widget, event_string):
    global middle
    middle = 1
def middleUp(widget, event_string):
    global middle
    middle = 0

def rightDown(widget, event_string):
    global right
    right = 1
def rightUp(widget, event_string):
    global right
    right = 0

def wheelForward(widget, event_string):
    mouseWheelForward(iRen,ren)
def wheelBackward(widget, event_string):
    mouseWheelBackward(iRen,ren)

def mouseMove(widget, event_string):
    global left, middle, right
    if left == 1:
        mouseLeftMove(iRen,ren)
    if middle == 1:
        mouseMiddleMove(iRen,ren)
    if right == 1:
        mouseRightMove(iRen,ren)
    if ( (left == 0) and (middle == 0) and (right == 0) ) :
        pass

# This is where the interaction style is defined
style = vtk.vtkInteractorStyleUser()
iRen.SetInteractorStyle(style)

style.AddObserver("LeftButtonPressEvent", leftDown)
style.AddObserver("LeftButtonReleaseEvent", leftUp)
style.AddObserver("MiddleButtonPressEvent", middleDown)
style.AddObserver("MiddleButtonReleaseEvent", middleUp)
style.AddObserver("RightButtonPressEvent", rightDown)
style.AddObserver("RightButtonReleaseEvent", rightUp)
style.AddObserver("MouseWheelForwardEvent", wheelForward)
style.AddObserver("MouseWheelBackwardEvent", wheelBackward)
style.AddObserver("MouseMoveEvent", mouseMove)

iRen.Initialize()
renWin.Render()

# render the image
renWin.Render()
recorder.Play()

#iRen.Start()
