From f29e27f8f94d79d360e60fb1505fbe3a358fb639 Mon Sep 17 00:00:00 2001 From: Terry Jia Date: Wed, 27 May 2026 17:35:30 -0400 Subject: [PATCH] feat: add model_info output to Load3D node --- comfy_api/latest/_io.py | 19 +++++++++++++++++++ comfy_extras/nodes_load_3d.py | 4 +++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/comfy_api/latest/_io.py b/comfy_api/latest/_io.py index 5ed968960..78b356525 100644 --- a/comfy_api/latest/_io.py +++ b/comfy_api/latest/_io.py @@ -770,6 +770,23 @@ class Load3DCamera(ComfyTypeIO): Type = CameraInfo +@comfytype(io_type="LOAD3D_MODEL_INFO") +class Load3DModelInfo(ComfyTypeIO): + class ModelTransform(TypedDict): + uuid: str + name: str + type: str + position: dict[str, float | int] + rotation: dict[str, float | int | str] + quaternion: dict[str, float | int] + scale: dict[str, float | int] + up: dict[str, float | int] + visible: bool + matrix: list[float] + + Type = list[ModelTransform] + + @comfytype(io_type="LOAD_3D") class Load3D(ComfyTypeIO): """3D models are stored as a dictionary.""" @@ -779,6 +796,7 @@ class Load3D(ComfyTypeIO): normal: str camera_info: Load3DCamera.CameraInfo recording: NotRequired[str] + model_info: NotRequired[list[Load3DModelInfo.ModelTransform]] Type = Model3DDict @@ -2291,6 +2309,7 @@ __all__ = [ "FlowControl", "Accumulation", "Load3DCamera", + "Load3DModelInfo", "Load3D", "Load3DAnimation", "Photomaker", diff --git a/comfy_extras/nodes_load_3d.py b/comfy_extras/nodes_load_3d.py index 9112bdd0a..b4515145a 100644 --- a/comfy_extras/nodes_load_3d.py +++ b/comfy_extras/nodes_load_3d.py @@ -47,6 +47,7 @@ class Load3D(IO.ComfyNode): IO.Load3DCamera.Output(display_name="camera_info"), IO.Video.Output(display_name="recording_video"), IO.File3DAny.Output(display_name="model_3d"), + IO.Load3DModelInfo.Output(display_name="model_info"), ], ) @@ -69,7 +70,8 @@ class Load3D(IO.ComfyNode): video = InputImpl.VideoFromFile(recording_video_path) file_3d = Types.File3D(folder_paths.get_annotated_filepath(model_file)) - return IO.NodeOutput(output_image, output_mask, model_file, normal_image, image['camera_info'], video, file_3d) + model_info = image.get('model_info', []) + return IO.NodeOutput(output_image, output_mask, model_file, normal_image, image['camera_info'], video, file_3d, model_info) process = execute # TODO: remove