integrated fastmesh to hun2.1

This commit is contained in:
DenisKochetov
2025-09-03 02:21:37 +02:00
parent b4aa1f8bf3
commit a295aa6959
7 changed files with 2501 additions and 48 deletions
+192
View File
@@ -0,0 +1,192 @@
"""
Utilities for exporting from pipelines to our mesh objects
Direct functions WITHOUT trimesh dependency
"""
import torch
import numpy as np
from .mesh import Mesh, FastMesh
def export_to_fastmesh(mesh_output, device=None):
"""
Export from pipeline to FastMesh
Args:
mesh_output: object with mesh_v and mesh_f from pipeline
device: torch device
Returns:
FastMesh object or list of FastMesh objects
"""
if device is None:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
if isinstance(mesh_output, list):
outputs = []
for mesh in mesh_output:
if mesh is None:
outputs.append(None)
else:
fastmesh = _convert_single_mesh_to_fastmesh(mesh, device)
outputs.append(fastmesh)
return outputs
else:
return _convert_single_mesh_to_fastmesh(mesh_output, device)
def export_to_mesh(mesh_output, device=None):
"""
Export from pipeline to standard Mesh
Args:
mesh_output: object with mesh_v and mesh_f from pipeline
device: torch device
Returns:
Mesh object or list of Mesh objects
"""
if device is None:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
if isinstance(mesh_output, list):
outputs = []
for mesh in mesh_output:
if mesh is None:
outputs.append(None)
else:
standard_mesh = _convert_single_mesh_to_mesh(mesh, device)
outputs.append(standard_mesh)
return outputs
else:
return _convert_single_mesh_to_mesh(mesh_output, device)
def _convert_single_mesh_to_fastmesh(mesh_obj, device):
"""Convert one mesh object to FastMesh"""
try:
# Extract vertices and faces
vertices = mesh_obj.mesh_v
faces = mesh_obj.mesh_f
# Flip faces (as in original function)
faces = faces[:, ::-1]
# Convert to numpy if needed
if hasattr(vertices, 'cpu'):
vertices = vertices.cpu().numpy()
if hasattr(faces, 'cpu'):
faces = faces.cpu().numpy()
vertices = np.array(vertices, dtype=np.float32)
faces = np.array(faces, dtype=np.int32)
print(f"[export_to_fastmesh] Convert: {vertices.shape[0]} vertices, {faces.shape[0]} faces")
fastmesh = FastMesh(device=device)
fastmesh.v = torch.tensor(vertices, dtype=torch.float32, device=device)
fastmesh.f = torch.tensor(faces, dtype=torch.int32, device=device)
fastmesh.auto_normal()
fastmesh._create_empty_albedo()
print(f"[export_to_fastmesh] FastMesh created successfully")
return fastmesh
except Exception as e:
print(f"[export_to_fastmesh] Error: {e}")
return None
def _convert_single_mesh_to_mesh(mesh_obj, device):
"""Convert one mesh object to standard Mesh"""
try:
vertices = mesh_obj.mesh_v
faces = mesh_obj.mesh_f
faces = faces[:, ::-1]
if hasattr(vertices, 'cpu'):
vertices = vertices.cpu().numpy()
if hasattr(faces, 'cpu'):
faces = faces.cpu().numpy()
vertices = np.array(vertices, dtype=np.float32)
faces = np.array(faces, dtype=np.int32)
print(f"[export_to_mesh] Convert: {vertices.shape[0]} vertices, {faces.shape[0]} faces")
mesh = Mesh(device=device)
mesh.v = torch.tensor(vertices, dtype=torch.float32, device=device)
mesh.f = torch.tensor(faces, dtype=torch.int32, device=device)
mesh.auto_normal()
mesh._create_empty_albedo_fast()
print(f"[export_to_mesh] Mesh created successfully")
return mesh
except Exception as e:
print(f"[export_to_mesh] Error: {e}")
return None
def export_to_mesh_ultra_fast(mesh_output, device=None):
"""
Ultra-fast export to standard Mesh WITHOUT any slow operations
"""
if device is None:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
try:
# Process list or single object
if isinstance(mesh_output, list):
return [_convert_single_mesh_to_mesh_ultra_fast(mesh, device) for mesh in mesh_output]
else:
return _convert_single_mesh_to_mesh_ultra_fast(mesh_output, device)
except Exception as e:
print(f"[export_to_mesh_ultra_fast] Error: {e}")
return None
def _convert_single_mesh_to_mesh_ultra_fast(mesh_obj, device):
"""Convert one mesh object to standard Mesh Ultra-fast"""
try:
# Extract vertices and faces
vertices = mesh_obj.mesh_v
faces = mesh_obj.mesh_f
# Flip faces (as in original function)
faces = faces[:, ::-1]
# Convert to numpy if needed
if hasattr(vertices, 'cpu'):
vertices = vertices.cpu().numpy()
if hasattr(faces, 'cpu'):
faces = faces.cpu().numpy()
vertices = np.array(vertices, dtype=np.float32)
faces = np.array(faces, dtype=np.int32)
print(f"[export_to_mesh_ultra_fast] Convert: {vertices.shape[0]} vertices, {faces.shape[0]} faces")
# Create standard Mesh Minimal
mesh = Mesh(device=device)
mesh.v = torch.tensor(vertices, dtype=torch.float32, device=device)
mesh.f = torch.tensor(faces, dtype=torch.int32, device=device)
print(f"[export_to_mesh_ultra_fast] Mesh created instantly")
return mesh
except Exception as e:
print(f"[export_to_mesh_ultra_fast] Error: {e}")
return None