Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions __init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,12 +122,14 @@
from .modules.saveImage import RunwareSaveImage
from .modules.videoOutputs import RunwareVideoInferenceOutputs
from .modules.threeDInference import threeDInference
from .modules.threeDModelSearch import Runware3DModelSearch
from .modules.threeDInferenceInputs import threeDInferenceInputs
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.threeDInferenceSettingsDracoCompression import Runware3DInferenceSettingsDracoCompression
from .modules.save3D import RunwareSave3D
from .modules.saveText import RunwareSaveText
from .modules.loadMesh import RunwareLoadMesh
Expand Down Expand Up @@ -267,12 +269,14 @@
"Runware Save Image": RunwareSaveImage,
"Runware Video Inference Outputs": RunwareVideoInferenceOutputs,
"Runware 3D Inference": threeDInference,
"Runware 3D Model Search": Runware3DModelSearch,
"Runware 3D Inference Inputs": threeDInferenceInputs,
"Runware 3D Inference Settings": Runware3DInferenceSettings,
"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 3D Inference Settings Draco Compression": Runware3DInferenceSettingsDracoCompression,
"Runware Save 3D": RunwareSave3D,
"Runware Save Text": RunwareSaveText,
"Runware Load Mesh": RunwareLoadMesh,
Expand All @@ -286,6 +290,7 @@
"Runware VAE Search": "Runware VAE",
"Runware Multi Inference": "Runware Multi Inference [BETA]",
"Runware Video Model Search": "Runware Video Model",
"Runware 3D Model Search": "Runware 3D Model",
"Runware Audio Model Search": "Runware Audio Model",
"Runware Text Model Search": "Runware Text Model",
"Runware Image Inference Settings Color Palette": "Runware Image Inference Color Palette",
Expand Down
6 changes: 5 additions & 1 deletion clientlibs/main.js
Original file line number Diff line number Diff line change
@@ -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, threeDInferenceSettingsMeshClusterToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, outpaintSettingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, imageInferenceSettingsMoodboardsToggleHandler, imageInferenceSettingsStructuredPromptToggleHandler, imageInferenceSettingsPromptEnhanceToggleHandler, imageInferenceSettingsScoringRubricToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, audioInferenceReferenceVoiceToggleHandler, audioInferenceSpeechVoicesToggleHandler, videoInputsFrameToggleHandler, referenceVideosToggleHandler } from "./utils.js";
import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, saveTextHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, threeDModelSearchFilterHandler, 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, threeDInferenceSettingsDracoCompressionToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, outpaintSettingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, imageInferenceSettingsMoodboardsToggleHandler, imageInferenceSettingsStructuredPromptToggleHandler, imageInferenceSettingsPromptEnhanceToggleHandler, imageInferenceSettingsScoringRubricToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, audioInferenceReferenceVoiceToggleHandler, audioInferenceSpeechVoicesToggleHandler, videoInputsFrameToggleHandler, referenceVideosToggleHandler } from "./utils.js";
import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js";

const nodeInitList = [];
Expand Down Expand Up @@ -188,13 +188,17 @@ app.registerExtension({
threeDInferenceSettingsLatToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSMESHCLUSTER) {
threeDInferenceSettingsMeshClusterToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSDRACOCOMPRESSION) {
threeDInferenceSettingsDracoCompressionToggleHandler(node);
}

if(crNodeProps.colorModeOnly === true) return;
if(nodeWidgets.length <= 0) return;

if(nodeClass === RUNWARE_NODE_TYPES.VIDEOMODELSEARCH) {
videoModelSearchFilterHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.THREEDMODELSEARCH) {
threeDModelSearchFilterHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOMODELSEARCH) {
audioModelSearchFilterHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.TEXTMODELSEARCH) {
Expand Down
10 changes: 10 additions & 0 deletions clientlibs/types.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,12 +170,14 @@ const RUNWARE_NODE_TYPES = {
SAVETEXT: "Runware Save Text",
VIDEOINFERENCEOUTPUTS: "Runware Video Inference Outputs",
THREEDINFERENCE: "Runware 3D Inference",
THREEDMODELSEARCH: "Runware 3D Model Search",
THREEDINFERENCEINPUTS: "Runware 3D Inference Inputs",
THREEDINFERENCESETTINGS: "Runware 3D Inference Settings",
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",
THREEDINFERENCESETTINGSDRACOCOMPRESSION: "Runware 3D Inference Settings Draco Compression",
SAVE3D: "Runware Save 3D",
LOADMESH: "Runware Load Mesh",
WATERMARKADVANCEDFEATURE: "Runware Watermark Advanced Feature",
Expand Down Expand Up @@ -681,6 +683,10 @@ const RUNWARE_NODE_PROPS = {
bgColor: DEFAULT_BGCOLOR,
promptEnhancer: true,
},
[RUNWARE_NODE_TYPES.THREEDMODELSEARCH]: {
bgColor: DEFAULT_BGCOLOR,
liveSearch: false,
},
[RUNWARE_NODE_TYPES.THREEDINFERENCEINPUTS]: {
bgColor: DEFAULT_BGCOLOR,
colorModeOnly: true,
Expand All @@ -705,6 +711,10 @@ const RUNWARE_NODE_PROPS = {
bgColor: DEFAULT_BGCOLOR,
colorModeOnly: true,
},
[RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSDRACOCOMPRESSION]: {
bgColor: DEFAULT_BGCOLOR,
colorModeOnly: true,
},
[RUNWARE_NODE_TYPES.SAVE3D]: {
bgColor: DEFAULT_BGCOLOR,
colorModeOnly: true,
Expand Down
79 changes: 79 additions & 0 deletions clientlibs/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -2324,6 +2324,28 @@ function threeDInferenceSettingsMeshClusterToggleHandler(node) {
});
}

function threeDInferenceSettingsDracoCompressionToggleHandler(node) {
const pairs = [
["useEnabled", "enabled"],
["useLevel", "level"],
["useQuantizationPosition", "quantizationPosition"],
["useQuantizationNormal", "quantizationNormal"],
["useQuantizationTexCoord", "quantizationTexCoord"],
];
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");
Expand Down Expand Up @@ -3416,6 +3438,61 @@ function textModelSearchFilterHandler(textModelSearchNode) {
filterModelList();
}

function threeDModelSearchFilterHandler(threeDModelSearchNode) {
const modelArchWidget = threeDModelSearchNode.widgets.find(w => w.name === "Model Architecture");
const threeDListWidget = threeDModelSearchNode.widgets.find(w => w.name === "ThreeDList");

if (!modelArchWidget || !threeDListWidget) return;

const THREED_MODELS = {
"Tencent": [
"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": [
"meta:sam@3d (Meta SAM 3D)",
],
"Microsoft": [
"microsoft:trellis-2@4b (TRELLIS.2)",
],
"Tripo": [
"tripo:v3.1@0 (Tripo 3D v3.1)",
],
"Hyper3D": [
"hyper3d:rodin@gen-1 (Rodin Gen-1)",
"hyper3d:rodin@gen-2 (Rodin Gen-2)",
],
"Meshy": [
"meshy:meshy@6 (Meshy 6)",
],
};

function filterModelList() {
const selectedArch = modelArchWidget.value;
let filteredModels = [];

if (selectedArch === "All") {
Object.values(THREED_MODELS).forEach(models => filteredModels.push(...models));
} else if (THREED_MODELS[selectedArch]) {
filteredModels = THREED_MODELS[selectedArch];
}

if (filteredModels.length > 0) {
const currentValue = threeDListWidget.value;
threeDListWidget.options.values = filteredModels;

if (!filteredModels.includes(currentValue)) {
threeDListWidget.value = filteredModels[0];
}

threeDModelSearchNode.setDirtyCanvas(true);
}
}

appendWidgetCB(modelArchWidget, filterModelList);
filterModelList();
}

function audioModelSearchFilterHandler(audioModelSearchNode) {
const modelProviderWidget = audioModelSearchNode.widgets.find(w => w.name === "Model Provider");
const audioListWidget = audioModelSearchNode.widgets.find(w => w.name === "AudioList");
Expand Down Expand Up @@ -5208,6 +5285,7 @@ export {
APIKeyHandler,
videoInferenceDimensionsHandler,
videoModelSearchFilterHandler,
threeDModelSearchFilterHandler,
audioModelSearchFilterHandler,
textModelSearchFilterHandler,
vectorizeModelSearchFilterHandler,
Expand Down Expand Up @@ -5240,6 +5318,7 @@ export {
threeDInferenceSettingsToggleHandler,
threeDInferenceSettingsLatToggleHandler,
threeDInferenceSettingsMeshClusterToggleHandler,
threeDInferenceSettingsDracoCompressionToggleHandler,
ultralyticsProviderSettingsToggleHandler,
openaiProviderSettingsToggleHandler,
lightricksProviderSettingsToggleHandler,
Expand Down
24 changes: 4 additions & 20 deletions modules/threeDInference.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,15 @@
class threeDInference:
"""Runware 3D Inference node for generating 3D models from images"""

# 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",
"Rodin Gen-1": "hyper3d:rodin@gen-1",
"Rodin Gen-2": "hyper3d:rodin@gen-2",
"Meshy 6": "meshy:meshy@6",
}

# Output formats
OUTPUT_FORMATS = ["GLB", "FBX", "PLY", "OBJ"]

@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"Model": (list(cls.THREED_MODELS.keys()), {
"tooltip": "Select the 3D generation model to use.",
"default": "Meta SAM 3D",
"Model": ("RUNWARE3DMODEL", {
"tooltip": "Connect a Runware 3D Model from Runware 3D Model Search node.",
}),
Comment thread
Sirsho1997 marked this conversation as resolved.
"positivePrompt": ("STRING", {
"multiline": True,
Expand Down Expand Up @@ -66,7 +53,7 @@ def INPUT_TYPES(cls):
"step": 1,
}),
"inputs": ("RUNWARE3DINFERENCEINPUTS", {
"tooltip": "Connect Runware 3D Inference Inputs for image, mask, meshFile, images (array from images_1…4), etc.",
"tooltip": "Connect Runware 3D Inference Inputs for image, mask, meshFile, images (array from Images 1…8), etc.",
}),
"settings": ("RUNWARE3DINFERENCESETTINGS", {
"tooltip": "Connect Runware 3D Inference Settings for textureSize, decimationTarget, remesh, resolution, imageAutoFix, faceLimit, texture, pbr, quad, Tripo options, sparseStructure, shapeSlat, texSlat, etc.",
Expand All @@ -82,7 +69,7 @@ def INPUT_TYPES(cls):

def generate3D(self, **kwargs):
"""Generate 3D model from inputs"""
modelName = kwargs.get("Model", "Meta SAM 3D")
model = kwargs.get("Model", "meta:sam@3d")
positivePrompt = kwargs.get("positivePrompt", "")
negativePrompt = kwargs.get("negativePrompt", "")
seed = kwargs.get("seed", 1)
Expand All @@ -93,9 +80,6 @@ def generate3D(self, **kwargs):
inputs = kwargs.get("inputs", None)
settings = kwargs.get("settings", None)

# Get model AIR code
model = self.THREED_MODELS.get(modelName, "meta:sam@3d")

# Build generation config
genConfig = [
{
Expand Down
6 changes: 3 additions & 3 deletions modules/threeDInferenceInputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def INPUT_TYPES(cls):
}),
}
for i in range(1, _IMAGE_SLOTS + 1):
optional[f"images_{i}"] = ("IMAGE", {
optional[f"Images {i}"] = ("IMAGE", {
"tooltip": f"Multi-view image slot {i}; merged in order into inputs.images as a list of data URIs.",
})
Comment thread
Sirsho1997 marked this conversation as resolved.
return {
Expand All @@ -30,7 +30,7 @@ def INPUT_TYPES(cls):
}

DESCRIPTION = (
"Configure custom inputs for Runware 3D Inference: image, mask, meshFile, and images_1…images_8 "
"Configure custom inputs for Runware 3D Inference: image, mask, meshFile, and Images 1…Images 8 "
"(merged into inputs.images as an array)."
)
Comment thread
Sirsho1997 marked this conversation as resolved.
FUNCTION = "createInputs"
Expand All @@ -57,7 +57,7 @@ def createInputs(self, **kwargs):

images_list: list = []
for i in range(1, _IMAGE_SLOTS + 1):
slot = kwargs.get(f"images_{i}")
slot = kwargs.get(f"Images {i}")
if slot is not None:
Comment thread
Sirsho1997 marked this conversation as resolved.
images_list.append(rwUtils.convertTensor2IMG(slot))
if images_list:
Expand Down
Loading