diff --git a/example_workflows/Advanced.json b/example_workflows/Advanced.json index 73fc808..1313f41 100644 --- a/example_workflows/Advanced.json +++ b/example_workflows/Advanced.json @@ -1,8 +1,8 @@ { "id": "440427ce-0c6a-4462-af51-639ed2f16dec", "revision": 0, - "last_node_id": 40, - "last_link_id": 78, + "last_node_id": 41, + "last_link_id": 80, "nodes": [ { "id": 39, @@ -13,7 +13,7 @@ ], "size": [ 301.7261859434295, - 90.65259616638991 + 130 ], "flags": {}, "order": 0, @@ -36,7 +36,9 @@ }, "widgets_values": [ "TRELLIS.2-4B", - "flash_attn" + "flash_attn", + "cuda", + true ] }, { @@ -84,19 +86,173 @@ "image" ] }, + { + "id": 40, + "type": "Trellis2MeshWithVoxelAdvancedGenerator", + "pos": [ + 555.1619459582687, + 700.5135710436982 + ], + "size": [ + 413.1841796875, + 438 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "pipeline", + "type": "TRELLIS2PIPELINE", + "link": 75 + }, + { + "name": "image", + "type": "IMAGE", + "link": 76 + } + ], + "outputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "links": [ + 79 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "022090e3d6df179ab463d33da445e57ba3891211", + "Node name for S&R": "Trellis2MeshWithVoxelAdvancedGenerator", + "widget_ue_connectable": {} + }, + "widgets_values": [ + 723525328, + "randomize", + "1024_cascade", + 12, + 7.5, + 0.7, + 5, + 12, + 7.5, + 0.5, + 3, + 12, + 7.5, + 0.5, + 3, + 100000 + ] + }, + { + "id": 41, + "type": "Trellis2SimplifyMesh", + "pos": [ + 873.1780893119785, + 547.9097136148278 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "link": 79 + } + ], + "outputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "links": [ + 80 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "7b7c73f87eb65a3ff1fd5c28bdd7d097e57eb9dc", + "widget_ue_connectable": {}, + "Node name for S&R": "Trellis2SimplifyMesh" + }, + "widgets_values": [ + 5000000, + "Meshlib" + ] + }, + { + "id": 38, + "type": "Trellis2PostProcessAndUnWrapAndRasterizer", + "pos": [ + 997.3126942209559, + 703.70828486086 + ], + "size": [ + 419.15234375, + 370 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "link": 80 + } + ], + "outputs": [ + { + "name": "trimesh", + "type": "TRIMESH", + "links": [ + 73 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03", + "Node name for S&R": "Trellis2PostProcessAndUnWrapAndRasterizer", + "widget_ue_connectable": {} + }, + "widgets_values": [ + 90, + 0, + 1, + 1, + 2048, + true, + 1, + 0, + 1000000, + "Meshlib", + true, + 0.03, + "OPAQUE", + "Auto" + ] + }, { "id": 19, "type": "Trellis2ExportMesh", "pos": [ - 1445.610740061347, - 502.94502603344927 + 1360.0462953298393, + 514.4818209219691 ], "size": [ 270, 106 ], "flags": {}, - "order": 4, + "order": 5, "mode": 0, "inputs": [ { @@ -130,15 +286,15 @@ "id": 10, "type": "Preview3D", "pos": [ - 1550.8319924776888, - 699.2361408227106 + 1457.5762924746616, + 705.9659231712205 ], "size": [ 626.8865556299502, 658.2643216794061 ], "flags": {}, - "order": 5, + "order": 6, "mode": 0, "inputs": [ { @@ -201,118 +357,6 @@ "Home_2K_00001_.glb", "" ] - }, - { - "id": 38, - "type": "Trellis2PostProcessAndUnWrapAndRasterizer", - "pos": [ - 1052.1124699414247, - 699.8626572251001 - ], - "size": [ - 419.15234375, - 346 - ], - "flags": {}, - "order": 3, - "mode": 0, - "inputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "link": 78 - } - ], - "outputs": [ - { - "name": "trimesh", - "type": "TRIMESH", - "links": [ - 73 - ] - } - ], - "properties": { - "aux_id": "visualbruno/ComfyUI-Trellis2", - "ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03", - "Node name for S&R": "Trellis2PostProcessAndUnWrapAndRasterizer", - "widget_ue_connectable": {} - }, - "widgets_values": [ - 90, - 0, - 1, - 1, - 2048, - true, - 1, - 0, - 1000000, - "Meshlib", - true, - 0.03, - "OPAQUE" - ] - }, - { - "id": 40, - "type": "Trellis2MeshWithVoxelAdvancedGenerator", - "pos": [ - 555.1619459582687, - 700.5135710436982 - ], - "size": [ - 413.1841796875, - 438 - ], - "flags": {}, - "order": 2, - "mode": 0, - "inputs": [ - { - "name": "pipeline", - "type": "TRELLIS2PIPELINE", - "link": 75 - }, - { - "name": "image", - "type": "IMAGE", - "link": 76 - } - ], - "outputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "links": [ - 78 - ] - } - ], - "properties": { - "aux_id": "visualbruno/ComfyUI-Trellis2", - "ver": "022090e3d6df179ab463d33da445e57ba3891211", - "Node name for S&R": "Trellis2MeshWithVoxelAdvancedGenerator", - "widget_ue_connectable": {} - }, - "widgets_values": [ - 723525328, - "randomize", - "1024_cascade", - 12, - 7.5, - 0.7, - 5, - 12, - 7.5, - 0.5, - 3, - 12, - 7.5, - 0.5, - 3, - 100000 - ] } ], "links": [ @@ -349,9 +393,17 @@ "IMAGE" ], [ - 78, + 79, 40, 0, + 41, + 0, + "MESHWITHVOXEL" + ], + [ + 80, + 41, + 0, 38, 0, "MESHWITHVOXEL" @@ -365,8 +417,8 @@ "ds": { "scale": 0.6934334949441419, "offset": [ - 33.42173835045634, - -244.1074188775531 + 46.88139106623601, + -242.18464906905308 ] }, "links_added_by_ue": [], diff --git a/example_workflows/Only_Mesh_Advanced.json b/example_workflows/Only_Mesh_Advanced.json index 8c121b6..1cd0376 100644 --- a/example_workflows/Only_Mesh_Advanced.json +++ b/example_workflows/Only_Mesh_Advanced.json @@ -1,57 +1,142 @@ { "id": "440427ce-0c6a-4462-af51-639ed2f16dec", "revision": 0, - "last_node_id": 45, - "last_link_id": 89, + "last_node_id": 47, + "last_link_id": 95, "nodes": [ { - "id": 43, - "type": "Trellis2MeshWithVoxelToTrimesh", + "id": 39, + "type": "Trellis2LoadModel", "pos": [ - 1737.4763650560913, - 612.3235144153165 + 172.34044277137122, + 635.2670381050675 ], "size": [ - 289.41171875, - 26 + 301.7261859434295, + 130 ], "flags": {}, - "order": 5, + "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 + ] + }, + { + "id": 6, + "type": "Trellis2LoadImageWithTransparency", + "pos": [ + 134.7157262503816, + 834.9720915725163 + ], + "size": [ + 378.59551697974155, + 463.3598024362732 + ], + "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": [ + 88 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "e7f9b30df7a09bcedf1c955e176754c73f983254", + "Node name for S&R": "Trellis2LoadImageWithTransparency", + "widget_ue_connectable": {} + }, + "widgets_values": [ + "Image_2048_00002_.png", + "image" + ] + }, + { + "id": 47, + "type": "Trellis2SimplifyMesh", + "pos": [ + 866.4482629540897, + 386.39471720369016 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 3, "mode": 0, "inputs": [ { "name": "mesh", "type": "MESHWITHVOXEL", - "link": 83 + "link": 93 } ], "outputs": [ { - "name": "trimesh", - "type": "TRIMESH", + "name": "mesh", + "type": "MESHWITHVOXEL", "links": [ - 84 + 95 ] } ], "properties": { "aux_id": "visualbruno/ComfyUI-Trellis2", "ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0", - "Node name for S&R": "Trellis2MeshWithVoxelToTrimesh", - "widget_ue_connectable": {} + "widget_ue_connectable": {}, + "Node name for S&R": "Trellis2SimplifyMesh" }, - "widgets_values": [] + "widgets_values": [ + 5000000, + "Meshlib" + ] }, { - "id": 42, - "type": "Trellis2SimplifyMesh", + "id": 46, + "type": "Trellis2Remesh", "pos": [ - 1357.7233866110491, - 681.5441957276756 + 1000.0828330856959, + 557.5238047089168 ], "size": [ - 270, - 82 + 316.630859375, + 154 ], "flags": {}, "order": 4, @@ -60,7 +145,51 @@ { "name": "mesh", "type": "MESHWITHVOXEL", - "link": 86 + "link": 95 + } + ], + "outputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "links": [ + 92 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "7b7c73f87eb65a3ff1fd5c28bdd7d097e57eb9dc", + "widget_ue_connectable": {}, + "Node name for S&R": "Trellis2Remesh" + }, + "widgets_values": [ + 1, + 0, + true, + 0.03, + "Auto" + ] + }, + { + "id": 42, + "type": "Trellis2SimplifyMesh", + "pos": [ + 1351.9548131292695, + 558.4851235990978 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "link": 92 } ], "outputs": [ @@ -83,63 +212,19 @@ "Meshlib" ] }, - { - "id": 44, - "type": "Trellis2PostProcessMesh", - "pos": [ - 1018.3493663133462, - 680.5829868609449 - ], - "size": [ - 303.833984375, - 154 - ], - "flags": {}, - "order": 3, - "mode": 0, - "inputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "link": 89 - } - ], - "outputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "links": [ - 86 - ] - } - ], - "properties": { - "aux_id": "visualbruno/ComfyUI-Trellis2", - "ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0", - "Node name for S&R": "Trellis2PostProcessMesh", - "widget_ue_connectable": {} - }, - "widgets_values": [ - true, - 1, - 0, - true, - 0.03 - ] - }, { "id": 10, "type": "Preview3D", "pos": [ - 1114.3566445411961, - 898.2458966590575 + 1009.5641496496474, + 763.6500296419599 ], "size": [ 626.8865556299502, 658.2643216794061 ], "flags": {}, - "order": 7, + "order": 8, "mode": 0, "inputs": [ { @@ -203,19 +288,57 @@ "" ] }, + { + "id": 43, + "type": "Trellis2MeshWithVoxelToTrimesh", + "pos": [ + 1648.0662046700654, + 567.1377197654879 + ], + "size": [ + 336.5202391989493, + 26 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "link": 83 + } + ], + "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": [] + }, { "id": 19, "type": "Trellis2ExportMesh", "pos": [ - 1763.834116428031, - 704.8389365825459 + 1678.2694956590033, + 644.2707634178166 ], "size": [ 270, 106 ], "flags": {}, - "order": 6, + "order": 7, "mode": 0, "inputs": [ { @@ -245,92 +368,12 @@ true ] }, - { - "id": 39, - "type": "Trellis2LoadModel", - "pos": [ - 172.34044277137122, - 635.2670381050675 - ], - "size": [ - 301.7261859434295, - 90.65259616638991 - ], - "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" - ] - }, - { - "id": 6, - "type": "Trellis2LoadImageWithTransparency", - "pos": [ - 134.7157262503816, - 834.9720915725163 - ], - "size": [ - 378.59551697974155, - 463.3598024362732 - ], - "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": [ - 88 - ] - } - ], - "properties": { - "aux_id": "visualbruno/ComfyUI-Trellis2", - "ver": "e7f9b30df7a09bcedf1c955e176754c73f983254", - "Node name for S&R": "Trellis2LoadImageWithTransparency", - "widget_ue_connectable": {} - }, - "widgets_values": [ - "Image_2048_00002_.png", - "image" - ] - }, { "id": 45, "type": "Trellis2MeshWithVoxelAdvancedGenerator", "pos": [ - 571.2986524019634, - 681.544283746436 + 561.6847153407034, + 553.6781550684681 ], "size": [ 413.1841796875, @@ -356,15 +399,15 @@ "name": "mesh", "type": "MESHWITHVOXEL", "links": [ - 89 + 93 ] } ], "properties": { "aux_id": "visualbruno/ComfyUI-Trellis2", "ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0", - "widget_ue_connectable": {}, - "Node name for S&R": "Trellis2MeshWithVoxelAdvancedGenerator" + "Node name for S&R": "Trellis2MeshWithVoxelAdvancedGenerator", + "widget_ue_connectable": {} }, "widgets_values": [ 0, @@ -411,14 +454,6 @@ 0, "TRIMESH" ], - [ - 86, - 44, - 0, - 42, - 0, - "MESHWITHVOXEL" - ], [ 87, 39, @@ -436,10 +471,26 @@ "IMAGE" ], [ - 89, + 92, + 46, + 0, + 42, + 0, + "MESHWITHVOXEL" + ], + [ + 93, 45, 0, - 44, + 47, + 0, + "MESHWITHVOXEL" + ], + [ + 95, + 47, + 0, + 46, 0, "MESHWITHVOXEL" ] @@ -452,8 +503,8 @@ "ds": { "scale": 0.6934334949441419, "offset": [ - 27.65334090619644, - -339.286108735981 + 16.116546017676637, + -239.3006263844426 ] }, "links_added_by_ue": [], diff --git a/example_workflows/Only_Mesh_Simple.json b/example_workflows/Only_Mesh_Simple.json index ecfa6d5..4745700 100644 --- a/example_workflows/Only_Mesh_Simple.json +++ b/example_workflows/Only_Mesh_Simple.json @@ -1,231 +1,22 @@ { "id": "440427ce-0c6a-4462-af51-639ed2f16dec", "revision": 0, - "last_node_id": 44, - "last_link_id": 86, + "last_node_id": 46, + "last_link_id": 91, "nodes": [ - { - "id": 39, - "type": "Trellis2LoadModel", - "pos": [ - 172.34044277137122, - 635.2670381050675 - ], - "size": [ - 301.7261859434295, - 90.65259616638991 - ], - "flags": {}, - "order": 0, - "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" - ] - }, - { - "id": 41, - "type": "Trellis2MeshWithVoxelGenerator", - "pos": [ - 625.1369992088025, - 700.7722458877151 - ], - "size": [ - 342.2818359375, - 222 - ], - "flags": {}, - "order": 2, - "mode": 0, - "inputs": [ - { - "name": "pipeline", - "type": "TRELLIS2PIPELINE", - "link": 79 - }, - { - "name": "image", - "type": "IMAGE", - "link": 80 - } - ], - "outputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "links": [ - 85 - ] - } - ], - "properties": { - "aux_id": "visualbruno/ComfyUI-Trellis2", - "ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0", - "Node name for S&R": "Trellis2MeshWithVoxelGenerator", - "widget_ue_connectable": {} - }, - "widgets_values": [ - 1903714208, - "randomize", - "1024_cascade", - 12, - 12, - 12, - 60000 - ] - }, - { - "id": 43, - "type": "Trellis2MeshWithVoxelToTrimesh", - "pos": [ - 1737.4763650560913, - 612.3235144153165 - ], - "size": [ - 289.41171875, - 26 - ], - "flags": {}, - "order": 5, - "mode": 0, - "inputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "link": 83 - } - ], - "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": [] - }, - { - "id": 42, - "type": "Trellis2SimplifyMesh", - "pos": [ - 1357.7233866110491, - 681.5441957276756 - ], - "size": [ - 270, - 82 - ], - "flags": {}, - "order": 4, - "mode": 0, - "inputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "link": 86 - } - ], - "outputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "links": [ - 83 - ] - } - ], - "properties": { - "aux_id": "visualbruno/ComfyUI-Trellis2", - "ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0", - "Node name for S&R": "Trellis2SimplifyMesh", - "widget_ue_connectable": {} - }, - "widgets_values": [ - 1000000, - "Meshlib" - ] - }, - { - "id": 44, - "type": "Trellis2PostProcessMesh", - "pos": [ - 1018.3493663133462, - 680.5829868609449 - ], - "size": [ - 303.833984375, - 154 - ], - "flags": {}, - "order": 3, - "mode": 0, - "inputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "link": 85 - } - ], - "outputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "links": [ - 86 - ] - } - ], - "properties": { - "aux_id": "visualbruno/ComfyUI-Trellis2", - "ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0", - "Node name for S&R": "Trellis2PostProcessMesh", - "widget_ue_connectable": {} - }, - "widgets_values": [ - true, - 1, - 0, - true, - 0.03 - ] - }, { "id": 10, "type": "Preview3D", "pos": [ - 1114.3566445411961, - 898.2458966590575 + 591.355422959564, + 842.4847360343381 ], "size": [ 626.8865556299502, 658.2643216794061 ], "flags": {}, - "order": 7, + "order": 8, "mode": 0, "inputs": [ { @@ -255,7 +46,7 @@ "ver": "0.4.0", "Node name for S&R": "Preview3D", "widget_ue_connectable": {}, - "Last Time Model File": "Cyborg_NoTexture_00001_.glb", + "Last Time Model File": "OrcShaman_OnlyMesh_00003_.glb", "Scene Config": { "showGrid": true, "backgroundColor": "#282828", @@ -267,9 +58,9 @@ "fov": 35, "state": { "position": { - "x": 2.100849689958477, - "y": 3.0394995290713793, - "z": 11.18496965925252 + "x": -0.19116400345772733, + "y": 4.145193779904209, + "z": 8.909632339388065 }, "target": { "x": 0, @@ -285,7 +76,7 @@ } }, "widgets_values": [ - "Cyborg_NoTexture_00001_.glb", + "OrcShaman_OnlyMesh_00003_.glb", "" ] }, @@ -294,14 +85,14 @@ "type": "Trellis2LoadImageWithTransparency", "pos": [ 134.7157262503816, - 834.9720915725163 + 886.8876685708556 ], "size": [ 378.59551697974155, 463.3598024362732 ], "flags": {}, - "order": 1, + "order": 0, "mode": 0, "inputs": [], "outputs": [ @@ -330,23 +121,98 @@ "widget_ue_connectable": {} }, "widgets_values": [ - "Image_2048_00002_.png", + "a_stylized_orc_sorcerer_3d_game_asset.png", "image" ] }, + { + "id": 39, + "type": "Trellis2LoadModel", + "pos": [ + 205.0280576284307, + 686.2212301991564 + ], + "size": [ + 301.7261859434295, + 130 + ], + "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 + ] + }, + { + "id": 43, + "type": "Trellis2MeshWithVoxelToTrimesh", + "pos": [ + 1321.1903201557482, + 699.8108609834646 + ], + "size": [ + 289.41171875, + 26 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "link": 83 + } + ], + "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": [] + }, { "id": 19, "type": "Trellis2ExportMesh", "pos": [ - 1763.834116428031, - 704.8389365825459 + 1316.7833144978897, + 782.7123460894339 ], "size": [ 270, 106 ], "flags": {}, - "order": 6, + "order": 7, "mode": 0, "inputs": [ { @@ -371,10 +237,187 @@ "widget_ue_connectable": {} }, "widgets_values": [ - "Cyborg_NoTexture", + "OrcShaman_OnlyMesh", "glb", true ] + }, + { + "id": 42, + "type": "Trellis2SimplifyMesh", + "pos": [ + 1320.2288912421195, + 554.6394079445778 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "link": 89 + } + ], + "outputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "links": [ + 83 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0", + "Node name for S&R": "Trellis2SimplifyMesh", + "widget_ue_connectable": {} + }, + "widgets_values": [ + 1000000, + "Meshlib" + ] + }, + { + "id": 41, + "type": "Trellis2MeshWithVoxelGenerator", + "pos": [ + 586.6809869074832, + 548.871098519077 + ], + "size": [ + 342.2818359375, + 222 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "pipeline", + "type": "TRELLIS2PIPELINE", + "link": 79 + }, + { + "name": "image", + "type": "IMAGE", + "link": 80 + } + ], + "outputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "links": [ + 90 + ] + } + ], + "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, + 60000 + ] + }, + { + "id": 45, + "type": "Trellis2Remesh", + "pos": [ + 963.5497666303972, + 551.7554072646574 + ], + "size": [ + 303.833984375, + 154 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "link": 91 + } + ], + "outputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "links": [ + 89 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "7b7c73f87eb65a3ff1fd5c28bdd7d097e57eb9dc", + "Node name for S&R": "Trellis2Remesh", + "widget_ue_connectable": {} + }, + "widgets_values": [ + 1, + 0, + true, + 0.03, + "Auto" + ] + }, + { + "id": 46, + "type": "Trellis2SimplifyMesh", + "pos": [ + 823.1853261315196, + 404.66131644540985 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "link": 90 + } + ], + "outputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "links": [ + 91 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0", + "Node name for S&R": "Trellis2SimplifyMesh", + "widget_ue_connectable": {} + }, + "widgets_values": [ + 5000000, + "Meshlib" + ] } ], "links": [ @@ -419,18 +462,26 @@ "TRIMESH" ], [ - 85, - 41, + 89, + 45, 0, - 44, + 42, 0, "MESHWITHVOXEL" ], [ - 86, - 44, + 90, + 41, 0, - 42, + 46, + 0, + "MESHWITHVOXEL" + ], + [ + 91, + 46, + 0, + 45, 0, "MESHWITHVOXEL" ] @@ -443,8 +494,8 @@ "ds": { "scale": 0.6934334949441419, "offset": [ - 27.65334090619644, - -339.286108735981 + 61.30242868626569, + -266.21968976441246 ] }, "links_added_by_ue": [], diff --git a/example_workflows/Simple.json b/example_workflows/Simple.json index cdc3fb6..556e115 100644 --- a/example_workflows/Simple.json +++ b/example_workflows/Simple.json @@ -1,22 +1,249 @@ { "id": "440427ce-0c6a-4462-af51-639ed2f16dec", "revision": 0, - "last_node_id": 41, - "last_link_id": 81, + "last_node_id": 42, + "last_link_id": 83, "nodes": [ + { + "id": 6, + "type": "Trellis2LoadImageWithTransparency", + "pos": [ + 134.7157262503816, + 834.9720915725163 + ], + "size": [ + 378.59551697974155, + 463.3598024362732 + ], + "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": [ + 80 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "e7f9b30df7a09bcedf1c955e176754c73f983254", + "Node name for S&R": "Trellis2LoadImageWithTransparency", + "widget_ue_connectable": {} + }, + "widgets_values": [ + "Image_04291_.png", + "image" + ] + }, + { + "id": 39, + "type": "Trellis2LoadModel", + "pos": [ + 181.9544238420111, + 635.2670381050675 + ], + "size": [ + 301.7261859434295, + 130 + ], + "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 + ] + }, + { + "id": 42, + "type": "Trellis2SimplifyMesh", + "pos": [ + 780.8837302038206, + 544.0641299884478 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "link": 82 + } + ], + "outputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "links": [ + 83 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "7b7c73f87eb65a3ff1fd5c28bdd7d097e57eb9dc", + "widget_ue_connectable": {}, + "Node name for S&R": "Trellis2SimplifyMesh" + }, + "widgets_values": [ + 5000000, + "Meshlib" + ] + }, + { + "id": 38, + "type": "Trellis2PostProcessAndUnWrapAndRasterizer", + "pos": [ + 928.0919248898376, + 696.0170735987202 + ], + "size": [ + 419.15234375, + 370 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "link": 83 + } + ], + "outputs": [ + { + "name": "trimesh", + "type": "TRIMESH", + "links": [ + 73 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03", + "Node name for S&R": "Trellis2PostProcessAndUnWrapAndRasterizer", + "widget_ue_connectable": {} + }, + "widgets_values": [ + 90, + 0, + 1, + 1, + 2048, + true, + 1, + 0, + 1000000, + "Meshlib", + true, + 0.03, + "OPAQUE", + "Auto" + ] + }, + { + "id": 41, + "type": "Trellis2MeshWithVoxelGenerator", + "pos": [ + 559.7618575134443, + 695.0038484434552 + ], + "size": [ + 342.2818359375, + 222 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "pipeline", + "type": "TRELLIS2PIPELINE", + "link": 79 + }, + { + "name": "image", + "type": "IMAGE", + "link": 80 + } + ], + "outputs": [ + { + "name": "mesh", + "type": "MESHWITHVOXEL", + "links": [ + 82 + ] + } + ], + "properties": { + "aux_id": "visualbruno/ComfyUI-Trellis2", + "ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0", + "Node name for S&R": "Trellis2MeshWithVoxelGenerator", + "widget_ue_connectable": {} + }, + "widgets_values": [ + 0, + "randomize", + "1024_cascade", + 12, + 12, + 12, + 49152 + ] + }, { "id": 19, "type": "Trellis2ExportMesh", "pos": [ - 1445.610740061347, - 502.94502603344927 + 1258.1376470853816, + 507.7520825828392 ], "size": [ 270, 106 ], "flags": {}, - "order": 4, + "order": 5, "mode": 0, "inputs": [ { @@ -50,15 +277,15 @@ "id": 10, "type": "Preview3D", "pos": [ - 1550.8319924776888, - 699.2361408227106 + 1374.8958704277616, + 691.5449295605706 ], "size": [ 626.8865556299502, 658.2643216794061 ], "flags": {}, - "order": 5, + "order": 6, "mode": 0, "inputs": [ { @@ -121,189 +348,6 @@ "Home_2K_00001_.glb", "" ] - }, - { - "id": 38, - "type": "Trellis2PostProcessAndUnWrapAndRasterizer", - "pos": [ - 1052.1124699414247, - 699.8626572251001 - ], - "size": [ - 419.15234375, - 346 - ], - "flags": {}, - "order": 3, - "mode": 0, - "inputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "link": 81 - } - ], - "outputs": [ - { - "name": "trimesh", - "type": "TRIMESH", - "links": [ - 73 - ] - } - ], - "properties": { - "aux_id": "visualbruno/ComfyUI-Trellis2", - "ver": "c5d66aa46bf1bbf903fd4fe9ff086ac774bb7e03", - "Node name for S&R": "Trellis2PostProcessAndUnWrapAndRasterizer", - "widget_ue_connectable": {} - }, - "widgets_values": [ - 90, - 0, - 1, - 1, - 2048, - true, - 1, - 0, - 1000000, - "Meshlib", - true, - 0.03, - "OPAQUE" - ] - }, - { - "id": 39, - "type": "Trellis2LoadModel", - "pos": [ - 172.34044277137122, - 635.2670381050675 - ], - "size": [ - 301.7261859434295, - 90.65259616638991 - ], - "flags": {}, - "order": 0, - "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" - ] - }, - { - "id": 6, - "type": "Trellis2LoadImageWithTransparency", - "pos": [ - 134.7157262503816, - 834.9720915725163 - ], - "size": [ - 378.59551697974155, - 463.3598024362732 - ], - "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": [ - 80 - ] - } - ], - "properties": { - "aux_id": "visualbruno/ComfyUI-Trellis2", - "ver": "e7f9b30df7a09bcedf1c955e176754c73f983254", - "Node name for S&R": "Trellis2LoadImageWithTransparency", - "widget_ue_connectable": {} - }, - "widgets_values": [ - "Image_04291_.png", - "image" - ] - }, - { - "id": 41, - "type": "Trellis2MeshWithVoxelGenerator", - "pos": [ - 625.1369992088025, - 700.7722458877151 - ], - "size": [ - 342.2818359375, - 222 - ], - "flags": {}, - "order": 2, - "mode": 0, - "inputs": [ - { - "name": "pipeline", - "type": "TRELLIS2PIPELINE", - "link": 79 - }, - { - "name": "image", - "type": "IMAGE", - "link": 80 - } - ], - "outputs": [ - { - "name": "mesh", - "type": "MESHWITHVOXEL", - "links": [ - 81 - ] - } - ], - "properties": { - "aux_id": "visualbruno/ComfyUI-Trellis2", - "ver": "a28d6cf93b0cf24aa9e7d3dccfd14f406227fbd0", - "widget_ue_connectable": {}, - "Node name for S&R": "Trellis2MeshWithVoxelGenerator" - }, - "widgets_values": [ - 0, - "randomize", - "1024_cascade", - 12, - 12, - 12, - 49152 - ] } ], "links": [ @@ -340,9 +384,17 @@ "IMAGE" ], [ - 81, + 82, 41, 0, + 42, + 0, + "MESHWITHVOXEL" + ], + [ + 83, + 42, + 0, 38, 0, "MESHWITHVOXEL" @@ -356,8 +408,8 @@ "ds": { "scale": 0.6934334949441419, "offset": [ - 33.42173835045634, - -244.1074188775531 + 100.71973787307515, + -285.44762990100236 ] }, "links_added_by_ue": [], diff --git a/nodes.py b/nodes.py index b75e9c3..5d6cfce 100644 --- a/nodes.py +++ b/nodes.py @@ -366,15 +366,13 @@ class Trellis2PostProcessMesh: return { "required": { "mesh": ("MESHWITHVOXEL",), - # "mesh_cluster_threshold_cone_half_angle_rad": ("FLOAT",{"default":90.0,"min":0.0,"max":359.9}), - # "mesh_cluster_refine_iterations": ("INT",{"default":0}), - # "mesh_cluster_global_iterations": ("INT",{"default":1}), - # "mesh_cluster_smooth_strength": ("INT",{"default":1}), - "remesh": ("BOOLEAN",{"default":True}), - "remesh_band": ("FLOAT",{"default":1.0}), - "remesh_project": ("FLOAT",{"default":0.0}), "fill_holes": ("BOOLEAN", {"default":True}), "fill_holes_max_perimeter": ("FLOAT",{"default":0.03,"min":0.001,"max":99.999,"step":0.001}), + "remove_duplicate_faces": ("BOOLEAN",{"default":True}), + "repair_non_manifold_edges": ("BOOLEAN", {"default":True}), + "remove_non_manifold_faces": ("BOOLEAN", {"default":True}), + "remove_small_connected_components": ("BOOLEAN", {"default":True}), + "remove_small_connected_components_size": ("FLOAT", {"default":0.00001,"min":0.00001,"max":9.99999,"step":0.00001}), }, } @@ -384,39 +382,9 @@ class Trellis2PostProcessMesh: CATEGORY = "Trellis2Wrapper" OUTPUT_NODE = True - def process(self, mesh, remesh, remesh_band, remesh_project, fill_holes, fill_holes_max_perimeter): - aabb = [[-0.5, -0.5, -0.5], [0.5, 0.5, 0.5]] - + def process(self, mesh, fill_holes, fill_holes_max_perimeter, remove_duplicate_faces, repair_non_manifold_edges, remove_non_manifold_faces, remove_small_connected_components, remove_small_connected_components_size): vertices = mesh.vertices faces = mesh.faces - attr_volume = mesh.attrs - coords = mesh.coords - attr_layout = mesh.layout - voxel_size = mesh.voxel_size - - # --- Input Normalization (AABB, Voxel Size, Grid Size) --- - if isinstance(aabb, (list, tuple)): - aabb = np.array(aabb) - if isinstance(aabb, np.ndarray): - aabb = torch.tensor(aabb, dtype=torch.float32, device=coords.device) - - # Calculate grid dimensions based on AABB and voxel size - if voxel_size is not None: - if isinstance(voxel_size, float): - voxel_size = [voxel_size, voxel_size, voxel_size] - if isinstance(voxel_size, (list, tuple)): - voxel_size = np.array(voxel_size) - if isinstance(voxel_size, np.ndarray): - voxel_size = torch.tensor(voxel_size, dtype=torch.float32, device=coords.device) - grid_size = ((aabb[1] - aabb[0]) / voxel_size).round().int() - else: - if isinstance(grid_size, int): - grid_size = [grid_size, grid_size, grid_size] - if isinstance(grid_size, (list, tuple)): - grid_size = np.array(grid_size) - if isinstance(grid_size, np.ndarray): - grid_size = torch.tensor(grid_size, dtype=torch.int32, device=coords.device) - voxel_size = (aabb[1] - aabb[0]) / grid_size # Move data to GPU vertices = vertices.cuda() @@ -427,52 +395,28 @@ class Trellis2PostProcessMesh: cumesh.init(vertices, faces) print(f"Current vertices: {cumesh.num_vertices}, faces: {cumesh.num_faces}") - # --- Initial Mesh Cleaning --- - # Fills holes as much as we can before processing if fill_holes: cumesh.fill_holes(max_hole_perimeter=fill_holes_max_perimeter) print(f"After filling holes: {cumesh.num_vertices} vertices, {cumesh.num_faces} faces") + + if remove_duplicate_faces: + print('Removing duplicate faces ...') + mesh.remove_duplicate_faces() + + if repair_non_manifold_edges: + print('Repairing non manifold edges ...') + mesh.repair_non_manifold_edges() + + if remove_non_manifold_faces: + print('Removing non manifold faces ...') + mesh.remove_non_manifold_faces() + + if remove_small_connected_components: + print('Removing small connected components ...') + mesh.remove_small_connected_components(remove_small_connected_components_size) - vertices, faces = cumesh.read() - - # Build BVH for the current mesh to guide remeshing - print(f"Building BVH for current mesh...") - bvh = CuMesh.cuBVH(vertices, faces) - - print("Cleaning mesh...") - # --- Branch 1: Standard Pipeline (Simplification & Cleaning) --- - if not remesh: - # Step 1: Clean up topology (duplicates, non-manifolds, isolated parts) - cumesh.remove_duplicate_faces() - cumesh.repair_non_manifold_edges() - cumesh.remove_small_connected_components(1e-5) - - if fill_holes: - cumesh.fill_holes(max_hole_perimeter=fill_holes_max_perimeter) - - print(f"After initial cleanup: {cumesh.num_vertices} vertices, {cumesh.num_faces} faces") + print(f"After initial cleanup: {cumesh.num_vertices} vertices, {cumesh.num_faces} faces") - # --- Branch 2: Remeshing Pipeline --- - else: - center = aabb.mean(dim=0) - scale = (aabb[1] - aabb[0]).max().item() - resolution = grid_size.max().item() - - # Perform Dual Contouring remeshing (rebuilds topology) - cumesh.init(*CuMesh.remeshing.remesh_narrow_band_dc( - vertices, faces, - center = center, - scale = (resolution + 3 * remesh_band) / resolution * scale, - resolution = resolution, - band = remesh_band, - project_back = remesh_project, # Snaps vertices back to original surface - verbose = True, - bvh = bvh, - )) - - print(f"After remeshing: {cumesh.num_vertices} vertices, {cumesh.num_faces} faces") - - # Step 2: Unify face orientations cumesh.unify_face_orientations() new_vertices, new_faces = cumesh.read() @@ -745,6 +689,7 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: "fill_holes": ("BOOLEAN", {"default":True}), "fill_holes_max_perimeter": ("FLOAT",{"default":0.03,"min":0.001,"max":99.999,"step":0.001}), "texture_alpha_mode": (["OPAQUE","MASK","BLEND"],{"default":"OPAQUE"}), + "dual_contouring_resolution": (["Auto","128","256","512","1024","2048"],{"default":"Auto"}), }, } @@ -754,7 +699,7 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: CATEGORY = "Trellis2Wrapper" OUTPUT_NODE = True - def process(self, mesh, mesh_cluster_threshold_cone_half_angle_rad, mesh_cluster_refine_iterations, mesh_cluster_global_iterations, mesh_cluster_smooth_strength, texture_size, remesh, remesh_band, remesh_project, target_face_num, simplify_method, fill_holes, fill_holes_max_perimeter, texture_alpha_mode): + def process(self, mesh, mesh_cluster_threshold_cone_half_angle_rad, mesh_cluster_refine_iterations, mesh_cluster_global_iterations, mesh_cluster_smooth_strength, texture_size, remesh, remesh_band, remesh_project, target_face_num, simplify_method, fill_holes, fill_holes_max_perimeter, texture_alpha_mode, dual_contouring_resolution): aabb = [[-0.5, -0.5, -0.5], [0.5, 0.5, 0.5]] vertices = mesh.vertices @@ -830,7 +775,12 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: else: center = aabb.mean(dim=0) scale = (aabb[1] - aabb[0]).max().item() - resolution = grid_size.max().item() + + if dual_contouring_resolution == "Auto": + resolution = grid_size.max().item() + print(f"Dual Contouring resolution: {resolution}") + else: + resolution = int(dual_contouring_resolution) print(f"Dual Contouring resolution: {resolution}") # Perform Dual Contouring remeshing (rebuilds topology) @@ -973,7 +923,121 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: torch.cuda.empty_cache() gc.collect() - return (textured_mesh,) + return (textured_mesh,) + +class Trellis2Remesh: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "mesh": ("MESHWITHVOXEL",), + "remesh_band": ("FLOAT",{"default":1.0}), + "remesh_project": ("FLOAT",{"default":0.0}), + "fill_holes": ("BOOLEAN", {"default":True}), + "fill_holes_max_perimeter": ("FLOAT",{"default":0.03,"min":0.001,"max":99.999,"step":0.001}), + "dual_contouring_resolution": (["Auto","128","256","512","1024","2048"],{"default":"Auto"}), + }, + } + + RETURN_TYPES = ("MESHWITHVOXEL",) + RETURN_NAMES = ("mesh",) + FUNCTION = "process" + CATEGORY = "Trellis2Wrapper" + OUTPUT_NODE = True + + def process(self, mesh, remesh_band, remesh_project, fill_holes, fill_holes_max_perimeter, dual_contouring_resolution): + aabb = [[-0.5, -0.5, -0.5], [0.5, 0.5, 0.5]] + + vertices = mesh.vertices + faces = mesh.faces + attr_volume = mesh.attrs + coords = mesh.coords + attr_layout = mesh.layout + voxel_size = mesh.voxel_size + + # --- Input Normalization (AABB, Voxel Size, Grid Size) --- + if isinstance(aabb, (list, tuple)): + aabb = np.array(aabb) + if isinstance(aabb, np.ndarray): + aabb = torch.tensor(aabb, dtype=torch.float32, device=coords.device) + + # Calculate grid dimensions based on AABB and voxel size + if voxel_size is not None: + if isinstance(voxel_size, float): + voxel_size = [voxel_size, voxel_size, voxel_size] + if isinstance(voxel_size, (list, tuple)): + voxel_size = np.array(voxel_size) + if isinstance(voxel_size, np.ndarray): + voxel_size = torch.tensor(voxel_size, dtype=torch.float32, device=coords.device) + grid_size = ((aabb[1] - aabb[0]) / voxel_size).round().int() + else: + if isinstance(grid_size, int): + grid_size = [grid_size, grid_size, grid_size] + if isinstance(grid_size, (list, tuple)): + grid_size = np.array(grid_size) + if isinstance(grid_size, np.ndarray): + grid_size = torch.tensor(grid_size, dtype=torch.int32, device=coords.device) + voxel_size = (aabb[1] - aabb[0]) / grid_size + + # Move data to GPU + vertices = vertices.cuda() + faces = faces.cuda() + + # Initialize CUDA mesh handler + cumesh = CuMesh.CuMesh() + cumesh.init(vertices, faces) + print(f"Current vertices: {cumesh.num_vertices}, faces: {cumesh.num_faces}") + + # --- Initial Mesh Cleaning --- + # Fills holes as much as we can before processing + if fill_holes: + cumesh.fill_holes(max_hole_perimeter=fill_holes_max_perimeter) + print(f"After filling holes: {cumesh.num_vertices} vertices, {cumesh.num_faces} faces") + + vertices, faces = cumesh.read() + + # Build BVH for the current mesh to guide remeshing + print(f"Building BVH for current mesh...") + bvh = CuMesh.cuBVH(vertices, faces) + + print("Cleaning mesh...") + center = aabb.mean(dim=0) + scale = (aabb[1] - aabb[0]).max().item() + + if dual_contouring_resolution == "Auto": + resolution = grid_size.max().item() + print(f"Dual Contouring resolution: {resolution}") + else: + resolution = int(dual_contouring_resolution) + + # Perform Dual Contouring remeshing (rebuilds topology) + cumesh.init(*CuMesh.remeshing.remesh_narrow_band_dc( + vertices, faces, + center = center, + scale = (resolution + 3 * remesh_band) / resolution * scale, + resolution = resolution, + band = remesh_band, + project_back = remesh_project, # Snaps vertices back to original surface + verbose = True, + bvh = bvh, + )) + + print(f"After remeshing: {cumesh.num_vertices} vertices, {cumesh.num_faces} faces") + + # Step 2: Unify face orientations + cumesh.unify_face_orientations() + + new_vertices, new_faces = cumesh.read() + + mesh.vertices = new_vertices.to(mesh.device) + mesh.faces = new_faces.to(mesh.device) + + del cumesh + mm.soft_empty_cache() + torch.cuda.empty_cache() + gc.collect() + + return (mesh,) NODE_CLASS_MAPPINGS = { "Trellis2LoadModel": Trellis2LoadModel, @@ -986,6 +1050,7 @@ NODE_CLASS_MAPPINGS = { "Trellis2UnWrapAndRasterizer": Trellis2UnWrapAndRasterizer, "Trellis2MeshWithVoxelAdvancedGenerator": Trellis2MeshWithVoxelAdvancedGenerator, "Trellis2PostProcessAndUnWrapAndRasterizer": Trellis2PostProcessAndUnWrapAndRasterizer, + "Trellis2Remesh": Trellis2Remesh, } NODE_DISPLAY_NAME_MAPPINGS = { @@ -999,4 +1064,5 @@ NODE_DISPLAY_NAME_MAPPINGS = { "Trellis2UnWrapAndRasterizer": "Trellis2 - UV Unwrap and Rasterize", "Trellis2MeshWithVoxelAdvancedGenerator": "Trellis2 - Mesh With Voxel Advanced Generator", "Trellis2PostProcessAndUnWrapAndRasterizer": "Trellis2 - Post Process/UnWrap and Rasterize", + "Trellis2Remesh": "Trellis2 - Remesh", } \ No newline at end of file diff --git a/wheels/Linux/cumesh-0.0.1-cp312-cp312-linux_x86_64.whl b/wheels/Linux/cumesh-0.0.1-cp312-cp312-linux_x86_64.whl index e001101..4caa732 100644 Binary files a/wheels/Linux/cumesh-0.0.1-cp312-cp312-linux_x86_64.whl and b/wheels/Linux/cumesh-0.0.1-cp312-cp312-linux_x86_64.whl differ diff --git a/wheels/Windows/Torch270/cumesh-0.0.1-cp311-cp311-win_amd64.whl b/wheels/Windows/Torch270/cumesh-0.0.1-cp311-cp311-win_amd64.whl index 4c56fff..2b989f2 100644 Binary files a/wheels/Windows/Torch270/cumesh-0.0.1-cp311-cp311-win_amd64.whl and b/wheels/Windows/Torch270/cumesh-0.0.1-cp311-cp311-win_amd64.whl differ diff --git a/wheels/Windows/Torch270/cumesh-0.0.1-cp312-cp312-win_amd64.whl b/wheels/Windows/Torch270/cumesh-0.0.1-cp312-cp312-win_amd64.whl index d4ab8fa..f9c6ee3 100644 Binary files a/wheels/Windows/Torch270/cumesh-0.0.1-cp312-cp312-win_amd64.whl and b/wheels/Windows/Torch270/cumesh-0.0.1-cp312-cp312-win_amd64.whl differ diff --git a/wheels/Windows/Torch280/cumesh-0.0.1-cp311-cp311-win_amd64.whl b/wheels/Windows/Torch280/cumesh-0.0.1-cp311-cp311-win_amd64.whl index 3ed763a..4f253fe 100644 Binary files a/wheels/Windows/Torch280/cumesh-0.0.1-cp311-cp311-win_amd64.whl and b/wheels/Windows/Torch280/cumesh-0.0.1-cp311-cp311-win_amd64.whl differ diff --git a/wheels/Windows/Torch280/cumesh-0.0.1-cp312-cp312-win_amd64.whl b/wheels/Windows/Torch280/cumesh-0.0.1-cp312-cp312-win_amd64.whl index 76df19e..e4044b2 100644 Binary files a/wheels/Windows/Torch280/cumesh-0.0.1-cp312-cp312-win_amd64.whl and b/wheels/Windows/Torch280/cumesh-0.0.1-cp312-cp312-win_amd64.whl differ