Updated Workflows + Added new MultiView nodes

Trellis2SparseMultiViewGenerator
Trellis2ImageCondMultiViewGenerator
Trellis2ShapeMultiViewGenerator
Trellis2ShapeCascadeMultiViewGenerator
Trellis2TexSlatMultiViewGenerator
This commit is contained in:
Bruno Fargnoli
2026-04-20 23:04:20 +02:00
parent 450c4c58e4
commit f0bc251544
34 changed files with 33203 additions and 89390 deletions
+2
View File
@@ -14,6 +14,8 @@
| Date | Description |
| --- | --- |
| **2026-04-20** | Recreated all Workflows |
| **2026-04-20** | Added node "Sparse MultiView Generator"<br>Added node "ImageCond MultiView Generator"<br>Added node "Shape MultiView Generator"<br>Added node "Shape Cascade MultiView Generator"<br>Added node "Tex Slat MultiView Generator" |
| **2026-04-20** | Added node "Fill Holes Nicely with Meshlib"<br>Fixed DinoV3 Features Extractor |
| **2026-04-06** | Added new "DINO-Lock" functionality<br>New fill_holes in Sparse Generator<br>Thanks to Easymode on Discord |
| **2026-04-05** | Added node "Extract Images from Video"<br>Can be used with "Sparse Generator with ReconViaGen" |
-769
View File
@@ -1,769 +0,0 @@
{
"id": "cd6e2e00-83cc-4795-abf1-09b46428c270",
"revision": 0,
"last_node_id": 207,
"last_link_id": 416,
"nodes": [
{
"id": 69,
"type": "Trellis2LoadImageWithTransparency",
"pos": [
-377.72410571388025,
328.4870830026766
],
"size": [
717.521556382955,
915.5313594325766
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": []
},
{
"name": "mask",
"type": "MASK",
"links": []
},
{
"name": "image_with_alpha",
"type": "IMAGE",
"links": [
241
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2LoadImageWithTransparency",
"widget_ue_connectable": {}
},
"widgets_values": [
"Image_1024_00101_.png",
"image"
]
},
{
"id": 203,
"type": "PrimitiveInt",
"pos": [
-373.0898096413628,
163.12227474974895
],
"size": [
270,
82
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "INT",
"type": "INT",
"links": [
409
]
}
],
"title": "Target Face Number",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.18.1",
"Node name for S&R": "PrimitiveInt"
},
"widgets_values": [
300000,
"fixed"
]
},
{
"id": 204,
"type": "PrimitiveString",
"pos": [
-368.2858630795249,
34.401714106564214
],
"size": [
270,
58
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "STRING",
"type": "STRING",
"links": [
410
]
}
],
"title": "Name",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.18.1",
"Node name for S&R": "PrimitiveString"
},
"widgets_values": [
"Tank"
]
},
{
"id": 202,
"type": "Preview3D",
"pos": [
376.48890096546415,
331.2515281089069
],
"size": [
868.8731050199159,
920.1382602693357
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "camera_info",
"shape": 7,
"type": "LOAD3D_CAMERA",
"link": null
},
{
"name": "bg_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "model_file",
"type": "STRING,FILE_3D_GLB,FILE_3D_GLTF,FILE_3D_FBX,FILE_3D_OBJ,FILE_3D_STL,FILE_3D_USDZ,FILE_3D",
"widget": {
"name": "model_file"
},
"link": 398
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.18.1",
"Node name for S&R": "Preview3D"
},
"widgets_values": [
"",
""
]
},
{
"id": 39,
"type": "Trellis2LoadModel",
"pos": [
404.6117778691903,
-564.6350558283436
],
"size": [
301.71875,
202
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"links": [
411
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03",
"Node name for S&R": "Trellis2LoadModel",
"widget_ue_connectable": {}
},
"widgets_values": [
"microsoft/TRELLIS.2-4B",
"flash_attn",
"cuda",
true,
false,
"flex_gemm",
"flash_attn"
]
},
{
"id": 119,
"type": "Trellis2PreProcessImage",
"pos": [
413.7442818307099,
-185.99180300678682
],
"size": [
281.8229166666667,
106
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 241
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
412
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "15854282a73cf231b81d52ada22e652f414a078b",
"Node name for S&R": "Trellis2PreProcessImage",
"widget_ue_connectable": {}
},
"widgets_values": [
10,
false,
1024
]
},
{
"id": 196,
"type": "Trellis2FillHolesWithCuMesh",
"pos": [
1148.203832543889,
-691.4362805609004
],
"size": [
312.4361328125,
58
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 413
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
392
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "dc66f263e832b103a81a021bf6cd53eec8ff28af",
"Node name for S&R": "Trellis2FillHolesWithCuMesh"
},
"widgets_values": [
1
]
},
{
"id": 197,
"type": "Trellis2ReconstructMeshWithQuad",
"pos": [
1143.7616665123248,
-576.3871604957823
],
"size": [
331.5878996659427,
142.11360851901668
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 392
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
393
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "d4d66cfc9f1ce5b1c3b9a2e504ee4b24ffad48a5",
"Node name for S&R": "Trellis2ReconstructMeshWithQuad",
"widget_ue_connectable": {}
},
"widgets_values": [
1,
1024,
true,
true
]
},
{
"id": 198,
"type": "Trellis2SimplifyMesh",
"pos": [
1146.6254930330851,
-381.0428638307529
],
"size": [
270,
82
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 393
},
{
"name": "target_face_num",
"type": "INT",
"widget": {
"name": "target_face_num"
},
"link": 409
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
394
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "5d4c1474ceb477f40bbd6d437f7da90f3d6d9229",
"Node name for S&R": "Trellis2SimplifyMesh"
},
"widgets_values": [
500000,
"Cumesh"
]
},
{
"id": 205,
"type": "Trellis2MeshWithVoxelAdvancedGenerator",
"pos": [
717.5499413662296,
-588.6883997158563
],
"size": [
413.1841796875,
702
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"link": 411
},
{
"name": "image",
"type": "IMAGE",
"link": 412
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
413
]
},
{
"name": "bvh",
"type": "BVH",
"links": [
415
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a5242473f68fe91d5ef0b188f8658ae0da540237",
"Node name for S&R": "Trellis2MeshWithVoxelAdvancedGenerator"
},
"widgets_values": [
12345,
"fixed",
"1024_cascade",
25,
7.5,
0.01,
5,
12,
7.5,
0.01,
3,
12,
3,
0.01,
3,
999999,
1,
32,
true,
0.1,
1,
0.1,
1,
0,
0.9,
true,
"euler"
]
},
{
"id": 201,
"type": "Trellis2ExportMesh",
"pos": [
1597.089782460921,
-140.8020848589493
],
"size": [
270,
102
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"link": 416
},
{
"name": "filename_prefix",
"type": "STRING",
"widget": {
"name": "filename_prefix"
},
"link": 410
}
],
"outputs": [
{
"name": "glb_path",
"type": "STRING",
"links": [
398
]
},
{
"name": "relative_path",
"type": "STRING",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a5242473f68fe91d5ef0b188f8658ae0da540237",
"Node name for S&R": "Trellis2ExportMesh"
},
"widgets_values": [
"3D/Trellis2",
"glb"
]
},
{
"id": 199,
"type": "Trellis2FillHolesWithMeshlib",
"pos": [
1151.769446503904,
-245.92060963339878
],
"size": [
302.4315956250001,
47.18107670916754
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 394
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
414
]
},
{
"name": "holes_filled",
"type": "INT",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e8098f5641702e74133c2dea0b45a13a3ab19985",
"Node name for S&R": "Trellis2FillHolesWithMeshlib"
},
"widgets_values": []
},
{
"id": 207,
"type": "Trellis2UnWrapAndRasterizer",
"pos": [
1153.8343873953147,
-150.96148118668327
],
"size": [
419.15234375,
314
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 414
},
{
"name": "bvh",
"type": "BVH",
"link": 415
}
],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
416
]
},
{
"name": "base_color_texture",
"type": "IMAGE",
"links": null
},
{
"name": "metallic_roughness_texture",
"type": "IMAGE",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a5242473f68fe91d5ef0b188f8658ae0da540237",
"Node name for S&R": "Trellis2UnWrapAndRasterizer"
},
"widgets_values": [
60,
0,
1,
1,
2048,
"OPAQUE",
false,
false,
false,
"telea"
]
}
],
"links": [
[
241,
69,
2,
119,
0,
"IMAGE"
],
[
392,
196,
0,
197,
0,
"MESHWITHVOXEL"
],
[
393,
197,
0,
198,
0,
"MESHWITHVOXEL"
],
[
394,
198,
0,
199,
0,
"MESHWITHVOXEL"
],
[
398,
201,
0,
202,
2,
"STRING"
],
[
409,
203,
0,
198,
1,
"INT"
],
[
410,
204,
0,
201,
1,
"STRING"
],
[
411,
39,
0,
205,
0,
"TRELLIS2PIPELINE"
],
[
412,
119,
0,
205,
1,
"IMAGE"
],
[
413,
205,
0,
196,
0,
"MESHWITHVOXEL"
],
[
414,
199,
0,
207,
0,
"MESHWITHVOXEL"
],
[
415,
205,
1,
207,
1,
"BVH"
],
[
416,
207,
0,
201,
0,
"TRIMESH"
]
],
"groups": [
{
"id": 1,
"title": "Configuration",
"bounding": [
-387.72410571388025,
-53.37077389343578,
737.521556382955,
1307.389216328689
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 2,
"title": "Generation",
"bounding": [
394.6117778691903,
-772.2962805609001,
1523.2043605195558,
1035.4596396805657
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"workflowRendererVersion": "LG",
"ue_links": [],
"ds": {
"scale": 0.5644739300537777,
"offset": [
717.24240821608,
973.4146936919584
]
},
"links_added_by_ue": [],
"frontendVersion": "1.42.8",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
-694
View File
@@ -1,694 +0,0 @@
{
"id": "622e21aa-627a-479c-9f08-0253df4ef152",
"revision": 0,
"last_node_id": 164,
"last_link_id": 329,
"nodes": [
{
"id": 119,
"type": "Trellis2PreProcessImage",
"pos": [
897.5905907717984,
823.1289593472236
],
"size": [
338.1875,
79.328125
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 241
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
281,
327
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "15854282a73cf231b81d52ada22e652f414a078b",
"Node name for S&R": "Trellis2PreProcessImage",
"widget_ue_connectable": {}
},
"widgets_values": [
25
]
},
{
"id": 39,
"type": "Trellis2LoadModel",
"pos": [
1327.276154007807,
692.1676476307475
],
"size": [
362.0625,
207.328125
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"links": [
87,
326
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03",
"Node name for S&R": "Trellis2LoadModel",
"widget_ue_connectable": {}
},
"widgets_values": [
"TRELLIS.2-4B",
"flash_attn",
"cuda",
true,
false
]
},
{
"id": 138,
"type": "Trellis2SimplifyMesh",
"pos": [
2747.339362428528,
649.4485906473623
],
"size": [
335.5,
114
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 321
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
309
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "fa93c4c067ccebf6ca689fa0d222a93b729325ee",
"Node name for S&R": "Trellis2SimplifyMesh",
"widget_ue_connectable": {}
},
"widgets_values": [
2000000,
"Cumesh"
]
},
{
"id": 10,
"type": "Preview3D",
"pos": [
2257.240824765328,
1021.6339532742255
],
"size": [
903,
836.78125
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "camera_info",
"shape": 7,
"type": "LOAD3D_CAMERA",
"link": null
},
{
"name": "bg_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "model_file",
"type": "STRING",
"widget": {
"name": "model_file"
},
"link": 22
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.4.0",
"Node name for S&R": "Preview3D",
"widget_ue_connectable": {},
"Last Time Model File": "SerpentStatue_00002_.glb",
"Scene Config": {
"showGrid": true,
"backgroundColor": "#282828",
"backgroundImage": "",
"backgroundRenderMode": "tiled"
},
"Camera Config": {
"cameraType": "perspective",
"fov": 35,
"state": {
"position": {
"x": 7.414666256428865,
"y": 3.3570132290769408,
"z": 5.34874244185929
},
"target": {
"x": -0.02435503410412615,
"y": 1.6867273698374317,
"z": 0.13811717805443535
},
"zoom": 1,
"cameraType": "perspective"
}
},
"Light Config": {
"intensity": 3
},
"Model Config": {
"upDirection": "original",
"materialMode": "original",
"showSkeleton": false
}
},
"widgets_values": [
"SerpentStatue_00002_.glb",
""
]
},
{
"id": 45,
"type": "Trellis2MeshWithVoxelAdvancedGenerator",
"pos": [
1742.5332178164758,
972.3746051296943
],
"size": [
495.8125,
866
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"link": 87
},
{
"name": "image",
"type": "IMAGE",
"link": 281
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
319
]
},
{
"name": "bvh",
"type": "BVH",
"links": []
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0",
"Node name for S&R": "Trellis2MeshWithVoxelAdvancedGenerator",
"widget_ue_connectable": {}
},
"widgets_values": [
123456,
"fixed",
"1024",
12,
6.5,
0.2,
4,
12,
6.5,
0.2,
4,
12,
3,
0.2,
3,
999999,
4,
32,
false,
0.1,
1,
0.1,
1,
0,
0.9,
true
]
},
{
"id": 19,
"type": "Trellis2ExportMesh",
"pos": [
3210.9571972842705,
1016.681270352647
],
"size": [
324,
146
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"link": 329
}
],
"outputs": [
{
"name": "glb_path",
"type": "STRING",
"links": [
22
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2ExportMesh",
"widget_ue_connectable": {}
},
"widgets_values": [
"Trellis2BetterTextured",
"glb",
true
]
},
{
"id": 69,
"type": "Trellis2LoadImageWithTransparency",
"pos": [
897.3491520510952,
952.1619923367256
],
"size": [
788.875,
938.875
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": []
},
{
"name": "mask",
"type": "MASK",
"links": []
},
{
"name": "image_with_alpha",
"type": "IMAGE",
"links": [
241
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2LoadImageWithTransparency",
"widget_ue_connectable": {}
},
"widgets_values": [
"Image_2048_00032_.png",
"image"
]
},
{
"id": 155,
"type": "Trellis2FillHolesWithMeshlib",
"pos": [
3167.7313003113813,
649.3451250922466
],
"size": [
344.9375,
71.328125
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 309
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
311
]
},
{
"name": "holes_filled",
"type": "INT",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2FillHolesWithMeshlib",
"widget_ue_connectable": {}
},
"widgets_values": []
},
{
"id": 156,
"type": "Trellis2MeshWithVoxelToTrimesh",
"pos": [
3593.1466803610683,
654.6503899580995
],
"size": [
349.40625,
82
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 311
}
],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
328
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2MeshWithVoxelToTrimesh",
"widget_ue_connectable": {}
},
"widgets_values": [
"90 degrees"
]
},
{
"id": 160,
"type": "Trellis2Remesh",
"pos": [
2277.4886240299484,
656.1644153578488
],
"size": [
422.1875,
262
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 319
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
321
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2Remesh",
"widget_ue_connectable": {}
},
"widgets_values": [
1,
0,
false,
0.03,
"1024",
true,
true
]
},
{
"id": 164,
"type": "Trellis2MeshTexturing",
"pos": [
3592.0674518531387,
803.2771445659899
],
"size": [
419.125,
568.65625
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"link": 326
},
{
"name": "image",
"type": "IMAGE",
"link": 327
},
{
"name": "trimesh",
"type": "TRIMESH",
"link": 328
}
],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
329
]
},
{
"name": "base_color_texture",
"type": "IMAGE",
"links": null
},
{
"name": "metallic_roughness_texture",
"type": "IMAGE",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2MeshTexturing",
"widget_ue_connectable": {}
},
"widgets_values": [
0,
"randomize",
12,
3,
0.2,
3,
1024,
4096,
"OPAQUE",
true,
0,
0.9,
4,
false,
false,
60
]
}
],
"links": [
[
22,
19,
0,
10,
2,
"STRING"
],
[
87,
39,
0,
45,
0,
"TRELLIS2PIPELINE"
],
[
241,
69,
2,
119,
0,
"IMAGE"
],
[
281,
119,
0,
45,
1,
"IMAGE"
],
[
309,
138,
0,
155,
0,
"MESHWITHVOXEL"
],
[
311,
155,
0,
156,
0,
"MESHWITHVOXEL"
],
[
319,
45,
0,
160,
0,
"MESHWITHVOXEL"
],
[
321,
160,
0,
138,
0,
"MESHWITHVOXEL"
],
[
326,
39,
0,
164,
0,
"TRELLIS2PIPELINE"
],
[
327,
119,
0,
164,
1,
"IMAGE"
],
[
328,
156,
0,
164,
2,
"TRIMESH"
],
[
329,
164,
0,
19,
0,
"TRIMESH"
]
],
"groups": [],
"config": {},
"extra": {
"workflowRendererVersion": "Vue",
"ue_links": [],
"ds": {
"scale": 0.513158118230707,
"offset": [
-749.1534758435857,
-288.6107035425266
]
},
"links_added_by_ue": [],
"frontendVersion": "1.37.11",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-634
View File
@@ -1,634 +0,0 @@
{
"id": "bdcdd41a-9d6d-48d5-8de6-ab8903d3b227",
"revision": 0,
"last_node_id": 16,
"last_link_id": 26,
"nodes": [
{
"id": 1,
"type": "Trellis2LoadModel",
"pos": [
324.6709594238695,
598.4626830706405
],
"size": [
362.0625,
207.328125
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"links": [
1
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03",
"Node name for S&R": "Trellis2LoadModel",
"widget_ue_connectable": {}
},
"widgets_values": [
"TRELLIS.2-4B",
"flash_attn",
"cuda",
true,
true
]
},
{
"id": 10,
"type": "Trellis2SimplifyMesh",
"pos": [
1674.314276200003,
751.6717152746028
],
"size": [
324,
114
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 26
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
21
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "87f48b0726b5d5e58b744bbac632331cd7a34103",
"Node name for S&R": "Trellis2SimplifyMesh",
"widget_ue_connectable": {}
},
"widgets_values": [
2000000,
"Cumesh"
]
},
{
"id": 9,
"type": "Trellis2MeshWithVoxelToTrimesh",
"pos": [
2339.5056410006705,
749.748649282976
],
"size": [
410.71875,
82
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 22
}
],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
9
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "87f48b0726b5d5e58b744bbac632331cd7a34103",
"Node name for S&R": "Trellis2MeshWithVoxelToTrimesh",
"widget_ue_connectable": {}
},
"widgets_values": [
"90 degrees"
]
},
{
"id": 7,
"type": "Preview3D",
"pos": [
1687.9847496889538,
1105.4665469841239
],
"size": [
859.3125,
770.71875
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "camera_info",
"shape": 7,
"type": "LOAD3D_CAMERA",
"link": null
},
{
"name": "bg_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "model_file",
"type": "STRING",
"widget": {
"name": "model_file"
},
"link": 6
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.6.0",
"Node name for S&R": "Preview3D",
"widget_ue_connectable": {},
"Last Time Model File": "DwarfWarrior_Refined_1536_00001_.glb",
"Scene Config": {
"showGrid": true,
"backgroundColor": "#282828",
"backgroundImage": "",
"backgroundRenderMode": "tiled"
},
"Camera Config": {
"cameraType": "perspective",
"fov": 35,
"state": {
"position": {
"x": -0.12117550423665688,
"y": 2.8575581491112874,
"z": 8.963607314880118
},
"target": {
"x": 0,
"y": 2.5,
"z": 0
},
"zoom": 1,
"cameraType": "perspective"
}
},
"Light Config": {
"intensity": 3
},
"Model Config": {
"upDirection": "original",
"materialMode": "original",
"showSkeleton": false
}
},
"widgets_values": [
"DwarfWarrior_Refined_1536_00001_.glb",
""
]
},
{
"id": 3,
"type": "Trellis2LoadMesh",
"pos": [
88.2344076276703,
883.9986034541271
],
"size": [
587.9375,
83.328125
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
2
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "87f48b0726b5d5e58b744bbac632331cd7a34103",
"Node name for S&R": "Trellis2LoadMesh",
"widget_ue_connectable": {}
},
"widgets_values": [
"C:\\Git\\ComfyUI\\output\\DwarfWarrior_Hy20_Hy3D_00002_.obj"
]
},
{
"id": 2,
"type": "Trellis2LoadImageWithTransparency",
"pos": [
-1.0218170793607726,
1192.2193858033618
],
"size": [
726.8125,
683.71875
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": []
},
{
"name": "mask",
"type": "MASK",
"links": []
},
{
"name": "image_with_alpha",
"type": "IMAGE",
"links": [
23
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2LoadImageWithTransparency",
"widget_ue_connectable": {}
},
"widgets_values": [
"DwarfWarrior02.png",
"image"
]
},
{
"id": 4,
"type": "Trellis2MeshRefiner",
"pos": [
791.2868696727592,
858.6175724018431
],
"size": [
375.6875,
700.65625
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"link": 1
},
{
"name": "trimesh",
"type": "TRIMESH",
"link": 2
},
{
"name": "image",
"type": "IMAGE",
"link": 24
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
25
]
},
{
"name": "bvh",
"type": "BVH",
"links": []
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "87f48b0726b5d5e58b744bbac632331cd7a34103",
"Node name for S&R": "Trellis2MeshRefiner",
"widget_ue_connectable": {}
},
"widgets_values": [
12345,
"fixed",
1024,
12,
6.5,
0.2,
4,
12,
3,
0.2,
3,
999999,
false,
16,
0.1,
1,
0,
0.9,
true,
4
]
},
{
"id": 6,
"type": "Trellis2ExportMesh",
"pos": [
1236.5760403785862,
1117.3755723277798
],
"size": [
324,
146
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"link": 9
}
],
"outputs": [
{
"name": "glb_path",
"type": "STRING",
"links": [
6
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "87f48b0726b5d5e58b744bbac632331cd7a34103",
"Node name for S&R": "Trellis2ExportMesh",
"widget_ue_connectable": {}
},
"widgets_values": [
"DwarfWarrior_Refined_1536",
"glb",
true
]
},
{
"id": 14,
"type": "Trellis2FillHolesWithMeshlib",
"pos": [
2050.9297608170014,
763.9776229275544
],
"size": [
249.28125,
71.328125
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 21
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
22
]
},
{
"name": "holes_filled",
"type": "INT",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2FillHolesWithMeshlib",
"widget_ue_connectable": {}
},
"widgets_values": []
},
{
"id": 15,
"type": "Trellis2PreProcessImage",
"pos": [
300.70156840071724,
1039.995663322853
],
"size": [
281.78125,
79.328125
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 23
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
24
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2PreProcessImage",
"widget_ue_connectable": {}
},
"widgets_values": [
25
]
},
{
"id": 16,
"type": "Trellis2Remesh",
"pos": [
1224.0291703682533,
749.6436908727221
],
"size": [
316.625,
262
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 25
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
26
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2Remesh",
"widget_ue_connectable": {}
},
"widgets_values": [
1,
0,
false,
0.03,
"1024",
true,
true
]
}
],
"links": [
[
1,
1,
0,
4,
0,
"TRELLIS2PIPELINE"
],
[
2,
3,
0,
4,
1,
"TRIMESH"
],
[
6,
6,
0,
7,
2,
"STRING"
],
[
9,
9,
0,
6,
0,
"TRIMESH"
],
[
21,
10,
0,
14,
0,
"MESHWITHVOXEL"
],
[
22,
14,
0,
9,
0,
"MESHWITHVOXEL"
],
[
23,
2,
2,
15,
0,
"IMAGE"
],
[
24,
15,
0,
4,
2,
"IMAGE"
],
[
25,
4,
0,
16,
0,
"MESHWITHVOXEL"
],
[
26,
16,
0,
10,
0,
"MESHWITHVOXEL"
]
],
"groups": [],
"config": {},
"extra": {
"workflowRendererVersion": "Vue",
"ue_links": [],
"ds": {
"scale": 0.5730855330116876,
"offset": [
101.58649840815897,
-273.8080548162989
]
},
"links_added_by_ue": [],
"frontendVersion": "1.37.11",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
@@ -1,173 +1,279 @@
{
"id": "9b1321c3-d206-474a-bf17-498b285fb45b",
"id": "bf99b914-b22a-4148-ba05-a9b9c3380ed0",
"revision": 0,
"last_node_id": 13,
"last_link_id": 19,
"last_node_id": 268,
"last_link_id": 528,
"nodes": [
{
"id": 1,
"type": "Trellis2LoadImageWithTransparency",
"id": 39,
"type": "Trellis2LoadModel",
"pos": [
628.7628375593317,
1459.9883699049824
-1225.323779258147,
97.34726822503463
],
"size": [
470.78125,
499.8125
280.05208333333337,
226
],
"flags": {},
"flags": {
"collapsed": false
},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": []
},
{
"name": "mask",
"type": "MASK",
"links": []
},
{
"name": "image_with_alpha",
"type": "IMAGE",
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"links": [
18
526
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2LoadImageWithTransparency",
"ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03",
"Node name for S&R": "Trellis2LoadModel",
"widget_ue_connectable": {}
},
"widgets_values": [
"Image_04298_2048.png",
"image"
"microsoft/TRELLIS.2-4B",
"flash_attn",
"cuda",
true,
false,
"flex_gemm",
"flash_attn",
false
]
},
{
"id": 3,
"type": "Trellis2MeshTexturing",
"id": 260,
"type": "PrimitiveInt",
"pos": [
1571.8033823942308,
1463.2804651639194
-1888.7341838217667,
348.47508641032636
],
"size": [
376.8125,
568.65625
270,
82
],
"flags": {},
"order": 4,
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "INT",
"type": "INT",
"links": [
508
]
}
],
"title": "Texture Size",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.19.3",
"Node name for S&R": "PrimitiveInt"
},
"widgets_values": [
2048,
"fixed"
]
},
{
"id": 194,
"type": "Trellis2PreProcessImage",
"pos": [
-1208.174423642917,
385.7358016085273
],
"size": [
281.7837890625,
106
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"link": 1
},
{
"name": "image",
"type": "IMAGE",
"link": 19
},
{
"name": "trimesh",
"type": "TRIMESH",
"link": 8
"link": 344
}
],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
11
]
},
{
"name": "base_color_texture",
"name": "image",
"type": "IMAGE",
"links": [
9
]
},
{
"name": "metallic_roughness_texture",
"type": "IMAGE",
"links": [
10
500
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "20651320d20ed56a52168c1bd3f29d6886c4be06",
"Node name for S&R": "Trellis2MeshTexturing",
"widget_ue_connectable": {}
"ver": "7ce26deae425d114f3deb78e802d6196e5987a4a",
"Node name for S&R": "Trellis2PreProcessImage"
},
"widgets_values": [
810478905,
"randomize",
12,
3,
0.2,
3,
1024,
4096,
"OPAQUE",
true,
0,
0.9,
4,
10,
false,
false,
60
1024
]
},
{
"id": 9,
"type": "PreviewImage",
"id": 261,
"type": "Trellis2MeshTexturing",
"pos": [
1571.9379630780118,
2084.7201337705405
-888.2213736686743,
116.2308532718417
],
"size": [
371.03125,
275.75
419.15234375,
602
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "images",
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"link": 526
},
{
"name": "image",
"type": "IMAGE",
"link": 9
"link": 500
},
{
"name": "trimesh",
"type": "TRIMESH",
"link": 528
},
{
"name": "texture_size",
"type": "INT",
"widget": {
"name": "texture_size"
},
"link": 508
}
],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
502
]
},
{
"name": "base_color_texture",
"type": "IMAGE",
"links": null
},
{
"name": "metallic_roughness_texture",
"type": "IMAGE",
"links": null
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.5.1",
"Node name for S&R": "PreviewImage",
"widget_ue_connectable": {}
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "9d1f80ec9b4d5c4b966e7595ee99e01a1d0c9f19",
"Node name for S&R": "Trellis2MeshTexturing"
},
"widgets_values": []
"widgets_values": [
12345,
"fixed",
12,
5,
0.05,
3,
1024,
2048,
"OPAQUE",
false,
0,
0.99,
4,
false,
false,
60,
"heun",
"telea",
false,
0,
4,
1
]
},
{
"id": 12,
"type": "Preview3D",
"id": 262,
"type": "Trellis2ExportMesh",
"pos": [
2434.8718248184696,
1320.1591362771344
-416.7657094952575,
129.1425828262007
],
"size": [
844.875,
826.0625
270,
102
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"link": 502
},
{
"name": "filename_prefix",
"type": "STRING",
"widget": {
"name": "filename_prefix"
},
"link": 527
}
],
"outputs": [
{
"name": "glb_path",
"type": "STRING",
"links": [
503
]
},
{
"name": "relative_path",
"type": "STRING",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "ef2286b47ce0ef0e681dffe0209aadd96de50f72",
"Node name for S&R": "Trellis2ExportMesh"
},
"widgets_values": [
"Test",
"glb"
]
},
{
"id": 263,
"type": "Preview3D",
"pos": [
-442.8173364514051,
292.64840010239254
],
"size": [
893.4374971800978,
964.1087296962992
],
"flags": {},
"order": 8,
@@ -187,20 +293,20 @@
},
{
"name": "model_file",
"type": "STRING",
"type": "STRING,FILE_3D_GLB,FILE_3D_GLTF,FILE_3D_FBX,FILE_3D_OBJ,FILE_3D_STL,FILE_3D_USDZ,FILE_3D",
"widget": {
"name": "model_file"
},
"link": 12
"link": 503
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.5.1",
"ver": "0.16.4",
"Node name for S&R": "Preview3D",
"widget_ue_connectable": {},
"Last Time Model File": "TexturedMesh_00001_.glb",
"Last Time Model File": "C:/Git/ComfyUI/output/Tower_00001_.glb",
"Resource Folder": "Git/ComfyUI/output",
"Scene Config": {
"showGrid": true,
"backgroundColor": "#282828",
@@ -212,14 +318,14 @@
"fov": 35,
"state": {
"position": {
"x": -0.1760179925373424,
"y": 7.556479375501969,
"z": 6.940407508674209
"x": 7.40962749875979,
"y": 4.597048002760341,
"z": 6.563498084427726
},
"target": {
"x": 0,
"y": 2.5,
"z": 0
"x": 0.01192413674304426,
"y": 2.400108551931419,
"z": 0.01837531975156183
},
"zoom": 1,
"cameraType": "perspective"
@@ -227,61 +333,28 @@
},
"Light Config": {
"intensity": 3
},
"Model Config": {
"upDirection": "original",
"materialMode": "original",
"showSkeleton": false
}
},
"widgets_values": [
"TexturedMesh_00001_.glb",
"C:/Git/ComfyUI/output/Tower_00001_.glb",
""
]
},
{
"id": 2,
"type": "Trellis2LoadModel",
"id": 6,
"type": "Trellis2LoadImageWithTransparency",
"pos": [
1059.2676133611621,
1150.7603358557099
-1938.3986918443484,
498.59522715431825
],
"size": [
362.0625,
207.328125
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"links": [
1
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03",
"Node name for S&R": "Trellis2LoadModel",
"widget_ue_connectable": {}
},
"widgets_values": [
"TRELLIS.2-4B",
"flash_attn",
"cuda",
true,
false
]
},
{
"id": 8,
"type": "Trellis2LoadMesh",
"pos": [
954.9310336408487,
2139.1348802280054
],
"size": [
514.34375,
83.328125
657.6262101878383,
765.9737728955563
],
"flags": {},
"order": 2,
@@ -289,216 +362,211 @@
"inputs": [],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
8
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "20651320d20ed56a52168c1bd3f29d6886c4be06",
"Node name for S&R": "Trellis2LoadMesh",
"widget_ue_connectable": {}
},
"widgets_values": [
"C:\\Git\\ComfyUI\\output\\DwarfSorcerer_Hy20_Hy3D_00001_.obj"
]
},
{
"id": 10,
"type": "PreviewImage",
"pos": [
2002.8182577158457,
2067.2225148250195
],
"size": [
379.34375,
274.25
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "images",
"name": "image",
"type": "IMAGE",
"link": 10
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.5.1",
"Node name for S&R": "PreviewImage",
"widget_ue_connectable": {}
},
"widgets_values": []
},
{
"id": 11,
"type": "Trellis2ExportMesh",
"pos": [
2025.4304267482246,
1460.1946946799014
],
"size": [
324,
146
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
"links": null
},
{
"name": "trimesh",
"type": "TRIMESH",
"link": 11
}
],
"outputs": [
"name": "mask",
"type": "MASK",
"links": null
},
{
"name": "glb_path",
"type": "STRING",
"name": "image_with_alpha",
"type": "IMAGE",
"links": [
12
344
]
}
],
"title": "Image with Transparency",
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "20651320d20ed56a52168c1bd3f29d6886c4be06",
"Node name for S&R": "Trellis2ExportMesh",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2LoadImageWithTransparency",
"widget_ue_connectable": {}
},
"widgets_values": [
"TexturedMesh",
"glb",
true
"Tower04_6Views_Hy20_SourceImage_00001_.png",
"image"
]
},
{
"id": 13,
"type": "Trellis2PreProcessImage",
"id": 219,
"type": "PrimitiveString",
"pos": [
1189.9333547330602,
1507.6866688560513
-1879.908257415271,
106.80098905509897
],
"size": [
281.78125,
79.328125
270,
58
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 18
}
],
"inputs": [],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"name": "STRING",
"type": "STRING",
"links": [
19
527
]
}
],
"title": "Name",
"properties": {
"widget_ue_connectable": {},
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2PreProcessImage"
"cnr_id": "comfy-core",
"ver": "0.16.4",
"Node name for S&R": "PrimitiveString"
},
"widgets_values": [
25
"Tower"
]
},
{
"id": 268,
"type": "Trellis2LoadMesh",
"pos": [
-1883.220870920183,
235.75914980178976
],
"size": [
270,
58
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
528
]
}
],
"title": "Mesh to Texture",
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "9d1f80ec9b4d5c4b966e7595ee99e01a1d0c9f19",
"Node name for S&R": "Trellis2LoadMesh"
},
"widgets_values": [
"C:\\Git\\ComfyUI\\output\\3D\\Tower04_6Views_Hy20\\Tower04_6Views_Hy20_WhiteMesh_HighPoly_00001_.glb"
]
}
],
"links": [
[
1,
344,
6,
2,
0,
3,
0,
"TRELLIS2PIPELINE"
],
[
8,
8,
0,
3,
2,
"TRIMESH"
],
[
9,
3,
1,
9,
194,
0,
"IMAGE"
],
[
10,
3,
2,
10,
500,
194,
0,
261,
1,
"IMAGE"
],
[
11,
3,
502,
261,
0,
11,
262,
0,
"TRIMESH"
],
[
12,
11,
503,
262,
0,
12,
263,
2,
"STRING"
],
[
18,
1,
2,
13,
508,
260,
0,
"IMAGE"
261,
3,
"INT"
],
[
19,
13,
526,
39,
0,
3,
261,
0,
"TRELLIS2PIPELINE"
],
[
527,
219,
0,
262,
1,
"IMAGE"
"STRING"
],
[
528,
268,
0,
261,
2,
"TRIMESH"
]
],
"groups": [],
"groups": [
{
"id": 2,
"title": "Configuration",
"bounding": [
-1963.9391875601236,
26.440740456795428,
701.3865401112473,
1252.3667177085042
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 3,
"title": "Texturing",
"bounding": [
-1235.323779258147,
23.74726822503463,
1709.8835112121144,
1259.8828335264047
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"workflowRendererVersion": "Vue",
"workflowRendererVersion": "LG",
"ue_links": [],
"ds": {
"scale": 0.6303940863128702,
"scale": 0.5709797729819551,
"offset": [
-519.4532595217203,
-1005.3553299723907
2230.433003559318,
196.9062149677335
]
},
"links_added_by_ue": [],
"frontendVersion": "1.37.11",
"frontendVersion": "1.42.11",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-588
View File
@@ -1,588 +0,0 @@
{
"id": "440427ce-0c6a-4462-af51-639ed2f16dec",
"revision": 0,
"last_node_id": 50,
"last_link_id": 103,
"nodes": [
{
"id": 39,
"type": "Trellis2LoadModel",
"pos": [
217.26891553515722,
664.9117591988434
],
"size": [
362.0625,
207.328125
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"links": [
87
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03",
"Node name for S&R": "Trellis2LoadModel",
"widget_ue_connectable": {}
},
"widgets_values": [
"TRELLIS.2-4B",
"flash_attn",
"cuda",
true,
false
]
},
{
"id": 10,
"type": "Preview3D",
"pos": [
1211.0446353840794,
1013.6644820212222
],
"size": [
752.25,
669.90625
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "camera_info",
"shape": 7,
"type": "LOAD3D_CAMERA",
"link": null
},
{
"name": "bg_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "model_file",
"type": "STRING",
"widget": {
"name": "model_file"
},
"link": 22
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.4.0",
"Node name for S&R": "Preview3D",
"widget_ue_connectable": {},
"Last Time Model File": "Cyborg_NoTexture_00001_.glb",
"Scene Config": {
"showGrid": true,
"backgroundColor": "#282828",
"backgroundImage": "",
"backgroundRenderMode": "tiled"
},
"Camera Config": {
"cameraType": "perspective",
"fov": 35,
"state": {
"position": {
"x": 1.5940872974312115,
"y": 8.300916247283151,
"z": 9.675558475883504
},
"target": {
"x": 0,
"y": 2.5,
"z": 0
},
"zoom": 1,
"cameraType": "perspective"
}
},
"Light Config": {
"intensity": 3
}
},
"widgets_values": [
"Cyborg_NoTexture_00001_.glb",
""
]
},
{
"id": 43,
"type": "Trellis2MeshWithVoxelToTrimesh",
"pos": [
2052.534856345812,
858.9148979525742
],
"size": [
403.8125,
82
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 99
}
],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
84
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0",
"Node name for S&R": "Trellis2MeshWithVoxelToTrimesh",
"widget_ue_connectable": {}
},
"widgets_values": [
"90 degrees"
]
},
{
"id": 6,
"type": "Trellis2LoadImageWithTransparency",
"pos": [
155.19860981422082,
1115.0081906575829
],
"size": [
454.3125,
436.03125
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": null
},
{
"name": "mask",
"type": "MASK",
"links": null
},
{
"name": "image_with_alpha",
"type": "IMAGE",
"links": [
100
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2LoadImageWithTransparency",
"widget_ue_connectable": {}
},
"widgets_values": [
"Image_4096_00003_.png",
"image"
]
},
{
"id": 45,
"type": "Trellis2MeshWithVoxelAdvancedGenerator",
"pos": [
676.0217411697733,
666.413786132539
],
"size": [
495.8125,
866
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"link": 87
},
{
"name": "image",
"type": "IMAGE",
"link": 101
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
102
]
},
{
"name": "bvh",
"type": "BVH",
"links": []
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0",
"Node name for S&R": "Trellis2MeshWithVoxelAdvancedGenerator",
"widget_ue_connectable": {}
},
"widgets_values": [
363877961,
"randomize",
"1024_cascade",
12,
6.5,
0.2,
4,
12,
6.5,
0.2,
4,
12,
3,
0.2,
3,
999999,
4,
32,
false,
0.1,
1,
0.1,
1,
0,
0.9,
true
]
},
{
"id": 19,
"type": "Trellis2ExportMesh",
"pos": [
2074.10746221146,
1068.7461290181727
],
"size": [
324,
146
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"link": 84
}
],
"outputs": [
{
"name": "glb_path",
"type": "STRING",
"links": [
22
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2ExportMesh",
"widget_ue_connectable": {}
},
"widgets_values": [
"Helmet",
"glb",
true
]
},
{
"id": 42,
"type": "Trellis2SimplifyMesh",
"pos": [
1627.8357847395862,
662.87588748443
],
"size": [
324,
114
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 103
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
98
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0",
"Node name for S&R": "Trellis2SimplifyMesh",
"widget_ue_connectable": {}
},
"widgets_values": [
2000000,
"Cumesh"
]
},
{
"id": 48,
"type": "Trellis2FillHolesWithMeshlib",
"pos": [
2049.694526173582,
665.7413910219719
],
"size": [
249.28125,
71.328125
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 98
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
99
]
},
{
"name": "holes_filled",
"type": "INT",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2FillHolesWithMeshlib",
"widget_ue_connectable": {}
},
"widgets_values": []
},
{
"id": 49,
"type": "Trellis2PreProcessImage",
"pos": [
280.1418643269891,
950.2196621439567
],
"size": [
281.78125,
79.328125
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 100
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
101
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2PreProcessImage",
"widget_ue_connectable": {}
},
"widgets_values": [
25
]
},
{
"id": 50,
"type": "Trellis2Remesh",
"pos": [
1233.6238854002822,
663.1067078802098
],
"size": [
316.625,
262
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 102
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
103
]
}
],
"properties": {
"widget_ue_connectable": {},
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2Remesh"
},
"widgets_values": [
1,
0,
false,
0.03,
"1024",
true,
true
]
}
],
"links": [
[
22,
19,
0,
10,
2,
"STRING"
],
[
84,
43,
0,
19,
0,
"TRIMESH"
],
[
87,
39,
0,
45,
0,
"TRELLIS2PIPELINE"
],
[
98,
42,
0,
48,
0,
"MESHWITHVOXEL"
],
[
99,
48,
0,
43,
0,
"MESHWITHVOXEL"
],
[
100,
6,
2,
49,
0,
"IMAGE"
],
[
101,
49,
0,
45,
1,
"IMAGE"
],
[
102,
45,
0,
50,
0,
"MESHWITHVOXEL"
],
[
103,
50,
0,
42,
0,
"MESHWITHVOXEL"
]
],
"groups": [],
"config": {},
"extra": {
"workflowRendererVersion": "Vue",
"ue_links": [],
"ds": {
"scale": 0.6303940863128564,
"offset": [
17.026760146572748,
-331.5589586642717
]
},
"links_added_by_ue": [],
"frontendVersion": "1.37.11",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
-573
View File
@@ -1,573 +0,0 @@
{
"id": "440427ce-0c6a-4462-af51-639ed2f16dec",
"revision": 0,
"last_node_id": 49,
"last_link_id": 99,
"nodes": [
{
"id": 10,
"type": "Preview3D",
"pos": [
661.5378666719415,
1029.2740203054677
],
"size": [
752.25,
699.90625
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "camera_info",
"shape": 7,
"type": "LOAD3D_CAMERA",
"link": null
},
{
"name": "bg_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "model_file",
"type": "STRING",
"widget": {
"name": "model_file"
},
"link": 22
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.4.0",
"Node name for S&R": "Preview3D",
"widget_ue_connectable": {},
"Last Time Model File": "OrcShaman_OnlyMesh_00003_.glb",
"Scene Config": {
"showGrid": true,
"backgroundColor": "#282828",
"backgroundImage": "",
"backgroundRenderMode": "tiled"
},
"Camera Config": {
"cameraType": "perspective",
"fov": 35,
"state": {
"position": {
"x": -0.19116400345772733,
"y": 4.145193779904209,
"z": 8.909632339388065
},
"target": {
"x": 0,
"y": 2.5,
"z": 0
},
"zoom": 1,
"cameraType": "perspective"
}
},
"Light Config": {
"intensity": 3
}
},
"widgets_values": [
"OrcShaman_OnlyMesh_00003_.glb",
""
]
},
{
"id": 6,
"type": "Trellis2LoadImageWithTransparency",
"pos": [
89.7989861858199,
1036.3030919628422
],
"size": [
454.3125,
466.03125
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": null
},
{
"name": "mask",
"type": "MASK",
"links": null
},
{
"name": "image_with_alpha",
"type": "IMAGE",
"links": [
96
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2LoadImageWithTransparency",
"widget_ue_connectable": {}
},
"widgets_values": [
"a_stylized_orc_sorcerer_3d_game_asset.png",
"image"
]
},
{
"id": 39,
"type": "Trellis2LoadModel",
"pos": [
112.25445464990881,
579.7661445482282
],
"size": [
362.0625,
207.328125
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"links": [
79
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03",
"Node name for S&R": "Trellis2LoadModel",
"widget_ue_connectable": {}
},
"widgets_values": [
"TRELLIS.2-4B",
"flash_attn",
"cuda",
true,
false
]
},
{
"id": 43,
"type": "Trellis2MeshWithVoxelToTrimesh",
"pos": [
1583.6373860127533,
962.7784209219674
],
"size": [
347.28125,
82
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 95
}
],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
84
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0",
"Node name for S&R": "Trellis2MeshWithVoxelToTrimesh",
"widget_ue_connectable": {}
},
"widgets_values": [
"90 degrees"
]
},
{
"id": 19,
"type": "Trellis2ExportMesh",
"pos": [
1576.5891438694878,
1164.1187920527402
],
"size": [
324,
146
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"link": 84
}
],
"outputs": [
{
"name": "glb_path",
"type": "STRING",
"links": [
22
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2ExportMesh",
"widget_ue_connectable": {}
},
"widgets_values": [
"OnlyMesh",
"glb",
true
]
},
{
"id": 42,
"type": "Trellis2SimplifyMesh",
"pos": [
1596.7449927354012,
588.463447863252
],
"size": [
324,
114
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 99
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
94
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0",
"Node name for S&R": "Trellis2SimplifyMesh",
"widget_ue_connectable": {}
},
"widgets_values": [
2000000,
"Cumesh"
]
},
{
"id": 41,
"type": "Trellis2MeshWithVoxelGenerator",
"pos": [
617.6070474606216,
585.0312918725468
],
"size": [
410.71875,
386
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"link": 79
},
{
"name": "image",
"type": "IMAGE",
"link": 97
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
98
]
},
{
"name": "bvh",
"type": "BVH",
"links": []
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0",
"Node name for S&R": "Trellis2MeshWithVoxelGenerator",
"widget_ue_connectable": {}
},
"widgets_values": [
1751130007,
"fixed",
"1024_cascade",
12,
12,
12,
999999,
4,
32,
false,
true
]
},
{
"id": 47,
"type": "Trellis2FillHolesWithMeshlib",
"pos": [
1621.231560866816,
803.5976226088751
],
"size": [
249.28125,
71.328125
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 94
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
95
]
},
{
"name": "holes_filled",
"type": "INT",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2FillHolesWithMeshlib",
"widget_ue_connectable": {}
},
"widgets_values": []
},
{
"id": 48,
"type": "Trellis2PreProcessImage",
"pos": [
189.61982603636818,
863.9035513602834
],
"size": [
281.78125,
79.328125
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 96
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
97
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2PreProcessImage",
"widget_ue_connectable": {}
},
"widgets_values": [
0
]
},
{
"id": 49,
"type": "Trellis2Remesh",
"pos": [
1091.952337866758,
586.1658651292023
],
"size": [
316.625,
262
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 98
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
99
]
}
],
"properties": {
"widget_ue_connectable": {},
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a354e8c4fead5c152d58b50eae2935cb2923cd72",
"Node name for S&R": "Trellis2Remesh"
},
"widgets_values": [
1,
0,
false,
0.03,
"1024",
true,
true
]
}
],
"links": [
[
22,
19,
0,
10,
2,
"STRING"
],
[
79,
39,
0,
41,
0,
"TRELLIS2PIPELINE"
],
[
84,
43,
0,
19,
0,
"TRIMESH"
],
[
94,
42,
0,
47,
0,
"MESHWITHVOXEL"
],
[
95,
47,
0,
43,
0,
"MESHWITHVOXEL"
],
[
96,
6,
2,
48,
0,
"IMAGE"
],
[
97,
48,
0,
41,
1,
"IMAGE"
],
[
98,
41,
0,
49,
0,
"MESHWITHVOXEL"
],
[
99,
49,
0,
42,
0,
"MESHWITHVOXEL"
]
],
"groups": [],
"config": {},
"extra": {
"workflowRendererVersion": "Vue",
"ue_links": [],
"ds": {
"scale": 0.5730855330116875,
"offset": [
116.72837260075312,
-328.2481181238407
]
},
"links_added_by_ue": [],
"frontendVersion": "1.37.11",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-810
View File
@@ -1,810 +0,0 @@
{
"id": "cd6e2e00-83cc-4795-abf1-09b46428c270",
"revision": 0,
"last_node_id": 233,
"last_link_id": 480,
"nodes": [
{
"id": 226,
"type": "Trellis2LoadMesh",
"pos": [
-385.0735510204828,
158.88137472879367
],
"size": [
270,
58
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
460
]
}
],
"title": "Original Mesh",
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a5242473f68fe91d5ef0b188f8658ae0da540237",
"Node name for S&R": "Trellis2LoadMesh"
},
"widgets_values": [
""
]
},
{
"id": 119,
"type": "Trellis2PreProcessImage",
"pos": [
432.4981118440155,
-182.40504275448276
],
"size": [
281.8229166666667,
106
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 241
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
461
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "15854282a73cf231b81d52ada22e652f414a078b",
"Node name for S&R": "Trellis2PreProcessImage",
"widget_ue_connectable": {}
},
"widgets_values": [
10,
false,
1024
]
},
{
"id": 39,
"type": "Trellis2LoadModel",
"pos": [
418.8462464575081,
-492.4195525023097
],
"size": [
301.71875,
202
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"links": [
469
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03",
"Node name for S&R": "Trellis2LoadModel",
"widget_ue_connectable": {}
},
"widgets_values": [
"microsoft/TRELLIS.2-4B",
"flash_attn",
"cuda",
true,
false,
"flex_gemm",
"flash_attn"
]
},
{
"id": 227,
"type": "Trellis2ReconstructMeshWithQuad",
"pos": [
1190.2002753188488,
-496.8180011267565
],
"size": [
331.5878996659427,
142.11360851901668
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 470
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
472
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "d4d66cfc9f1ce5b1c3b9a2e504ee4b24ffad48a5",
"Node name for S&R": "Trellis2ReconstructMeshWithQuad",
"widget_ue_connectable": {}
},
"widgets_values": [
1,
1024,
true,
true
]
},
{
"id": 231,
"type": "Trellis2FillHolesWithCuMesh",
"pos": [
1203.103220151927,
-621.2330460050034
],
"size": [
312.4361328125,
58
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 474
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
470
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "dc66f263e832b103a81a021bf6cd53eec8ff28af",
"Node name for S&R": "Trellis2FillHolesWithCuMesh"
},
"widgets_values": [
1
]
},
{
"id": 229,
"type": "Trellis2SimplifyMesh",
"pos": [
1194.8431366936325,
-292.14794928709534
],
"size": [
270,
82
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 472
},
{
"name": "target_face_num",
"type": "INT",
"widget": {
"name": "target_face_num"
},
"link": 475
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
471
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "5d4c1474ceb477f40bbd6d437f7da90f3d6d9229",
"Node name for S&R": "Trellis2SimplifyMesh"
},
"widgets_values": [
500000,
"Cumesh"
]
},
{
"id": 228,
"type": "Trellis2FillHolesWithMeshlib",
"pos": [
1198.1583617137858,
-151.8665797237854
],
"size": [
249.284765625,
46
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 471
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
476
]
},
{
"name": "holes_filled",
"type": "INT",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e8098f5641702e74133c2dea0b45a13a3ab19985",
"Node name for S&R": "Trellis2FillHolesWithMeshlib"
},
"widgets_values": []
},
{
"id": 232,
"type": "Trellis2UnWrapAndRasterizer",
"pos": [
1195.383895062337,
-50.23863923208595
],
"size": [
419.15234375,
314
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 476
},
{
"name": "bvh",
"type": "BVH",
"link": 477
}
],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
478
]
},
{
"name": "base_color_texture",
"type": "IMAGE",
"links": null
},
{
"name": "metallic_roughness_texture",
"type": "IMAGE",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a5242473f68fe91d5ef0b188f8658ae0da540237",
"Node name for S&R": "Trellis2UnWrapAndRasterizer"
},
"widgets_values": [
60,
0,
1,
1,
2048,
"OPAQUE",
false,
false,
false,
"telea"
]
},
{
"id": 233,
"type": "Trellis2ExportMesh",
"pos": [
1672.6947901006665,
-49.057670650420995
],
"size": [
270,
102
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"link": 478
},
{
"name": "filename_prefix",
"type": "STRING",
"widget": {
"name": "filename_prefix"
},
"link": 479
}
],
"outputs": [
{
"name": "glb_path",
"type": "STRING",
"links": [
480
]
},
{
"name": "relative_path",
"type": "STRING",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a5242473f68fe91d5ef0b188f8658ae0da540237",
"Node name for S&R": "Trellis2ExportMesh"
},
"widgets_values": [
"3D/Trellis2",
"glb"
]
},
{
"id": 202,
"type": "Preview3D",
"pos": [
369.6388214873717,
332.92876516342716
],
"size": [
868.8731050199159,
920.1382602693357
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"name": "camera_info",
"shape": 7,
"type": "LOAD3D_CAMERA",
"link": null
},
{
"name": "bg_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "model_file",
"type": "STRING,FILE_3D_GLB,FILE_3D_GLTF,FILE_3D_FBX,FILE_3D_OBJ,FILE_3D_STL,FILE_3D_USDZ,FILE_3D",
"widget": {
"name": "model_file"
},
"link": 480
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.18.1",
"Node name for S&R": "Preview3D"
},
"widgets_values": [
"",
""
]
},
{
"id": 69,
"type": "Trellis2LoadImageWithTransparency",
"pos": [
-383.4145219550909,
310.9862093076388
],
"size": [
717.521556382955,
915.5313594325766
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": []
},
{
"name": "mask",
"type": "MASK",
"links": []
},
{
"name": "image_with_alpha",
"type": "IMAGE",
"links": [
241
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2LoadImageWithTransparency",
"widget_ue_connectable": {}
},
"widgets_values": [
"Image_1024_00101_.png",
"image"
]
},
{
"id": 203,
"type": "PrimitiveInt",
"pos": [
-379.85391723715725,
7.869022281792564
],
"size": [
270,
82
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "INT",
"type": "INT",
"links": [
475
]
}
],
"title": "Target Face Number",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.18.1",
"Node name for S&R": "PrimitiveInt"
},
"widgets_values": [
300000,
"fixed"
]
},
{
"id": 204,
"type": "PrimitiveString",
"pos": [
-388.041436029903,
-125.57562894305721
],
"size": [
270,
58
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "STRING",
"type": "STRING",
"links": [
479
]
}
],
"title": "Name",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.18.1",
"Node name for S&R": "PrimitiveString"
},
"widgets_values": [
"Tank"
]
},
{
"id": 225,
"type": "Trellis2MeshRefiner",
"pos": [
753.899038005419,
-389.13958558695583
],
"size": [
340.390625,
578
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"link": 469
},
{
"name": "trimesh",
"type": "TRIMESH",
"link": 460
},
{
"name": "image",
"type": "IMAGE",
"link": 461
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
474
]
},
{
"name": "bvh",
"type": "BVH",
"links": [
477
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a5242473f68fe91d5ef0b188f8658ae0da540237",
"Node name for S&R": "Trellis2MeshRefiner"
},
"widgets_values": [
12345,
"fixed",
1024,
12,
7.5,
0.01,
3,
12,
3,
0.01,
3,
999999,
true,
16,
0.1,
1,
0,
0.9,
true,
1,
"heun"
]
}
],
"links": [
[
241,
69,
2,
119,
0,
"IMAGE"
],
[
460,
226,
0,
225,
1,
"TRIMESH"
],
[
461,
119,
0,
225,
2,
"IMAGE"
],
[
469,
39,
0,
225,
0,
"TRELLIS2PIPELINE"
],
[
470,
231,
0,
227,
0,
"MESHWITHVOXEL"
],
[
471,
229,
0,
228,
0,
"MESHWITHVOXEL"
],
[
472,
227,
0,
229,
0,
"MESHWITHVOXEL"
],
[
474,
225,
0,
231,
0,
"MESHWITHVOXEL"
],
[
475,
203,
0,
229,
1,
"INT"
],
[
476,
228,
0,
232,
0,
"MESHWITHVOXEL"
],
[
477,
225,
1,
232,
1,
"BVH"
],
[
478,
232,
0,
233,
0,
"TRIMESH"
],
[
479,
204,
0,
233,
1,
"STRING"
],
[
480,
233,
0,
202,
2,
"STRING"
]
],
"groups": [
{
"id": 1,
"title": "Configuration",
"bounding": [
-414.5659226642583,
-213.34811694305725,
764.6855244821979,
1466.2928336195214
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 2,
"title": "Generation",
"bounding": [
374.5341225783577,
-726.2357215927766,
1820.8266085195564,
1004.7525102622308
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"workflowRendererVersion": "LG",
"ue_links": [],
"ds": {
"scale": 0.6830134553650716,
"offset": [
111.46261093344825,
859.8232012529436
]
},
"links_added_by_ue": [],
"frontendVersion": "1.42.8",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
File diff suppressed because it is too large Load Diff
-754
View File
@@ -1,754 +0,0 @@
{
"id": "cd6e2e00-83cc-4795-abf1-09b46428c270",
"revision": 0,
"last_node_id": 205,
"last_link_id": 413,
"nodes": [
{
"id": 69,
"type": "Trellis2LoadImageWithTransparency",
"pos": [
-377.72410571388025,
328.4870830026766
],
"size": [
717.521556382955,
915.5313594325766
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": []
},
{
"name": "mask",
"type": "MASK",
"links": []
},
{
"name": "image_with_alpha",
"type": "IMAGE",
"links": [
241
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e7f9b30df7a09bcedf1c955e176754c73f983254",
"Node name for S&R": "Trellis2LoadImageWithTransparency",
"widget_ue_connectable": {}
},
"widgets_values": [
"Image_1024_00101_.png",
"image"
]
},
{
"id": 119,
"type": "Trellis2PreProcessImage",
"pos": [
398.0246741688026,
149.83708875416676
],
"size": [
281.8229166666667,
106
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 241
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
391
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "15854282a73cf231b81d52ada22e652f414a078b",
"Node name for S&R": "Trellis2PreProcessImage",
"widget_ue_connectable": {}
},
"widgets_values": [
10,
false,
1024
]
},
{
"id": 39,
"type": "Trellis2LoadModel",
"pos": [
388.892170207283,
-228.80616406738957
],
"size": [
301.71875,
202
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"links": [
390
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03",
"Node name for S&R": "Trellis2LoadModel",
"widget_ue_connectable": {}
},
"widgets_values": [
"microsoft/TRELLIS.2-4B",
"flash_attn",
"cuda",
true,
false,
"flex_gemm",
"flash_attn"
]
},
{
"id": 196,
"type": "Trellis2FillHolesWithCuMesh",
"pos": [
1117.157533597802,
-362.86738879994687
],
"size": [
312.4361328125,
58
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 396
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
392
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "dc66f263e832b103a81a021bf6cd53eec8ff28af",
"Node name for S&R": "Trellis2FillHolesWithCuMesh"
},
"widgets_values": [
1
]
},
{
"id": 197,
"type": "Trellis2ReconstructMeshWithQuad",
"pos": [
1124.8153675662377,
-239.75157745064854
],
"size": [
331.5878996659427,
142.11360851901668
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 392
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
393
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "d4d66cfc9f1ce5b1c3b9a2e504ee4b24ffad48a5",
"Node name for S&R": "Trellis2ReconstructMeshWithQuad",
"widget_ue_connectable": {}
},
"widgets_values": [
1,
1024,
true,
true
]
},
{
"id": 198,
"type": "Trellis2SimplifyMesh",
"pos": [
1134.132576655357,
-43.60066335397867
],
"size": [
270,
82
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 393
},
{
"name": "target_face_num",
"type": "INT",
"widget": {
"name": "target_face_num"
},
"link": 409
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
394
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "5d4c1474ceb477f40bbd6d437f7da90f3d6d9229",
"Node name for S&R": "Trellis2SimplifyMesh"
},
"widgets_values": [
500000,
"Cumesh"
]
},
{
"id": 203,
"type": "PrimitiveInt",
"pos": [
-373.0898096413628,
163.12227474974895
],
"size": [
270,
82
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "INT",
"type": "INT",
"links": [
409
]
}
],
"title": "Target Face Number",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.18.1",
"Node name for S&R": "PrimitiveInt"
},
"widgets_values": [
300000,
"fixed"
]
},
{
"id": 204,
"type": "PrimitiveString",
"pos": [
-368.2858630795249,
34.401714106564214
],
"size": [
270,
58
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "STRING",
"type": "STRING",
"links": [
410
]
}
],
"title": "Name",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.18.1",
"Node name for S&R": "PrimitiveString"
},
"widgets_values": [
"Tank"
]
},
{
"id": 202,
"type": "Preview3D",
"pos": [
376.48890096546415,
331.2515281089069
],
"size": [
868.8731050199159,
920.1382602693357
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "camera_info",
"shape": 7,
"type": "LOAD3D_CAMERA",
"link": null
},
{
"name": "bg_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "model_file",
"type": "STRING,FILE_3D_GLB,FILE_3D_GLTF,FILE_3D_FBX,FILE_3D_OBJ,FILE_3D_STL,FILE_3D_USDZ,FILE_3D",
"widget": {
"name": "model_file"
},
"link": 398
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.18.1",
"Node name for S&R": "Preview3D"
},
"widgets_values": [
"",
""
]
},
{
"id": 199,
"type": "Trellis2FillHolesWithMeshlib",
"pos": [
1132.506716841996,
89.90828212755481
],
"size": [
249.284765625,
46
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 394
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
411
]
},
{
"name": "holes_filled",
"type": "INT",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "e8098f5641702e74133c2dea0b45a13a3ab19985",
"Node name for S&R": "Trellis2FillHolesWithMeshlib"
},
"widgets_values": []
},
{
"id": 195,
"type": "Trellis2MeshWithVoxelGenerator",
"pos": [
746.136770520365,
-107.27192057879526
],
"size": [
342.2818359375,
342
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "pipeline",
"type": "TRELLIS2PIPELINE",
"link": 390
},
{
"name": "image",
"type": "IMAGE",
"link": 391
}
],
"outputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"links": [
396
]
},
{
"name": "bvh",
"type": "BVH",
"links": [
412
]
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a5242473f68fe91d5ef0b188f8658ae0da540237",
"Node name for S&R": "Trellis2MeshWithVoxelGenerator"
},
"widgets_values": [
12345,
"fixed",
"1024_cascade",
12,
12,
12,
999999,
1,
32,
true,
true,
"euler"
]
},
{
"id": 205,
"type": "Trellis2UnWrapAndRasterizer",
"pos": [
1509.48883255403,
-231.18851954550428
],
"size": [
419.15234375,
314
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "mesh",
"type": "MESHWITHVOXEL",
"link": 411
},
{
"name": "bvh",
"type": "BVH",
"link": 412
}
],
"outputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"links": [
413
]
},
{
"name": "base_color_texture",
"type": "IMAGE",
"links": null
},
{
"name": "metallic_roughness_texture",
"type": "IMAGE",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a5242473f68fe91d5ef0b188f8658ae0da540237",
"Node name for S&R": "Trellis2UnWrapAndRasterizer"
},
"widgets_values": [
60,
0,
1,
1,
2048,
"OPAQUE",
false,
false,
false,
"telea"
]
},
{
"id": 201,
"type": "Trellis2ExportMesh",
"pos": [
1517.3851156356834,
145.96275340737535
],
"size": [
270,
102
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "trimesh",
"type": "TRIMESH",
"link": 413
},
{
"name": "filename_prefix",
"type": "STRING",
"widget": {
"name": "filename_prefix"
},
"link": 410
}
],
"outputs": [
{
"name": "glb_path",
"type": "STRING",
"links": [
398
]
},
{
"name": "relative_path",
"type": "STRING",
"links": null
}
],
"properties": {
"aux_id": "visualbruno/ComfyUI-Trellis2",
"ver": "a5242473f68fe91d5ef0b188f8658ae0da540237",
"Node name for S&R": "Trellis2ExportMesh"
},
"widgets_values": [
"3D/Trellis2",
"glb"
]
}
],
"links": [
[
241,
69,
2,
119,
0,
"IMAGE"
],
[
390,
39,
0,
195,
0,
"TRELLIS2PIPELINE"
],
[
391,
119,
0,
195,
1,
"IMAGE"
],
[
392,
196,
0,
197,
0,
"MESHWITHVOXEL"
],
[
393,
197,
0,
198,
0,
"MESHWITHVOXEL"
],
[
394,
198,
0,
199,
0,
"MESHWITHVOXEL"
],
[
396,
195,
0,
196,
0,
"MESHWITHVOXEL"
],
[
398,
201,
0,
202,
2,
"STRING"
],
[
409,
203,
0,
198,
1,
"INT"
],
[
410,
204,
0,
201,
1,
"STRING"
],
[
411,
199,
0,
205,
0,
"MESHWITHVOXEL"
],
[
412,
195,
1,
205,
1,
"BVH"
],
[
413,
205,
0,
201,
0,
"TRIMESH"
]
],
"groups": [
{
"id": 1,
"title": "Configuration",
"bounding": [
-387.72410571388025,
-53.37077389343578,
737.521556382955,
1307.389216328689
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 2,
"title": "Generation",
"bounding": [
378.892170207283,
-436.46738879994683,
1706.6665797550602,
727.1063315541132
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"workflowRendererVersion": "LG",
"ue_links": [],
"ds": {
"scale": 0.5644739300537773,
"offset": [
683.341395587175,
735.5254552429528
]
},
"links_added_by_ue": [],
"frontendVersion": "1.42.8",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
File diff suppressed because it is too large Load Diff
+821 -1
View File
@@ -1,5 +1,6 @@
import os
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision.transforms as transforms
from PIL import Image, ImageSequence, ImageOps
@@ -5609,7 +5610,816 @@ class Trellis2MaxTokensCalculator:
print(f"Error, cannot get VRAM size : {e}")
max_tokens = default_max_tokens
return (max_tokens,)
return (max_tokens,)
class Trellis2ImageCondMultiViewGenerator:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"pipeline": ("TRELLIS2PIPELINE",),
"front_image": ("IMAGE",)
},
"optional": {
"back_image": ("IMAGE",),
"left_image": ("IMAGE",),
"right_image": ("IMAGE",),
},
}
RETURN_TYPES = ("IMAGE_CONDS", "IMAGE_CONDS", "VIEWS_LIST", "TRELLIS2PIPELINE",)
RETURN_NAMES = ("conds_512", "conds_1024", "views_list", "pipeline",)
FUNCTION = "process"
CATEGORY = "Trellis2Wrapper"
OUTPUT_NODE = True
def process(self,
pipeline,
front_image,
back_image = None,
left_image = None,
right_image = None):
front_pil = tensor2pil(front_image)
# Convert optional view image tensors to PIL
back_pil = tensor2pil(back_image) if back_image is not None else None
left_pil = tensor2pil(left_image) if left_image is not None else None
right_pil = tensor2pil(right_image) if right_image is not None else None
# Collect views
views_dict = {'front': front_pil}
if back_pil is not None: views_dict['back'] = back_pil
if left_pil is not None: views_dict['left'] = left_pil
if right_pil is not None: views_dict['right'] = right_pil
views_list = list(views_dict.keys())
# Calculate conditioning per view
conds_512 = {}
conds_1024 = {}
pipeline.load_image_cond_model()
for v, img in views_dict.items():
c512 = pipeline.get_cond([img], 512)
c1024 = pipeline.get_cond([img], 1024)
conds_512[v] = c512
conds_1024[v] = c1024
if not pipeline.keep_models_loaded:
pipeline.unload_image_cond_model()
return (conds_512, conds_1024, views_list, pipeline,)
class Trellis2SparseMultiViewGenerator:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"pipeline": ("TRELLIS2PIPELINE",),
"image_conds": ("IMAGE_CONDS",),
"views_list": ("VIEWS_LIST",),
"seed": ("INT", {"default": 0, "min": 0, "max": 0x7fffffff}),
"sparse_structure_steps": ("INT",{"default":12, "min":1, "max":100},),
"sparse_structure_guidance_strength": ("FLOAT",{"default":6.50,"min":0.00,"max":99.99,"step":0.01}),
"sparse_structure_guidance_rescale": ("FLOAT",{"default":0.05,"min":0.00,"max":1.00,"step":0.01}),
"sparse_structure_rescale_t": ("FLOAT",{"default":4.00,"min":0.00,"max":9.99,"step":0.01}),
"sparse_structure_sampler": (["euler", "heun", "rk4", "rk5"], {"default": "euler"}),
"sparse_structure_resolution": ("INT", {"default":32,"min":32,"max":128,"step":4}),
"sparse_structure_guidance_interval_start": ("FLOAT",{"default":0.10,"min":0.00,"max":1.00,"step":0.01}),
"sparse_structure_guidance_interval_end": ("FLOAT",{"default":1.00,"min":0.00,"max":1.00,"step":0.01}),
"fill_holes":("BOOLEAN",{"default":True}),
"hole_iterations": ("INT",{"default":1,"min":1,"max":9,"step":1}),
"verbose": ("BOOLEAN",{"default":False}),
"dino_lock": ("FLOAT",{"default":0.00,"min":0.00,"max":1.00,"step":0.01}),
"dino_substeps": ("INT",{"default":4,"min":1,"max":99,"step":1}),
"hole_fill_algorithm": (["morphological_closing","flood_fill","remove_small_holes"],{"default":"flood_fill"}),
"dino_foundation_cap": ("FLOAT",{"default":1.00,"min":0.01,"max":1.00,"step":0.01}),
"keep_only_shell": ("BOOLEAN",{"default":True}),
"front_axis": (["z", "x"], {"default": "z"}),
"blend_temperature": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 10.0, "step": 0.1}),
},
}
RETURN_TYPES = ("COORDS", "INT", "VIEWS_LIST", "TRELLIS2PIPELINE",)
RETURN_NAMES = ("coords", "sparse_structure_resolution", "views_list", "pipeline",)
FUNCTION = "process"
CATEGORY = "Trellis2Wrapper"
OUTPUT_NODE = True
def process(self, pipeline, image_conds, views_list, seed,
# sparse
sparse_structure_steps,
sparse_structure_guidance_strength,
sparse_structure_guidance_rescale,
sparse_structure_rescale_t,
sparse_structure_sampler,
sparse_structure_resolution,
sparse_structure_guidance_interval_start,
sparse_structure_guidance_interval_end,
fill_holes,
hole_iterations,
verbose,
dino_lock,
dino_substeps,
hole_fill_algorithm,
dino_foundation_cap,
keep_only_shell,
front_axis,
blend_temperature
):
self.seed_all(seed)
sparse_structure_guidance_interval = [sparse_structure_guidance_interval_start,sparse_structure_guidance_interval_end]
sparse_structure_sampler_params = {"steps":sparse_structure_steps,"guidance_strength":sparse_structure_guidance_strength,"guidance_rescale":sparse_structure_guidance_rescale,"guidance_interval":sparse_structure_guidance_interval,"rescale_t":sparse_structure_rescale_t}
sparse_sampler_prefix = pipeline.GetSamplerName(sparse_structure_sampler)
pipeline.load_sparse_structure_model()
if pipeline.low_vram:
for v in image_conds:
image_conds[v] = pipeline._cond_to(image_conds[v], pipeline.device)
# Sample sparse structure latent
flow_model = pipeline.models['sparse_structure_flow_model']
reso = flow_model.resolution
in_channels = flow_model.in_channels
noise = torch.randn(1, in_channels, reso, reso, reso).to(pipeline.device)
sampler_class = getattr(samplers, f"Flow{sparse_sampler_prefix}MultiViewGuidanceIntervalSampler", samplers.FlowEulerMultiViewGuidanceIntervalSampler)
sampler = sampler_class(
sigma_min=1e-5,
resolution=flow_model.resolution if hasattr(flow_model, 'resolution') else flow_model[0].resolution
)
sparse_structure_sampler_params = {**pipeline.sparse_structure_sampler_params, **sparse_structure_sampler_params}
if pipeline.low_vram:
flow_model.to(pipeline.device)
z_s = sampler.sample(
flow_model,
noise,
conds=image_conds,
**sparse_structure_sampler_params,
views=views_list,
front_axis=front_axis,
blend_temperature=blend_temperature,
verbose=verbose,
dino_lock=dino_lock,
dino_substeps=dino_substeps,
dino_foundation_cap=dino_foundation_cap,
tqdm_desc="Sampling sparse structure (MultiView)",
).samples
if pipeline.low_vram:
flow_model.cpu()
pipeline._cleanup_cuda()
# Decode sparse structure latent
decoder = pipeline.models['sparse_structure_decoder']
if pipeline.low_vram:
decoder.to(pipeline.device)
# Standard decoding logic from sample_sparse_structure
decoded = decoder(z_s) > 0
if pipeline.low_vram:
decoder.cpu()
pipeline._cleanup_cuda()
# if resolution != decoded.shape[2]:
# ratio = decoded.shape[2] // resolution
# decoded = torch.nn.functional.max_pool3d(decoded.float(), ratio, ratio, 0) > 0.5
if sparse_structure_resolution != decoded.shape[2]:
if sparse_structure_resolution < decoded.shape[2]:
ratio = decoded.shape[2] // sparse_structure_resolution
decoded = torch.nn.functional.max_pool3d(decoded.float(), ratio, ratio, 0) > 0.5
else:
decoded = torch.nn.functional.interpolate(decoded.float(), size=(sparse_structure_resolution, sparse_structure_resolution, sparse_structure_resolution), mode='nearest') > 0.5
# Optionally fill holes in the sparse voxel grid using the selected algorithm
if fill_holes:
hole_structure = 1
try:
from scipy.ndimage import binary_closing, label, binary_fill_holes
arr = decoded.cpu().numpy()
if arr.ndim == 5:
arr = arr[:, 0]
closed = np.zeros_like(arr)
for b in range(arr.shape[0]):
filled = arr[b].astype(np.bool_)
inv = ~filled
labeled, num_features = label(inv)
border_mask = np.zeros_like(inv)
border_mask[0,:,:] = border_mask[-1,:,:] = 1
border_mask[:,0,:] = border_mask[:,-1,:] = 1
border_mask[:,:,0] = border_mask[:,:,-1] = 1
border_labels = np.unique(labeled[border_mask==1])
holes = np.isin(labeled, border_labels, invert=True) & (labeled > 0)
n_holes = np.unique(labeled[holes]).size
print(f"[Sparse HoleFill] Batch {b}: Found {n_holes} holes before filling.")
if hole_fill_algorithm == "morphological_closing":
closed[b] = binary_closing(arr[b], structure=np.ones((hole_structure,)*3), iterations=hole_iterations)
elif hole_fill_algorithm == "flood_fill":
# Robust structure-preserving hole filling:
# 1. Morphological closing to connect small gaps
# 2. Fill internal holes
# 3. Keep only the largest connected component
from scipy.ndimage import binary_closing, label, binary_fill_holes
# Step 1: Morphological closing (small structure, 1 iter)
closed1 = binary_closing(arr[b], structure=np.ones((hole_structure,)*3), iterations=hole_iterations)
# Step 2: Fill internal holes
filled = binary_fill_holes(closed1)
# Step 3: Keep only the largest connected component
labeled, num = label(filled)
if num > 0:
sizes = np.bincount(labeled.ravel())
sizes[0] = 0 # background
largest = sizes.argmax()
closed[b] = (labeled == largest)
else:
closed[b] = filled
elif hole_fill_algorithm == "remove_small_holes":
# Remove small holes by area (2D slices)
from skimage.morphology import remove_small_holes
# Apply per-slice (z axis)
temp = np.copy(arr[b])
for z in range(temp.shape[0]):
temp[z] = remove_small_holes(temp[z].astype(bool), area_threshold=hole_structure**2)
closed[b] = temp
else:
print(f"[Sparse HoleFill] Unknown algorithm: {hole_fill_algorithm}, skipping.")
closed[b] = arr[b]
# Count holes after filling
filled2 = closed[b].astype(np.bool_)
inv2 = ~filled2
labeled2, num_features2 = label(inv2)
border_labels2 = np.unique(labeled2[border_mask==1])
holes2 = np.isin(labeled2, border_labels2, invert=True) & (labeled2 > 0)
n_holes2 = np.unique(labeled2[holes2]).size
print(f"[Sparse HoleFill] Batch {b}: {n_holes-n_holes2} holes filled, {n_holes2} remain after filling.")
# Optionally remove deeply interior voxels, keeping surface and near-surface structure
if keep_only_shell:
from scipy.ndimage import binary_erosion
filled = closed[b].astype(np.bool_)
before_count = int(filled.sum())
struct = np.ones((3, 3, 3), dtype=bool)
# Erode twice: only voxels surviving 2 erosion passes are >=2 layers deep
# This preserves thin structures (e.g. necks with 3x3 cross-section)
eroded = binary_erosion(filled, structure=struct, border_value=0)
eroded = binary_erosion(eroded, structure=struct, border_value=0)
# Remove only deeply interior voxels (>=2 layers from any surface)
shell = filled & ~eroded
closed[b] = shell
after_count = int(shell.sum())
if verbose:
print(f"[Sparse Shell] Batch {b}: {before_count} -> {after_count} voxels (removed {before_count - after_count} deeply interior)")
decoded = torch.from_numpy(closed).to(decoded.device)
# Debug: print tensor info before extracting coordinates
if verbose:
print(f"[Sparse HoleFill] decoded shape: {decoded.shape}, dtype: {decoded.dtype}, device: {decoded.device}")
print(f"[Sparse HoleFill] decoded min: {decoded.min().item()}, max: {decoded.max().item()}, unique: {torch.unique(decoded)}")
# Safety: ensure tensor is contiguous and on CPU for argwhere
decoded = decoded.contiguous().cpu()
except ImportError:
print("[Warning] scipy or skimage not installed, skipping hole filling.")
except Exception as e:
print(f"[Warning] Hole filling failed: {e}")
try:
coords = torch.argwhere(decoded)[:, [0, 1, 2, 3]].int()
except Exception as e:
print(f"[Sparse HoleFill] Error in torch.argwhere: {e}")
raise
if verbose:
print(f"[Sparse HoleFill] coords shape: {coords.shape}, min: {coords.min(dim=0).values.tolist() if coords.numel()>0 else 'empty'}, max: {coords.max(dim=0).values.tolist() if coords.numel()>0 else 'empty'}")
if coords.numel() == 0:
raise RuntimeError("No voxels remain after hole filling/shell extraction. The mask is empty. Adjust your input, mask, or hole filling parameters.")
else:
coords = torch.argwhere(decoded)[:, [0, 2, 3, 4]].int()
coords = coords.cpu()
del decoded
del z_s
if pipeline.low_vram:
for v in image_conds:
image_conds[v] = pipeline._cond_cpu(image_conds[v])
pipeline._cleanup_cuda()
return (coords, sparse_structure_resolution, views_list, pipeline,)
def seed_all(self, seed: int = 0):
import random
"""
Set random seeds of all components.
"""
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
class Trellis2ShapeMultiViewGenerator:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"pipeline": ("TRELLIS2PIPELINE",),
"image_conds": ("IMAGE_CONDS",),
"views_list": ("VIEWS_LIST",),
"coords": ("COORDS",),
"resolution": ([512,1024],{"default":1024}),
"shape_steps": ("INT",{"default":12, "min":1, "max":100},),
"shape_guidance_strength": ("FLOAT",{"default":6.50,"min":0.00,"max":99.99,"step":0.01}),
"shape_guidance_rescale": ("FLOAT",{"default":0.05,"min":0.00,"max":1.00,"step":0.01}),
"shape_rescale_t": ("FLOAT",{"default":4.00,"min":0.00,"max":9.99,"step":0.01}),
"shape_sampler": (["euler", "heun", "rk4", "rk5"], {"default": "euler"}),
"shape_guidance_interval_start": ("FLOAT",{"default":0.10,"min":0.00,"max":1.00,"step":0.01}),
"shape_guidance_interval_end": ("FLOAT",{"default":1.00,"min":0.00,"max":1.00,"step":0.01}),
"verbose": ("BOOLEAN",{"default":False}),
"dino_lock": ("FLOAT",{"default":0.00,"min":0.00,"max":1.00,"step":0.01}),
"dino_substeps": ("INT",{"default":4,"min":1,"max":99,"step":1}),
"dino_foundation_cap": ("FLOAT",{"default":1.00,"min":0.01,"max":1.00,"step":0.01}),
"front_axis": (["z", "x"], {"default": "z"}),
"blend_temperature": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 10.0, "step": 0.1}),
},
}
RETURN_TYPES = ("SHAPE_SLAT", "INT", "VIEWS_LIST", "TRELLIS2PIPELINE",)
RETURN_NAMES = ("shape_slat", "resolution", "views_list", "pipeline",)
FUNCTION = "process"
CATEGORY = "Trellis2Wrapper"
OUTPUT_NODE = True
def process(self, pipeline, image_conds, views_list, coords, resolution,
# shape
shape_steps,
shape_guidance_strength,
shape_guidance_rescale,
shape_rescale_t,
shape_sampler,
shape_guidance_interval_start,
shape_guidance_interval_end,
verbose,
dino_lock,
dino_substeps,
dino_foundation_cap,
front_axis,
blend_temperature
):
shape_guidance_interval = [shape_guidance_interval_start, shape_guidance_interval_end]
shape_slat_sampler_params = {"steps":shape_steps,"guidance_strength":shape_guidance_strength,"guidance_rescale":shape_guidance_rescale,"guidance_interval":shape_guidance_interval,"rescale_t":shape_rescale_t}
if resolution == 512:
pipeline.load_shape_slat_flow_model_512()
shape_slat = self.sample(
pipeline, shape_sampler,
image_conds, views_list,
pipeline.models['shape_slat_flow_model_512'],
coords, shape_slat_sampler_params,
front_axis=front_axis,
blend_temperature=blend_temperature,
verbose=verbose,
dino_lock=dino_lock,
dino_substeps=dino_substeps,
dino_foundation_cap=dino_foundation_cap
)
if not pipeline.keep_models_loaded:
pipeline.unload_shape_slat_flow_model_512()
elif resolution == 1024:
pipeline.load_shape_slat_flow_model_1024()
shape_slat = self.sample(
pipeline, shape_sampler,
image_conds, views_list,
pipeline.models['shape_slat_flow_model_1024'],
coords, shape_slat_sampler_params,
front_axis=front_axis,
blend_temperature=blend_temperature,
verbose=verbose,
dino_lock=dino_lock,
dino_substeps=dino_substeps,
dino_foundation_cap=dino_foundation_cap
)
if not pipeline.keep_models_loaded:
pipeline.unload_shape_slat_flow_model_1024()
return (shape_slat, resolution, views_list, pipeline,)
def sample(
self,
pipeline,
shape_sampler,
conds: dict,
views: list,
flow_model,
coords: torch.Tensor,
sampler_params: dict = {},
front_axis: str = 'z',
blend_temperature: float = 2.0,
verbose: bool = False,
dino_lock: float = 0.00,
dino_substeps: int = 4,
dino_foundation_cap: float = 0.92
) -> SparseTensor:
if pipeline.low_vram:
for v in conds:
conds[v] = pipeline._cond_to(conds[v], pipeline.device)
coords_dev = coords.to(pipeline.device)
noise = SparseTensor(
feats=torch.randn(coords.shape[0], flow_model.in_channels, device=pipeline.device),
coords=coords_dev,
)
# sampler = samplers.FlowEulerMultiViewGuidanceIntervalSampler(
# sigma_min=1e-5,
# resolution=flow_model.resolution,
# )
sampler_class = getattr(samplers, f"Flow{shape_sampler}MultiViewGuidanceIntervalSampler", samplers.FlowEulerMultiViewGuidanceIntervalSampler)
sampler = sampler_class(
sigma_min=1e-5,
resolution=flow_model.resolution if hasattr(flow_model, 'resolution') else flow_model[0].resolution
)
sampler_params = {**pipeline.shape_slat_sampler_params, **sampler_params}
if pipeline.low_vram:
flow_model.to(pipeline.device)
slat = sampler.sample(
flow_model,
noise,
conds=conds,
**sampler_params,
views=views,
front_axis=front_axis,
blend_temperature=blend_temperature,
verbose=verbose,
dino_lock = dino_lock,
dino_substeps = dino_substeps,
dino_foundation_cap = dino_foundation_cap,
tqdm_desc="Sampling shape SLat (MultiView)",
).samples
if pipeline.low_vram:
flow_model.cpu()
pipeline._cleanup_cuda()
std = torch.tensor(pipeline.shape_slat_normalization['std'])[None].to(slat.device)
mean = torch.tensor(pipeline.shape_slat_normalization['mean'])[None].to(slat.device)
slat = slat * std + mean
del coords_dev
if pipeline.low_vram:
for v in conds:
conds[v] = pipeline._cond_cpu(conds[v])
pipeline._cleanup_cuda()
return slat
class Trellis2ShapeCascadeMultiViewGenerator:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"pipeline": ("TRELLIS2PIPELINE",),
"image_conds": ("IMAGE_CONDS",),
"views_list": ("VIEWS_LIST",),
"shape_slat": ("SHAPE_SLAT",),
"from_resolution": ("INT",),
"to_resolution": ([1024,1536,2048,2560,3072,3584,4096],{"default":1024}),
"sparse_structure_resolution": ("INT", {"default":32,"min":32,"max":128,"step":4}),
"max_num_tokens": ("INT",{"default":999999,"min":0,"max":999999}),
"shape_steps": ("INT",{"default":12, "min":1, "max":100},),
"shape_guidance_strength": ("FLOAT",{"default":6.50,"min":0.00,"max":99.99,"step":0.01}),
"shape_guidance_rescale": ("FLOAT",{"default":0.05,"min":0.00,"max":1.00,"step":0.01}),
"shape_rescale_t": ("FLOAT",{"default":4.00,"min":0.00,"max":9.99,"step":0.01}),
"shape_sampler": (["euler", "heun", "rk4", "rk5"], {"default": "euler"}),
"shape_guidance_interval_start": ("FLOAT",{"default":0.10,"min":0.00,"max":1.00,"step":0.01}),
"shape_guidance_interval_end": ("FLOAT",{"default":1.00,"min":0.00,"max":1.00,"step":0.01}),
"verbose": ("BOOLEAN",{"default":False}),
"dino_lock": ("FLOAT",{"default":0.00,"min":0.00,"max":1.00,"step":0.01}),
"dino_substeps": ("INT",{"default":4,"min":1,"max":99,"step":1}),
"dino_foundation_cap": ("FLOAT",{"default":1.00,"min":0.01,"max":1.00,"step":0.01}),
"front_axis": (["z", "x"], {"default": "z"}),
"blend_temperature": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 10.0, "step": 0.1}),
},
}
RETURN_TYPES = ("SHAPE_SLAT","INT","VIEWS_LIST", "TRELLIS2PIPELINE","INT",)
RETURN_NAMES = ("shape_slat","resolution","views_list", "pipeline","num_tokens")
FUNCTION = "process"
CATEGORY = "Trellis2Wrapper"
OUTPUT_NODE = True
def process(self, pipeline, image_conds, views_list, shape_slat, from_resolution, to_resolution, sparse_structure_resolution, max_num_tokens,
# shape
shape_steps,
shape_guidance_strength,
shape_guidance_rescale,
shape_rescale_t,
shape_sampler,
shape_guidance_interval_start,
shape_guidance_interval_end,
verbose,
dino_lock,
dino_substeps,
dino_foundation_cap,
front_axis,
blend_temperature
):
shape_guidance_interval = [shape_guidance_interval_start, shape_guidance_interval_end]
shape_slat_sampler_params = {"steps":shape_steps,"guidance_strength":shape_guidance_strength,"guidance_rescale":shape_guidance_rescale,"guidance_interval":shape_guidance_interval,"rescale_t":shape_rescale_t}
args = pipeline._pretrained_args
shape_sampler_prefix = pipeline.GetSamplerName(shape_sampler)
pipeline.load_shape_slat_flow_model_1024()
flow_model = pipeline.models['shape_slat_flow_model_1024']
sampler_class = getattr(samplers, f"Flow{shape_sampler_prefix}MultiViewGuidanceIntervalSampler", samplers.FlowEulerMultiViewGuidanceIntervalSampler)
sampler = sampler_class(
sigma_min=1e-5,
resolution=flow_model.resolution if hasattr(flow_model, 'resolution') else flow_model[0].resolution
)
pipeline.shape_slat_sampler = sampler
slat, hr_resolution, num_tokens = self.sample(pipeline, shape_slat, from_resolution, to_resolution, sparse_structure_resolution, max_num_tokens, image_conds, shape_slat_sampler_params, flow_model, verbose, dino_lock, dino_substeps, dino_foundation_cap, views_list, front_axis, blend_temperature)
if not pipeline.keep_models_loaded:
pipeline.unload_shape_slat_flow_model_1024()
return (slat, hr_resolution, views_list, pipeline, num_tokens,)
def sample(self, pipeline, slat, lr_resolution, resolution, sparse_structure_resolution, max_num_tokens, conds, sampler_params, flow_model, verbose, dino_lock, dino_substeps, dino_foundation_cap, views, front_axis, blend_temperature):
# Upsample
pipeline.load_shape_slat_decoder()
if pipeline.low_vram:
pipeline.models['shape_slat_decoder'].to(pipeline.device)
pipeline.models['shape_slat_decoder'].low_vram = True
hr_coords = pipeline.models['shape_slat_decoder'].upsample(slat, upsample_times=4)
if pipeline.low_vram:
pipeline.models['shape_slat_decoder'].cpu()
pipeline.models['shape_slat_decoder'].low_vram = False
if not pipeline.keep_models_loaded:
pipeline.unload_shape_slat_decoder()
hr_resolution = resolution
ratio = (sparse_structure_resolution / 32)
while True:
quant_coords = torch.cat([
hr_coords[:, :1],
((hr_coords[:, 1:] + 0.5) / (lr_resolution * ratio) * (hr_resolution // 16)).int(),
], dim=1)
coords = quant_coords.unique(dim=0)
num_tokens = coords.shape[0]
if num_tokens < max_num_tokens:
if hr_resolution != resolution:
print(f"Due to the limited number of tokens, the resolution is reduced to {hr_resolution}.")
print(f"Num Tokens: {num_tokens}")
break
hr_resolution -= 128
if hr_resolution < 1024 and resolution >= 1024:
print(f"Num Tokens: {num_tokens}")
hr_resolution = 1024
break
if hr_resolution < 512:
print(f"Num Tokens: {num_tokens}")
hr_resolution = 512
break
if pipeline.low_vram:
for v in conds:
conds[v] = pipeline._cond_to(conds[v], pipeline.device)
coords_dev = coords.to(pipeline.device)
# Sample structured latent
noise = SparseTensor(
feats=torch.randn(coords.shape[0], flow_model.in_channels, device=pipeline.device),
coords=coords_dev,
)
sampler_params = {**pipeline.shape_slat_sampler_params, **sampler_params}
if pipeline.low_vram:
flow_model.to(pipeline.device)
slat = pipeline.shape_slat_sampler.sample(
flow_model,
noise,
conds=conds,
**sampler_params,
views=views,
front_axis=front_axis,
blend_temperature=blend_temperature,
verbose=verbose,
dino_lock=dino_lock,
dino_substeps=dino_substeps,
dino_foundation_cap=dino_foundation_cap,
tqdm_desc="Sampling shape SLat (MultiView HR)",
).samples
if pipeline.low_vram:
flow_model.cpu()
pipeline._cleanup_cuda()
std = torch.tensor(pipeline.shape_slat_normalization['std'])[None].to(slat.device)
mean = torch.tensor(pipeline.shape_slat_normalization['mean'])[None].to(slat.device)
slat = slat * std + mean
del coords_dev
if pipeline.low_vram:
for v in conds:
conds[v] = pipeline._cond_cpu(conds[v])
pipeline._cleanup_cuda()
return slat, hr_resolution, num_tokens
class Trellis2TexSlatMultiViewGenerator:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"pipeline": ("TRELLIS2PIPELINE",),
"image_conds": ("IMAGE_CONDS",),
"views_list": ("VIEWS_LIST",),
"shape_slat": ("SHAPE_SLAT",),
"resolution": ([512,1024],{"default":1024}),
"texture_steps": ("INT",{"default":12, "min":1, "max":100},),
"texture_guidance_strength": ("FLOAT",{"default":6.50,"min":0.00,"max":99.99,"step":0.01}),
"texture_guidance_rescale": ("FLOAT",{"default":0.05,"min":0.00,"max":1.00,"step":0.01}),
"texture_rescale_t": ("FLOAT",{"default":4.00,"min":0.00,"max":9.99,"step":0.01}),
"texture_sampler": (["euler", "heun", "rk4", "rk5"], {"default": "euler"}),
"texture_guidance_interval_start": ("FLOAT",{"default":0.00,"min":0.00,"max":1.00,"step":0.01}),
"texture_guidance_interval_end": ("FLOAT",{"default":0.90,"min":0.00,"max":1.00,"step":0.01}),
"verbose": ("BOOLEAN",{"default":False}),
"dino_lock": ("FLOAT",{"default":0.00,"min":0.00,"max":1.00,"step":0.01}),
"dino_substeps": ("INT",{"default":4,"min":1,"max":99,"step":1}),
"dino_foundation_cap": ("FLOAT",{"default":1.00,"min":0.01,"max":1.00,"step":0.01}),
"front_axis": (["z", "x"], {"default": "z"}),
"blend_temperature": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 10.0, "step": 0.1}),
},
}
RETURN_TYPES = ("TEXTURE_SLAT", "VIEWS_LIST", "TRELLIS2PIPELINE",)
RETURN_NAMES = ("texture_slat", "views_list", "pipeline",)
FUNCTION = "process"
CATEGORY = "Trellis2Wrapper"
OUTPUT_NODE = True
def process(self, pipeline, image_conds, views_list, shape_slat, resolution,
# shape
texture_steps,
texture_guidance_strength,
texture_guidance_rescale,
texture_rescale_t,
texture_sampler,
texture_guidance_interval_start,
texture_guidance_interval_end,
verbose,
dino_lock,
dino_substeps,
dino_foundation_cap,
front_axis,
blend_temperature
):
texture_guidance_interval = [texture_guidance_interval_start,texture_guidance_interval_end]
tex_slat_sampler_params = {"steps":texture_steps,"guidance_strength":texture_guidance_strength,"guidance_rescale":texture_guidance_rescale,"guidance_interval":texture_guidance_interval,"rescale_t":texture_rescale_t}
if resolution == 512:
pipeline.load_tex_slat_flow_model_512()
flow_model = pipeline.models['tex_slat_flow_model_512']
else:
pipeline.load_tex_slat_flow_model_1024()
flow_model = pipeline.models['tex_slat_flow_model_1024']
tex_slat = self.sample(
pipeline,
texture_sampler,
image_conds, views_list,
shape_slat=shape_slat,
flow_model=flow_model,
sampler_params=tex_slat_sampler_params,
front_axis=front_axis,
blend_temperature=blend_temperature,
verbose=verbose,
dino_lock=dino_lock,
dino_substeps=dino_substeps,
dino_foundation_cap=dino_foundation_cap
)
if not pipeline.keep_models_loaded:
if resolution == 512:
pipeline.unload_tex_slat_flow_model_512()
else:
pipeline.unload_tex_slat_flow_model_1024()
return (tex_slat, views_list, pipeline,)
def sample(
self,
pipeline,
sampler,
conds: dict,
views: list,
shape_slat: SparseTensor,
flow_model,
sampler_params: dict = {},
front_axis: str = 'z',
blend_temperature: float = 2.0,
verbose: bool = False,
dino_lock: float = 0.00,
dino_substeps: int = 4,
dino_foundation_cap: float = 0.92
) -> SparseTensor:
"""
Sample structured latent for texture with multi-view blending.
"""
if pipeline.low_vram:
for v in conds:
conds[v] = pipeline._cond_to(conds[v], pipeline.device)
# Normalize shape slat for conditioning
std = torch.tensor(pipeline.shape_slat_normalization['std'])[None].to(shape_slat.device)
mean = torch.tensor(pipeline.shape_slat_normalization['mean'])[None].to(shape_slat.device)
shape_slat_normalized = (shape_slat - mean) / std
#coords = shape_slat.coords
#coords_dev = coords.to(pipeline.device)
# Calculate noise channels: total input - concat cond channels
in_channels = flow_model.in_channels if isinstance(flow_model, nn.Module) else flow_model[0].in_channels
noise_channels = in_channels - shape_slat.feats.shape[1]
# noise = SparseTensor(
# feats=torch.randn(coords.shape[0], noise_channels, device=pipeline.device),
# coords=coords_dev,
# )
noise = shape_slat.replace(feats=torch.randn(shape_slat.coords.shape[0], in_channels - shape_slat.feats.shape[1]).to(pipeline.device))
sampler_params = {**pipeline.tex_slat_sampler_params, **sampler_params}
# sampler = samplers.FlowEulerMultiViewGuidanceIntervalSampler(
# sigma_min=1e-5,
# resolution=flow_model.resolution,
# )
tex_sampler_prefix = pipeline.GetSamplerName(sampler)
sampler_class = getattr(samplers, f"Flow{tex_sampler_prefix}MultiViewGuidanceIntervalSampler", samplers.FlowEulerMultiViewGuidanceIntervalSampler)
sampler = sampler_class(
sigma_min=1e-5,
resolution=flow_model.resolution if hasattr(flow_model, 'resolution') else flow_model[0].resolution
)
if pipeline.low_vram:
flow_model.to(pipeline.device)
slat = sampler.sample(
flow_model,
noise,
conds=conds,
**sampler_params,
views=views,
front_axis=front_axis,
blend_temperature=blend_temperature,
concat_cond=shape_slat_normalized,
verbose=verbose,
dino_lock=dino_lock,
dino_substeps=dino_substeps,
dino_foundation_cap=dino_foundation_cap,
tqdm_desc="Sampling texture SLat (MultiView)",
).samples
if pipeline.low_vram:
flow_model.cpu()
pipeline._cleanup_cuda()
std = torch.tensor(pipeline.tex_slat_normalization['std'])[None].to(slat.device)
mean = torch.tensor(pipeline.tex_slat_normalization['mean'])[None].to(slat.device)
slat = slat * std + mean
#del coords_dev
if pipeline.low_vram:
for v in conds:
conds[v] = pipeline._cond_cpu(conds[v])
pipeline._cleanup_cuda()
return slat
NODE_CLASS_MAPPINGS = {
"Trellis2LoadModel": Trellis2LoadModel,
@@ -5671,6 +6481,11 @@ NODE_CLASS_MAPPINGS = {
"Trellis2ExtractImagesFromVideo": Trellis2ExtractImagesFromVideo,
"Trellis2MaxTokensCalculator": Trellis2MaxTokensCalculator,
"Trellis2FillHolesNicelyWithMeshlib": Trellis2FillHolesNicelyWithMeshlib,
"Trellis2SparseMultiViewGenerator": Trellis2SparseMultiViewGenerator,
"Trellis2ImageCondMultiViewGenerator": Trellis2ImageCondMultiViewGenerator,
"Trellis2ShapeMultiViewGenerator": Trellis2ShapeMultiViewGenerator,
"Trellis2ShapeCascadeMultiViewGenerator": Trellis2ShapeCascadeMultiViewGenerator,
"Trellis2TexSlatMultiViewGenerator": Trellis2TexSlatMultiViewGenerator,
}
@@ -5734,4 +6549,9 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"Trellis2ExtractImagesFromVideo": "Trellis2 - Extract Images from Video",
"Trellis2MaxTokensCalculator": "Trellis2 - Max Tokens Calculator",
"Trellis2FillHolesNicelyWithMeshlib": "Trellis2 - Fill Holes Nicely With Meshlib",
"Trellis2SparseMultiViewGenerator": "Trellis2 - Sparse MultiView Generator",
"Trellis2ImageCondMultiViewGenerator": "Trellis2 - ImageCond MultiView Generator",
"Trellis2ShapeMultiViewGenerator": "Trellis2 - Shape MultiView Generator",
"Trellis2ShapeCascadeMultiViewGenerator": "Trellis2 - Shape Cascade MultiView Generator",
"Trellis2TexSlatMultiViewGenerator": "Trellis2 - Tex Slat MultiView Generator",
}
+5 -2
View File
@@ -164,7 +164,7 @@ class DinoLockMixin:
tqdm_desc: str = "Sampling",
dino_lock: float = 0.0,
dino_substeps: int = 4,
dino_foundation_cap: float = 0.92,
dino_foundation_cap: float = 0.92,
**kwargs
):
# Strip keys that must not reach the model
@@ -183,7 +183,10 @@ class DinoLockMixin:
**kwargs)
if dino_lock <= 0.0:
return super().sample(model, noise, cond, steps, rescale_t, verbose,
return super().sample(model, noise, cond,
steps = steps,
rescale_t = rescale_t,
verbose = verbose,
tqdm_desc=tqdm_desc,
neg_cond=neg_cond,
guidance_strength=guidance_strength,