diff --git a/README.md b/README.md index 0873cd5..1bdce79 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ | Date | Description | | --- | --- | +| **2026-02-21** | Fixed "Vertical lines" bug | | **2026-02-17** | Disabled Triton Cache (trying to fix vertical lines bug)
Fixed "Weld Vertices"
Added "Reconstruct Mesh with Quad" node | | **2026-02-13** | Added the node "Weld Vertices"
Added the resolution 1536 for "Mesh Texturing" | | **2026-02-12** | Added the node "Mesh With Voxel Multi-View Generator" | @@ -45,19 +46,9 @@ ||Applied latest fixes from Microsoft| | **2026-01-05** |Implemented "Tiled" Decoder| ||Updated Cumesh and O_voxel| - ---- - -## WARNING ## - -Many users reported that their is a bug with mesh generation like on this picture: -image - -I did not find yet the root cause of this problem. - -For the moment, the only solution is to restart ComfyUI. --- + ## REQUIREMENTS ## You need to have access to facebook dinov3 models in order to use Trellis.2 diff --git a/nodes.py b/nodes.py index 9ef6f72..17b29d6 100644 --- a/nodes.py +++ b/nodes.py @@ -779,9 +779,7 @@ class Trellis2PostProcessMesh: def INPUT_TYPES(s): return { "required": { - "mesh": ("MESHWITHVOXEL",), - "fill_holes": ("BOOLEAN", {"default":False}), - "fill_holes_max_perimeter": ("FLOAT",{"default":0.03,"min":0.001,"max":99.999,"step":0.001}), + "mesh": ("MESHWITHVOXEL",), "remove_duplicate_faces": ("BOOLEAN",{"default":False}), "repair_non_manifold_edges": ("BOOLEAN", {"default":False}), "remove_non_manifold_faces": ("BOOLEAN", {"default":False}), @@ -804,8 +802,6 @@ class Trellis2PostProcessMesh: def process(self, mesh, - fill_holes, - fill_holes_max_perimeter, remove_duplicate_faces, repair_non_manifold_edges, remove_non_manifold_faces, @@ -836,10 +832,6 @@ class Trellis2PostProcessMesh: cumesh = CuMesh.CuMesh() cumesh.init(vertices, faces) print(f"Current vertices: {cumesh.num_vertices}, faces: {cumesh.num_faces}") - - 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 ...') @@ -1523,20 +1515,7 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: # 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() - - # BVH is coming from MeshWithVoxel Generator node - # print(f"Building BVH for current mesh...") - # bvh = CuMesh.cuBVH(vertices, faces) - # bvh.vertices = vertices - # bvh.faces = faces + print(f"Current vertices: {cumesh.num_vertices}, faces: {cumesh.num_faces}") pbar.update(1) @@ -1555,9 +1534,6 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: 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) - if simplify_method == 'Cumesh': cumesh.simplify(target_face_num, verbose=True) elif simplify_method == 'Meshlib': @@ -1568,10 +1544,7 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: 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) + cumesh.remove_small_connected_components(1e-5) print(f"After initial cleanup: {cumesh.num_vertices} vertices, {cumesh.num_faces} faces") @@ -1899,8 +1872,6 @@ class Trellis2Remesh: "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"}), "remove_floaters": ("BOOLEAN",{"default":True}), "remove_inner_faces": ("BOOLEAN",{"default":False}), @@ -1913,7 +1884,7 @@ class Trellis2Remesh: CATEGORY = "Trellis2Wrapper" OUTPUT_NODE = True - def process(self, mesh, remesh_band, remesh_project, fill_holes, fill_holes_max_perimeter, dual_contouring_resolution, remove_floaters, remove_inner_faces): + def process(self, mesh, remesh_band, remesh_project, dual_contouring_resolution, remove_floaters, remove_inner_faces): reset_cuda() mesh_copy = copy.deepcopy(mesh) @@ -1961,13 +1932,7 @@ class Trellis2Remesh: # 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") + print(f"Current vertices: {cumesh.num_vertices}, faces: {cumesh.num_faces}") vertices, faces = cumesh.read() @@ -2764,8 +2729,6 @@ class Trellis2RemeshWithQuad: "mesh": ("MESHWITHVOXEL",), "remesh_band": ("FLOAT",{"default":1.0}), "remesh_project": ("FLOAT",{"default":0.0}), - "fill_holes": ("BOOLEAN", {"default":False}), - "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"}), "remove_floaters": ("BOOLEAN",{"default":True}), "remove_inner_faces": ("BOOLEAN",{"default":True}), @@ -2778,7 +2741,7 @@ class Trellis2RemeshWithQuad: CATEGORY = "Trellis2Wrapper" OUTPUT_NODE = True - def process(self, mesh, remesh_band, remesh_project, fill_holes, fill_holes_max_perimeter, dual_contouring_resolution, remove_floaters, remove_inner_faces): + def process(self, mesh, remesh_band, remesh_project, dual_contouring_resolution, remove_floaters, remove_inner_faces): reset_cuda() mesh_copy = copy.deepcopy(mesh) @@ -2828,12 +2791,6 @@ class Trellis2RemeshWithQuad: 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() del cumesh diff --git a/pyproject.toml b/pyproject.toml index f1ddf1c..b6c7625 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "trellis2" description = "ComfyUI Wrapper for Microsoft Trellis.2 - Native and Compact Structured Latents for 3D Generation" -version = "1.0.10" +version = "1.0.11" license = {file = "LICENSE"} # classifiers = [ # # For OS-independent nodes (works on all operating systems) diff --git a/trellis2/pipelines/trellis2_image_to_3d.py b/trellis2/pipelines/trellis2_image_to_3d.py index 938242d..68bc3b2 100644 --- a/trellis2/pipelines/trellis2_image_to_3d.py +++ b/trellis2/pipelines/trellis2_image_to_3d.py @@ -818,7 +818,6 @@ class Trellis2ImageTo3DPipeline(Pipeline): self._cleanup_cuda() out_mesh = [] for m in meshes: - m.fill_holes() out_mesh.append( MeshWithVoxel( m.vertices, m.faces, @@ -838,7 +837,6 @@ class Trellis2ImageTo3DPipeline(Pipeline): self._cleanup_cuda() out_mesh = [] for m, v in zip(meshes, tex_voxels): - m.fill_holes() out_mesh.append( MeshWithVoxel( m.vertices, m.faces,