o
    ߥi                     @   s   d dl Z d dlZd dlZd dlZdd Zdd Zdd Zdd	d
Zdd Z				dddZ
dddZeg deg ddfddZ			dddZdS )    Nc           
      C   s   t | d}t|D ]!\}}|| }|d|d |d |d |d |d |d f  q	|D ]}|d }	|d|	d |	d |	d f  q-|  d S )Nwz v %.4f %.4f %.4f %.4f %.4f %.4f
r         f %d %d %d
open	enumeratewriteclose)
	mesh_pathvertsfacescolorsfileidxvcff_plus r   c/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/human_reconstruction/utils.pysave_obj_mesh_with_color   s   
&"r   c                 C   sz   t | d}t|D ]\}}|d|d |d |d f  q	|D ]}|d }|d|d |d |d f  q |  d S )Nr   zv %.4f %.4f %.4f
r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   save_obj_mesh   s   
""r   c                 C   sJ   t | jdkr| d d d d tjf } t| ddd } | d } | S )Nr   r   r   g     o@)lenshapenpnewaxistorch
from_numpy	transposefloat)imgr   r   r   	to_tensor   s
   r"   P  c           
         sl    fdd}t |||d}t|d\}}t|d dd df |j|d dddf  }	|	j}	|	|fS )Nc                    s\   t j| dd} t j| ddd} t|   }|   }|d }|	 
  S )Nr   axisr   )r   expand_dimsrepeatr   r   cudar    query	get_predsdetachcpunumpy)pointssamplespredcalib_tensornetr   r   	eval_func(   s   z!reconstruction.<locals>.eval_funcnum_samplesg      ?      )	eval_gridmcubesmarching_cubesr   matmulT)
r3   r2   coordsmatr6   r4   sdfverticesr   r   r   r1   r   reconstruction&   s   	2rB   c                 C   s>   | j dd}|d }|D ]}|jjd |jjd kr|}q|S )NF)only_watertightr   )splitrA   r   )mesh_bigmesh_lst	keep_meshmeshr   r   r   keep_largest8   s   rI   @   {Gz?   c                 C   sr  | j dd }t|}tj|td}tj|td}|d | }	|	dkr4d|d|d |	d|d |	d|d |	f< t||}
| d d |
f }t|||d||
< d||
< |	dkr[ntd|d |	 |	D ]}td|d |	 |	D ]}td|d |	 |	D ]}|||	d  ||	d  ||	d  f sq}||||f }|||||	 f }||||	 |f }||||	 ||	 f }|||	 ||f }|||	 |||	 f }|||	 ||	 |f }|||	 ||	 ||	 f }t||||||||g}|	 }|
 }|| |k r)|| d ||||	 |||	 |||	 f< d||||	 |||	 |||	 f< q}qqqe|	d }	|	dks%||S )	Nr   r8   dtyper   Tr   r5   F)r   r   zerosonesboollogical_and
batch_evalrangearrayminmaxreshape)r>   r4   init_resolution	thresholdr6   
resolutionr@   dirty	grid_maskreso	test_maskr.   xyzv0v1v2v3v4v5v6v7r   v_minv_maxr   r   r   r9   A   sX   

&

&
!r9   c                 C   s   | j d }t|}|| }t|D ]}|| d d || || | f ||| || | < q|| rI|| d d || d f ||| d < |S )Nr   )r   r   rO   rT   )r.   r4   r6   num_ptsr@   num_batchesir   r   r   rS   p   s   

rS   )r   r   r   )r   r   r   c                 C   s  t jd | d | d | f }|dd}t d}|| }|d |  |d< |d |  |d< |d |  |d	< ||dddf< t |d dd df ||d dddf  }|d urwt |d dd df ||d dddf  }t ||}|d| | | }||fS )
Nr7   r8   r   )r   r   r   )r   r   r   )r   r   )r   mgridrX   eyer<   )resb_minb_max	transformr>   coords_matrixlengthr   r   r   create_grid~   s   
00ry   r   c                 C   s   | } |}|}|d ur1|j dkrtjt| td}d||< n|}tj||  dddd|k}n|d urF|j dkrDtjt|td}n|}|| }	tt	|	 }
dt
t| g }tdt|
||
< | |
 }||
 }||	 d	}	||	|||
fS )
NrQ   rM   Trp   r7   r   r$   r   int32)rN   r   rO   r   rQ   sumravelrX   listsetrP   rT   astype)r   r   colorverts_retainedfaces_retainedmin_vert_in_facer   	vert_mask
bool_faces	new_faces
vertex_idsoldtonew	new_verts
new_colorsr   r   r   get_submesh   s2   


r   )r#   )rJ   rK   rL   )rL   )NNr   )osr:   r-   r   r   r   r   r"   rB   rI   r9   rS   rU   ry   r   r   r   r   r   <module>   s,    



/
