§
    Û×j$U  ã                  ó4  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZ	ddl
Z
ddlmZmZmZmZmZ ddœdGd„ZddœdHd„ZdId„ZdJddœdKd„Z G d„ d¦  «        ZdLd"„Zd#d$dd$d%œdMd)„ZdNd*„ZdOd+„Zdd,ddd-œdPd1„Z G d2„ d3¦  «        Z	 dQd$d4œdRd?„Zd@dAdBœdSdF„ZdS )Ta  Mesh cleanup, decimation, UV unwrapping and texture / vertex-colour inpainting.

Results stay on the device of their inputs; decimation (fast-simplification, MIT), UV unwrapping (xatlas, MIT),
connected components (scipy) and image inpainting (OpenCV) run on the CPU.
é    )ÚannotationsNé   )ÚMeshÚface_normalsÚselect_verticesÚsubmeshÚweldç        )Úmin_areaÚmeshr   r   ÚfloatÚreturnc               ó6  — | j         }|dd…df         |dd…df         k    |dd…df         |dd…df         k    z  |dd…df         |dd…df         k    z  }|t          | j        |¦  «                             d¬¦  «        d|z  k    z  }t	          | |¦  «        S )z`Drops faces with a repeated vertex index or an area <= min_area, then the vertices no face uses.Nr   r   é   ©Údim)Úfacesr   ÚverticesÚnormr   )r   r   r   Úkeeps       ú=C:\Users\johnn\OneDrive\Documents\AI\shared\mesh3d\cleanup.pyÚremove_degenerater      s»   € àŒJ€EØ�!�!�!�Q�$ŒK˜5    A œ;Ò&¨5°°°°A°¬;¸%ÀÀÀÀ1À¼+Ò+EÑFÈ%ÐPQÐPQÐPQÐSTÐPTÌ+ÐY^Ð_`Ð_`Ð_`ÐbcÐ_cÔYdÒJdÑe€DØ�L˜œ¨Ñ.Ô.×3Ò3¸Ð3Ñ:Ô:¸QÀ¹\ÒIÑI€DÝ�4˜ÑÔÐó    )Ú	tolerancer   c               óX  ‡ — |dk    r.t          j        ‰ j        |z  ¦  «                             ¦   «         nJ‰ j                             ¦   «         dz                        t           j        ¦  «                             ¦   «         }|gˆ fd„dD ¦   «         z   }t          j        t          j        |d¦  «        dd¬¦  «        \  }}t          j	        t          |¦  «        |j        ¬¦  «        }t          j        t          |                     ¦   «         ¦  «        dz   ft          |¦  «        |j        ¬¦  «                             d||d	¦  «        }t          j        |¦  «        }t          j	        t          |¦  «        |j        ¬¦  «        ||                     ¦   «         <   ||         ‰ j                 }	|	d
d
…df         |	d
d
…df         k    |	d
d
…df         |	d
d
…df         k    z  |	d
d
…df         |	d
d
…df         k    z  }
t'          ‰ |                     ¦   «         j        |	|
         ¦  «        S )a<  Merges vertices whose positions are equal (or round to the same multiple of tolerance) and whose normals, uvs and
    colours are identical, so UV seams and hard edges stay split; to weld through them, pass a Mesh without those
    attributes. The first vertex of each group is kept; faces that collapse are removed.r   r
   c                óØ   •— g | ]f}t          ‰|¦  «        ®t          ‰|¦  «                             ¦   «         dz                        t          j        ¦  «                             ¦   «         ‘ŒgS )Nr
   )Úgetattrr   ÚviewÚtorchÚint32Úlong)Ú.0Úkr   s     €r   ú
<listcomp>z"merge_vertices.<locals>.<listcomp>"   s�   ø€ ð  Zð  Zð  ZÐWXõ  }Dð  EIð  KLñ  }Mô  }Mð  }Y�' $¨Ñ*Ô*×0Ò0Ñ2Ô2°SÑ8×>Ò>½u¼{ÑKÔK×PÒPÑRÔRð  }Yð  }Yð  }Yr   )ÚnormalsÚuvsÚcolorsr   T)r   Úreturn_inverse©ÚdeviceÚaminNr   )r   Úroundr   r!   r   r   r    ÚuniqueÚcatÚarangeÚlenr*   ÚfullÚintÚmaxÚscatter_reduceÚ
empty_likeÚargsortr   r   ÚsortÚvalues)r   r   ÚpositionÚkeysÚ_ÚinverseÚorderÚfirstÚrankr   r   s   `          r   Úmerge_verticesr@      s2  ø€ ð AJÈAÂÀ�uŒ{˜4œ=¨9Ñ4Ñ5Ô5×:Ò:Ñ<Ô<Ð<ÐTXÔTa×TgÒTgÑTiÔTiÐloÑTo×SuÒSuÕv{ô  wBñ  TCô  TC÷  THò  THñ  TJô  TJ€HØˆ:ð  Zð  Zð  Zð  ZÐ\xð  Zñ  Zô  Zñ  Z€DÝ”�eœi¨¨aÑ0Ô0°aÈÐMÑMÔM�J€A€wÝŒL�˜W™œ¨g¬nÐ=Ñ=Ô=€EÝŒJ�˜GŸKšK™MœMÑ*Ô*¨QÑ.Ð0µ#°g±,´,ÀwÄ~ÐVÑVÔV×eÒeÐfgÐipÐrwÐyñ  Aô  A€EÝÔ˜EÑ"Ô"€DÝ!œL­¨U©¬¸E¼LÐIÑIÔI€Dˆ�Š‰ŒÑØ�ŒM˜$œ*Ô%€EØ�!�!�!�Q�$ŒK˜5    A œ;Ò&¨5°°°°A°¬;¸%ÀÀÀÀ1À¼+Ò+EÑFÈ%ÐPQÐPQÐPQÐSTÐPTÌ+ÐY^Ð_`Ð_`Ð_`ÐbcÐ_cÔYdÒJdÑe€DÝ˜4 §¢¡¤Ô!4°e¸D´kÑBÔBÐBr   útuple[np.ndarray, int]c                óZ  — ddl m} ddlm} t	          | j        ¦  «        \  }}|| j                                      ¦   «                              ¦   «         }t          |¦  «        r$t          |                     ¦   «         ¦  «        dz   nd}|dd…g d¢f                              d¦  «        |dd…g d¢f                              d¦  «        }} |t          j        t          |¦  «        t          j        ¦  «        ||ff||f¬	¦  «        }	 ||	d
¬¦  «        \  }
}||dd…df                  |
fS )z`Connected component of each face, faces being connected through shared positions (seams welded).r   )Ú
coo_matrix)Úconnected_componentsr   N)r   r   r   éÿÿÿÿ)r   r   r   )ÚshapeF)Údirected)Úscipy.sparserC   Úscipy.sparse.csgraphrD   r	   r   r   ÚcpuÚnumpyr0   r2   r3   ÚreshapeÚnpÚonesÚint8)r   rC   rD   r;   r<   r   ÚcountÚrowsÚcolsÚgraphÚ
componentsÚlabelss               r   Ú_componentsrV   -   s:  € à'Ð'Ð'Ð'Ð'Ð'Ø9Ð9Ð9Ð9Ð9Ð9Ý�d”mÑ$Ô$�J€A€wØ�D”JÔ×#Ò#Ñ%Ô%×+Ò+Ñ-Ô-€EÝ&)¨'¡l¤lÐ9�C�—’‘”ÑÔ Ñ"Ð"¸€EØ�q�q�q˜)˜)˜)�|Ô$×,Ò,¨RÑ0Ô0°%¸¸¸¸9¸9¸9¸Ô2E×2MÒ2MÈbÑ2QÔ2Qˆ$€DØˆJ�œ¥ D¡	¤	­2¬7Ñ3Ô3°d¸D°\ÐBÈ5ÐRWÈ.ÐYÑYÔY€EØ-Ð-¨e¸eÐDÑDÔDÑ€J�Ø�%˜˜˜˜1˜”+Ô 
Ð*Ð*r   ç{®Gáz„?)Úmin_diameter_ratioÚmin_face_ratiorX   c               óŒ  — t          | j        ¦  «        dk    r| S t          | ¦  «        \  }}t          j        |¦  «                             | j        j        ¦  «        }t          j        ||¬¦  «        }| j        | j                  	                    ¦   «         }|dd…df          
                    dd¦  «        }t          j        |dft          d¦  «        t          j        |j        ¬¦  «                             d||                     d¦  «        d	¦  «        }t          j        |dft          d
¦  «        t          j        |j        ¬¦  «                             d||                     d¦  «        d¦  «        }	|	|z
                       d¬¦  «        }
|                     dd¦  «                             d¦  «        |                     dd¦  «                             d¦  «        z
                       ¦   «         }||t          | j        ¦  «        z  k    |
||z  k    z  }d||                     ¦   «         <   t'          | ||         ¦  «        S )aB  Keeps the connected components (faces connected through shared positions) with at least min_face_ratio of the
    faces and a bounding box diagonal of at least min_diameter_ratio of the mesh's; the largest component is always kept.
    Hunyuan3D's pymeshlab cleanup corresponds to min_face_ratio=0, min_diameter_ratio=0.1.r   ©Ú	minlengthNrE   é   Úinf©Údtyper*   r   r+   z-infÚamaxr   T)r0   r   rV   r   Ú
from_numpyÚtor*   Úbincountr   r   Úexpandr1   Úfloat32r4   r+   ra   r   rL   Úargmaxr   )r   rY   rX   rU   rT   ÚsizesÚcornersÚindexÚlowÚhighÚdiagonalÚwholer   s                r   Úremove_floatersro   :   s8  € õ ˆ4Œ:�„˜!ÒÐØˆÝ$ TÑ*Ô*Ñ€FˆJÝÔ˜fÑ%Ô%×(Ò(¨¬Ô):Ñ;Ô;€FÝŒN˜6¨ZÐ8Ñ8Ô8€EØŒm˜DœJÔ'×-Ò-Ñ/Ô/€GØ�1�1�1�d�7ŒO×"Ò" 2 qÑ)Ô)€EÝ
Œ*�j !�_¥e¨E¡l¤l½%¼-ÐPWÔP^Ð
_Ñ
_Ô
_×
nÒ
nÐopÐrwð  zA÷  zFò  zFð  GHñ  zIô  zIð  KQñ  Rô  R€CÝŒ:�z 1�o¥u¨V¡}¤}½E¼MÐRYÔR`ÐaÑaÔa×pÒpÐqrÐtyð  |C÷  |Hò  |Hð  IJñ  |Kô  |Kð  MSñ  Tô  T€DØ�s‘
× Ò  QÐ Ñ'Ô'€HØ�_Š_˜R Ñ#Ô#×(Ò(¨Ñ+Ô+¨g¯oªo¸bÀ!Ñ.DÔ.D×.IÒ.IÈ!Ñ.LÔ.LÑL×RÒRÑTÔT€EØ�^¥c¨$¬*¡o¤oÑ5Ò5¸(ÐFXÐ[`ÑF`Ò:`Ña€DØ€Dˆ�Š‰ŒÑÝ�4˜˜fœÑ&Ô&Ð&r   c                  óÆ   — e Zd ZdZej                             ej                             ej                             e	¦  «        ¦  «        d¦  «        Z
dd„Zdddœdd„Zd„ ZdS )Ú_Workerz«A mesh_worker.py job in a child process: the input arrays are sent and the outputs collected by a thread, so that the caller
    keeps running (CPU or GPU work) meanwhile.zmesh_worker.pyÚjobÚstrc                ó$  ‡ ‡	‡
‡— t          j        ¦   «         Š	|D ]}t          j        ‰	|¦  «         Œi d c‰ _        ‰ _        t          j        ¦   «         \  }}t          j        |d¦  «        Š
	 t          j
        t          j        d‰ j        |gd„ |D ¦   «         ¢t          j        t          j        |t          t          dd¦  «        ¬¦  «        ‰ _        n## t"          $ r ‰
                     ¦   «          ‚ w xY w	 t          j        |¦  «         n# t          j        |¦  «         w xY wˆ
ˆ fd„}t'          j        |d¬	¦  «        Š‰                     ¦   «          ˆ	ˆ ˆfd
„}t'          j        |d¬	¦  «        ‰ _        ‰ j                             ¦   «          d S )NÚrbz-Ic              3  óN   K  — | ] }t          t          |¦  «        ¦  «        V — Œ!d S ©N)rs   r2   )r"   Úvalues     r   ú	<genexpr>z#_Worker.__init__.<locals>.<genexpr>\   s6   è è € ÐV~ÐV~ÐkpÕWZÕ[^Ð_dÑ[eÔ[eÑWfÔWfÐV~ÐV~ÐV~ÐV~ÐV~ÐV~r   ÚCREATE_NO_WINDOWr   )ÚstdinÚstdoutÚstderrÚcreationflagsc            
     ó^  •— g } ‰5  ‰D ]n}|                      d¦  «        rBt          t          t          |                     ¦   «         dd …         ¦  «        ¦  «        ‰_        ŒY|                      |¦  «         Œo	 d d d ¦  «         n# 1 swxY w Y   d                     | ¦  «        ‰j        d<   d S )Ns   UV_PROGRESS r   r   r}   )	Ú
startswithÚtupleÚmapr2   ÚsplitÚprogressÚappendÚjoinÚoutput)ÚerrorsÚlineÚreaderÚselfs     €€r   Úread_statusz%_Worker.__init__.<locals>.read_statusd   sì   ø€ ØˆFØð ,ð ,Ø"ð ,ð ,�DØ—’ Ñ7Ô7ð ,Ý(-­cµ#°t·z²z±|´|ÀAÀBÀBÔ7GÑ.HÔ.HÑ(IÔ(I˜œ˜àŸš dÑ+Ô+Ð+Ð+ð	,ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð %(§H¢H¨VÑ$4Ô$4ˆDŒK˜Ñ!Ð!Ð!s   †A2BÂB	ÂB	T)ÚtargetÚdaemonc                 ó¤   •— ‰j                              ‰                      ¦   «         ¦  «        d         ‰j        d<   ‰                     ¦   «          d S )Nr   r|   )ÚprocessÚcommunicateÚgetvaluer‡   r†   )Úpayloadr‹   Ústatus_threads   €€€r   r‘   z%_Worker.__init__.<locals>.communicateq   sI   ø€ Ø$(¤L×$<Ò$<¸W×=MÒ=MÑ=OÔ=OÑ$PÔ$PÐQRÔ$SˆDŒK˜Ñ!Ø×ÒÑ Ô Ð Ð Ð r   )ÚioÚBytesIOrM   Úsaver‡   r„   ÚosÚpipeÚfdopenÚ
subprocessÚPopenÚsysÚ
executableÚSCRIPTÚPIPEr   r�   ÚBaseExceptionÚcloseÚ	threadingÚThreadÚstartÚthread)r‹   rr   Ú	argumentsÚarraysÚarrayÚread_fdÚwrite_fdrŒ   r‘   r“   rŠ   r”   s   `        @@@r   Ú__init__z_Worker.__init__T   sÝ  øøøø€ Ý”*‘,”,ˆØð 	$ð 	$ˆEÝŒG�G˜UÑ#Ô#Ð#Ð#Ø%'¨Ð"ˆŒ�T”]ÝœG™IœIÑˆ�Ý”˜7 DÑ)Ô)ˆð	Ý%Ô+­S¬^¸TÀ4Ä;ÐPSÐ,ÐV~ÐV~Ðt}ÐV~ÑV~ÔV~Ð,õ  HRô  HWÝ3=´?È8ÕcjÕkuð  xJð  LMñ  dNô  dNðOñ Oô OˆDŒLˆLøåð 	ð 	ð 	Ø�LŠL‰NŒNˆNØð	øøøð õ ŒH�XÑÔÐÐø�BŒH�XÑÔÐÐøøøð	5ð 	5ð 	5ð 	5ð 	5ð 	5õ "Ô(°ÀDÐIÑIÔIˆØ×ÒÑÔÐð	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!õ  Ô&¨kÀ$ÐGÑGÔGˆŒØŒ×ÒÑÔÐÐÐs   Á-A%C ÃD Ã C3Ã3D ÄD"N©Úcheck_abortr„   rP   r2   r   úlist[np.ndarray]c               óv  ‡— |€|€| j                              ¦   «          nd }| j                              ¦   «         rX|�
 |¦   «          | j        }|�|�||k    r ||Ž  |}| j                              d¬¦  «         | j                              ¦   «         °X|�
 |¦   «          | j        j        rCt          d| j        d                              d¬¦  «         	                    ¦   «         › �¦  «        ‚|�| j        �
 || j        Ž  t          j        | j        d         ¦  «        Šˆfd„t          |¦  «        D ¦   «         S )	Ngš™™™™™¹?)ÚtimeoutzMesh worker failed: r}   Úreplace)rˆ   r|   c                ó8   •— g | ]}t          j        ‰¦  «        ‘ŒS © )rM   Úload)r"   r;   Ústreams     €r   r$   z"_Worker.result.<locals>.<listcomp>Œ   s!   ø€ Ð6Ð6Ð6 A•”˜‘”Ð6Ð6Ð6r   )r¦   r†   Úis_aliver„   r�   Ú
returncodeÚRuntimeErrorr‡   ÚdecodeÚstripr•   r–   Úrange)r‹   rP   r®   r„   ÚreportedÚcurrentr¶   s         @r   Úresultz_Worker.resultx   s_  ø€ ØÐ 8Ð#3ØŒK×ÒÑÔÐÐàˆHØ”+×&Ò&Ñ(Ô(ð .ØÐ*Ø�K‘M”M�MØœ-�ØÐ'¨GÐ,?ÀGÈxÒDWÐDWØ�H˜gÐ&Ð&Ø&�HØ”× Ò ¨Ð Ñ-Ô-Ð-ð ”+×&Ò&Ñ(Ô(ð .ð Ð&Ø�‘”�ØŒ<Ô"ð 	pÝÐn°d´kÀ(Ô6K×6RÒ6RÐZcÐ6RÑ6dÔ6d×6jÒ6jÑ6lÔ6lÐnÐnÑoÔoÐoØÐ D¤MÐ$=ØˆH�d”mÐ$Ð$Ý”˜DœK¨Ô1Ñ2Ô2ˆØ6Ð6Ð6Ð6­¨u©¬Ð6Ñ6Ô6Ð6r   c                óœ   — | j                              ¦   «         €| j                              ¦   «          | j                             ¦   «          d S rw   )r�   ÚpollÚkillr¦   r†   ©r‹   s    r   r¢   z_Worker.closeŽ   sD   € ØŒ<×ÒÑÔÐ&ØŒL×ÒÑÔÐØŒ×ÒÑÔÐÐÐr   )rr   rs   )rP   r2   r   r¯   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r˜   Úpathr†   ÚdirnameÚabspathÚ__file__rŸ   r¬   r¿   r¢   r´   r   r   rq   rq   N   s›   € € € € € ð2ð 2ð ŒW�\Š\˜"œ'Ÿ/š/¨"¬'¯/ª/¸(Ñ*CÔ*CÑDÔDÐFVÑWÔW€Fð"ð "ð "ð "ðH 15¸tð 7ð 7ð 7ð 7ð 7ð 7ð,ð ð ð ð r   rq   Úpointsú
np.ndarrayÚ	trianglesÚtarget_facesr2   ÚaggressivenessÚpartsútuple[np.ndarray, np.ndarray]c                ó¤  ‡ ‡‡‡‡‡‡— ddl m} ddlmŠm} ˆˆˆ ˆˆfd„Š |‰ ‰|d¬¦  «        } |t          |¦  «        ¦  «        5 Šˆˆfd„|D ¦   «         }d	d	d	¦  «         n# 1 swxY w Y   d
„ |D ¦   «         }		 d„ |D ¦   «         }
|	D ]}|                     ¦   «          Œn# |	D ]}|                     ¦   «          Œw xY wt          j        dgd„ |
D ¦   «         z   ¦  «        }t          j	        t          j
        d„ |
D ¦   «         ¦  «        dd¬¦  «        \  }}|                     d¦  «        t          j
        d„ t          |
|¦  «        D ¦   «         ¦  «                 }||d	d	…df         |d	d	…df         k    |d	d	…df         |d	d	…df         k    z  |d	d	…df         |d	d	…df         k    z           }||                     t          j        ¦  «        fS )a&  The cells of a parts^3 grid decimated in parallel child processes, each to its share of target_faces with its cut border kept,
    then welded back on their unchanged border vertices. The cells are extracted and their processes started by parallel threads (the
    numpy work releases the GIL).r   )ÚThreadPoolExecutorr   )Ú	cell_meshÚ
grid_partsc                óò   •—  ‰‰‰| ¦  «        \  }}t          ‰t          | ¦  «        z  t          ‰¦  «        z  ¦  «        }t          d|‰f‰|         |                     t          j        ¦  «        f¦  «        S )NÚdecimate_cell)r,   r0   rq   ÚastyperM   r    )	ÚgroupÚusedÚlocalÚsharerÐ   rÕ   rÌ   rÏ   rÎ   s	       €€€€€r   r¥   z_decimate_parts.<locals>.start›   sp   ø€ Ø�i ¨	°5Ñ9Ô9‰ˆˆeÝ�l¥S¨¡Z¤ZÑ/µ#°i±.´.Ñ@ÑAÔAˆÝ�¨°Ð(?À&ÈÄ,ÐPU×P\ÒP\Õ]_Ô]eÑPfÔPfÐAgÑhÔhÐhr   F)Úcentersc                ó<   •— g | ]}‰                      ‰|¦  «        ‘ŒS r´   )Úsubmit)r"   rÚ   Úpoolr¥   s     €€r   r$   z#_decimate_parts.<locals>.<listcomp>¢   s'   ø€ Ð@Ð@Ð@°�$—+’+˜e UÑ+Ô+Ð@Ð@Ð@r   Nc                ó^   — g | ]*}|                      ¦   «         ­|                     ¦   «         ‘Œ+S rw   )Ú	exceptionr¿   ©r"   rr   s     r   r$   z#_decimate_parts.<locals>.<listcomp>£   s-   € ÐIÐIÐI °·²±´Ð1Hˆs�zŠz‰|Œ|Ð1HÐ1HÐ1Hr   c                ó\   — g | ])}|                      ¦   «                               d ¦  «        ‘Œ*S )r   )r¿   rä   s     r   r$   z#_decimate_parts.<locals>.<listcomp>¥   s.   € Ð<Ð<Ð<¨c�3—:’:‘<”<×&Ò& qÑ)Ô)Ð<Ð<Ð<r   c                ó2   — g | ]\  }}t          |¦  «        ‘ŒS r´   )r0   ©r"   Úpr;   s      r   r$   z#_decimate_parts.<locals>.<listcomp>©   s"   € Ð:Ð:Ð:©$¨!¨Q�s 1™vœvÐ:Ð:Ð:r   c                ó   — g | ]\  }}|‘ŒS r´   r´   rç   s      r   r$   z#_decimate_parts.<locals>.<listcomp>ª   s   € Ð/FÐ/FÐ/F±d°a¸°Ð/FÐ/FÐ/Fr   T)Úaxisr(   rE   c                ó$   — g | ]\  \  }}}||z   ‘ŒS r´   r´   )r"   r;   ÚfÚoffsets       r   r$   z#_decimate_parts.<locals>.<listcomp>«   s$   € Ð/gÐ/gÐ/g¹~¹vÀÀ1Àv°°F±
Ð/gÐ/gÐ/gr   r   )Úconcurrent.futuresrÔ   Úmesh_workerrÕ   rÖ   r0   r¢   rM   Úcumsumr-   ÚconcatenaterL   ÚziprÙ   r    )rÌ   rÎ   rÏ   rÐ   rÑ   rÔ   rÖ   ÚgroupsÚstartsÚworkersÚresultsÚworkerÚoffsetsÚweldedr<   r   rÕ   rá   r¥   s   ````            @@@r   Ú_decimate_partsrú   ”   sµ  øøøøøøø€ ð 6Ð5Ð5Ð5Ð5Ð5Ø2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ðið ið ið ið ið ið ið ið ið
 ˆZ˜ 	¨5¸%Ð@Ñ@Ô@€FØ	Ð	�C ™KœKÑ	(Ô	(ð A¨DØ@Ð@Ð@Ð@Ð@¸Ð@Ñ@Ô@ˆðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að AàIÐI vÐIÑIÔI€GðØ<Ð<°VÐ<Ñ<Ô<ˆàð 	ð 	ˆFØ�LŠL‰NŒNˆNˆNð	ø�gð 	ð 	ˆFØ�LŠL‰NŒNˆNˆNð	øøøåŒi˜˜Ð:Ð:°'Ð:Ñ:Ô:Ñ:Ñ;Ô;€GÝ”i¥¤Ð/FÐ/F¸gÐ/FÑ/FÔ/FÑ GÔ GÈaÐ`dÐeÑeÔe�O€FˆGØ�OŠO˜BÑÔ¥¤Ð/gÐ/gÕQTÐU\Ð^eÑQfÔQfÐ/gÑ/gÔ/gÑ hÔ hÔi€EØ�5˜˜˜˜A˜”; %¨¨¨¨1¨¤+Ò-°%¸¸¸¸1¸´+ÀÀqÀqÀqÈ!ÀtÄÒ2LÑMÐQVÐWXÐWXÐWXÐZ[ÐW[ÔQ\Ð`eÐfgÐfgÐfgÐijÐfjÔ`kÒQkÑlÔm€EØ�5—<’<¥¤Ñ)Ô)Ð)Ð)s   ÁA"Á"A&Á)A&Á:B  Â B;g      @F)rÐ   Úpreserve_borderrÑ   rù   rû   Úboolrù   c          	     óì  — ddl }t          | j        ¦  «        |k    r| S |dk    r| j        �t	          d¦  «        ‚| j        j        }|r|| j        t          j        t          | j        ¦  «        |¬¦  «        | j        }
}	}|	| 	                    ¦   «          
                    ¦   «                              t          j        ¦  «        }}nÜt          | j        ¦  «        \  }}	|	| j                 }
|
|
dd…df         |
dd…df         k    |
dd…df         |
dd…df         k    z  |
dd…df         |
dd…df         k    z           }
t          j        |
d¬¦  «        \  }}
||          	                    ¦   «          
                    ¦   «                              t          j        ¦  «        }|
 	                    ¦   «          
                    ¦   «                              t          j        ¦  «        }|dk    rt#          |||||¦  «        \  }}|                     |||||| j        du¬	¦  «        }|dd…         \  }}t'          t          j        |                     t          j        ¦  «        ¦  «                             |¦  «        t          j        |                     t          j        ¦  «        ¦  «                             |¦  «        ¦  «        }| j        ��©|                     |                     t          j        ¦  «        ||d         ¦  «        \  }}}t          j        |                     t          j        ¦  «        ¦  «                             |¦  «        }t          j        t          |¦  «        ft          |	¦  «        t          j        |¬
¦  «        }|                     d|	t          j        t          |	¦  «        |¬¦  «        d¦  «        }| j                             ¦   «         ||                  }t          j        t          |¦  «        |j        d         |¬¦  «                             d||¦  «        }|t          j        |t          |¦  «        ¬¦  «                              d¦  «        dd…df         z  |_        |S )a  Quadric edge-collapse decimation (fast-simplification) to about target_faces faces, on positions welded through
    seams. Kept: positions (optimized by the collapses) and vertex colours (averaged over the merged vertices). Lost:
    normals (recomputed by the writers and the renderer), uvs and textures, which no longer match the new topology:
    decimate before unwrap_uv and baking. A mesh with at most target_faces faces is returned unchanged.
    Welding runs on the mesh's device (much faster on a GPU for large meshes); welded=True skips it for a mesh whose positions are
    already unique, faces non-degenerate and vertices all used (e.g. fresh from dual contouring). parts > 1 first decimates the cells
    of a parts^3 grid in parallel child processes (their cut borders kept), then the welded result in a last pass: fast-simplification
    is single-threaded and keeps the GIL (16.9M faces to 100K: 46 s in one pass, about 20 s with parts=2, at the same distance to the
    input surface). Not available with vertex colours.r   Nr   z1decimate(parts > 1) does not carry vertex coloursr)   r   T)r(   )Útarget_countÚaggrû   Úreturn_collapsesr_   r+   r[   )!Úfast_simplificationr0   r   r'   Ú
ValueErrorr   r*   r   r/   rJ   rK   rÙ   rM   Úfloat64r	   r-   r    rú   Úsimplifyr   rb   rf   rc   Úint64Úreplay_simplificationr1   r4   r   ÚzerosrF   Ú
index_add_rd   Ú	clamp_min)r   rÏ   rÐ   rû   rÑ   rù   r  r*   Ú	positionsr<   r   rÛ   rÌ   rÎ   Ú
simplifiedÚ
points_outÚ	faces_outr¿   r;   Úmappingr>   r'   Úsumss                          r   Údecimater  °   s  € ð ÐÐÐÝ
ˆ4Œ:�„˜,Ò&Ð&ØˆØˆq‚y€y�T”[Ð,ÝÐLÑMÔMÐMØŒ]Ô!€FØð BØ$(¤Mµ5´<ÅÀDÄMÑ@RÔ@RÐ[aÐ3bÑ3bÔ3bÐdhÔdn˜E�7ˆ	Ø 	§¢¡¤× 5Ò 5Ñ 7Ô 7× >Ò >½r¼zÑ JÔ Jˆfˆˆå! $¤-Ñ0Ô0Ñˆ	�7Ø˜œ
Ô#ˆØ�u˜Q˜Q˜Q ˜T”{ e¨A¨A¨A¨q¨D¤kÒ1°e¸A¸A¸A¸q¸D´kÀUÈ1È1È1ÈaÈ4Ä[Ò6PÑQÐUZÐ[\Ð[\Ð[\Ð^_Ð[_ÔU`ÐdiÐjkÐjkÐjkÐmnÐjnÔdoÒUoÑpÔqˆÝ”l 5¸Ð>Ñ>Ô>‰ˆˆeØ˜4”×$Ò$Ñ&Ô&×,Ò,Ñ.Ô.×5Ò5µb´jÑAÔAˆØ—	’	‘”×!Ò!Ñ#Ô#×*Ò*­2¬8Ñ4Ô4€IØˆq‚y€yÝ+¨F°I¸|È^Ð]bÑcÔcÑˆ�	Ø$×-Ò-¨f°iÈlÐ`nð  APØ?C¼{ÐRVÐ?Vð .ñ Xô X€Jà& r¨ rœNÑ€J�	Ý•%Ô" :×#4Ò#4µR´ZÑ#@Ô#@ÑAÔA×DÒDÀVÑLÔLÍeÔN^Ð_h×_oÒ_oÕprÔpxÑ_yÔ_yÑNzÔNz×N}ÒN}ð  Eñ  OFô  OFñ  Gô  G€FØ„{ÑØ+×AÒAÀ&Ç-Â-ÕPRÔPZÑB[ÔB[Ð]fÐhrÐstÔhuÑvÔv‰ˆˆ1ˆgÝÔ" 7§>¢>µ"´(Ñ#;Ô#;Ñ<Ô<×?Ò?ÀÑGÔGˆÝ”
�C 	™NœNÐ,­c°'©l¬lÅ%Ä+ÐV\Ð]Ñ]Ô]ˆØ×$Ò$ Q¨µ´½cÀ'¹l¼lÐSYÐ1ZÑ1ZÔ1ZÐ\bÑcÔcˆØ”×"Ò"Ñ$Ô$ U¨4¤[Ô1ˆÝŒ{�3˜z™?œ?¨F¬L¸¬OÀFÐKÑKÔK×VÒVÐWXÐZaÐciÑjÔjˆØ�uœ~¨gÅÀZÁÄÐQÑQÔQ×[Ò[Ð\]Ñ^Ô^Ð_`Ð_`Ð_`ÐbfÐ_fÔgÑgˆŒØ€Mr   c           
     óè  — | j         j        }t          | t          j        |                     t          j        ¦  «        ¦  «                             |¦  «        t          j        |                     t          j        ¦  «         	                    dd¦  «        ¦  «                             |¦  «        ¦  «        }| 
                    t          j        |¦  «                             |¦  «        d d d ¬¦  «        S )NrE   r]   )r&   Ú
base_colorÚmetallic_roughnessÚ
normal_map)r   r*   r   r   rb   rÙ   rM   r  rc   rL   r²   )r   r  Úindicesr&   r*   Ú	unwrappeds         r   Ú_atlas_meshr  Ü   s  € ØŒ]Ô!€FÝ ¥eÔ&6°w·~²~ÅbÄhÑ7OÔ7OÑ&PÔ&P×&SÒ&SÐTZÑ&[Ô&[Õ]bÔ]mÐnu×n|Òn|Õ}ô  ~Fñ  oGô  oG÷  oOò  oOð  PRð  TUñ  oVô  oVñ  ^Wô  ^W÷  ^Zò  ^Zð  [añ  ^bô  ^bñ  cô  c€IØ×Ò¥Ô!1°#Ñ!6Ô!6×!9Ò!9¸&Ñ!AÔ!AÈdÐgkÐx|ÐÑ}Ô}Ð}r   c                ó0  — | j                              ¦   «                              ¦   «                              ¦   «                              ¦   «         | j                             ¦   «                              ¦   «                              t          j        ¦  «        fS rw   )	r   Údetachr   rJ   rK   r   rÙ   rM   Úuint32)r   s    r   Ú_xatlas_arraysr  â   si   € ØŒ=×ÒÑ!Ô!×'Ò'Ñ)Ô)×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7¸¼¿ºÑ9IÔ9I×9OÒ9OÑ9QÔ9Q×9XÒ9XÕY[ÔYbÑ9cÔ9cÐcÐcr   r   )Ú
resolutionÚpaddingÚmax_iterationsrÑ   r  r  r  c          	     ó^   — ddl m} t          | g |g t          | ¦  «        ¢|‘|‘|‘|‘R Ž ¢R Ž S )aî  UV atlas from xatlas: a Mesh whose vertices are split along the chart seams (faces keep their order), with uvs in [0, 1] (glTF
    convention, see mesh.py). Normals and colours follow their vertices; textures are dropped (they belong to the old uvs). For good
    charts, weld first (merge_vertices on a Mesh without uvs) and decimate large meshes before unwrapping. resolution > 0 packs for that
    texture size with `padding` texels between charts. xatlas is CPU code whose chart computation grows faster than the mesh: parts > 1
    unwraps the cells of a parts^3 grid as separate xatlas meshes, computed in parallel (100K faces: 26-46 s whole, under 2 s with
    parts=2), with slightly longer seams; BackgroundUnwrap runs it in a child process.r   )Úunwrap_arrays)rï   r   r  r  )r   r  r  r  rÑ   r   s         r   Ú	unwrap_uvr!  æ   sZ   € ð +Ð*Ð*Ð*Ð*Ð*Ý�tÐo˜m˜mÐn­^¸DÑ-AÔ-AÐnÀ:ÐnÈwÐnÐXfÐnÐhmÐnÐnÐnÐoÐoÐoÐor   c                  ó>   — e Zd ZdZddddddœdd„Zdddœdd„Zd„ ZdS )ÚBackgroundUnwrapa  unwrap_uv(mesh, ...) computed in a child process (mesh_worker.py), so that it overlaps other work: xatlas keeps the GIL while it
    runs, which would stall the kernel launches of a thread. result() returns the same Mesh as unwrap_uv; close() stops the process
    (call it on cancellation). max_faces bounds spatial regions instead of using a fixed grid; this path reports progress and uses
    get_default_workers() for its CPU budget. result(progress=True) displays completed regions plus the final atlas packing.r   r   r   N)r  r  r  rÑ   Ú	max_facesr   r   r  r2   r  r  rÑ   r$  ú
int | Nonec               ó  — || _         |€)t          d||||ft          |¦  «        ¦  «        | _        d S ddlm} t          d||||t          dt           |¦   «         ¦  «        ¦  «        ft          |¦  «        ¦  «        | _        d S )NÚunwrapr   )Úget_default_workersÚunwrap_boundedr   )r   rq   r  r÷   Úshared.utils.utilsr(  r3   r2   )r‹   r   r  r  r  rÑ   r$  r(  s           r   r¬   zBackgroundUnwrap.__init__÷   sÒ   € àˆŒ	ØÐÝ! (¨Z¸À.ÐRWÐ,XÕZhÐimÑZnÔZnÑoÔoˆDŒKˆKˆKà>Ð>Ð>Ð>Ð>Ð>Ý!Ð"2°ZÀÈ.ÐZcÕehÐijÕloð  qDð  qDñ  qFô  qFñ  mGô  mGñ  fHô  fHð  5Iõ  KYð  Z^ñ  K_ô  K_ñ  `ô  `ˆDŒKˆKˆKr   Fr­   r   c          	     óô   ‡‡‡‡‡	— ddl m} ddlmŠ	 ddlmŠ  |¦   «         5 ŠdxŠŠˆˆˆˆˆ	fd„}t          | j        g| j                             d||r|nd¬¦  «        ¢R Ž cddd¦  «         S # 1 swxY w Y   dS )	zwWait for the atlas, polling the caller's cancellation check when supplied. Close in a finally block to reap the worker.r   )Ú	ExitStack)Útqdm)ÚPhaseProgressNc                ó^  •— |rdnd}‰€B‰                       ‰||dd¬¦  «        ¦  «        Š‰                       ‰||d¦  «        ¦  «        Š‰j        |k    r‰                     |¦  «         |‰_        ‰                     | ‰j        z
  ¦  «         ‰                     | ‰j        z
  ¦  «         d S )NzPacking UV AtlaszUnwrapping UVsÚstepsgUUUUUUÕ?)ÚtotalÚdescÚunitÚmininterval)Úenter_contextÚtitleÚset_descriptionÚupdateÚnÚadvanceÚ	completed)	r;  r1  Úpackingr6  r.  ÚbarÚphaseÚstackr-  s	       €€€€€r   r8  z'BackgroundUnwrap.result.<locals>.update	  sÂ   ø€ à.5ÐKÐ*Ð*Ð;K�Ø�;Ø×-Ò-¨d¨d¸ÀUÐQXÐfkÐ.lÑ.lÔ.lÑmÔm�CØ!×/Ò/°°¸eÀUÈGÑ0TÔ0TÑUÔU�EØ”; %Ò'Ð'Ø×'Ò'¨Ñ.Ô.Ð.Ø"'�E”KØ—
’
˜9 s¤uÑ,Ñ-Ô-Ð-Ø—’˜i¨%¬/Ñ9Ñ:Ô:Ð:Ð:Ð:r   r]   r­   )	Ú
contextlibr,  r-  Úshared.utils.phase_progressr.  r  r   r÷   r¿   )
r‹   r®   r„   r,  r8  r.  r=  r>  r?  r-  s
        @@@@@r   r¿   zBackgroundUnwrap.result   sA  øøøøø€ à(Ð(Ð(Ð(Ð(Ð(ØÐÐÐÐÐØ=Ð=Ð=Ð=Ð=Ð=àˆY‰[Œ[ð 	B˜EØÐˆC�%ð
;ð 
;ð 
;ð 
;ð 
;ð 
;ð 
;ð 
;ð 
;õ ˜tœyð  B¨4¬;×+=Ò+=¸aÈ[ÐmuÐcÐciÐciÐ{Ð+=ñ  ,Aô  ,Að  Bð  Bð  Bð	Bð 	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bøøøð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bs   ¢>A-Á-A1Á4A1c                ó8   — | j                              ¦   «          d S rw   )r÷   r¢   rÃ   s    r   r¢   zBackgroundUnwrap.close  s   € ØŒ×ÒÑÔÐÐÐr   )r   r   r  r2   r  r2   r  r2   rÑ   r2   r$  r%  )r   r   )rÄ   rÅ   rÆ   rÇ   r¬   r¿   r¢   r´   r   r   r#  r#  ñ   sŽ   € € € € € ð@ð @ð
 9:È!ÐcdÐstØ)-ð`ð `ð `ð `ð `ð `ð %)°5ð Bð Bð Bð Bð Bð Bð.ð ð ð ð r   r#  )Úflip_vÚtextureútorch.TensorÚmaskÚvtx_posÚvtx_uvÚpos_idxÚuv_idxútorch.Tensor | NonerC  ú!tuple[torch.Tensor, torch.Tensor]c               ó  — | j         | j        c}\  }}	}
|€|n|}|                     ¦   «         }t          j        |rd|dd…df         z
  n|dd…df         |dz
  z  ¦  «                             ¦   «         }t          j        |dd…df         |	dz
  z  ¦  «                             ¦   «         }|                     d¦  «                             ¦   «         |                     d¦  «                             ¦   «         }}||         |	z  ||         z   }|                     d¦  «        |         dk    }t          j        t          |¦  «        |¬¦  «        }t          |¦  «        }|                      d|
¦  «        }t          j	        |fdt          j
        |¬¦  «                             d||         ||         d¦  «        }|dk    }t          j        ||
t          j        |¬¦  «        }||||                                                ¦   «         ||<   t          j        ||          |¬¦  «        }|dk    }|                     d¦  «                             ¦   «         |                     dd¦  «                             d¦  «                             ¦   «         }}||                              ¦   «         ||                              ¦   «         z
                       d¬	¦  «                             d
¦  «                             d¦  «                             ¦   «         }d\  }}|dk    �r|||         z  }t          j        |t          j        |¬¦  «                             d||¦  «        } t          j        ||
t          j        |¬¦  «                             d||dd…df         ||         z  ¦  «        }!|| dk    z  }"t          j        |"dd…df         |!|                      d¦  «        dd…df         z  |¦  «        }||"z  }t-          |||" z                                ¦   «         ¦  «        }#||#|k    rdndz  }|#}|dk    �°||         }$t          j	        ||	z  fdt          j
        |¬¦  «                             d||$         ||$         d¦  «        }%|%dk    }&|                      ¦   «         |                     ¦   «         }(}'|||%|&                           })| j        t          j        k    r@|)                     ¦   «                              dd¦  «                             | j        ¦  «        n|)                     | j        ¦  «        |'                     d|
¦  «        |&<   |j        t          j        k    rdnd|(                     d¦  «        |&<   |'|(fS )aê  Fills texels at the mesh's UV corners from the colours of neighbouring vertices: a vectorized, behaviour-compatible
    reimplementation of the "smooth" mode of Hunyuan3D's meshVerticeInpaint (written independently, no Tencent code).

    texture [H, W, C] (float or uint8) and mask [H, W] (> 0 = painted) are images whose rows run top to bottom; vertex
    positions vtx_pos [P, 3] with faces pos_idx [F, 3], uvs vtx_uv [T, 2] with faces uv_idx [F, 3] (default pos_idx).
    The texel of a uv is (round(v * (H - 1)), round(u * (W - 1))) with v = 1 - v when flip_v (the reference uses OpenGL
    uvs, i.e. flip_v=True; WanGP meshes use glTF uvs, flip_v=False).
    1. A vertex whose corner texel is painted takes its colour (the last such corner in face order).
    2. Vertices with an unpainted corner are then repeatedly set to the inverse-squared-distance weighted mean of their
       coloured neighbours (each corner's next corner in its face), until no more vertices can be reached, plus as many
       further smoothing passes as the reference's termination rule gives. Unlike the reference, which updates vertices
       in place one after the other, each pass updates all vertices at once (order independent), so colours can differ
       slightly where several passes propagate.
    3. Every corner of a coloured vertex writes its vertex colour into its texel (the last corner wins) and marks it in
       the mask (255, or True for a bool mask).
    Returns the new texture and mask on the input device.Nr   r   rE   r)   r_   ra   r[   r   g-Cëâ6?éþÿÿÿ)r   r   g ÂëþKH´9éÿ   T)r*   rF   Údoubler   r,   r!   rL   r/   r0   r1   r  r4   r  rf   r   rd   Úrollr   r	  Úpowr  Úwherer2   ÚsumÚcloner`   Úuint8Úclamprc   r   rü   )*rD  rF  rG  rH  rI  rJ  rC  r*   ÚheightÚwidthÚchannelsr&   rQ   rR   Úcorner_vertexÚ	corner_uvÚtexelÚpaintedr=   r   ÚflatÚlastÚcoloredÚcolorÚentriesÚpendingÚsourcer�   ÚweightÚbudgetÚpreviousÚactiver1  r  r8  ÚmissingÚwriteÚwinnerÚwrittenÚnew_textureÚnew_maskr8   s*                                             r   Úinpaint_vertex_colorsrp    sY  € ð$ )0¬¸¼Ð%€FÑ%ˆV�U˜HØ˜ˆWˆW¨F€FØ
�-Š-‰/Œ/€CÝŒ;¨6Ð@˜˜S    A œY™˜°s¸1¸1¸1¸a¸4´yÀVÈaÁZÑPÑQÔQ×VÒVÑXÔX€DÝŒ;�s˜1˜1˜1˜a˜4”y E¨A¡IÑ.Ñ/Ô/×4Ò4Ñ6Ô6€DØ&Ÿš¨rÑ2Ô2×7Ò7Ñ9Ô9¸6¿>º>È"Ñ;MÔ;M×;RÒ;RÑ;TÔ;T�9€MØ�ŒO˜eÑ# d¨9¤oÑ5€EØ�lŠl˜2ÑÔ˜uÔ%¨Ò)€GÝŒL�˜U™œ¨FÐ3Ñ3Ô3€EÝ�7‰|Œ|€HØ�?Š?˜2˜xÑ(Ô(€DåŒ:�x�k 2­U¬[ÀÐHÑHÔH×WÒWÐXYÐ[hÐipÔ[qÐsxð  zAô  tBð  DJñ  Kô  K€DØ�aŠi€GÝŒK˜ (µ%´-ÈÐOÑOÔO€EØ˜%  W¤Ô.Ô/×5Ò5Ñ7Ô7€Eˆ'�NÝŒn˜]¨G¨8Ô4ÀÐIÑIÔI€GØ˜Šk€Gà—_’_ RÑ(Ô(×-Ò-Ñ/Ô/°·²¸bÀ!Ñ1DÔ1D×1LÒ1LÈRÑ1PÔ1P×1UÒ1UÑ1WÔ1WˆF€FØ�fŒo×$Ò$Ñ&Ô&¨°¬×)?Ò)?Ñ)AÔ)AÑA×GÒGÈAÐGÑNÔN×XÒXÐY]Ñ^Ô^×bÒbÐceÑfÔf×lÒlÑnÔn€FØÑ€FˆHØ
�1Š*‰*Ø˜' &œ/Ñ)ˆÝ”˜H­E¬MÀ&ÐIÑIÔI×TÒTÐUVÐX^Ð`fÑgÔgˆÝŒ{˜8 XµU´]È6ÐRÑRÔR×]Ò]Ð^_ÐagÐioÐpqÐpqÐpqÐswÐpwÔixð  |Að  BHô  |Iñ  jIñ  Jô  JˆØ˜E AšIÑ&ˆÝ”˜F 1 1 1 d 7œO¨T°E·O²OÀEÑ4JÔ4JÈ1È1È1ÈdÈ7Ô4SÑ-SÐUZÑ[Ô[ˆØ�6ÑˆÝ�g˜g¨¨Ñ/Ô0×4Ò4Ñ6Ô6Ñ7Ô7ˆØ˜ 8Ò+Ð+�"�"°Ñ2ˆØˆð �1Š*‰*ð �MÔ"€EÝŒZ˜ %™Ð)¨2µU´[ÈÐPÑPÔP×_Ò_Ð`aÐchÐinÔcoÐqvÐw|Ôq}ð  @Fñ  Gô  G€FØ˜Šk€GØ#ŸMšM™OœO¨T¯ZªZ©\¬\�€KØ�= ¨¤Ô1Ô2€FØ`gÔ`mÕqvÔq|Ò`|Ð`|¨f¯lªl©n¬n×.BÒ.BÀ1ÀcÑ.JÔ.J×.MÒ.MÈgÌmÑ.\Ô.\Ð.\ð  CI÷  CLò  CLð  MTô  MZñ  C[ô  C[€K×Ò�R˜Ñ"Ô" 7Ñ+Ø)-¬µu´zÒ)AÐ)A  Às€H‡M‚M�"ÑÔ�gÑØ˜Ð Ð r   g      @Úns)ÚradiusÚmethodrr  rs  rs   c               óÄ  ‡‡‡	‡
— ddl Š‰j        ‰j        dœ|         Š	|                      ¦   «                              ¦   «         }|j        t          j        k    r|nY|                     ¦   «         dz   	                    ¦   «          
                    dd¦  «                             t          j        ¦  «                             ¦   «         }|                     ¦   «                              ¦   «                              ¦   «         dk                         t          j        ¦  «        Š
|j        d         dk    r|ddd…f         |ddd…f         gn|g}ˆˆ	ˆ
ˆfd	„|D ¦   «         }t          j        t          j        |d¦  «        ¦  «                             | j        ¦  «        }| j        t          j        k    r|n.|                     ¦   «         dz                       | j        ¦  «        S )
aa  Fills the texels where mask > 0 with OpenCV inpainting (method "ns": Navier-Stokes, as Hunyuan3D; "telea"), on the
    CPU. texture [H, W, C] uint8 or float 0..1 (C = 1, 3 or 4; alpha is inpainted separately); returns the same dtype on
    the input device. Note: mask marks the texels to fill (OpenCV convention), i.e. the complement of a painted mask.r   N)rq  ÚtelearO  r   é   .r]   c           	     ó~   •— g | ]9} ‰                      t          j        |¦  «        ‰‰‰¦  «        j        |j        Ž ‘Œ:S r´   )ÚinpaintrM   ÚascontiguousarrayrL   rF   )r"   ÚgÚcv2ÚflagsÚholesrr  s     €€€€r   r$   z#inpaint_texture.<locals>.<listcomp>b  sF   ø€ ÐkÐkÐkÐ_`ÐPˆc�kŠk�"Ô.¨qÑ1Ô1°5¸&À%ÑHÔHÔPÐRSÔRYÐZÐkÐkÐkr   )r{  Ú
INPAINT_NSÚINPAINT_TELEAr  rJ   r`   r   rV  r   r,   rW  rc   rK   rÙ   rM   rF   rb   rñ   r*   )rD  rF  rr  rs  r©   ró   Úfilledr¿   r{  r|  r}  s     `     @@@r   Úinpaint_texturer�  X  sœ  øøøø€ ð €J€J€JØ”>¨CÔ,=Ð>Ð>¸vÔF€EØ�NŠNÑÔ× Ò Ñ"Ô"€EØ”k¥U¤[Ò0Ð0ˆUˆU°u·{²{±}´}ÀsÑ7J×6QÒ6QÑ6SÔ6S×6YÒ6YÐZ[Ð]`Ñ6aÔ6a×6dÒ6dÕejÔepÑ6qÔ6q×xÒxÑzÔz€EØ�[Š[‰]Œ]×ÒÑ Ô ×&Ò&Ñ(Ô(¨1Ò,×4Ò4µR´XÑ>Ô>€EØ16´¸Q´À1Ò1DÐ1Dˆe�C˜˜!˜�GŒn˜e C¨¨¨ GœnÐ-Ð-È5È'€FØkÐkÐkÐkÐkÐkÐkÐdjÐkÑkÔk€FÝÔ�bœn¨V°QÑ7Ô7Ñ8Ô8×;Ò;¸G¼NÑKÔK€FØ”]¥e¤kÒ1Ð1ˆ6ˆ6¸¿º¹¼ÈÑ8L×7PÒ7PÐQXÔQ^Ñ7_Ô7_Ð_r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   rA   )rW   )r   r   rY   r   rX   r   r   r   )rÌ   rÍ   rÎ   rÍ   rÏ   r2   rÐ   r   rÑ   r2   r   rÒ   )r   r   rÏ   r2   rÐ   r   rû   rü   rÑ   r2   rù   rü   r   r   )r   r   r   r   )r   r   r   rÒ   )r   r   r  r2   r  r2   r  r2   rÑ   r2   r   r   rw   )rD  rE  rF  rE  rG  rE  rH  rE  rI  rE  rJ  rK  rC  rü   r   rL  )
rD  rE  rF  rE  rr  r   rs  rs   r   rE  )rÇ   Ú
__future__r   r•   r˜   r›   r�   r£   rK   rM   r   r   r   r   r   r   r	   r   r@   rV   ro   rq   rú   r  r  r  r!  r#  rp  r�  r´   r   r   ú<module>rƒ     s  ððð ð
 #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð à Ð Ð Ð Ø €€€à DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dð 8;ð ð ð ð ð ð ð 69ð Cð Cð Cð Cð Cð Cð 
+ð 
+ð 
+ð 
+ð'Ð]`ð 'ð 'ð 'ð 'ð 'ð 'ð(Cð Cð Cð Cð Cñ Cô Cð CðL*ð *ð *ð *ð8 HKÐdiÐxyØ!ð)ð )ð )ð )ð )ð )ðX~ð ~ð ~ð ~ðdð dð dð dð 01ÀÐZ[Ðjkð pð pð pð pð pð pð'ð 'ð 'ð 'ð 'ñ 'ô 'ð 'ðV 9=ð:!ØPUð:!ð :!ð :!ð :!ð :!ð :!ðz SVÐeið `ð `ð `ð `ð `ð `ð `ð `r   