From 7dd6d319e280255ed837687abf7cab3b5afb1a68 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 e430c0ecf..6b5e65799 100644 --- a/comfy_api/latest/_io.py +++ b/comfy_api/latest/_io.py @@ -777,6 +777,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.""" @@ -786,6 +803,7 @@ class Load3D(ComfyTypeIO): normal: str camera_info: Load3DCamera.CameraInfo recording: NotRequired[str] + model_info: NotRequired[list[Load3DModelInfo.ModelTransform]] Type = Model3DDict @@ -2298,6 +2316,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 9c27c0191..e27e4a87c 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"), ], ) @@ -73,7 +74,8 @@ class Load3D(IO.ComfyNode): if model_file and model_file != "none": file_3d = Types.File3D(folder_paths.get_annotated_filepath(model_file)) mesh_path = model_file - return IO.NodeOutput(output_image, output_mask, mesh_path, normal_image, image['camera_info'], video, file_3d) + model_info = image.get('model_info', []) + return IO.NodeOutput(output_image, output_mask, mesh_path, normal_image, image['camera_info'], video, file_3d, model_info) process = execute # TODO: remove