from vtk import *
import sys
import os
import time

myProcId = 0
numProcs = 1

compManager = vtkCompositeManager()
if compManager.GetController():
    myProcId = compManager.GetController().GetLocalProcessId()
    numProcs = compManager.GetController().GetNumberOfProcesses()

try:
    v = vtkMesaRenderer()
    if myProcId > 0:
        _graphics_fact=vtkGraphicsFactory()
        _graphics_fact.SetUseMesaClasses(1)
        del _graphics_fact
    del v
except Exception, (bar):
    print "No mesa", bar
    


#print "I am process: %d / %d" % (myProcId, numProcs)

# create a rendering window and renderer
ren = vtkRenderer()
renWin = vtkRenderWindow()
renWin.AddRenderer(ren)
renWin.SetSize(300,300)

if myProcId:
    renWin.OffScreenRenderingOn()


# create an actor and give it cone geometry
cone = vtkConeSource()
cone.SetResolution(8)
coneMapper = vtkPolyDataMapper()
coneMapper.SetInput(cone.GetOutput())
coneActor = vtkActor()
coneActor.SetMapper(coneMapper)

# assign our actor to the renderer
ren.AddActor(coneActor)

renWin.SetWindowName("I am node %d" % myProcId)

if numProcs > 1:
    compManager.SetRenderWindow(renWin)
    compManager.InitializePieces()

#print "Pid of process %d is %d" % (myProcId, os.getpid())

def ExitMaster(a, b):
    #print "ExitMaster; I am %d / %d" % ( myProcId, numProcs )
    if numProcs > 1 and myProcId == 0:
        #print "Trigger exit RMI on all satellite nodes"
        for a in range(1, numProcs):
            #print "Trigger exit in satellite node %d" % a
            compManager.GetController().TriggerRMI(a, 239954)

if myProcId == 0:
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)
    iren.AddObserver("ExitEvent", ExitMaster)
    iren.Start()
    #renWin.Render()
    #renWin.Render()
    #renWin.Render()
else:
    compManager.InitializeRMIs()
    compManager.GetController().ProcessRMIs()
    compManager.GetController().Finalize()
    #print "**********************************"
    #print "Done on the slave node"
    #print "**********************************"
    sys.exit()

ExitMaster(0, 0)

#time.sleep(5)

