feat: BLENDER_CINEMATIC workflow graph node (M1)
Add StepName.BLENDER_CINEMATIC and full graph runtime support so cinematic output types can be promoted from legacy_only to graph/shadow rollout mode. - process_steps.py: add BLENDER_CINEMATIC = "blender_cinematic" enum value - workflow_executor.py: map to render_cinematic_task in STEP_TASK_MAP - workflow_node_registry.py: node definition with render/scene/camera fields (no animation params — cinematic is fixed at 250 frames @ 25fps) - workflow_graph_runtime.py: _ORDER_LINE_RENDER_STEPS, _CINEMATIC_TASK_KEYS, shadow queue routing, predict_render_output_artifact (mp4), _build_task_kwargs, _artifact_kind_override_for_step - tasks.py: _normalize_cinematic_params + render_cinematic_task Celery task (calls render_cinematic_to_file, publishes as turntable asset type since mp4) No DB migration needed: admins can now manually set cinematic output types to graph rollout mode via the admin panel and assign a workflow definition. docs: learnings erfasst — BLENDER_CINEMATIC workflow graph node M1 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1019,6 +1019,165 @@ _NODE_DEFINITIONS: list[WorkflowNodeDefinition] = [
|
||||
artifact_roles_consumed=["order_line_context", "render_template", "material_assignments", "bbox"],
|
||||
artifact_roles_produced=["rendered_frames", "rendered_video"],
|
||||
),
|
||||
_definition(
|
||||
StepName.BLENDER_CINEMATIC,
|
||||
"Render Cinematic",
|
||||
"order_line",
|
||||
"render.production.cinematic",
|
||||
"rendering",
|
||||
"Render a cinematic highlight animation with Blender (250 frames @ 25 fps, procedural 4-segment camera path).",
|
||||
node_type="renderFramesNode",
|
||||
icon="film",
|
||||
defaults={"use_custom_render_settings": False},
|
||||
fields=[
|
||||
_field(
|
||||
"use_custom_render_settings",
|
||||
"Custom Render Settings",
|
||||
"boolean",
|
||||
description="Enable explicit engine, sample, and resolution overrides for Graph/Shadow mode. When disabled, authoritative output-type and template settings are inherited.",
|
||||
section="Render",
|
||||
default=False,
|
||||
),
|
||||
_field(
|
||||
"render_engine",
|
||||
"Render Engine",
|
||||
"select",
|
||||
description="Renderer backend for the cinematic render.",
|
||||
section="Render",
|
||||
default="cycles",
|
||||
options=_BLENDER_ENGINE_OPTIONS,
|
||||
),
|
||||
_field(
|
||||
"cycles_device",
|
||||
"Cycles Device",
|
||||
"select",
|
||||
description="Force CPU, GPU, or automatic device selection.",
|
||||
section="Render",
|
||||
default="gpu",
|
||||
options=_CYCLES_DEVICE_OPTIONS,
|
||||
),
|
||||
_field(
|
||||
"samples",
|
||||
"Samples",
|
||||
"number",
|
||||
description="Quality samples for each frame.",
|
||||
section="Render",
|
||||
default=128,
|
||||
min=1,
|
||||
max=4096,
|
||||
step=1,
|
||||
),
|
||||
_field("width", "Width", "number", section="Output", default=1920, min=64, max=8192, step=1, unit="px"),
|
||||
_field("height", "Height", "number", section="Output", default=1080, min=64, max=8192, step=1, unit="px"),
|
||||
_field(
|
||||
"transparent_bg",
|
||||
"Transparent Background",
|
||||
"boolean",
|
||||
description="Render with alpha output for each frame.",
|
||||
section="Output",
|
||||
default=False,
|
||||
),
|
||||
_field(
|
||||
"target_collection",
|
||||
"Target Collection",
|
||||
"text",
|
||||
description="Template collection name that receives the imported product geometry.",
|
||||
section="Scene",
|
||||
default="Product",
|
||||
),
|
||||
_field(
|
||||
"lighting_only",
|
||||
"Lighting Only",
|
||||
"boolean",
|
||||
description="Use template lighting and auto-framing without template materials.",
|
||||
section="Scene",
|
||||
default=False,
|
||||
),
|
||||
_field(
|
||||
"shadow_catcher",
|
||||
"Shadow Catcher",
|
||||
"boolean",
|
||||
description="Enable a shadow catcher plane for composited renders.",
|
||||
section="Scene",
|
||||
default=False,
|
||||
),
|
||||
_field(
|
||||
"rotation_x",
|
||||
"Rotation X",
|
||||
"number",
|
||||
description="Additional X-axis rotation in degrees.",
|
||||
section="Camera",
|
||||
default=0,
|
||||
min=-360,
|
||||
max=360,
|
||||
step=1,
|
||||
unit="deg",
|
||||
),
|
||||
_field(
|
||||
"rotation_y",
|
||||
"Rotation Y",
|
||||
"number",
|
||||
description="Additional Y-axis rotation in degrees.",
|
||||
section="Camera",
|
||||
default=0,
|
||||
min=-360,
|
||||
max=360,
|
||||
step=1,
|
||||
unit="deg",
|
||||
),
|
||||
_field(
|
||||
"rotation_z",
|
||||
"Rotation Z",
|
||||
"number",
|
||||
description="Additional Z-axis rotation in degrees.",
|
||||
section="Camera",
|
||||
default=0,
|
||||
min=-360,
|
||||
max=360,
|
||||
step=1,
|
||||
unit="deg",
|
||||
),
|
||||
_field(
|
||||
"focal_length_mm",
|
||||
"Focal Length",
|
||||
"number",
|
||||
description="Optional camera focal length override.",
|
||||
section="Camera",
|
||||
default=None,
|
||||
min=1,
|
||||
max=500,
|
||||
step=0.1,
|
||||
unit="mm",
|
||||
),
|
||||
_field(
|
||||
"sensor_width_mm",
|
||||
"Sensor Width",
|
||||
"number",
|
||||
description="Optional camera sensor width override.",
|
||||
section="Camera",
|
||||
default=None,
|
||||
min=1,
|
||||
max=100,
|
||||
step=0.1,
|
||||
unit="mm",
|
||||
),
|
||||
_field(
|
||||
"material_override",
|
||||
"Material Override",
|
||||
"text",
|
||||
description="Optional material name forced onto all parts during rendering.",
|
||||
section="Materials",
|
||||
default="",
|
||||
),
|
||||
],
|
||||
input_contract={
|
||||
"context": "order_line",
|
||||
"requires": ["order_line_context", "render_template", "material_assignments", "bbox"],
|
||||
},
|
||||
output_contract={"context": "order_line", "provides": ["rendered_video"]},
|
||||
artifact_roles_consumed=["order_line_context", "render_template", "material_assignments", "bbox"],
|
||||
artifact_roles_produced=["rendered_video"],
|
||||
),
|
||||
_definition(
|
||||
StepName.OUTPUT_SAVE,
|
||||
"Save Output",
|
||||
|
||||
Reference in New Issue
Block a user