Prism Pipeline
Integration
Drive Prism Pipeline from a visual graph. Auto-resolve PrismCore, query assets and shots, publish product versions, manage scene files, and build full production automation workflows — all from connected nodes.
Auto-Resolved PrismCore
Vibrante-Node uses a shared-memory bootstrap so you never need to wire core between nodes. Place one prism_core_init anywhere in the graph — the engine detects it before execution begins and bootstraps PrismCore on the Qt main thread. Every prism_* node that runs after it automatically inherits the same instance.
# prism_core_init detects once at startup
# All subsequent prism_* nodes just call:
from src.utils.prism_core import resolve_prism_core
async def execute(self, inputs):
core = resolve_prism_core(inputs)
if core is None:
self.log_error("PrismCore not available.")
return {"assets": [], "exec_out": True}
assets = core.getAssets()
return {"assets": assets, "exec_out": True}Auto-bootstrap
prism_core_init triggers PrismCore.startup() on the Qt main thread before graph execution. Thread-safe via asyncio bridge.
No wiring required
resolve_prism_core() checks inputs, then a global cache, then shared memory. PrismCore is available everywhere.
Safe fallback
If core is None (no init node in graph), each node logs an error and returns an empty safe default — no crash, no silent data loss.
Example: Multi-Asset Publisher
This is a real workflow pattern from the prism_multi_asset_publisher website example. It queries all project assets, iterates over each one, resolves export paths, and publishes a new version.
async def execute(self, inputs):
core = resolve_prism_core(inputs)
if core is None:
self.log_error("PrismCore not available.")
return {"output_path": "", "exec_out": True}
entity = inputs.get("entity", {})
product_name = inputs.get("product_name", "model")
comment = inputs.get("comment", "")
try:
# Prism v2.1.0 corrected createProduct signature
result = core.createProductVersion(
entity=entity,
product=product_name,
comment=comment
)
output_path = result.get("output_path", "")
self.log_info(f"Published: {output_path}")
return {"output_path": output_path, "exec_out": True}
except Exception as e:
self.log_error(f"Prism publish failed: {e}")
return {"output_path": "", "exec_out": True}Node Catalog
62 nodes across 6 functional groups. All node IDs start with prism_ and are grouped as category: "Prism" in the node library.
Authoring Prism Nodes
node_id starts with prism_The registry rewrites core = inputs.get('core') → core = resolve_prism_core(inputs) for all matching nodes automatically.
category: "Prism"Groups the node in the library panel and enables Prism-specific icon (icons/prism_icon.png).
No core input portPrismCore is resolved automatically — never add a core port. Doing so makes the node harder to use and breaks the auto-wiring.
Guard with if core is NoneIf no prism_core_init is in the graph, core will be None. Always return a safe empty default instead of crashing.
Use list() for list outputsReturn list({...}) or [] — never return core.getAssets() directly, as it may be a generator or custom Prism iterable.
Tutorial 7: Prism Workflow
Step-by-step: core init → get assets → ForEach → get export path → log
→Deadline Integration
Submit render jobs from Prism shot workflows to Thinkbox Deadline
→Node Development
Write your own prism_* nodes following the SDK conventions
→