Skip to content

Commit 00af555

Browse files
authored
Merge pull request #167 from Runware/feature-trellis-dracoCompression
Added Support for Draco Compression in 3D Inference
2 parents 0bfe164 + a793c18 commit 00af555

10 files changed

Lines changed: 316 additions & 26 deletions

__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,14 @@
122122
from .modules.saveImage import RunwareSaveImage
123123
from .modules.videoOutputs import RunwareVideoInferenceOutputs
124124
from .modules.threeDInference import threeDInference
125+
from .modules.threeDModelSearch import Runware3DModelSearch
125126
from .modules.threeDInferenceInputs import threeDInferenceInputs
126127
from .modules.threeDInferenceSettings import Runware3DInferenceSettings
127128
from .modules.threeDInferenceSettingsSparseStructure import Runware3DInferenceSettingsSparseStructure
128129
from .modules.threeDInferenceSettingsShapeSlat import Runware3DInferenceSettingsShapeSlat
129130
from .modules.threeDInferenceSettingsTexSlat import Runware3DInferenceSettingsTexSlat
130131
from .modules.threeDInferenceSettingsMeshCluster import Runware3DInferenceSettingsMeshCluster
132+
from .modules.threeDInferenceSettingsDracoCompression import Runware3DInferenceSettingsDracoCompression
131133
from .modules.save3D import RunwareSave3D
132134
from .modules.saveText import RunwareSaveText
133135
from .modules.loadMesh import RunwareLoadMesh
@@ -267,12 +269,14 @@
267269
"Runware Save Image": RunwareSaveImage,
268270
"Runware Video Inference Outputs": RunwareVideoInferenceOutputs,
269271
"Runware 3D Inference": threeDInference,
272+
"Runware 3D Model Search": Runware3DModelSearch,
270273
"Runware 3D Inference Inputs": threeDInferenceInputs,
271274
"Runware 3D Inference Settings": Runware3DInferenceSettings,
272275
"Runware 3D Inference Settings Sparse Structure": Runware3DInferenceSettingsSparseStructure,
273276
"Runware 3D Inference Settings Shape Slat": Runware3DInferenceSettingsShapeSlat,
274277
"Runware 3D Inference Settings Tex Slat": Runware3DInferenceSettingsTexSlat,
275278
"Runware 3D Inference Settings Mesh Cluster": Runware3DInferenceSettingsMeshCluster,
279+
"Runware 3D Inference Settings Draco Compression": Runware3DInferenceSettingsDracoCompression,
276280
"Runware Save 3D": RunwareSave3D,
277281
"Runware Save Text": RunwareSaveText,
278282
"Runware Load Mesh": RunwareLoadMesh,
@@ -286,6 +290,7 @@
286290
"Runware VAE Search": "Runware VAE",
287291
"Runware Multi Inference": "Runware Multi Inference [BETA]",
288292
"Runware Video Model Search": "Runware Video Model",
293+
"Runware 3D Model Search": "Runware 3D Model",
289294
"Runware Audio Model Search": "Runware Audio Model",
290295
"Runware Text Model Search": "Runware Text Model",
291296
"Runware Image Inference Settings Color Palette": "Runware Image Inference Color Palette",

clientlibs/main.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { app } from "../../scripts/app.js";
22
import { api } from "../../scripts/api.js";
3-
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";
3+
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";
44
import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js";
55

66
const nodeInitList = [];
@@ -188,13 +188,17 @@ app.registerExtension({
188188
threeDInferenceSettingsLatToggleHandler(node);
189189
} else if(nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSMESHCLUSTER) {
190190
threeDInferenceSettingsMeshClusterToggleHandler(node);
191+
} else if(nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSDRACOCOMPRESSION) {
192+
threeDInferenceSettingsDracoCompressionToggleHandler(node);
191193
}
192194

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

196198
if(nodeClass === RUNWARE_NODE_TYPES.VIDEOMODELSEARCH) {
197199
videoModelSearchFilterHandler(node);
200+
} else if(nodeClass === RUNWARE_NODE_TYPES.THREEDMODELSEARCH) {
201+
threeDModelSearchFilterHandler(node);
198202
} else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOMODELSEARCH) {
199203
audioModelSearchFilterHandler(node);
200204
} else if(nodeClass === RUNWARE_NODE_TYPES.TEXTMODELSEARCH) {

clientlibs/types.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,14 @@ const RUNWARE_NODE_TYPES = {
170170
SAVETEXT: "Runware Save Text",
171171
VIDEOINFERENCEOUTPUTS: "Runware Video Inference Outputs",
172172
THREEDINFERENCE: "Runware 3D Inference",
173+
THREEDMODELSEARCH: "Runware 3D Model Search",
173174
THREEDINFERENCEINPUTS: "Runware 3D Inference Inputs",
174175
THREEDINFERENCESETTINGS: "Runware 3D Inference Settings",
175176
THREEDINFERENCESETTINGSSPARSESTRUCTURE: "Runware 3D Inference Settings Sparse Structure",
176177
THREEDINFERENCESETTINGSSHAPESLAT: "Runware 3D Inference Settings Shape Slat",
177178
THREEDINFERENCESETTINGSTEXSLAT: "Runware 3D Inference Settings Tex Slat",
178179
THREEDINFERENCESETTINGSMESHCLUSTER: "Runware 3D Inference Settings Mesh Cluster",
180+
THREEDINFERENCESETTINGSDRACOCOMPRESSION: "Runware 3D Inference Settings Draco Compression",
179181
SAVE3D: "Runware Save 3D",
180182
LOADMESH: "Runware Load Mesh",
181183
WATERMARKADVANCEDFEATURE: "Runware Watermark Advanced Feature",
@@ -681,6 +683,10 @@ const RUNWARE_NODE_PROPS = {
681683
bgColor: DEFAULT_BGCOLOR,
682684
promptEnhancer: true,
683685
},
686+
[RUNWARE_NODE_TYPES.THREEDMODELSEARCH]: {
687+
bgColor: DEFAULT_BGCOLOR,
688+
liveSearch: false,
689+
},
684690
[RUNWARE_NODE_TYPES.THREEDINFERENCEINPUTS]: {
685691
bgColor: DEFAULT_BGCOLOR,
686692
colorModeOnly: true,
@@ -705,6 +711,10 @@ const RUNWARE_NODE_PROPS = {
705711
bgColor: DEFAULT_BGCOLOR,
706712
colorModeOnly: true,
707713
},
714+
[RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSDRACOCOMPRESSION]: {
715+
bgColor: DEFAULT_BGCOLOR,
716+
colorModeOnly: true,
717+
},
708718
[RUNWARE_NODE_TYPES.SAVE3D]: {
709719
bgColor: DEFAULT_BGCOLOR,
710720
colorModeOnly: true,

clientlibs/utils.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2324,6 +2324,28 @@ function threeDInferenceSettingsMeshClusterToggleHandler(node) {
23242324
});
23252325
}
23262326

2327+
function threeDInferenceSettingsDracoCompressionToggleHandler(node) {
2328+
const pairs = [
2329+
["useEnabled", "enabled"],
2330+
["useLevel", "level"],
2331+
["useQuantizationPosition", "quantizationPosition"],
2332+
["useQuantizationNormal", "quantizationNormal"],
2333+
["useQuantizationTexCoord", "quantizationTexCoord"],
2334+
];
2335+
pairs.forEach(([useName, paramName]) => {
2336+
const useW = node.widgets.find(w => w.name === useName);
2337+
const paramW = node.widgets.find(w => w.name === paramName);
2338+
if (!useW || !paramW) return;
2339+
function toggleEnabled() {
2340+
const enabled = useW.value === true;
2341+
toggleWidgetEnabled(paramW, enabled, node);
2342+
node.setDirtyCanvas(true);
2343+
}
2344+
appendWidgetCB(useW, () => setTimeout(toggleEnabled, 50));
2345+
setTimeout(toggleEnabled, 100);
2346+
});
2347+
}
2348+
23272349
function openaiProviderSettingsToggleHandler(openaiNode) {
23282350
// Find all "use" parameter widgets for OpenAI Provider Settings (these are COMBO widgets)
23292351
const useBackgroundWidget = openaiNode.widgets.find(w => w.name === "useBackground");
@@ -3416,6 +3438,61 @@ function textModelSearchFilterHandler(textModelSearchNode) {
34163438
filterModelList();
34173439
}
34183440

3441+
function threeDModelSearchFilterHandler(threeDModelSearchNode) {
3442+
const modelArchWidget = threeDModelSearchNode.widgets.find(w => w.name === "Model Architecture");
3443+
const threeDListWidget = threeDModelSearchNode.widgets.find(w => w.name === "ThreeDList");
3444+
3445+
if (!modelArchWidget || !threeDListWidget) return;
3446+
3447+
const THREED_MODELS = {
3448+
"Tencent": [
3449+
"tencent:hunyuan-3d@3.1-pro (Tencent Hunyuan 3D 3.1 Pro)",
3450+
"tencent:hunyuan-3d@3.1-rapid (Tencent Hunyuan 3D 3.1 Rapid)",
3451+
],
3452+
"Meta": [
3453+
"meta:sam@3d (Meta SAM 3D)",
3454+
],
3455+
"Microsoft": [
3456+
"microsoft:trellis-2@4b (TRELLIS.2)",
3457+
],
3458+
"Tripo": [
3459+
"tripo:v3.1@0 (Tripo 3D v3.1)",
3460+
],
3461+
"Hyper3D": [
3462+
"hyper3d:rodin@gen-1 (Rodin Gen-1)",
3463+
"hyper3d:rodin@gen-2 (Rodin Gen-2)",
3464+
],
3465+
"Meshy": [
3466+
"meshy:meshy@6 (Meshy 6)",
3467+
],
3468+
};
3469+
3470+
function filterModelList() {
3471+
const selectedArch = modelArchWidget.value;
3472+
let filteredModels = [];
3473+
3474+
if (selectedArch === "All") {
3475+
Object.values(THREED_MODELS).forEach(models => filteredModels.push(...models));
3476+
} else if (THREED_MODELS[selectedArch]) {
3477+
filteredModels = THREED_MODELS[selectedArch];
3478+
}
3479+
3480+
if (filteredModels.length > 0) {
3481+
const currentValue = threeDListWidget.value;
3482+
threeDListWidget.options.values = filteredModels;
3483+
3484+
if (!filteredModels.includes(currentValue)) {
3485+
threeDListWidget.value = filteredModels[0];
3486+
}
3487+
3488+
threeDModelSearchNode.setDirtyCanvas(true);
3489+
}
3490+
}
3491+
3492+
appendWidgetCB(modelArchWidget, filterModelList);
3493+
filterModelList();
3494+
}
3495+
34193496
function audioModelSearchFilterHandler(audioModelSearchNode) {
34203497
const modelProviderWidget = audioModelSearchNode.widgets.find(w => w.name === "Model Provider");
34213498
const audioListWidget = audioModelSearchNode.widgets.find(w => w.name === "AudioList");
@@ -5208,6 +5285,7 @@ export {
52085285
APIKeyHandler,
52095286
videoInferenceDimensionsHandler,
52105287
videoModelSearchFilterHandler,
5288+
threeDModelSearchFilterHandler,
52115289
audioModelSearchFilterHandler,
52125290
textModelSearchFilterHandler,
52135291
vectorizeModelSearchFilterHandler,
@@ -5240,6 +5318,7 @@ export {
52405318
threeDInferenceSettingsToggleHandler,
52415319
threeDInferenceSettingsLatToggleHandler,
52425320
threeDInferenceSettingsMeshClusterToggleHandler,
5321+
threeDInferenceSettingsDracoCompressionToggleHandler,
52435322
ultralyticsProviderSettingsToggleHandler,
52445323
openaiProviderSettingsToggleHandler,
52455324
lightricksProviderSettingsToggleHandler,

modules/threeDInference.py

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,15 @@
55
class threeDInference:
66
"""Runware 3D Inference node for generating 3D models from images"""
77

8-
# Available 3D models
9-
THREED_MODELS = {
10-
"Tencent Hunyuan 3D 3.1 Pro": "tencent:hunyuan-3d@3.1-pro",
11-
"Tencent Hunyuan 3D 3.1 Rapid": "tencent:hunyuan-3d@3.1-rapid",
12-
"Meta SAM 3D": "meta:sam@3d",
13-
"TRELLIS.2": "microsoft:trellis-2@4b",
14-
"Tripo 3D v3.1": "tripo:v3.1@0",
15-
"Rodin Gen-1": "hyper3d:rodin@gen-1",
16-
"Rodin Gen-2": "hyper3d:rodin@gen-2",
17-
"Meshy 6": "meshy:meshy@6",
18-
}
19-
208
# Output formats
219
OUTPUT_FORMATS = ["GLB", "FBX", "PLY", "OBJ"]
2210

2311
@classmethod
2412
def INPUT_TYPES(cls):
2513
return {
2614
"required": {
27-
"Model": (list(cls.THREED_MODELS.keys()), {
28-
"tooltip": "Select the 3D generation model to use.",
29-
"default": "Meta SAM 3D",
15+
"Model": ("RUNWARE3DMODEL", {
16+
"tooltip": "Connect a Runware 3D Model from Runware 3D Model Search node.",
3017
}),
3118
"positivePrompt": ("STRING", {
3219
"multiline": True,
@@ -66,7 +53,7 @@ def INPUT_TYPES(cls):
6653
"step": 1,
6754
}),
6855
"inputs": ("RUNWARE3DINFERENCEINPUTS", {
69-
"tooltip": "Connect Runware 3D Inference Inputs for image, mask, meshFile, images (array from images_1…4), etc.",
56+
"tooltip": "Connect Runware 3D Inference Inputs for image, mask, meshFile, images (array from Images 1…8), etc.",
7057
}),
7158
"settings": ("RUNWARE3DINFERENCESETTINGS", {
7259
"tooltip": "Connect Runware 3D Inference Settings for textureSize, decimationTarget, remesh, resolution, imageAutoFix, faceLimit, texture, pbr, quad, Tripo options, sparseStructure, shapeSlat, texSlat, etc.",
@@ -82,7 +69,7 @@ def INPUT_TYPES(cls):
8269

8370
def generate3D(self, **kwargs):
8471
"""Generate 3D model from inputs"""
85-
modelName = kwargs.get("Model", "Meta SAM 3D")
72+
model = kwargs.get("Model", "meta:sam@3d")
8673
positivePrompt = kwargs.get("positivePrompt", "")
8774
negativePrompt = kwargs.get("negativePrompt", "")
8875
seed = kwargs.get("seed", 1)
@@ -93,9 +80,6 @@ def generate3D(self, **kwargs):
9380
inputs = kwargs.get("inputs", None)
9481
settings = kwargs.get("settings", None)
9582

96-
# Get model AIR code
97-
model = self.THREED_MODELS.get(modelName, "meta:sam@3d")
98-
9983
# Build generation config
10084
genConfig = [
10185
{

modules/threeDInferenceInputs.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def INPUT_TYPES(cls):
2121
}),
2222
}
2323
for i in range(1, _IMAGE_SLOTS + 1):
24-
optional[f"images_{i}"] = ("IMAGE", {
24+
optional[f"Images {i}"] = ("IMAGE", {
2525
"tooltip": f"Multi-view image slot {i}; merged in order into inputs.images as a list of data URIs.",
2626
})
2727
return {
@@ -30,7 +30,7 @@ def INPUT_TYPES(cls):
3030
}
3131

3232
DESCRIPTION = (
33-
"Configure custom inputs for Runware 3D Inference: image, mask, meshFile, and images_1…images_8 "
33+
"Configure custom inputs for Runware 3D Inference: image, mask, meshFile, and Images 1…Images 8 "
3434
"(merged into inputs.images as an array)."
3535
)
3636
FUNCTION = "createInputs"
@@ -57,7 +57,7 @@ def createInputs(self, **kwargs):
5757

5858
images_list: list = []
5959
for i in range(1, _IMAGE_SLOTS + 1):
60-
slot = kwargs.get(f"images_{i}")
60+
slot = kwargs.get(f"Images {i}")
6161
if slot is not None:
6262
images_list.append(rwUtils.convertTensor2IMG(slot))
6363
if images_list:

0 commit comments

Comments
 (0)