"""Demo a complex workflow of a rendering with a series of subsequent actions:
- Render a CG render out of Maya
- Check the resulting images for potential defects caused by potential server glitches
- Register the CG render in the database
- Create and render a slap comp
- Convert the rendered slapcomp to a quicktime
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Rendering |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| +-----Rendering-----+ +--------Rendering---------+ +-------Rendering--------+ +------Rendering-------+ +--------Rendering--------+ +-------Rendering-------+ +--------default--------+ |
| | CreateCamera | | MayaSceneGeneration | | HoudiniRender0-10 | | CheckImages0-10 | | CreateSlapComp | | NukeRender0-10 | | Quicktime | |
| |-------------------| |--------------------------| |------------------------| |----------------------| |-------------------------| |-----------------------| |-----------------------| |
| | camera_file<> o--------->o camera_file<> | o frames<range(0...> | +--->o images<> | % images<> | o frames<range(0...> | % images<> | |
| +-------------------+ | scene_file<> o--------->o scene_file<> | | | images<> o---------->o images.0<> | +--->o scene_file<> | +--->o images.0<> | |
| +--------------------------+ | | renderings<> o------+ +----------------------+ |--->o images.10<> | | | renderings<> o-----+--->o images.10<> | |
| | +------------------------+ +-------Rendering-------+ +--->o images.20<> | | +-----------------------+ +--->o images.20<> | |
| | +--------Rendering--------+ | CheckImages10-20 | | o template<nuke_te...> | | +-------Rendering-------+ | | quicktime<> o |
| | | HoudiniRender10-20 | |-----------------------| | | slapcomp<> o-----+ | NukeRender10-20 | | +-----------------------+ |
| | |-------------------------| +--->o images<> | | +-------------------------+ | |-----------------------| | |
| | o frames<range(1...> | | | images<> o-----| +-------Rendering-------+ | o frames<range(1...> | | |
| +--->o scene_file<> | | +-----------------------+ | | UpdateDatabase | +--->o scene_file<> | | |
| | | renderings<> o-----+ +-------Rendering-------+ | |-----------------------| | | renderings<> o-----| |
| | +-------------------------+ | CheckImages20-30 | | o id_<123456> | | +-----------------------+ | |
| | +--------Rendering--------+ |-----------------------| | % images<> | | +-------Rendering-------+ | |
| | | HoudiniRender20-30 | +--->o images<> | |--->o images.0<> | | | NukeRender20-30 | | |
| | |-------------------------| | | images<> o-----+--->o images.10<> | | |-----------------------| | |
| | o frames<range(2...> | | +-----------------------+ +--->o images.20<> | | o frames<range(2...> | | |
| +--->o scene_file<> | | | status<> o +--->o scene_file<> | | |
| | renderings<> o-----+ +-----------------------+ | renderings<> o-----+ |
| +-------------------------+ +-----------------------+ |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
"""
from flowpipe import Graph, Node
@Node(outputs=["camera_file"], metadata={"interpreter": "3dequalizer"})
def CreateCamera():
"""Creates a shot camera."""
return {"camera_file": "/abs/camera.abc"}
@Node(outputs=["scene_file"], metadata={"interpreter": "maya"})
def MayaSceneGeneration(camera_file):
"""Creates a Maya scene file for rendering."""
return {"scene_file": "/usd/scene.usd"}
@Node(outputs=["renderings"], metadata={"interpreter": "houdini"})
def HoudiniRender(frames, scene_file):
"""Creates a Houdini scene file for rendering."""
return {"renderings": "/renderings/file.%04d.exr"}
@Node(outputs=["images"])
def CheckImages(images):
"""Check if the images are valid and return them."""
return {"images": images}
@Node(outputs=["slapcomp"], metadata={"interpreter": "nuke"})
def CreateSlapComp(images, template):
"""Create a nuke slapcomp scene file from the given images and template."""
return {"slapcomp": "slapcomp.nk"}
@Node(outputs=["renderings"], metadata={"interpreter": "nuke"})
def NukeRender(frames, scene_file):
"""Renders the slapcomp scene file using Nuke."""
return {"renderings": "/renderings/file.%04d.exr"}
@Node(outputs=["quicktime"])
def Quicktime(images):
"""Create a quicktime movie from the rendered images."""
return {"quicktime": "resulting.mov"}
@Node(outputs=["status"])
def UpdateDatabase(id_, images):
"""Update the database entries of the given asset with the given data."""
return {"status": True}
def complex_cg_render(frames, batch_size):
graph = Graph(name="Rendering")
slapcomp = CreateSlapComp(graph=graph, template="nuke_template.nk")
update_database = UpdateDatabase(graph=graph, id_=123456)
camera_creation = CreateCamera(graph=graph)
scene_creation = MayaSceneGeneration(graph=graph)
camera_creation.outputs["camera_file"].connect(
scene_creation.inputs["camera_file"]
)
for i in range(0, frames, batch_size):
houdini_render = HoudiniRender(
name="HoudiniRender{0}-{1}".format(i, i + batch_size),
graph=graph,
frames=range(i, i + batch_size),
scene_file="/scene/for/rendering.ma",
)
scene_creation.outputs["scene_file"].connect(
houdini_render.inputs["scene_file"]
)
check_images = CheckImages(
name="CheckImages{0}-{1}".format(i, i + batch_size), graph=graph
)
houdini_render.outputs["renderings"].connect(
check_images.inputs["images"]
)
check_images.outputs["images"].connect(
slapcomp.inputs["images"][str(i)]
)
check_images.outputs["images"].connect(
update_database.inputs["images"][str(i)]
)
quicktime = Quicktime()
for i in range(0, frames, batch_size):
nuke_render = NukeRender(
name="NukeRender{0}-{1}".format(i, i + batch_size),
graph=graph,
frames=range(i, i + batch_size),
)
slapcomp.outputs["slapcomp"].connect(nuke_render.inputs["scene_file"])
nuke_render.outputs["renderings"].connect(
quicktime.inputs["images"][str(i)]
)
print(graph)
if __name__ == "__main__":
complex_cg_render(30, 10)