From dde85898864590cd10c92e86009fcbf7b74a2fe1 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Fri, 29 May 2026 23:12:40 +0530 Subject: [PATCH] Add support for Trellis 2 --- __init__.py | 2 + clientlibs/main.js | 4 +- clientlibs/types.js | 5 ++ clientlibs/utils.js | 30 +++++++ modules/threeDInferenceSettings.py | 66 ++++++++++++-- modules/threeDInferenceSettingsMeshCluster.py | 90 +++++++++++++++++++ 6 files changed, 190 insertions(+), 7 deletions(-) create mode 100644 modules/threeDInferenceSettingsMeshCluster.py diff --git a/__init__.py b/__init__.py index 368c579..fbf4130 100644 --- a/__init__.py +++ b/__init__.py @@ -119,6 +119,7 @@ from .modules.threeDInferenceSettings import Runware3DInferenceSettings from .modules.threeDInferenceSettingsSparseStructure import Runware3DInferenceSettingsSparseStructure from .modules.threeDInferenceSettingsShapeSlat import Runware3DInferenceSettingsShapeSlat from .modules.threeDInferenceSettingsTexSlat import Runware3DInferenceSettingsTexSlat +from .modules.threeDInferenceSettingsMeshCluster import Runware3DInferenceSettingsMeshCluster from .modules.save3D import RunwareSave3D from .modules.saveText import RunwareSaveText from .modules.loadMesh import RunwareLoadMesh @@ -257,6 +258,7 @@ NODE_CLASS_MAPPINGS = { "Runware 3D Inference Settings Sparse Structure": Runware3DInferenceSettingsSparseStructure, "Runware 3D Inference Settings Shape Slat": Runware3DInferenceSettingsShapeSlat, "Runware 3D Inference Settings Tex Slat": Runware3DInferenceSettingsTexSlat, + "Runware 3D Inference Settings Mesh Cluster": Runware3DInferenceSettingsMeshCluster, "Runware Save 3D": RunwareSave3D, "Runware Save Text": RunwareSaveText, "Runware Load Mesh": RunwareLoadMesh, diff --git a/clientlibs/main.js b/clientlibs/main.js index 7cb4f4c..39293f0 100644 --- a/clientlibs/main.js +++ b/clientlibs/main.js @@ -1,6 +1,6 @@ import { app } from "../../scripts/app.js"; import { api } from "../../scripts/api.js"; -import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, saveTextHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, textModelSearchFilterHandler, vectorizeModelSearchFilterHandler, vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, imageInferenceAdvancedFeaturesToggleHandler, watermarkAdvancedFeatureToggleHandler, videoInferenceSpeechInputToggleHandler, regionalPromptingRegionsToggleHandler, upscalerToggleHandler, imageUpscalerSettingsToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, textInferenceSettingsToggleHandler, videoSettingsToggleHandler, videoInferenceSettingsTtsToggleHandler, videoInferenceSettingsActiveSpeakerDetectionToggleHandler, videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler, videoInferenceSettingsSegmentsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, outpaintSettingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, imageInferenceSettingsMoodboardsToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, audioInferenceSpeechVoicesToggleHandler, referenceVideosToggleHandler } from "./utils.js"; +import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, saveTextHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, textModelSearchFilterHandler, vectorizeModelSearchFilterHandler, vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, imageInferenceAdvancedFeaturesToggleHandler, watermarkAdvancedFeatureToggleHandler, videoInferenceSpeechInputToggleHandler, regionalPromptingRegionsToggleHandler, upscalerToggleHandler, imageUpscalerSettingsToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, textInferenceSettingsToggleHandler, videoSettingsToggleHandler, videoInferenceSettingsTtsToggleHandler, videoInferenceSettingsActiveSpeakerDetectionToggleHandler, videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler, videoInferenceSettingsSegmentsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, threeDInferenceSettingsMeshClusterToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, outpaintSettingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, imageInferenceSettingsMoodboardsToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, audioInferenceSpeechVoicesToggleHandler, referenceVideosToggleHandler } from "./utils.js"; import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js"; const nodeInitList = []; @@ -176,6 +176,8 @@ app.registerExtension({ nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSSHAPESLAT || nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSTEXSLAT) { threeDInferenceSettingsLatToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSMESHCLUSTER) { + threeDInferenceSettingsMeshClusterToggleHandler(node); } if(crNodeProps.colorModeOnly === true) return; diff --git a/clientlibs/types.js b/clientlibs/types.js index e1cc897..e6c329b 100644 --- a/clientlibs/types.js +++ b/clientlibs/types.js @@ -169,6 +169,7 @@ const RUNWARE_NODE_TYPES = { THREEDINFERENCESETTINGSSPARSESTRUCTURE: "Runware 3D Inference Settings Sparse Structure", THREEDINFERENCESETTINGSSHAPESLAT: "Runware 3D Inference Settings Shape Slat", THREEDINFERENCESETTINGSTEXSLAT: "Runware 3D Inference Settings Tex Slat", + THREEDINFERENCESETTINGSMESHCLUSTER: "Runware 3D Inference Settings Mesh Cluster", SAVE3D: "Runware Save 3D", LOADMESH: "Runware Load Mesh", WATERMARKADVANCEDFEATURE: "Runware Watermark Advanced Feature", @@ -670,6 +671,10 @@ const RUNWARE_NODE_PROPS = { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, }, + [RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSMESHCLUSTER]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.SAVE3D]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, diff --git a/clientlibs/utils.js b/clientlibs/utils.js index 6de9389..0f90b98 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -2224,6 +2224,14 @@ function threeDInferenceSettingsToggleHandler(node) { ["useModeration", "moderation"], ["useSavePreRemeshedModel", "savePreRemeshedModel"], ["useTexturePrompt", "texturePrompt"], + ["useFaceCount", "faceCount"], + ["useGenerateType", "generateType"], + ["usePolygonType", "polygonType"], + ["useGeometryOnly", "geometryOnly"], + ["useRemeshBand", "remeshBand"], + ["useRemeshProject", "remeshProject"], + ["useTextureFormat", "textureFormat"], + ["useAlphaMode", "alphaMode"], ]; pairs.forEach(([useName, paramName]) => { const useW = node.widgets.find(w => w.name === useName); @@ -2260,6 +2268,27 @@ function threeDInferenceSettingsLatToggleHandler(node) { }); } +function threeDInferenceSettingsMeshClusterToggleHandler(node) { + const pairs = [ + ["useThresholdConeHalfAngleRad", "thresholdConeHalfAngleRad"], + ["useRefineIterations", "refineIterations"], + ["useGlobalIterations", "globalIterations"], + ["useSmoothStrength", "smoothStrength"], + ]; + pairs.forEach(([useName, paramName]) => { + const useW = node.widgets.find(w => w.name === useName); + const paramW = node.widgets.find(w => w.name === paramName); + if (!useW || !paramW) return; + function toggleEnabled() { + const enabled = useW.value === true; + toggleWidgetEnabled(paramW, enabled, node); + node.setDirtyCanvas(true); + } + appendWidgetCB(useW, () => setTimeout(toggleEnabled, 50)); + setTimeout(toggleEnabled, 100); + }); +} + function openaiProviderSettingsToggleHandler(openaiNode) { // Find all "use" parameter widgets for OpenAI Provider Settings (these are COMBO widgets) const useBackgroundWidget = openaiNode.widgets.find(w => w.name === "useBackground"); @@ -5043,6 +5072,7 @@ export { threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, + threeDInferenceSettingsMeshClusterToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, diff --git a/modules/threeDInferenceSettings.py b/modules/threeDInferenceSettings.py index 52414d9..7266974 100644 --- a/modules/threeDInferenceSettings.py +++ b/modules/threeDInferenceSettings.py @@ -1,9 +1,9 @@ """ Runware 3D Inference Settings Node -Main settings for 3D inference: textureSize, decimationTarget, remesh, resolution, -imageAutoFix, faceLimit, texture, pbr, Tripo mesh/texture options, material/quality, +Main settings for 3D inference: textureSize, decimationTarget, remesh, remeshBand, remeshProject, +resolution, imageAutoFix, faceLimit, texture, pbr, textureFormat, alphaMode, Tripo mesh/texture options, material/quality, polyCount, taPose, boundingBox, meshMode, addons, hdTexture, and sub-configs -sparseStructure, shapeSlat, texSlat from connected nodes. +sparseStructure, shapeSlat, texSlat, meshCluster from connected nodes. """ from typing import Dict, Any @@ -425,6 +425,47 @@ class Runware3DInferenceSettings: "label_on": "true", "label_off": "false", }), + "meshCluster": ("RUNWARE3DINFERENCESETTINGSLAT", { + "tooltip": "Connect Runware 3D Inference Settings Mesh Cluster node.", + }), + "useRemeshBand": ("BOOLEAN", { + "tooltip": "Enable to include remeshBand in settings.", + "default": False, + }), + "remeshBand": ("FLOAT", { + "tooltip": "Narrow-band width (in voxels) for dual-contouring remeshing. Must be greater than 0 when remesh is true. Only used when enabled.", + "default": 1.0, + "min": 0.0, + "max": 16.0, + "step": 0.1, + }), + "useRemeshProject": ("BOOLEAN", { + "tooltip": "Enable to include remeshProject in settings.", + "default": False, + }), + "remeshProject": ("FLOAT", { + "tooltip": "Projection factor for snapping remeshed vertices back to the original surface. Must be greater than 0 when remesh is true. Only used when enabled.", + "default": 0.0, + "min": 0.0, + "max": 1.0, + "step": 0.01, + }), + "useTextureFormat": ("BOOLEAN", { + "tooltip": "Enable to include textureFormat in settings.", + "default": False, + }), + "textureFormat": (["WEBP", "PNG"], { + "tooltip": "Texture format stored in the GLB output: WEBP or PNG. Only used when 'Use Texture Format' is enabled.", + "default": "WEBP", + }), + "useAlphaMode": ("BOOLEAN", { + "tooltip": "Enable to include alphaMode in settings.", + "default": False, + }), + "alphaMode": (["OPAQUE", "BLEND", "MASK"], { + "tooltip": "Material alpha mode. Only used when 'Use Alpha Mode' is enabled.", + "default": "OPAQUE", + }), } } @@ -433,10 +474,11 @@ class Runware3DInferenceSettings: FUNCTION = "create" CATEGORY = "Runware" DESCRIPTION = ( - "Configure Runware 3D Inference settings: textureSize, decimationTarget, remesh, resolution, imageAutoFix, faceLimit, " - "texture, pbr, textureSeed, textureAlignment, textureQuality, autoSize, orientation, quad, compress, " + "Configure Runware 3D Inference settings: textureSize, decimationTarget, remesh, remeshBand, remeshProject, " + "resolution, imageAutoFix, faceLimit, texture, pbr, textureSeed, textureAlignment, textureQuality, " + "textureFormat, alphaMode, autoSize, orientation, quad, compress, " "smartLowPoly, generateParts, exportUv, geometryQuality, originalAlpha, material, quality, polyCount, " - "taPose, boundingBox, meshMode, addons, hdTexture, and lat configs." + "taPose, boundingBox, meshMode, addons, hdTexture, lat configs, and meshCluster." ) def create(self, **kwargs) -> tuple[Dict[str, Any]]: @@ -448,6 +490,10 @@ class Runware3DInferenceSettings: settings["decimationTarget"] = int(kwargs.get("decimationTarget", 500000)) if kwargs.get("useRemesh", False): settings["remesh"] = bool(kwargs.get("remesh", True)) + if kwargs.get("useRemeshBand", False): + settings["remeshBand"] = float(kwargs.get("remeshBand", 1.0)) + if kwargs.get("useRemeshProject", False): + settings["remeshProject"] = float(kwargs.get("remeshProject", 0.0)) if kwargs.get("useResolution", False): settings["resolution"] = int(kwargs.get("resolution", 1024)) @@ -473,6 +519,10 @@ class Runware3DInferenceSettings: settings["textureAlignment"] = kwargs.get("textureAlignment", "original_image") if kwargs.get("useTextureQuality", False): settings["textureQuality"] = kwargs.get("textureQuality", "standard") + if kwargs.get("useTextureFormat", False): + settings["textureFormat"] = kwargs.get("textureFormat", "WEBP") + if kwargs.get("useAlphaMode", False): + settings["alphaMode"] = kwargs.get("alphaMode", "OPAQUE") if kwargs.get("useAutoSize", False): settings["autoSize"] = bool(kwargs.get("autoSize", False)) if kwargs.get("useOrientation", False): @@ -556,6 +606,10 @@ class Runware3DInferenceSettings: if tex is not None and isinstance(tex, dict) and len(tex) > 0: settings["texSlat"] = tex + mesh_cluster = kwargs.get("meshCluster", None) + if mesh_cluster is not None and isinstance(mesh_cluster, dict) and len(mesh_cluster) > 0: + settings["meshCluster"] = mesh_cluster + return (settings,) diff --git a/modules/threeDInferenceSettingsMeshCluster.py b/modules/threeDInferenceSettingsMeshCluster.py new file mode 100644 index 0000000..9efac65 --- /dev/null +++ b/modules/threeDInferenceSettingsMeshCluster.py @@ -0,0 +1,90 @@ +""" +Runware 3D Inference Settings Mesh Cluster Node +Outputs meshCluster config: thresholdConeHalfAngleRad, refineIterations, +globalIterations, smoothStrength +""" + +import math +from typing import Dict, Any + + +class Runware3DInferenceSettingsMeshCluster: + """Runware 3D Inference Settings Mesh Cluster Node""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "optional": { + "useThresholdConeHalfAngleRad": ("BOOLEAN", { + "tooltip": "Enable to include thresholdConeHalfAngleRad in meshCluster", + "default": False, + }), + "thresholdConeHalfAngleRad": ("FLOAT", { + "tooltip": "Cone half-angle threshold (radians) used during UV chart clustering. Only used when enabled.", + "default": math.pi / 2, + "min": 0.0, + "max": math.pi, + "step": 0.01, + }), + "useRefineIterations": ("BOOLEAN", { + "tooltip": "Enable to include refineIterations in meshCluster", + "default": False, + }), + "refineIterations": ("INT", { + "tooltip": "Local refinement iterations for chart clustering. Only used when enabled.", + "default": 0, + "min": 0, + "max": 64, + "step": 1, + }), + "useGlobalIterations": ("BOOLEAN", { + "tooltip": "Enable to include globalIterations in meshCluster", + "default": False, + }), + "globalIterations": ("INT", { + "tooltip": "Global iterations for chart clustering. Only used when enabled.", + "default": 1, + "min": 0, + "max": 64, + "step": 1, + }), + "useSmoothStrength": ("BOOLEAN", { + "tooltip": "Enable to include smoothStrength in meshCluster", + "default": False, + }), + "smoothStrength": ("INT", { + "tooltip": "Smoothing strength applied during chart clustering. Only used when enabled.", + "default": 1, + "min": 0, + "max": 10, + "step": 1, + }), + } + } + + RETURN_TYPES = ("RUNWARE3DINFERENCESETTINGSLAT",) + RETURN_NAMES = ("Mesh Cluster",) + FUNCTION = "create" + CATEGORY = "Runware" + DESCRIPTION = "Configure mesh cluster parameters for Runware 3D Inference settings." + + def create(self, **kwargs) -> tuple[Dict[str, Any]]: + out: Dict[str, Any] = {} + if kwargs.get("useThresholdConeHalfAngleRad", False): + out["thresholdConeHalfAngleRad"] = float(kwargs.get("thresholdConeHalfAngleRad", math.pi / 2)) + if kwargs.get("useRefineIterations", False): + out["refineIterations"] = int(kwargs.get("refineIterations", 0)) + if kwargs.get("useGlobalIterations", False): + out["globalIterations"] = int(kwargs.get("globalIterations", 1)) + if kwargs.get("useSmoothStrength", False): + out["smoothStrength"] = int(kwargs.get("smoothStrength", 1)) + return (out,) + + +NODE_CLASS_MAPPINGS = { + "Runware3DInferenceSettingsMeshCluster": Runware3DInferenceSettingsMeshCluster, +} +NODE_DISPLAY_NAME_MAPPINGS = { + "Runware3DInferenceSettingsMeshCluster": "Runware 3D Inference Settings Mesh Cluster", +}