# Copyright 2009 Autodesk, Inc.  All rights reserved.
# Use of this software is subject to the terms of the Autodesk license agreement 
# provided at the time of installation or download, or which otherwise accompanies
# this software in either electronic or hard copy form.
#
# Script description:
# Render all layers from a scene to different files.
#
# Topic: FBPlayerControl, FBCamera, FBVideoGrabber, FBFolderPopup
#

from pyfbsdk import *
import os

# naming mask to identify render layers
lRenderPrefix = 'Render'
lformat = '.tif' # .avi, .jpg, .tga, .tif, .tiff, .yuv, .swf

# Rendering grabs zoom bar data for frame range
gApplication = FBApplication()
gSystem = FBSystem()
lControl = FBPlayerControl()
timeSpan = gSystem.CurrentTake.LocalTimeSpan
lStart = timeSpan.GetStart()
lStop = timeSpan.GetStop()
lStepFrame = 1
lFrameRate = lControl.GetTransportFpsValue()

# a function for setting render options and executing render
def RenderLayer ( pPath,pLayerName ):
    lRenderPath = "%s\%s_%s" % ( pPath,pLayerName,lformat )

    lOptions = FBVideoGrabber().GetOptions()
    lOptions.ViewingMode = FBVideoRenderViewingMode().FBViewingModeCurrent
    lOptions.TimeSpan = timeSpan
    lOptions.TimeSteps = FBTime(0, 0, 0, 1)
    lOptions.CameraResolution = FBCameraResolutionMode().kFBResolutionCustom
    lOptions.AntiAliasing = False
    lOptions.RenderAudio = False
    lOptions.FieldMode = FBVideoRenderFieldMode().FBFieldModeNoField
    lOptions.BitsPerPixel = FBVideoRenderDepth().FBVideoRender24Bits
    lOptions.ShowCameraLabel = False
    lOptions.ShowSafeArea = False
    lOptions.OutputFileName = pPath
    lOptions.ShowTimeCode = True
    lOptions.OutputFileName = lRenderPath
    gApplication.FileRender( lOptions )

#Create a dictionary of Groups visibility to recall later
lShow = {}
for lGroups in FBSystem().Scene.Groups:
    lShow[lGroups.Name]=lGroups.Show

# hide Axis and grid from renders
for lCamera in FBSystem().Scene.Cameras:
    lCamera.ViewShowAxis = False
    lCamera.ViewShowGrid = False


# select global folder for renders
lFp = FBFolderPopup()
lFp.Caption = "Select a folder to put your Rendered Layers:"

# Set the default path. Good for a PC only... will have to be different for Mac.
lFp.Path = r"C:\temp"

lRes = lFp.Execute()
# create a subfolder for render layers
if lRes:
    lfolder = FBMessageBoxGetUserValue( "Create subfolder for render layers: " , "Warning: will overwrite existing ", "MyRenderLayers", FBPopupInputType.kFBPopupString, "Ok" )

    if lfolder[0]:
        print "Creating subfolder %s" % lfolder[1]
        if not os.path.exists("%s\\%s" % ( lFp.Path,lfolder[1] )):
            os.mkdir("%s\\%s" % ( lFp.Path,lfolder[1] ))

        lFp.Path = "%s\%s" % (lFp.Path,lfolder[1])

    else:
        FBMessageBox( "Result", "Got an error", "Ok" )

    del( lfolder )

# Render each Render Layer    
    for lGroups in FBSystem().Scene.Groups:
        lGroups.Show = False
    for lGroups in FBSystem().Scene.Groups:
        if lGroups.Name.startswith( lRenderPrefix ):
            lGroups.Show = True
            print 'Rendering Layer ' + lGroups.Name.lstrip( lRenderPrefix )
            RenderLayer(lFp.Path,lGroups.Name.lstrip( lRenderPrefix ))
            print 'Done'
            lGroups.Show = False

# unhide axis and grid from scene
for lCamera in FBSystem().Scene.Cameras:
    lCamera.ViewShowAxis = True
    lCamera.ViewShowGrid = True

# reset visibility status of Groups
for lGroups in FBSystem().Scene.Groups:
    lGroups.Show = lShow[lGroups.Name]