# Raptor / Chromium configuration file (Brian Paul) import sys, re sys.path.append( "/u/mhouston/work/cr/mothership/server" ) from mothership import * # Filenames, etc: DataDirectory = "/spire/raptor/" VolumeFile = DataDirectory + "middle.dat" XferFile = DataDirectory + "xfer.dat" Shaderpath = '/u/mhouston/work/cr/progs/raptor' # Hostnames of rendering nodes: RenderNodes = [ "localhost", "localhost", "localhost", "localhost" ] # How many nodes to use: NumNodes = 4 # Network protocol: Protocol = "tcpip" # Initial window size: WinWidth = 400 WinHeight = 400 # ====================================================================== # You shouldn't have to touch anything beyond this point. def GetVolumeSize(filename): """Open the named volume.dat file and extract the width, height, depth parameters and return them in a tuple.""" f = open(filename) if not f: print "Error opening %s" % filename return (0, 0, 0) volInfo = f.read() m = re.search("width:\s*(\d+)", volInfo) if m: width = int(m.group(1)) m = re.search("height:\s*(\d+)", volInfo) if m: height = int(m.group(1)) m = re.search("depth:\s*(\d+)", volInfo) if m: depth = int(m.group(1)) return (width, height, depth) def SliceVolume(volumeDims, numSlabs): """Slice the volumeDims (width, height, depth) into and return a list of the resulting subvolume tuples (x, y, z, w, h, d).""" subVolumes = [] w = volumeDims[0] h = volumeDims[1] d = volumeDims[2] sliceThickness = d / numSlabs for i in range(numSlabs): subVolumes.append( (0, 0, numSlabs/2 + i * (sliceThickness - 2), w, h, sliceThickness) ) return subVolumes def PrintSummary(numNodes, renderNodes, subVolumes): """Print summary of the subVolumes list.""" voxels = 0 for i in range(numNodes): x = subVolumes[i][0] y = subVolumes[i][1] z = subVolumes[i][2] w = subVolumes[i][3] h = subVolumes[i][4] d = subVolumes[i][5] print "Node %d: %s %d x %d x %d subvolume, starting at %d, %d, %d" % (i, renderNodes[i], w, h, d, x, y, z) voxels += w * h * d print "Total Voxels: %d (%d Megavoxels)" % (voxels, voxels / (1024*1024)) def StartCompositingConfiguration(numNodes, renderNodes, subVolumes, volumeFile, xferFile, shaderpath): assert len(subVolumes) >= numNodes assert len(renderNodes) >= numNodes # Build binaryswap peers string peers = "" for i in range(numNodes): peers += Protocol + "://" + renderNodes[i] if i != numNodes - 1: peers += "," program = os.path.join(crbindir, 'raptor') resizable = 1 # Set up the server node servernode = CRNetworkNode( ) # Note: each client has the -swap flag and we tell the server to only # do one SwapBuffers here. servernode.Conf('only_swap_once', 1) servernode.Conf('shared_windows', 1) renderspu = SPU('render') renderspu.Conf('window_geometry', [850, 000, WinWidth, WinHeight]) renderspu.Conf('resizable', resizable) renderspu.Conf('render_to_app_window', 1 ) renderspu.Conf('render_to_crut_window', 1 ) renderspu.Conf('default_visual', 'rgb, double, z, alpha') servernode.AddSPU( renderspu ) #create a crutserver crutserver = CRUTServerNode( ) crutserver.Conf('window_geometry', [900, 0, WinWidth, WinHeight] ) cr = CR() cr.MTU( 256*1024 ) # Create rendering/binary swap nodes for i in range(numNodes): subvol = subVolumes[i] appnode = CRApplicationNode( renderNodes[i] ) appnode.SetApplication('%s %s %s %s %s %s %s %s %s %s CR' % (program, volumeFile, shaderpath, xferFile, subvol[0], subvol[1], subvol[2], subvol[3], subvol[4], subvol[5])) appnode.StartDir( crbindir ) spu = SPU('binaryswap') spu.Conf('window_geometry', [0, 0, WinWidth, WinHeight]) spu.Conf('use_glxchoosevisual', 0) spu.Conf('display_string', ':0.0') spu.Conf('type', 'alpha') spu.Conf('resizable', resizable) spu.Conf('peers', peers) spu.Conf('node_number', i) spu.Conf('title', 'binary-swap SPU node %d' % i) spu.Conf('default_visual', 'rgb, double, z, alpha') appnode.AddSPU( spu ) spu = SPU('pack') spu.AddServer( servernode, Protocol ) appnode.AddSPU( spu ) appnode.AddCRUTServer( crutserver , Protocol, port=9000 ) cr.AddNode(appnode) # Note: adding nodes in the order in which they must be started! cr.AddNode( crutserver ) cr.AddNode( servernode ) cr.Go() Size = GetVolumeSize(VolumeFile) print "Volume Size: %d x %d x %d" % Size SubVolumes = SliceVolume(Size, NumNodes) PrintSummary(NumNodes, RenderNodes, SubVolumes) StartCompositingConfiguration(NumNodes, RenderNodes, SubVolumes, VolumeFile, XferFile, Shaderpath)