Skip to content

Houdini

The Houdini adapter (fxqintegrations.houdini) publishes ROP output to fxquinox and loads versions back. hou is imported lazily, so the module loads anywhere - the host-touching functions only run inside Houdini.

Publishing a ROP

from fxqclient import Session
from fxqintegrations import houdini

fxq = Session("http://localhost:8000", api_key="fxq_...")

houdini.publish_rop(
    fxq,
    task_id="...",
    rop_path="/out/mantra1",
    product="beautyMain",
    comment="lighting v2",
)

The adapter reads the ROP's output from the Houdini scene, then delegates to the shared publish contract to create the Product → Version → Representation chain. Pass inputs to record the upstream versions this render consumed.

Loading a version

Use the core resolve_for_load(version_id) to get a version's files and bring them into the scene (for example as a file SOP or a reference).

The adapter also registers a universal loader entry so the host-agnostic loader can place files without knowing it's Houdini:

@loader.register_loader("houdini_file", product_types=["geometry", "render", "pointcache"])
def load_file_node(session, version_id, files, *, into="/obj"):
    ...   # build a file SOP for the given files

Keep host code thin

The adapter only gathers Houdini-specific data; everything else is the host-agnostic core, so the same publish behaves identically in Nuke and any host you add.