Fixed "Vertical Lines" bug - Removed "fill_holes" parameters

This commit is contained in:
Bruno Fargnoli
2026-02-21 12:14:07 +01:00
parent c7b53c074a
commit f560d3c28d
4 changed files with 9 additions and 63 deletions
+2 -11
View File
@@ -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)<br>Fixed "Weld Vertices"<br>Added "Reconstruct Mesh with Quad" node |
| **2026-02-13** | Added the node "Weld Vertices"<br>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:
<img width="666" height="752" alt="image" src="https://github.com/user-attachments/assets/ce11c61d-a1c2-40c9-a698-b6330dd19953" />
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
+6 -49
View File
@@ -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
+1 -1
View File
@@ -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)
@@ -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,