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:
-
-
-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,