From 3b6c2b4fb6198057f2895b6bf2f0e410456187a5 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 29 Apr 2026 15:15:07 +0530 Subject: [PATCH] Added support for Hunyan 3D --- modules/threeDInference.py | 14 +++++- modules/threeDInferenceInputs.py | 4 +- modules/threeDInferenceSettings.py | 45 +++++++++++++++++++ ...nware_3D_inference_Tencent_Hunyuan_3D.json | 1 + 4 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 workflows/Runware_3D_inference_Tencent_Hunyuan_3D.json diff --git a/modules/threeDInference.py b/modules/threeDInference.py index 88f1ec7..411b5e2 100644 --- a/modules/threeDInference.py +++ b/modules/threeDInference.py @@ -7,6 +7,8 @@ class threeDInference: # Available 3D models THREED_MODELS = { + "Tencent Hunyuan 3D 3.1 Pro": "tencent:hunyuan-3d@3.1-pro", + "Tencent Hunyuan 3D 3.1 Rapid": "tencent:hunyuan-3d@3.1-rapid", "Meta SAM 3D": "meta:sam@3d", "TRELLIS.2": "microsoft:trellis-2@4b", "Tripo 3D v3.1": "tripo:v3.1@0", @@ -16,7 +18,7 @@ class threeDInference: } # Output formats - OUTPUT_FORMATS = ["GLB", "PLY", "FBX"] + OUTPUT_FORMATS = ["GLB", "FBX", "PLY", "OBJ"] @classmethod def INPUT_TYPES(cls): @@ -31,6 +33,11 @@ class threeDInference: "placeholder": "Describe the 3D object you want to generate...", "tooltip": "A text prompt describing the 3D object to generate." }), + "negativePrompt": ("STRING", { + "multiline": True, + "placeholder": "Describe what to avoid in the 3D output...", + "tooltip": "A negative text prompt describing attributes to avoid in the generated 3D object." + }), "useSeed": ("BOOLEAN", { "tooltip": "Include seed in the API request. Turn off if the model should not receive a seed.", "default": True, @@ -77,6 +84,7 @@ class threeDInference: """Generate 3D model from inputs""" modelName = kwargs.get("Model", "Meta SAM 3D") positivePrompt = kwargs.get("positivePrompt", "") + negativePrompt = kwargs.get("negativePrompt", "") seed = kwargs.get("seed", 1) use_seed = kwargs.get("useSeed", True) outputFormat = kwargs.get("outputFormat", "GLB") @@ -106,6 +114,10 @@ class threeDInference: if positivePrompt and positivePrompt.strip() != "": genConfig[0]["positivePrompt"] = positivePrompt.strip() + # Add negativePrompt if provided + if negativePrompt and negativePrompt.strip() != "": + genConfig[0]["negativePrompt"] = negativePrompt.strip() + if use_seed: genConfig[0]["seed"] = seed diff --git a/modules/threeDInferenceInputs.py b/modules/threeDInferenceInputs.py index 46236b1..6808353 100644 --- a/modules/threeDInferenceInputs.py +++ b/modules/threeDInferenceInputs.py @@ -1,6 +1,6 @@ from .utils import runwareUtils as rwUtils -_IMAGE_SLOTS = 4 +_IMAGE_SLOTS = 8 class threeDInferenceInputs: @@ -30,7 +30,7 @@ class threeDInferenceInputs: } DESCRIPTION = ( - "Configure custom inputs for Runware 3D Inference: image, mask, meshFile, and images_1…images_4 " + "Configure custom inputs for Runware 3D Inference: image, mask, meshFile, and images_1…images_8 " "(merged into inputs.images as an array)." ) FUNCTION = "createInputs" diff --git a/modules/threeDInferenceSettings.py b/modules/threeDInferenceSettings.py index 00aa80f..52414d9 100644 --- a/modules/threeDInferenceSettings.py +++ b/modules/threeDInferenceSettings.py @@ -388,6 +388,43 @@ class Runware3DInferenceSettings: "texSlat": ("RUNWARE3DINFERENCESETTINGSLAT", { "tooltip": "Connect Runware 3D Inference Settings Tex Slat node.", }), + "useFaceCount": ("BOOLEAN", { + "tooltip": "Enable to include faceCount in settings (Tencent Hunyuan Pro).", + "default": False, + }), + "faceCount": ("INT", { + "tooltip": "Target number of mesh faces for Hunyuan Pro (3000-1500000).", + "default": 500000, + "min": 3000, + "max": 1500000, + "step": 1000, + }), + "useGenerateType": ("BOOLEAN", { + "tooltip": "Enable to include generateType in settings (Tencent Hunyuan Pro).", + "default": False, + }), + "generateType": (["Normal", "Geometry"], { + "tooltip": "Hunyuan Pro generation mode: Normal or Geometry.", + "default": "Normal", + }), + "usePolygonType": ("BOOLEAN", { + "tooltip": "Enable to include polygonType in settings (Tencent Hunyuan Pro).", + "default": False, + }), + "polygonType": (["triangle", "quadrilateral"], { + "tooltip": "Polygon type for low-poly style output. For Hunyuan 3.1, lowpoly mode is not supported by provider.", + "default": "triangle", + }), + "useGeometryOnly": ("BOOLEAN", { + "tooltip": "Enable to include geometryOnly in settings (Tencent Hunyuan Rapid).", + "default": False, + }), + "geometryOnly": ("BOOLEAN", { + "tooltip": "Rapid-only: texture-free white model generation.", + "default": False, + "label_on": "true", + "label_off": "false", + }), } } @@ -422,6 +459,14 @@ class Runware3DInferenceSettings: settings["texture"] = bool(kwargs.get("texture", True)) if kwargs.get("usePbr", False): settings["pbr"] = bool(kwargs.get("pbr", True)) + if kwargs.get("useFaceCount", False): + settings["faceCount"] = int(kwargs.get("faceCount", 500000)) + if kwargs.get("useGenerateType", False): + settings["generateType"] = kwargs.get("generateType", "Normal") + if kwargs.get("usePolygonType", False): + settings["polygonType"] = kwargs.get("polygonType", "triangle") + if kwargs.get("useGeometryOnly", False): + settings["geometryOnly"] = bool(kwargs.get("geometryOnly", False)) if kwargs.get("useTextureSeed", False): settings["textureSeed"] = int(kwargs.get("textureSeed", 1)) if kwargs.get("useTextureAlignment", False): diff --git a/workflows/Runware_3D_inference_Tencent_Hunyuan_3D.json b/workflows/Runware_3D_inference_Tencent_Hunyuan_3D.json new file mode 100644 index 0000000..ef0313e --- /dev/null +++ b/workflows/Runware_3D_inference_Tencent_Hunyuan_3D.json @@ -0,0 +1 @@ +{"id":"9c7846cc-28e4-4e47-9afd-a0afd8aa946e","revision":0,"last_node_id":4,"last_link_id":3,"nodes":[{"id":4,"type":"LoadImage","pos":[-262.55990081701316,-173.49336151906746],"size":[282.798828125,314],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[2]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.19.3","Node name for S&R":"LoadImage"},"widgets_values":[".webp","image"]},{"id":1,"type":"Runware 3D Inference","pos":[410.20945011776087,-170.0173422261238],"size":[400,330],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWARE3DINFERENCEINPUTS","link":3},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWARE3DINFERENCESETTINGS","link":null},{"localized_name":"Model","name":"Model","type":"COMBO","widget":{"name":"Model"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","type":"STRING","widget":{"name":"negativePrompt"},"link":null},{"localized_name":"useSeed","name":"useSeed","type":"BOOLEAN","widget":{"name":"useSeed"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"useOutputQuality","name":"useOutputQuality","shape":7,"type":"BOOLEAN","widget":{"name":"useOutputQuality"},"link":null},{"localized_name":"outputQuality","name":"outputQuality","shape":7,"type":"INT","widget":{"name":"outputQuality"},"link":null}],"outputs":[{"localized_name":"3dObject","name":"3dObject","type":"STRING","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"4f974312a40d669210eee8bbec40c15a9d664eb8","Node name for S&R":"Runware 3D Inference"},"widgets_values":["Tencent Hunyuan 3D 3.1 Pro","","",false,2026520027,"randomize","GLB",false,95],"bgcolor":"#5345bf"},{"id":3,"type":"Runware 3D Inference Inputs","pos":[81.77888705546957,-123.22973560217876],"size":[291.853125,238],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":null},{"localized_name":"mask","name":"mask","shape":7,"type":"IMAGE","link":null},{"localized_name":"images_1","name":"images_1","shape":7,"type":"IMAGE","link":2},{"localized_name":"images_2","name":"images_2","shape":7,"type":"IMAGE","link":null},{"localized_name":"images_3","name":"images_3","shape":7,"type":"IMAGE","link":null},{"localized_name":"images_4","name":"images_4","shape":7,"type":"IMAGE","link":null},{"localized_name":"images_5","name":"images_5","shape":7,"type":"IMAGE","link":null},{"localized_name":"images_6","name":"images_6","shape":7,"type":"IMAGE","link":null},{"localized_name":"images_7","name":"images_7","shape":7,"type":"IMAGE","link":null},{"localized_name":"images_8","name":"images_8","shape":7,"type":"IMAGE","link":null},{"localized_name":"meshFile","name":"meshFile","shape":7,"type":"STRING","widget":{"name":"meshFile"},"link":null}],"outputs":[{"localized_name":"Inputs","name":"Inputs","type":"RUNWARE3DINFERENCEINPUTS","links":[3]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"4f974312a40d669210eee8bbec40c15a9d664eb8","Node name for S&R":"Runware 3D Inference Inputs"},"widgets_values":[""],"bgcolor":"#5345bf"},{"id":2,"type":"Runware Save 3D","pos":[874.6227690216073,-163.10399773255116],"size":[270,106],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"3dObject","name":"3dObject","type":"STRING","widget":{"name":"3dObject"},"link":1},{"localized_name":"filenamePrefix","name":"filenamePrefix","type":"STRING","widget":{"name":"filenamePrefix"},"link":null},{"localized_name":"filepath","name":"filepath","shape":7,"type":"STRING","widget":{"name":"filepath"},"link":null}],"outputs":[{"localized_name":"filepath","name":"filepath","type":"STRING","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"4f974312a40d669210eee8bbec40c15a9d664eb8","Node name for S&R":"Runware Save 3D"},"widgets_values":["","ComfyUI",""],"bgcolor":"#5345bf"}],"links":[[1,1,0,2,0,"STRING"],[2,4,0,3,2,"IMAGE"],[3,3,0,1,0,"RUNWARE3DINFERENCEINPUTS"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6057126191083312,"offset":[487.1679059599401,535.6289486296486]}},"version":0.4} \ No newline at end of file