diff --git a/comfy/supported_models.py b/comfy/supported_models.py index 20a60194b..f445edf66 100644 --- a/comfy/supported_models.py +++ b/comfy/supported_models.py @@ -1270,6 +1270,8 @@ class Trellis2(supported_models_base.BASE): latent_format = latent_formats.Trellis2 vae_key_prefix = ["vae."] clip_vision_prefix = "conditioner.main_image_encoder.model." + # this is only needed for the texture model + supported_inference_dtypes = [torch.bfloat16, torch.float32] def get_model(self, state_dict, prefix="", device=None): return model_base.Trellis2(self, device=device) diff --git a/comfy_extras/nodes_trellis2.py b/comfy_extras/nodes_trellis2.py index 4aaa2c5f4..42fe7f707 100644 --- a/comfy_extras/nodes_trellis2.py +++ b/comfy_extras/nodes_trellis2.py @@ -620,6 +620,19 @@ def fill_holes_fn(vertices, faces, max_perimeter=0.03): return v, f + +def make_double_sided(vertices, faces): + is_batched = vertices.ndim == 3 + if is_batched: + f_list = [] + for i in range(faces.shape[0]): + f_inv = faces[i][:, [0, 2, 1]] + f_list.append(torch.cat([faces[i], f_inv], dim=0)) + return vertices, torch.stack(f_list) + + faces_inv = faces[:, [0, 2, 1]] + return vertices, torch.cat([faces, faces_inv], dim=0) + class PostProcessMesh(IO.ComfyNode): @classmethod def define_schema(cls): @@ -651,11 +664,13 @@ class PostProcessMesh(IO.ComfyNode): if simplify > 0 and actual_face_count > simplify: verts, faces, colors = simplify_fn(verts, faces, target=simplify, colors=colors) + verts, faces = make_double_sided(verts, faces) + mesh = type(mesh)(vertices=verts, faces=faces) mesh.vertices = verts mesh.faces = faces if colors is not None: - mesh.colors = None + mesh.colors = colors return IO.NodeOutput(mesh) class Trellis2Extension(ComfyExtension):