§
    ÎÐj>z  ã                  ó  — d Z ddlmZ ddlZddlZddlZddlmZ ddlZ	ddl
Z
ddlmZmZmZmZmZmZmZ ddlmZmZmZmZ ddd„Zded„Zdfdgd„Zdhd„Zdid„Zdjd„Zdkdld„Zh d£Zdmd„Z dnd„Z!dod"„Z"dpd$„Z#d%d&œdgd'„Z$dqd)„Z%drdsd-„Z&dtd/„Z'i d0d1“d2d1“d3d4“d5d4“d6d7“d8d7“d9d:“d;d:“d<d=“d>d=“d?d@“dAd@“dBdC“dDdC“dEdF“dGdF“Z(dudK„Z)dvdP„Z*dwdQ„Z+dxdU„Z,dydzdX„Z-d{d[„Z.d%d&œdgd\„Z/drdsd]„Z0dtd^„Z1 e	j2        g d_¢¦  «        Z3d|d`„Z4d%d&œdgda„Z5drdsdb„Z6dtdc„Z7dS )}aR  OBJ (+ MTL + textures), PLY and STL readers, writers and quick statistics, in Mesh conventions (see mesh.py).

OBJ and PLY texture coordinates have v upwards (OpenGL); they are converted from / to the glTF convention (v' = 1 - v).
Vertex colours are sRGB in all three formats. Readers create their tensors on the `device` they are given.
é    )ÚannotationsN)ÚPathé   )Údecode_imageÚencode_imageÚfile_readerÚ
image_sizeÚpack_texturesÚ	remap_uvsÚto_channels)ÚMeshÚlinear_to_srgbÚsrgb_to_linearÚvertex_normalsÚrowsú
np.ndarrayÚreturnútuple[np.ndarray, np.ndarray]c                ó  — t          | ¦  «        dk    r!| t          j        dt          j        ¦  «        fS t          j        | j        ddd…         ¦  «        }| |         }t          j        t          | ¦  «        t          ¦  «        }|dd…         |dd…         k                         d¦  «        |dd…<   t          j	        t          | ¦  «        t          j        ¦  «        }t          j
        |¦  «        dz
  ||<   ||         |fS )z]Unique rows of an [N, K] array (sorted) and, for each input row, the index of its unique row.r   Néÿÿÿÿr   )ÚlenÚnpÚzerosÚint64ÚlexsortÚTÚonesÚboolÚanyÚemptyÚcumsum)r   ÚorderÚorderedÚfirstÚinverses        ú=C:\Users\johnn\OneDrive\Documents\AI\shared\mesh3d\formats.pyÚunique_rowsr'      sÕ   € å
ˆ4�y„y�A‚~€~Ø•R”X˜a¥¤Ñ*Ô*Ð*Ð*ÝŒJ�t”v˜d˜d ˜d”|Ñ$Ô$€EØ�5Œk€GÝŒG•C˜‘I”I�tÑ$Ô$€EØ˜˜˜” ¨¨¨¤Ò,×1Ò1°!Ñ4Ô4€Eˆ!ˆ"ˆ"�IÝŒh•s˜4‘y”y¥"¤(Ñ+Ô+€GÝ”Y˜uÑ%Ô%¨Ñ)€GˆE�NØ�5Œ>˜7Ð"Ð"ó    Úcountsc                ó®  — t          j        | t           j        ¦  «        } t          j        | dz
  d¦  «        }t          j        t          j        | ¦  «        | z
  |¦  «        }t          j        |                     ¦   «         ¦  «        t          j        t          j        |¦  «        |z
  |¦  «        z
  dz   }t          j        |||z   ||z   dz   gd¦  «        S )zl[T, 3] corner indices of the fan triangulation of polygons with `counts` corners stored one after the other.é   r   r   )	r   Úasarrayr   ÚmaximumÚrepeatr!   ÚarangeÚsumÚstack)r)   Ú	trianglesr$   Ústeps       r&   Ú_fanr4   "   s®   € åŒZ˜¥¤Ñ)Ô)€FÝ”
˜6 A™: qÑ)Ô)€IÝŒI•b”i Ñ'Ô'¨&Ñ0°)Ñ<Ô<€EÝŒ9�Y—]’]‘_”_Ñ%Ô%­¬	µ"´)¸IÑ2FÔ2FÈÑ2RÐT]Ñ(^Ô(^Ñ^ÐabÑb€DÝŒ8�U˜E D™L¨%°$©,¸Ñ*:Ð;¸QÑ?Ô?Ð?r(   r   c                ó8  ‡ ‡— ˆ fd„Št          d ‰|t          j        ¦  «         ‰|t          j        ¦  «         ‰|t          j        ¦  «         ‰|t          j        ¦  «         ‰|t          j        ¦  «        dœˆfd„|                     ¦   «         D ¦   «         ¤ŽS )Nc                ó‚   •— | €d n:t          j        t          j        | |¬¦  «        ¦  «                             ‰¦  «        S )N©Údtype)ÚtorchÚ
from_numpyr   ÚascontiguousarrayÚto)Úar8   Údevices     €r&   ú<lambda>z_to_mesh.<locals>.<lambda>,   s;   ø€  a i˜d˜dµUÔ5EÅbÔFZÐ[\ÐdiÐFjÑFjÔFjÑ5kÔ5k×5nÒ5nÐouÑ5vÔ5v€ r(   )ÚverticesÚfacesÚnormalsÚuvsÚcolorsc                óD   •— i | ]\  }}| ‰|t           j        ¦  «        “ŒS © )r   Úuint8)Ú.0ÚkÚvÚtensors      €r&   ú
<dictcomp>z_to_mesh.<locals>.<dictcomp>.   s0   ø€ Ð5jÐ5jÐ5jÑQUÐQRÐTU°a¸¸ÀÅ2Ä8Ñ9LÔ9LÐ5jÐ5jÐ5jr(   rF   )r   r   Úfloat32r   Úitems)r>   r@   rA   rB   rC   rD   ÚtexturesrK   s   `      @r&   Ú_to_meshrP   +   sÔ   øø€ ØvÐvÐvÐv€FÝð l˜˜ ­"¬*Ñ5Ô5¸V¸VÀEÍ2Ì8Ñ=TÔ=TÐ^dÐ^dÐelÕnpÔnxÑ^yÔ^yð  @Fð  @Fð  GJõ  LNô  LVñ  @Wô  @WØ�v˜f¥b¤jÑ1Ô1ðlð lØ5jÐ5jÐ5jÐ5jÐYa×YgÒYgÑYiÔYiÐ5jÑ5jÔ5jðlð lð lr(   Úpathr   c                óD   — t          |                      ¦   «         ¦  «        S ©N)r   Ú
read_bytes)rQ   s    r&   Ú_texture_filerU   1   s   € Ý˜ŸšÑ)Ô)Ñ*Ô*Ð*r(   Úarrayc                óž   — t          | d¦  «        } | d         dk                         ¦   «         rt          j        | dd d…f         ¦  «        n| S )Né   ).é   éÿ   .rY   )r   Úallr   r;   )rV   s    r&   Ú_base_color_arrayr\   5   sN   € Ý˜˜qÑ!Ô!€EØ49¸&´MÀSÒ4H×3MÒ3MÑ3OÔ3OÐZ�2Ô  c¨2¨A¨2 g¤Ñ/Ô/Ð/ÐUZÐZr(   ÚtexturerC   c                ó
  — t          j        t          j        |t          j        |¦  «        z
  dz  dz
  t          j        ¬¦  «        ¦  «                             dddd¦  «        }t          j        t          j        | ¦  «        ¦  «                             ddd¦  «        d                              ¦   «         dz  }t           j	        j
                             ||dd	d
¬¦  «        ddd…df         j                             ¦   «         S )zZBilinear sample (repeat wrap) of a uint8 [H, W, C] texture at glTF uvs: float 0..1 [N, C].r+   r   r7   r   r   NrZ   ÚbilinearÚborderF)ÚmodeÚpadding_modeÚalign_corners)r9   r:   r   r;   ÚfloorrM   ÚviewÚpermuteÚfloatÚnnÚ
functionalÚgrid_sampler   Únumpy)r]   rC   ÚgridÚimages       r&   Ú_samplern   :   sò   € åÔ�BÔ0°#½¼À¹¼Ñ2EÈÑ1JÈQÑ1NÕVXÔV`ÐaÑaÔaÑbÔb×gÒgÐhiÐklÐnpÐrsÑtÔt€DÝÔ�RÔ1°'Ñ:Ô:Ñ;Ô;×CÒCÀAÀqÈ!ÑLÔLÈTÔR×XÒXÑZÔZÐ]`Ñ`€EÝŒ8Ô×*Ò*¨5°$¸ZÐV^ÐnsÐ*ÑtÔtÐuvÐxyÐxyÐxyÐ{|Ðu|Ô}Ô÷  Fò  Fñ  Hô  Hð  Hr(   c                ó¬   — |                       ¦   «                              d¬¦  «                             ¦   «         }|€|n|                     |d¬¦  «        S )NÚcpu©r>   F)Úcopy)Údetachr<   rk   Úastype)rK   r8   rV   s      r&   Ú_numpyru   A   sJ   € Ø�MŠM‰OŒO×Ò eÐÑ,Ô,×2Ò2Ñ4Ô4€EØ�Mˆ5ˆ5 u§|¢|°EÀ |Ñ'FÔ'FÐFr(   >   ú-oú-sú-tú-bmú-ccú-mmú-typeú-boostú-clampú-blenduú-blendvú-texresú-imfchanÚ	argumentsÚstrc                ó  — |                       ¦   «         d}}|t          |¦  «        k     rÈ||         t          v r¹|dz  }|t          |¦  «        k     r,t          j        d||         t          j        ¦  «        s|dz  }Œft          d¦  «        D ]C}|t          |¦  «        dz
  k     r+t          j        d||         t          j        ¦  «        r|dz  }ŒD|t          |¦  «        k     r||         t          v °¹d                     ||d…         ¦  «        S )zYFile name of an MTL map statement, skipping its options (which take one to three values).r   r   z[-+]?[\d.]+(e[-+]?\d+)?rY   ú N)Úsplitr   Ú_MAP_OPTIONSÚreÚ	fullmatchÚIÚrangeÚjoin)rƒ   ÚtokensÚiÚ_s       r&   Ú	_map_filer‘   J   s   € à—’Ñ!Ô! 1ˆA€FØ
�c�&‰kŒkŠ/ˆ/˜f Qœi­<Ð7Ð7Ø	ˆQ‰ˆØ�s�6‰{Œ{Š?ˆ?¥2¤<Ð0JÈFÐSTÌIÕWYÔW[Ñ#\Ô#\ˆ?Ø�‰FˆAØÝ�q‘”ð 	ð 	ˆAØ•3�v‘;”; ‘?Ò"Ð"¥r¤|Ð4NÐPVÐWXÔPYÕ[]Ô[_Ñ'`Ô'`Ð"Ø�Q‘�øð �c�&‰kŒkŠ/ˆ/˜f Qœi­<Ð7Ð7ð �8Š8�F˜1˜2˜2”JÑÔÐr(   údict[str, dict]c                ó(  — i d }}|                       dd¬¦  «                             ¦   «         D ]ã}|                     ¦   «                              d d¦  «        }t	          |¦  «        dk     rŒ>|d                              ¦   «         }|dk    r/|                     |d                              ¦   «         i ¦  «        }Œ�|�6|dk    r0d	„ |d                              ¦   «         d d
…         D ¦   «         |d<   ŒÅ|�|dv rt          |d         ¦  «        ||<   Œä|S )Núutf-8Úreplace©ÚencodingÚerrorsr   r+   r   ÚnewmtlÚkdc                ó,   — g | ]}t          |¦  «        ‘ŒS rF   )rg   )rH   Úxs     r&   ú
<listcomp>z_read_mtl.<locals>.<listcomp>b   s   € ÐDÐDÐD¨!�U 1™XœXÐDÐDÐDr(   rY   ©Úmap_kdÚmap_prÚmap_pmÚnorm)Ú	read_textÚ
splitlinesÚstripr‡   r   ÚlowerÚ
setdefaultr‘   )rQ   Ú	materialsÚcurrentÚlineÚpartsÚkeys         r&   Ú	_read_mtlr­   X   s  € Ø˜Tˆw€IØ—’¨¸	�ÑBÔB×MÒMÑOÔOð 
/ð 
/ˆØ—
’
‘”×"Ò" 4¨Ñ+Ô+ˆÝˆu‰:Œ:˜Š>ˆ>ØØ�AŒh�nŠnÑÔˆØ�(Š?ˆ?Ø×*Ò*¨5°¬8¯>ª>Ñ+;Ô+;¸RÑ@Ô@ˆGˆGØÐ  S¨D¢[ [ØDÐD¨u°Q¬x¯~ª~Ñ/?Ô/?ÀÀÀÔ/CÐDÑDÔDˆG�D‰MˆMØÐ  SÐ,RÐ%RÐ%RÝ$ U¨1¤XÑ.Ô.ˆG�C‰LøØÐr(   Úlinesú	list[str]c                ó6  ‡— d„ | D ¦   «         }t          t          t          |¦  «        d¬¦  «        Št          ˆfd„|D ¦   «         ¦  «        rˆfd„|D ¦   «         }t	          j        |t          j        ¦  «                             t          |¦  «        ‰¦  «        S )Nc                óF   — g | ]}|                      ¦   «         d d…         ‘ŒS ©r   N©r‡   ©rH   rª   s     r&   r�   z_float_rows.<locals>.<listcomp>i   s)   € Ð/Ð/Ð/ ˆD�JŠJ‰LŒL˜˜˜ÔÐ/Ð/Ð/r(   r   )Údefaultc              3  ó>   •K  — | ]}t          |¦  «        ‰k    V — Œd S rS   ©r   ©rH   ÚrÚwidths     €r&   ú	<genexpr>z_float_rows.<locals>.<genexpr>k   s-   øè è € Ð
)Ð
)˜q�3ˆq‰6Œ6�UŠ?Ð
)Ð
)Ð
)Ð
)Ð
)Ð
)r(   c                óB   •— g | ]}|d g‰t          |¦  «        z
  z  z   ‘ŒS )Únanr·   r¸   s     €r&   r�   z_float_rows.<locals>.<listcomp>l   s/   ø€ Ð=Ð=Ð=°1��U�G˜u¥s¨1¡v¤v™~Ñ.Ñ.Ð=Ð=Ð=r(   )ÚmaxÚmapr   r   r   rV   Úfloat64Úreshape)r®   r   rº   s     @r&   Ú_float_rowsrÂ   h   s˜   ø€ Ø/Ð/¨Ð/Ñ/Ô/€DÝ••C˜‘”¨Ð*Ñ*Ô*€EÝ
Ð
)Ð
)Ð
)Ð
) DÐ
)Ñ
)Ô
)Ñ)Ô)ð >Ø=Ð=Ð=Ð=¸Ð=Ñ=Ô=ˆÝŒ8�D�"œ*Ñ%Ô%×-Ò-­c°$©i¬i¸Ñ?Ô?Ð?r(   Ú
face_linesc                óÔ  — d„ | D ¦   «         }t          j        t          t          |¦  «        t           j        t          |¦  «        ¦  «        }d„ |D ¦   «         }d                     |¦  «        }|r|d                              d¦  «        nd}|r
d|d         v nd}|                     d¦  «        |t          |¦  «        z  k    r§|                     d¦  «        |t          |¦  «        z  k    r~t          j        |                     dd¦  «                             dd¦  «         	                    ¦   «         t           j        ¦  «         
                    t          |¦  «        |d	z   ¦  «        }nVd
„ |D ¦   «         }t          j        d„ |D ¦   «         t           j        ¦  «         
                    t          |¦  «        d¦  «        }t          j        |ddd|j        d	         z
  ff¦  «        |fS )zXCorner (v, vt, vn) indices as written (0 = absent) and the corner count of each polygon.c                óF   — g | ]}|                      ¦   «         d d…         ‘ŒS r²   r³   r´   s     r&   r�   z _obj_corners.<locals>.<listcomp>r   s)   € Ð6Ð6Ð6 4ˆd�jŠj‰lŒl˜1˜2˜2ÔÐ6Ð6Ð6r(   c                ó   — g | ]	}|D ]}|‘ŒŒ
S rF   rF   )rH   ÚfaceÚts      r&   r�   z _obj_corners.<locals>.<listcomp>t   s%   € Ð/Ð/Ð/�$¨$Ð/Ð/ QˆAÐ/Ð/Ð/Ð/r(   r†   r   ú/z//Fz/0/r   c                óR   — g | ]$}|                      d ¦  «        ddgz   dd…         ‘Œ%S )rÉ   Ú NrY   r³   )rH   rÈ   s     r&   r�   z _obj_corners.<locals>.<listcomp>{   s4   € Ð=Ð=Ð=°1�!—'’'˜#‘,”, " b Ñ)¨2¨A¨2Ô.Ð=Ð=Ð=r(   c                ó&   — g | ]}d „ |D ¦   «         ‘ŒS )c                ó4   — g | ]}|rt          |¦  «        nd ‘ŒS ©r   )Úint©rH   Úps     r&   r�   z+_obj_corners.<locals>.<listcomp>.<listcomp>|   s'   € Ð=Ð=Ð=°A qÐ/�S ™VœV˜V¨aÐ=Ð=Ð=r(   rF   )rH   Úrows     r&   r�   z _obj_corners.<locals>.<listcomp>|   s'   € ÐOÐOÐOÀ#Ð=Ð=¸Ð=Ñ=Ô=ÐOÐOÐOr(   rY   )r   r   )r   Úfromiterr¿   r   r   r�   ÚcountrV   r•   r‡   rÁ   ÚpadÚshape)	rÃ   rŽ   r)   ÚflatÚjoinedÚslashesÚdoublesÚnumbersr«   s	            r&   Ú_obj_cornersrÜ   p   s¹  € à6Ð6¨:Ð6Ñ6Ô6€FÝŒ[��S &Ñ)Ô)­2¬8µS¸±[´[ÑAÔA€FØ/Ð/˜&Ð/Ñ/Ô/€DØ�XŠX�d‰^Œ^€FØ$(Ð/ˆd�1Œg�mŠm˜CÑ Ô Ð ¨a€GØ!%Ð0ˆd�d˜1”gˆoˆo¨5€GØ‡|‚|�CÑÔ˜G¥c¨$¡i¤iÑ/Ò/Ð/°F·L²LÀÑ4FÔ4FÈ'ÕTWÐX\ÑT]ÔT]ÑJ]Ò4]Ð4]Ý”(˜6Ÿ>š>¨$°Ñ6Ô6×>Ò>¸sÀCÑHÔH×NÒNÑPÔPÕRTÔRZÑ[Ô[×cÒcÕdgÐhlÑdmÔdmÐovÐyzÑozÑ{Ô{ˆˆà=Ð=¸Ð=Ñ=Ô=ˆÝ”(ÐOÐOÈÐOÑOÔOÕQSÔQYÑZÔZ×bÒbÕcfÐgkÑclÔclÐnoÑpÔpˆÝŒ6�'˜F Q¨¨G¬M¸!Ô,<Ñ(<Ð$=Ð>Ñ?Ô?ÀÐGÐGr(   rp   rq   c          	     óP  ‡ ‡/‡0‡1‡2— t          ‰ ¦  «        Š ‰                      dd¬¦  «                             dd¦  «                             ¦   «         }g g g g g i g f\  }}}}}}}	d}
|D �]\}|                     d¦  «        r|                     |¦  «         Œ.|                     d¦  «        r|                     |¦  «         ŒY|                     d	¦  «        r|                     |¦  «         Œ„|                     d
¦  «        r+|                     |¦  «         |                     |
¦  «         ŒÄ|                     d¦  «        r?|                     |dd…                              ¦   «         t          |¦  «        ¦  «        }
�Œ|                     d¦  «        r/|	                     |dd…                              ¦   «         ¦  «         �Œ^t          |¦  «        }|rt          |¦  «        dd…dd…f         nd}|rt          |¦  «        dd…dd…f         nd}t          |¦  «        \  }}|dk                          ¦   «         rÇt          j        t          |¦  «        dft          j        ¦  «        g d¢}}d}|D ]Y}|                     d¦  «        r#|ddddœ|dd…                  xx         dz  cc<   Œ:|                     d
¦  «        r
|||<   |dz  }ŒZt          j        ||d¬¦  «        }t          j        |dk     ||z   dz   |¦  «        }|dz
  }i Š0|	D ]8}‰ j        |z                       ¦   «         r‰0t'          ‰ j        |z  ¦  «        z  Š0Œ9d„ |                     ¦   «         D ¦   «         Š1t          j        |t          j        ¦  «        }t          j        |¦  «        }ˆ0ˆ1fd„|D ¦   «         Š/t          |¦  «        dk    o|duot          ˆ/fd„dD ¦   «         ¦  «        }t          |¦  «        dk    }t/          |¦  «        }|r4t          j        |t          j        ||¦  «        dd…df         gd¦  «        n|}t3          |¦  «        \  }}||dd…df         dd…f         }|j        d         dk    r*||dd…df         dd…f                              dd¦  «        nd}|�"|dd…df         dk                          ¦   «         rdn||dd…df                  ddgz  ddgz   Š2|�"|dd…df         dk                          ¦   «         rdn||dd…df                  }i } |�rKˆ fd„‰/d                              ¦   «         D ¦   «         }!d|!v rt9          |!d         ¦  «        | d<   d|!v sd|!v râ|!                     d|!                     d¦  «        ¦  «        j        dd…         }"d|!v rt=          |!d         d¦  «        d          nt          j        |"d!t          j         ¦  «        }#d|!v rt=          |!d         d¦  «        d          nt          j        |"t          j         ¦  «        }$t          j!        t          j"        |#¦  «        |#|$gd¦  «        | d"<   d#|!v rt=          |!d#         d¦  «        | d$<   �n0|r|dd…df         n't          j        t          |¦  «        |d         ¦  «        }%ˆ ˆ2fd%„tG          |‰/¦  «        D ¦   «         }&|€#t          j$        t          |¦  «        df¦  «        n2tK          tM          j'        |¦  «        ¦  «         (                    ¦   «         }'tG          |‰/¦  «        D ]3\  }(})|(|&vr*|'|%|(k    xx         |)                     d&g d'¢¦  «        z  cc<   Œ4|&rÞtS          d(„ |& *                    ¦   «         D ¦   «         t          j        d)d!t          j         ¦  «        gz   ¦  «        \  }*}+tW          t          j        t          |¦  «        dfd*¦  «        |+d         |*j        ¦  «        },tG          |+|&¦  «        D ]*\  }-}(|%|(k    }.tW          ‰2|.         |-|*j        ¦  «        |,|.<   Œ+|,t9          |*¦  «        cŠ2| d<   |'dk     ,                    ¦   «         rdnFt[          tM          j'        |'                     dd¦  «        ¦  «        ¦  «         (                    ¦   «         }t]          ||||         |‰2|fi | ¤ŽS )+a÷  Mesh from an OBJ file. Polygons are fan-triangulated; vertices are split per distinct (v, vt, vn) corner; "v x y z
    r g b" colours (0..1, sRGB) are read. One material with maps keeps its textures (map_Kd, map_Pr + map_Pm packed into
    metallic_roughness, norm; its Kd is ignored, the texture replacing it). With several materials, their map_Kd images
    are packed into one atlas (uvs remapped, other maps dropped) and the Kd of untextured materials becomes vertex
    colours (Kd read as linear).r”   r•   r–   ú	r†   r   úv úvt úvn úf Úusemtlé   NÚmtllibr+   rY   r   )r   r   r   )rß   rà   rá   r   )rß   ÚvtÚvn)Úaxisc                ó   — i | ]\  }}||“Œ	S rF   rF   )rH   Únr�   s      r&   rL   zread_obj.<locals>.<dictcomp>­   s   € Ð5Ð5Ð5‘d�a˜ˆQ�Ð5Ð5Ð5r(   c                ób   •— g | ]+}‰                      ‰                      |¦  «        i ¦  «        ‘Œ,S rF   )Úget)rH   r�   r¨   Únamess     €€r&   r�   zread_obj.<locals>.<listcomp>°   s1   ø€ Ð:Ð:Ð:°ˆI�MŠM˜%Ÿ)š) A™,œ,¨Ñ+Ô+Ð:Ð:Ð:r(   c              3  ó,   •K  — | ]}|‰d          v V — ŒdS ©r   NrF   )rH   rI   Úmapss     €r&   r»   zread_obj.<locals>.<genexpr>±   s,   øè è € Ð@~Ð@~ÐRSÀÀdÈ1ÄgÀÐ@~Ð@~Ð@~Ð@~Ð@~Ð@~r(   rž   c                óŠ   •— i | ]?\  }}|d k    ¯‰j         |z                       ¦   «         ¯'|t          ‰j         |z  ¦  «        “Œ@S )rš   )ÚparentÚis_filerU   )rH   rI   ÚfrQ   s      €r&   rL   zread_obj.<locals>.<dictcomp>½   sT   ø€ Ð|Ð|Ð|±t°q¸!ÐRSÐW[ÒR[ÐR[ÐaeÔalÐopÑap×`yÒ`yÑ`{Ô`{ÐR[�•M $¤+°¡/Ñ2Ô2ÐR[ÐR[ÐR[r(   rŸ   Ú
base_colorr    r¡   ).r   rZ   Úmetallic_roughnessr¢   Ú
normal_mapc                óˆ   •— i | ]>\  }}d |v ¯	‰®‰j         |d          z                       ¦   «         ¯-|‰j         |d          z  “Œ?S )rŸ   )rò   ró   )rH   r�   ÚmrQ   rC   s      €€r&   rL   zread_obj.<locals>.<dictcomp>É   sƒ   ø€ ð  Zð  Zð  Z±$°!°QÈXÐYZÈ]È]Ð_bÐ_nÐtxÔtð  CDð  EMô  CNñ  uN÷  tWò  tWñ  tYô  tYÐ_n��D”K ! H¤+Ñ-Ð_nÐ_nÐ_nr(   rš   )ç      ð?rú   rú   c                óH   — g | ]}t          t          |¦  «        d ¦  «        ‘Œ S )rX   )r   rU   )rH   rô   s     r&   r�   zread_obj.<locals>.<listcomp>Ï   s*   € Ð)cÐ)cÐ)cÈq­+µmÀAÑ6FÔ6FÈÑ*JÔ*JÐ)cÐ)cÐ)cr(   )rX   rX   rX   g      à?)/r   r£   r•   r¤   Ú
startswithÚappendr§   r¥   r   rÂ   rÜ   r   r   r   r   r.   Úwhererò   ró   r­   rN   rV   Úuniquer4   Úconcatenater'   rÖ   Úclipr\   rì   r   ÚfullrG   r1   Ú
zeros_likeÚzipr   r   r9   r:   rk   r
   Úvaluesr   r[   r   rP   )3rQ   r>   r®   Úv_linesÚvt_linesÚvn_linesÚf_linesÚface_materialsÚmaterial_namesÚ	librariesr©   rª   Ú	positionsÚ	texcoordsrB   Úcornersr)   ÚseenÚtotalsrÇ   ÚrelativeÚlibraryÚusedÚ	keep_mapsr‡   r2   Úkeysrÿ   r%   r@   rD   Úvertex_normals_rO   ÚfoundrÖ   Ú	roughnessÚmetallicÚmaterial_ofÚfilesÚlinearÚindexÚmaterialÚatlasÚboxesÚpackedÚboxr   rð   r¨   rí   rC   s3   `                                              @@@@r&   Úread_objr$  €   sX	  øøøøø€ õ �‰:Œ:€DØ�NŠN G°IˆNÑ>Ô>×FÒFÀtÈSÑQÔQ×\Ò\Ñ^Ô^€EØVXÐZ\Ð^`ÐbdÐfhÐjlÐnpÐVpÑS€GˆX�x ¨.¸.È)Ø€GØð /ñ /ˆØ�?Š?˜4Ñ Ô ð 	/Ø�NŠN˜4Ñ Ô Ð Ð Ø�_Š_˜UÑ#Ô#ð 
	/Ø�OŠO˜DÑ!Ô!Ð!Ð!Ø�_Š_˜UÑ#Ô#ð 	/Ø�OŠO˜DÑ!Ô!Ð!Ð!Ø�_Š_˜TÑ"Ô"ð 	/Ø�NŠN˜4Ñ Ô Ð Ø×!Ò! 'Ñ*Ô*Ð*Ð*Ø�_Š_˜XÑ&Ô&ð 	/Ø$×/Ò/°°Q°R°R´·²Ñ0@Ô0@Å#ÀnÑBUÔBUÑVÔVˆG‰GØ�_Š_˜XÑ&Ô&ð 	/Ø×Ò˜T ! " "œXŸ^š^Ñ-Ô-Ñ.Ô.Ð.ùÝ˜GÑ$Ô$€IØ08ÐB•˜HÑ%Ô% a a a¨¨!¨ eÔ,Ð,¸d€IØ.6Ð@�k˜(Ñ#Ô# A A A r¨ r EÔ*Ð*¸D€GÝ" 7Ñ+Ô+�O€GˆVØ�!Š×ÒÑÔð 
IÝ”x¥ W¡¤¨qÐ 1µ2´8Ñ<Ô<¸i¸i¸iˆfˆØˆØð 	ð 	ˆDØ�ŠÐ3Ñ4Ô4ð Ø˜a q°Ð2Ð2°4¸¸¸´8Ô<Ð=Ð=Ô=ÀÑBÐ=Ð=Ñ=Ð=Ø—’ Ñ&Ô&ð Ø#��T‘
Ø˜‘	�øÝ”9˜T 6°Ð2Ñ2Ô2ˆÝ”(˜7 Qš;¨°7Ñ(:¸QÑ(>ÀÑHÔHˆØ˜‰k€Gà€IØð :ð :ˆØŒK˜'Ñ!×*Ò*Ñ,Ô,ð 	:Ø� 4¤;°Ñ#8Ñ9Ô9Ñ9ˆIøØ5Ð5˜n×2Ò2Ñ4Ô4Ð5Ñ5Ô5€EÝ”X˜n­b¬hÑ7Ô7€NÝŒ9�^Ñ$Ô$€DØ:Ð:Ð:Ð:Ð:°TÐ:Ñ:Ô:€DÝ�D‘	”	˜Q’Ð~ 9°DÐ#8Ð~½SÐ@~Ð@~Ð@~Ð@~ÐW}Ð@~Ñ@~Ô@~Ñ=~Ô=~€IÝ�‰IŒI˜ŠM€Eå�V‘”€IØW\Ði�2Œ>˜7¥B¤I¨n¸fÑ$EÔ$EÀaÀaÀaÈÀgÔ$NÐOÐQRÑSÔSÐSÐbi€DÝ! $Ñ'Ô'�O€FˆGØ˜    1 œ r¨ rÐ)Ô*€HØ8A¼ÈÔ8JÈaÒ8OÐ8OˆY�v˜a˜a˜a ˜d”| Q q SÐ(Ô)×.Ò.¨q°!Ñ4Ô4Ð4ÐUY€FØÐ#¨¨q¨q¨q°!¨t¬°qÒ(8×'=Ò'=Ñ'?Ô'?Ð#ˆ$ˆ$ÀYÈvÐVWÐVWÐVWÐYZÐVZÌ|ÔE\Ð`aÐceÐ_fÑEfÐjkÐmnÐioÑEo€CØ%˜o°&¸¸¸¸A¸´,ÀÒ2B×1GÒ1GÑ1IÔ1I˜o�d�dÈwÐW]Ð^_Ð^_Ð^_ÐabÐ^bÔWcÔOd€OØ€HØñ nØ|Ð|Ð|Ð|¸tÀA¼w¿}º}¹¼Ð|Ñ|Ô|ˆØ�uÐÐÝ%6°u¸X´Ñ%GÔ%GˆH�\Ñ"Ø�uÐÐ ¨EÐ 1Ð 1Ø—Y’Y˜x¨¯ª°8Ñ)<Ô)<Ñ=Ô=ÔDÀRÀaÀRÔHˆEØCKÈuÐCTÐCT� E¨(¤O°QÑ7Ô7¸Ô?Ð?ÕZ\ÔZaÐbgÐilÕnpÔnvÑZwÔZwˆIØBJÈeÐBSÐBS•{ 5¨¤?°AÑ6Ô6°vÔ>Ð>ÕY[ÔYaÐbgÕikÔiqÑYrÔYrˆHÝ-/¬Xµr´}ÀYÑ7OÔ7OÐQZÐ\dÐ6eÐghÑ-iÔ-iˆHÐ)Ñ*Ø�Uˆ?ˆ?Ý%0°°v´ÀÑ%BÔ%BˆH�\Ñ"ùà&+ÐN�f˜Q˜Q˜Q ˜T”l�lµ´½¸V¹¼ÀdÈ1ÄgÑ1NÔ1Nˆð Zð  Zð  Zð  Zð  Z½#¸dÀD¹/¼/ð  Zñ  Zô  ZˆØ.4¨n•”�#˜f™+œ+ qÐ)Ñ*Ô*Ð*Å.ÕQVÔQaÐbhÑQiÔQiÑBjÔBj×BpÒBpÑBrÔBrˆÝ" 4¨™œð 	Tð 	T‰OˆE�8Ø˜EÐ!Ð!Ø�{ eÒ+Ð,Ð,Ô,°·²¸TÀ?À?À?Ñ0SÔ0SÑSÐ,Ð,Ñ,øØð 	KÝ(Ð)cÐ)cÐTY×T`ÒT`ÑTbÔTbÐ)cÑ)cÔ)cÕgiÔgnÐoxÐz}õ  @Bô  @Hñ  hIô  hIð  gJñ  *Jñ  Kô  K‰LˆE�5Ý�rœw­¨F©¬°QÐ'7¸Ñ=Ô=¸uÀR¼yÈ%Ì+ÑVÔVˆFÝ! %¨Ñ/Ô/ð Fð F‘
��UØ" eÒ+�Ý(¨¨T¬°C¸¼ÑEÔE��t‘�Ø*0Õ2CÀEÑ2JÔ2JÐ'ˆC�˜,Ñ'Ø  Aš+×*Ò*Ñ,Ô,Ðm��µ.ÅÔAQÐRX×R]ÒR]Ð^_ÐabÑRcÔRcÑAdÔAdÑ2eÔ2e×2kÒ2kÑ2mÔ2mˆÝ�F˜H g¨iÔ&8¸/È3ÐPVÐcÐcÐZbÐcÐcÐcr(   rª   c                ó°   — t          |¦  «        rF| t          |¦  «        z  t          |                     ¦   «                              ¦   «         ¦  «        z  ndS )zLOne formatted line per row of array (line holds one placeholder per column).rË   )r   ÚtupleÚravelÚtolist)rª   rV   s     r&   Ú_format_rowsr)  Ù   sE   € åBEÀeÁ*Ä*ÐTˆD•3�u‘:”:Ñ¥ u§{¢{¡}¤}×';Ò';Ñ'=Ô'=Ñ!>Ô!>Ñ>Ð>ÐRTÐTr(   ÚmeshÚnameúdict[str, bytes]c           
     óú  — t          | j        t          j        ¦  «        }t	          t          | j        t          j        ¦  «        ¦  «        \  }}|g}| j        �`t          j        |d¬¦  «        d         }| 	                    t          | j        dd…dd…f         t          j        ¦  «        |         ¦  «         t          j
        |d¦  «        }d|› d|› d�t          d	d
|j        d         z  z   dz   |¦  «        g}||         dz   g}	| j        �žt	          t          | j        t          j        ¦  «        t          j        ddg¦  «        z  t          j        ddg¦  «        z   ¦  «        \  }
}| 	                    t          d|
¦  «        ¦  «         |	 	                    ||         dz   ¦  «         t	          t          | j        €t          | j        | j        ¦  «        n| j        t          j        ¦  «        ¦  «        \  }}| 	                    t          d|¦  «        ¦  «         |	 	                    ||         dz   ¦  «         | 	                    d¦  «         | j        €dnd}| 	                    t          |t          j        |	d¦  «                             t%          |¦  «        d¦  «        ¦  «        ¦  «         |› d�d                     |¦  «                             d¦  «        i}g d¢}| j        �@t-          t          | j        ¦  «        ¦  «        ||› d�<   | 	                    d|› d�¦  «         | j        �Zt          | j        ¦  «        }t-          |d         ¦  «        t-          |d         ¦  «        c||› d�<   ||› d�<   |d|› d�d|› d�gz  }| j        �6t-          t          | j        ¦  «        ¦  «        ||› d�<   |d |› d�d!|› d�gz  }d                     |¦  «        dz                        d¦  «        ||› d"�<   |S )#aR  OBJ + MTL (+ PNG textures): positions, uvs (v = 1 - glTF v) and normals are each welded (exact values) with their
    own indices; vertex colours are appended to the "v" lines; metallic_roughness is split into map_Pr / map_Pm images
    and the normal map is referenced by "norm" and by "map_Bump -bm 1" (read as a normal map by Blender).NT)Úreturn_indexr   rY   z# WanGP mesh3d
mtllib z.mtl
o ú
rJ   z %.9gr   r   zvt %.9g %.9g
zvn %.9g %.9g %.9g
zusemtl material
zf %d//%d %d//%d %d//%d
zf %d/%d/%d %d/%d/%d %d/%d/%d
r+   z.objrË   r”   )z# WanGP mesh3dznewmtl materialzKa 0 0 0zKd 1 1 1zKs 0 0 0zd 1zillum 1z_basecolor.pngzmap_Kd ).r   ).r+   z_roughness.pngz_metallic.pngzmap_Pr zmap_Pm z_normal.pngznorm zmap_Bump -bm 1 z.mtl)ru   rA   r   r   r'   r@   rM   rD   rÿ   rý   r   r)  rÖ   rC   rB   r   r1   rÁ   r   r�   Úencoderõ   r   rö   r÷   )r*  r+  rA   r  Úposition_indexÚcolumnsr$   r  ÚtextÚcornerrC   Úuv_indexrB   Únormal_indexrª   r  ÚmtlÚmrs                     r&   Ú	write_objr9  Þ   s  € õ �4”:�rœxÑ(Ô(€EÝ +­F°4´=Å"Ä*Ñ,MÔ,MÑ NÔ NÑ€Iˆ~Øˆk€GØ„{ÐÝ”	˜.°tÐ<Ñ<Ô<¸QÔ?ˆØ�Š•v˜dœk¨!¨!¨!¨R¨a¨R¨%Ô0µ"´*Ñ=Ô=¸eÔDÑEÔEÐEÝŒ^˜G QÑ'Ô'€FØ< dÐ<Ð<°DÐ<Ð<Ð<½lÈ3ÐQXÐ[aÔ[gÐhiÔ[jÑQjÑKjÐmqÑKqÐsyÑ>zÔ>zÐ{€DØ˜UÔ# aÑ'Ð(€FØ„xÐÝ#¥F¨4¬8µR´ZÑ$@Ô$@Å2Ä:ÈqÐRTÈgÑCVÔCVÑ$VÕY[ÔYcÐefÐhiÐdjÑYkÔYkÑ$kÑlÔl‰ˆˆXØ�Š•LÐ!1°3Ñ7Ô7Ñ8Ô8Ð8Ø�Š�h˜u”o¨Ñ)Ñ*Ô*Ð*Ý'­Ð\`Ô\hÐ\p­~¸d¼mÈTÌZÑ/XÔ/XÐ/XÐvzô  wCõ  EGô  EOñ  )Pô  )Pñ  Qô  QÑ€Gˆ\Ø‡K‚K•Ð2°GÑ<Ô<Ñ=Ô=Ð=Ø
‡M‚M�,˜uÔ%¨Ñ)Ñ*Ô*Ð*Ø‡K‚KÐ#Ñ$Ô$Ð$Ø)-¬Ð)9Ð%Ð%Ð?_€DØ‡K‚K•˜T¥2¤8¨F°AÑ#6Ô#6×#>Ò#>½sÀ5¹z¼zÈ2Ñ#NÔ#NÑOÔOÑPÔPÐPØˆ]ˆ]ˆ]˜BŸGšG D™MœM×0Ò0°Ñ9Ô9Ð:€EØ
eÐ
eÐ
e€CØ„Ð"Ý)5µf¸T¼_Ñ6MÔ6MÑ)NÔ)Nˆ�Ð%Ð%Ð%Ñ&Ø�
Š
Ð1˜TÐ1Ð1Ð1Ñ2Ô2Ð2ØÔÐ*Ý�DÔ+Ñ,Ô,ˆÝHTÐUWÐX^ÔU_ÑH`ÔH`ÕbnÐoqÐrxÔoyÑbzÔbzÐEˆ�Ð%Ð%Ð%Ñ&¨°Ð.DÐ.DÐ.DÑ(EØÐ.˜$Ð.Ð.Ð.Ð0M¸$Ð0MÐ0MÐ0MÐNÑNˆØ„Ð"Ý&2µ6¸$¼/Ñ3JÔ3JÑ&KÔ&Kˆ�Ð"Ð"Ð"Ñ#ØÐ)˜Ð)Ð)Ð)Ð+N¸TÐ+NÐ+NÐ+NÐOÑOˆØ ŸIšI c™NœN¨TÑ1×9Ò9¸'ÑBÔB€EˆTˆ-ˆ-ˆ-ÑØ€Lr(   Údictc                óX  — t          | ¦  «        } |                      dd¬¦  «                             dd¦  «                             ¦   «         }d„ |D ¦   «         }t	          |¦  «        }t          d„ |D ¦   «         ¦  «        }i g }}|D ]�}|                     d¦  «        rj| j        |d	d …                              ¦   «         z   	                    ¦   «         r4|t          | j        |d	d …                              ¦   «         z  ¦  «        z  }Œ‚|                     ¦   «         D ]’}d
D ]�}	|	|v r‡| j        ||	         z   	                    ¦   «         ret          | j        ||	         z  d¦  «        5 }
|                     t          t          |
¦  «        ¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   ŒŽŒ“d„ |D ¦   «         }dt!          |¦  «        |t!          |¦  «        pt!          |¦  «        |t!          |¦  «        rf|d d …d d…f                              d¦  «                             ¦   «         |d d …d d…f                              d¦  «                             ¦   «         gnd t)          d„ |D ¦   «         ¦  «        |j        d         d	k    dd dt,          j                             | ¦  «        dœS )Nr”   r•   r–   rÞ   r†   c                ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS )rß   ©rü   r´   s     r&   r�   zobj_stats.<locals>.<listcomp>  s)   € Ð?Ð?Ð?˜¨¯ª¸Ñ)>Ô)>Ð?ˆtÐ?Ð?Ð?r(   c              3  ó¤   K  — | ]K}|                      d ¦  «        ¯t          t          |                     ¦   «         ¦  «        dz
  d¦  «        V — ŒLdS )râ   rY   r   N)rü   r¾   r   r‡   r´   s     r&   r»   zobj_stats.<locals>.<genexpr>
  sS   è è € Ð]Ð]°dÀtÇÂÐW[ÑG\ÔG\Ð]•C�˜DŸJšJ™LœLÑ)Ô)¨AÑ-¨qÑ1Ô1Ð]Ð]Ð]Ð]Ð]Ð]r(   rå   rä   rž   Úrbc                óp   — h | ]3}|                      d ¦  «        ¯|dd…                              ¦   «         ’Œ4S )rã   rä   N)rü   r¥   r´   s     r&   ú	<setcomp>zobj_stats.<locals>.<setcomp>  s;   € ÐLÐLÐL °$·/²/À(Ñ2KÔ2KÐLˆD���ŒH�NŠNÑÔÐLÐLÐLr(   ÚobjrY   r   c              3  ó@   K  — | ]}|                      d ¦  «        V — ŒdS )rà   Nr=  r´   s     r&   r»   zobj_stats.<locals>.<genexpr>  s.   è è € ÐCÐC°T˜$Ÿ/š/¨%Ñ0Ô0ÐCÐCÐCÐCÐCÐCr(   r   ©Úformatr@   rA   r¨   rO   ÚbboxÚhas_uvÚ
has_colorsÚ
animationsÚ	animationÚsplatsÚ	file_size)r   r£   r•   r¤   rÂ   r0   rü   rò   r¥   ró   r­   r  Úopenrý   r	   r   r   Úminr(  r¾   r   rÖ   ÚosrQ   Úgetsize)rQ   r®   r  r  r2   r¨   rO   rª   r  r¬   Úhandler  s               r&   Ú	obj_statsrR    s1  € Ý�‰:Œ:€DØ�NŠN G°IˆNÑ>Ô>×FÒFÀtÈSÑQÔQ×\Ò\Ñ^Ô^€EØ?Ð? Ð?Ñ?Ô?€GÝ˜GÑ$Ô$€IÝÐ]Ð]¸eÐ]Ñ]Ô]Ñ]Ô]€IØ˜bˆx€IØð Cð CˆØ�?Š?˜8Ñ$Ô$ð 	C¨$¬+¸¸Q¸R¸R¼¿ºÑ8HÔ8HÑ*H×)QÒ)QÑ)SÔ)Sð 	CØ� 4¤;°°a°b°b´·²Ñ1AÔ1AÑ#AÑBÔBÑBˆIøØ×$Ò$Ñ&Ô&ð Eð EˆØ9ð 	Eð 	EˆCØ�hˆˆ D¤K°(¸3´-Ñ$?×#HÒ#HÑ#JÔ#JˆÝ˜$œ+¨°¬Ñ5°tÑ<Ô<ð EÀØ—O’O¥J­{¸6Ñ/BÔ/BÑ$CÔ$CÑDÔDÐDðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eøð	Eð MÐL¨ÐLÑLÔL€DØ­¨W©¬À	ÕX[Ð\eÑXfÔXfÐXsÕjmÐnrÑjsÔjsð  BJÝ\_Ð`iÑ\jÔ\jÐt�Y˜q˜q˜q " 1 "˜uÔ%×)Ò)¨!Ñ,Ô,×3Ò3Ñ5Ô5°yÀÀÀÀBÀQÀBÀÔ7G×7KÒ7KÈAÑ7NÔ7N×7UÒ7UÑ7WÔ7WÐXÐXÐptÝÐCÐC¸UÐCÑCÔCÑCÔCÐS\ÔSbÐcdÔSeÐijÒSjÐz{ð  KOð  [\õ  kmô  kr÷  kzò  kzð  {ñ  k@ô  k@ðAð Að As   Å'0F#Æ#F'Æ*F'ÚcharÚi1Úint8ÚucharÚu1rG   ÚshortÚi2Úint16ÚushortÚu2Úuint16rÏ   Úi4Úint32ÚuintÚu4Úuint32rg   Úf4rM   ÚdoubleÚf8rÀ   ÚdataÚbytesú&tuple[str, list[dict], list[str], int]c                ó¾  — |                       d¦  «        }|                      d¦  «        r|dk     rt          d¦  «        ‚|                      d|¦  «        dz   }d g g }}}| d |…                              dd¬	¦  «                             ¦   «         dd …         D �]?}|                     ¦   «         }|sŒ|d         d
k    r	|d         }Œ/|d         dv rE|                     t          |¦  «        dk    r|                     d d¦  «        d         nd¦  «         Œ~|d         dk    r3|                     |d         t          |d         ¦  «        g dœ¦  «         Œ½|d         dk    rv|d         dk    r-|d         t          |d                  t          |d                  fn|d         t          |d                  d f}|d         d                              |¦  «         �ŒA||||fS )Ns
   end_headers   plyr   zNot a PLY fileó   
r   r”   r•   ©r˜   rE  )ÚcommentÚobj_inforË   Úelementr+   )r+  rÔ   Ú
propertiesÚpropertyÚlistrX   rY   r   ro  )Úfindrü   Ú
ValueErrorr  Údecoder¤   r‡   rý   r   rÏ   Ú
_PLY_TYPES)	rf  ÚendÚbodyÚfmtÚelementsÚcommentsrª   ÚwordsÚprops	            r&   Ú_ply_headerr}    s  € Ø
�)Š)�MÑ
"Ô
"€CØ�?Š?˜6Ñ"Ô"ð + c¨A¢g gÝÐ)Ñ*Ô*Ð*Ø�:Š:�e˜SÑ!Ô! AÑ%€DØ" B¨�8ˆ€CØ�T�c�T”
×!Ò! '°)Ð!Ñ<Ô<×GÒGÑIÔIÈ!È"È"ÔMð 4ñ 4ˆØ—
’
‘”ˆØð 	ØØ�Œ8�xÒÐØ˜”(ˆCˆCØ�1ŒXÐ0Ð0Ð0Ø�OŠOµc¸%±j´jÀ1²n°n˜DŸJšJ t¨QÑ/Ô/°Ô2Ð2È"ÑMÔMÐMÐMØ�1ŒX˜Ò"Ð"Ø�OŠO U¨1¤X½¸EÀ!¼H¹¼ÐUWÐXÐXÑYÔYÐYÐYØ�1ŒX˜Ò#Ð#ØMRÐSTÌXÐY_ÒM_ÐM_�E˜!”H�j¨¨q¬Ô2µJ¸uÀQ¼xÔ4HÐIÐIÐfkÐlmÔfnÕpzð  |Að  BCô  |Dô  qEð  GKð  fLˆDØ�RŒL˜Ô&×-Ò-¨dÑ3Ô3Ð3ùØ�˜( DÐ(Ð(r(   Úposrn  Úendianútuple[int, dict]c           
     ó¬  ‡‡‡‡— |d         |d         c}Št          d„ |D ¦   «         ¦  «        rRt          j        ˆfd„|D ¦   «         ¦  «        }t          j        | |‰|¦  «        Š|‰|j        z  z   ˆfd„|D ¦   «         fS g |}}|D ] \  Š}}	|	€|t          j        |¦  «        j        z  }Œ%t          t          j        | ‰|z   d|¦  «        d         ¦  «        }
|                     |
¦  «         |t          j        |¦  «        j        |
t          j        |	¦  «        j        z  z   z  }Œ¡g t          |¦  «        }}|D ]3\  Š}}	||	€‰‰|z   fgn‰d	z   ‰|z   f‰‰|	z   t          |¦  «        ffgz  }Œ4t          j        |¦  «        }‰|j        z  t          | ¦  «        |z
  k    rht          j        | |‰|¦  «        Št          ˆfd
„t          d„ |D ¦   «         |¦  «        D ¦   «         ¦  «        rt          ‰||‰|‰|j        z  z   ¦  «        S ˆfd„|D ¦   «         }ˆfd„|D ¦   «         }ˆfd„|D ¦   «         }t          ‰¦  «        D ]n}|D ]i\  Š}}}|€||‰         |<   ||z  }Œt          t          j        | |d|¦  «        d         ¦  «        }
||z   |
c|‰         |<   |‰         |<   |||
|z  z   z  }ŒjŒot          j        | t          j        ¦  «        }i }|D �]|\  Š}}}t          ˆfd„|D ¦   «         ¦  «        }|€r||‰         dd…df         t          j        |¦  «        z                                 ¦   «                              ‰|d         z   ¦  «                             d¦  «        |‰<   Œ—|‰         }
t          j        |‰         |
¦  «        t          j        |
                     ¦   «         ¦  «        t          j        t          j        |
¦  «        |
z
  |
¦  «        z
  |z  z   }||dd…df         t          j        |¦  «        z                                 ¦   «                              ‰|d         z   ¦  «                             d¦  «        |
f|‰<   �Œ~||fS )zeReads one binary element: {property: array} (lists: (flat values, counts)) and the position after it.ro  rÔ   c              3  ó*   K  — | ]}|d          du V — ŒdS ©r+   NrF   rÐ   s     r&   r»   z$_read_ply_element.<locals>.<genexpr>8  s*   è è € Ð
'Ð
'˜Aˆ1ˆQŒ4�4ˆ<Ð
'Ð
'Ð
'Ð
'Ð
'Ð
'r(   c                ó6   •— g | ]}|d          ‰|d         z   f‘ŒS )r   r   rF   ©rH   rÑ   r  s     €r&   r�   z%_read_ply_element.<locals>.<listcomp>9  s*   ø€ Ð?Ð?Ð?°A˜1˜Qœ4 ¨!¨A¬$¡Ð/Ð?Ð?Ð?r(   c                ó:   •— i | ]}|d          ‰|d                   “ŒS rÎ   rF   )rH   rÑ   rV   s     €r&   rL   z%_read_ply_element.<locals>.<dictcomp>;  s'   ø€ Ð-OÐ-OÐ-OÀA¨a°¬d°E¸!¸A¼$´KÐ-OÐ-OÐ-Or(   Nr   r   ú#countc              3  ól   •K  — | ].\  }}‰|d          dz            |k                          ¦   «         V — Œ/dS )r   r‡  N)r[   )rH   rÑ   rê   rV   s      €r&   r»   z$_read_ply_element.<locals>.<genexpr>K  sE   øè è € ÐrÐr±t°q¸!��a˜”d˜X‘oÔ&¨!Ò+×0Ò0Ñ2Ô2ÐrÐrÐrÐrÐrÐrr(   c                ó"   — g | ]}|d          ®
|‘ŒS )r+   rF   rÐ   s     r&   r�   z%_read_ply_element.<locals>.<listcomp>K  s$   € ÐCiÐCiÐCiÈ!ÐXYÐZ[ÔX\ÐXhÀAÐXhÐXhÐXhr(   c                ó\   •— i | ](}|d          t          j        ‰t           j        ¦  «        “Œ)S rÎ   )r   r    r   ©rH   rÑ   rÔ   s     €r&   rL   z%_read_ply_element.<locals>.<dictcomp>N  s-   ø€ Ð=Ð=Ð=°!ˆa�Œd•B”H˜U¥B¤HÑ-Ô-Ð=Ð=Ð=r(   c                ól   •— i | ]0}|d          ®
|d         t          j        ‰t           j        ¦  «        “Œ1S ©r+   Nr   )r   r   r   r‹  s     €r&   rL   z%_read_ply_element.<locals>.<dictcomp>O  s6   ø€ ÐRÐRÐR°1ÀÀ1ÄÐAQˆq�Œt•R”X˜e¥R¤XÑ.Ô.ÐAQÐAQÐAQr(   c                óÂ   •— g | ][}|d          t          j        |d         ¦  «        j        |d         €dnt          j        |d         ¦  «        j        ‰|d         z   f‘Œ\S )r   r   r+   N)r   r8   Úitemsizer…  s     €r&   r�   z%_read_ply_element.<locals>.<listcomp>P  sa   ø€ Ð~Ð~Ð~Ðstˆa�Œd•B”H˜Q˜qœT‘N”NÔ+°Q°q´T°\¨T¨TÅrÄxÐPQÐRSÔPTÁ~Ä~ÔG^Ð`fÐijÐklÔimÑ`mÐnÐ~Ð~Ð~r(   c              3  ó4   •K  — | ]}|d          ‰k    ¯|V — ŒdS rï   rF   )rH   rÑ   r+  s     €r&   r»   z$_read_ply_element.<locals>.<genexpr>]  s+   øè è € Ð5Ð5˜!¨¨!¬°ª¨�A¨¨¨¨Ð5Ð5r(   r   r+   )r[   r   r8   Ú
frombufferr�  rÏ   rý   ÚiterÚnextr   r  Ú_uniform_resultrŒ   rG   r/   rr   re   rÁ   r.   r0   r!   )rf  r~  rn  r  Úpropsr8   r$   ÚcursorÚkindÚitemrê   ÚfieldsÚlistsÚstartsÚlengthsÚsizesÚrecordÚsizeÚ	item_sizeÚrawÚresultr|  Úitem_startsrV   rÔ   r+  s      `                   @@@r&   Ú_read_ply_elementr¤  5  sü  øøøø€ à˜<Ô(¨'°'Ô*:€L€Eˆ5Ý
Ð
'Ð
' Ð
'Ñ
'Ô
'Ñ'Ô'ð PÝ”Ð?Ð?Ð?Ð?¸Ð?Ñ?Ô?Ñ@Ô@ˆÝ”˜d E¨5°#Ñ6Ô6ˆØ�U˜Uœ^Ñ+Ñ+Ð-OÐ-OÐ-OÐ-OÈÐ-OÑ-OÔ-OÐOÐOà˜ˆ6€EØ!ð Lð LÑˆˆd�DØˆ<Ø•b”h˜t‘n”nÔ-Ñ-ˆFˆFå•B”M $¨°©°q¸&ÑAÔAÀ!ÔDÑEÔEˆAØ�LŠL˜‰OŒOˆOØ•b”h˜t‘n”nÔ-°µB´H¸T±N´NÔ4KÑ0KÑKÑKˆFˆFØ�˜U™œˆE€FØ!ð Ið IÑˆˆd�DØ¨T¨\�D˜& 4™-Ð(Ð)Ð)ÀÈÁÐRXÐ[_ÑR_Ð@`ÐcgÐioÐrvÑivÕy}ð  Dñ  zEô  zEð  yGð  cHð  @Iñ  	IˆˆÝŒH�VÑÔ€EØˆuŒ~Ñ¥ T¡¤¨S¡Ò0Ð0Ý”˜d E¨5°#Ñ6Ô6ˆÝÐrÐrÐrÐr½sÐCiÐCiÈuÐCiÑCiÔCiÐkpÑ?qÔ?qÐrÑrÔrÑrÔrð 	]Ý" 5¨%°¸¸sÀUÈUÌ^ÑE[Ñ?[Ñ\Ô\Ð\à=Ð=Ð=Ð=°uÐ=Ñ=Ô=€FØRÐRÐRÐR¸ÐRÑRÔR€GØ~Ð~Ð~Ð~Ðx}Ð~Ñ~Ô~€EÝ˜‘,”,ð ,ð ,ˆØ+0ð 	,ð 	,Ñ'ˆD�$˜	 4ØÐ Ø'*��t”˜VÑ$Ø�t‘��å�œ d¨D°!°SÑ9Ô9¸!Ô<Ñ=Ô=�Ø>AÀD¹jÈ!Ð;��t”˜VÑ$ g¨d¤m°FÑ&;Ø�t˜a )™mÑ+Ñ+��ð	,õ Œ-˜�bœhÑ
'Ô
'€CØ€FØ',ð {ñ {Ñ#ˆˆd�I˜tÝÐ5Ð5Ð5Ð5˜uÐ5Ñ5Ô5Ñ5Ô5ˆØÐØ˜v dœ|¨A¨A¨A¨t¨GÔ4µr´yÀ±´ÑFÔG×LÒLÑNÔN×SÒSÐTZÐ]aÐbcÔ]dÑTdÑeÔe×mÒmÐnpÑqÔqˆF�4‰LˆLà˜”ˆAÝœ) F¨4¤L°!Ñ4Ô4½¼	À!Ç%Â%Á'Ä'Ñ8JÔ8JÍRÌYÕWYÔW`ÐabÑWcÔWcÐfgÑWgÐijÑMkÔMkÑ8kÐoxÑ7xÑxˆKØ ¨A¨A¨A¨t¨GÔ 4µr´yÀÑ7KÔ7KÑ KÔL×QÒQÑSÔS×XÒXÐY_ÐbfÐghÔbiÑYiÑjÔj×rÒrÐsuÑvÔvÐxyÐzˆF�4‰L‰LØ�ˆ;Ðr(   c                ó  — i t          |¦  «        }}|D ]m\  }}}	|	€| |         nYt          j        | |         ¦  «                             d¦  «        t          j        |t          |¦  «        t          j        ¦  «        f||<   Œn||fS )Nr   )r’  r   r;   rÁ   r  r“  r   )
rV   r•  r$   rÔ   rv  r¢  rš  r+  r—  r˜  s
             r&   r”  r”  g  s¬   € Ø�˜U™œˆE€FØ!ð Oð OÑˆˆd�DØ&* l�u˜T”{�{½Ô9MÈeÐTXÌkÑ9ZÔ9Z×9bÒ9bÐceÑ9fÔ9fÕhjÔhoÐpuÕw{ð  }Bñ  xCô  xCõ  EGô  EMñ  iNô  iNð  9Oˆˆt‰ˆØ�ˆ;Ðr(   r3  ry  ú
list[dict]c           
     ó€  ‡‡— |                       ¦   «         di }}}|D �]Ÿ}|d         |d         }}t          d„ |D ¦   «         ¦  «        r•t          j        ||||t	          |¦  «        z  z   …         t          j        ¦  «                             |t	          |¦  «        ¦  «        Š||t	          |¦  «        z  z  }ˆfd„t          |¦  «        D ¦   «         ||d         <   ŒÁd„ |D ¦   «         }d„ |D ¦   «         Št          |¦  «        D ]�}	|D ]ˆ\  }
}}|€'||
          	                    ||         ¦  «         |d	z  }Œ/t          ||         ¦  «        }||
xx         ||d	z   |d	z   |z   …         z  cc<   ‰|
          	                    |¦  «         |d	|z   z  }Œ‰ŒŽˆfd
„|                     ¦   «         D ¦   «         ||d         <   �Œ¡|S )Nr   ro  rÔ   c              3  ó*   K  — | ]}|d          du V — ŒdS rƒ  rF   rÐ   s     r&   r»   z"_read_ply_ascii.<locals>.<genexpr>r  s*   è è € Ð+Ð+ ˆq�Œt�tˆ|Ð+Ð+Ð+Ð+Ð+Ð+r(   c                ó<   •— i | ]\  }}|d          ‰dd…|f         “ŒS rï   rF   )rH   r�   rÑ   r  s      €r&   rL   z#_read_ply_ascii.<locals>.<dictcomp>u  s/   ø€ Ð&WÐ&WÐ&W¹d¸aÀ q¨¤t¨V°A°A°A°q°D¬\Ð&WÐ&WÐ&Wr(   r+  c                ó    — i | ]}|d          g “ŒS rÎ   rF   rÐ   s     r&   rL   z#_read_ply_ascii.<locals>.<dictcomp>w  s   € Ð+Ð+Ð+ �1�Q”4˜Ð+Ð+Ð+r(   c                ó0   — i | ]}|d          ®
|d         g “ŒS r�  rF   rÐ   s     r&   rL   z#_read_ply_ascii.<locals>.<dictcomp>x  s'   € Ð?Ð?Ð? ¨a°¬dÐ.>�1�Q”4˜Ð.>Ð.>Ð.>r(   r   c                óæ   •— i | ]m\  }}||‰vrt          j        |t           j        ¦  «        nCt          j        |t           j        ¦  «        t          j        ‰|         t           j        ¦  «        f“ŒnS rF   )r   rV   rÀ   r   )rH   r+  r  rœ  s      €r&   rL   z#_read_ply_ascii.<locals>.<dictcomp>ƒ  s¬   ø€ ð #Hð #Hð #HÙ'3 t¨Vð $(ÈÐU\ÐI\ÐI\­¬°&½"¼*Ñ)EÔ)EÐ)EÕceÔckÐlrÕtvÔt~ÑcÔcõ  BDô  BJð  KRð  SWô  KXõ  Z\ô  Zbñ  Bcô  Bcð  cdð #Hð #Hð #Hr(   )r‡   r[   r   rV   r   rÀ   rÁ   Ú	enumeraterŒ   rý   rÏ   rN   )r3  ry  rŽ   Úatr¢  rn  r•  rÔ   r2  r�   r+  r—  r˜  rê   rœ  r  s                 @@r&   Ú_read_ply_asciir¯  n  s  øø€ ØŸš™œ q¨"�ˆB€FØð Hñ HˆØ˜|Ô,¨g°gÔ.>ˆuˆÝÐ+Ð+ UÐ+Ñ+Ô+Ñ+Ô+ð 	Ý”X˜f R¨¨UµS¸±Z´ZÑ-?Ñ(?Ð%?Ô@Å"Ä*ÑMÔM×UÒUÐV[Õ]`ÐafÑ]gÔ]gÑhÔhˆFØ�%�#˜e™*œ*Ñ$Ñ$ˆBØ&WÐ&WÐ&WÐ&WÅiÐPUÑFVÔFVÐ&WÑ&WÔ&WˆF�7˜6”?Ñ#ØØ+Ð+ UÐ+Ñ+Ô+ˆØ?Ð? UÐ?Ñ?Ô?ˆÝ�u‘”ð 		 ð 		 ˆAØ$)ð  ð  Ñ ��d˜DØ�<Ø˜D”M×(Ò(¨°¬Ñ4Ô4Ð4Ø˜!‘G�B�Bå˜F 2œJ™œ�AØ˜D�M�M”M V¨B°©F°2¸±6¸A±:Ð,=Ô%>Ñ>�M�M‘MØ˜D”M×(Ò(¨Ñ+Ô+Ð+Ø˜!˜a™%‘K�B�Bð ð#Hð #Hð #Hð #HØ7>·}²}±´ð#Hñ #Hô #Hˆˆw�vŒÑÑà€Mr(   ©ÚvertexrÇ   ú"tuple[dict, list[dict], list[str]]c                óB  — t          | ¦  «        \  }}}}|dk    r0t          | |d …                              dd¬¦  «        |¦  «        ||fS dddœ|         }i }|D ]A}t          |¦  «        t          |¦  «        z
  s nt	          | |||¦  «        \  }||d         <   ŒB|||fS )NÚasciir•   rk  ú<ú>)Úbinary_little_endianÚbinary_big_endianr+  )r}  r¯  rt  Úsetr¤  )	rf  Úwantedrx  ry  rz  r~  r  r¢  rn  s	            r&   Ú_read_ply_elementsr»  ˆ  sÌ   € Ý#.¨tÑ#4Ô#4Ñ €Cˆ�8˜SØ
ˆg‚~€~Ý˜t C D Dœz×0Ò0°ÀÐ0ÑKÔKÈXÑVÔVÐX`ÐbjÐjÐjØ&)ÀÐDÐDÀSÔI€FØ€FØð Uð UˆÝ�6‰{Œ{�S ™[œ[Ñ(ð 	ØˆEÝ'8¸¸sÀGÈVÑ'TÔ'TÑ$ˆˆV�G˜F”OÑ$Ð$Ø�8˜XÐ%Ð%r(   r  r—  c                ó�   — dddœ                      |r
|dd …         ndd¦  «        }|                      t          j        ¦  «        |z  S )Ng     ào@g    àÿï@)rW  r\  éþÿÿÿrË   rú   )rì   rt   r   rÀ   )r  r—  Úscales      r&   Ú
_ply_colorr¿  •  sI   € Ø Ð(Ð(×,Ò,¸$Ð-F¨T°"°#°#¬Y¨YÀBÈÑLÔL€EØ�=Š=�œÑ$Ô$ uÑ,Ð,r(   c               ó  ‡‡‡— t          | ¦  «        } t          |                      ¦   «         ¦  «        \  }}}|d         Šd„ |D ¦   «         Št          j        ‰d         ‰d         ‰d         gd¦  «                             t          j        ¦  «        }h d£t          ‰¦  «        k    r*t          j        ‰d         ‰d	         ‰d
         gd¦  «        nd}t          ˆfd„dD ¦   «         d¦  «        }d}|rFt          ˆfd„dD ¦   «         d¦  «        }	t          j        ˆˆfd„||	r|	fndz   D ¦   «         d¦  «        }t          ˆfd„dD ¦   «         d¦  «        }
|
rOt          j        ‰|
d                  d‰|
d                                       t          j        ¦  «        z
  gd¦  «        nd}| 	                    di ¦  «        Št          ˆfd„dD ¦   «         d¦  «        }|€t          d¦  «        ‚‰|         \  }}|                     t          j        ¦  «        }t          |¦  «        }||         }d‰v �rJ‰d         \  }}t          j        |d|z  ¦  «        st          d¦  «        ‚|                     dd¦  «        |         }t          j        |                     dd¦  «                             t          j        ¦  «        |                     dd¦  «        gd¦  «        }t!          |¦  «        \  }}|dd…df                              t          j        ¦  «        }t          j        |dd…df         d|dd…df         z
  gd¦  «        }||         |€dn||         |€dn||         }}}|                     dd¦  «        }n|}i }t          d„ |D ¦   «         d¦  «        }|rE|�C| j        |z                       ¦   «         r't'          t)          | j        |z  ¦  «        ¦  «        |d<   t+          ||||||€dn|                     dd¦  «        fi |¤ŽS ) a6  Mesh from an ASCII or binary PLY: x y z, nx ny nz, red green blue (alpha) colours (uchar/ushort scaled, float as is,
    sRGB), per-vertex s t / u v / texture_u texture_v coordinates or per-face "texcoord" lists (v upwards), polygon faces
    (fan-triangulated) and a "comment TextureFile" base colour texture.r±  c                óZ   — i | ](}|d          dk    ¯|d         D ]}|d         |d         “ŒŒ)S )r+  r±  ro  r   r   rF   ©rH   ÚerÑ   s      r&   rL   zread_ply.<locals>.<dictcomp>¡  sA   € ÐZÐZÐZ˜A¨1¨V¬9¸Ò+@Ð+@È!ÈLÌ/Ð+@Ð+@ÀQˆQˆqŒT�1�Q”4Ð+@Ð+@Ð+@Ð+@r(   rœ   ÚyÚzr   >   ÚnxÚnyÚnzrÆ  rÇ  rÈ  Nc              3  ó\   •K  — | ]&}t          |¦  «        t          ‰¦  «        k    ¯"|V — Œ'd S rS   ©r¹  ©rH   rê   r±  s     €r&   r»   zread_ply.<locals>.<genexpr>¤  s…   øè è € ð  Uð  U˜õ  Bð  CDñ  Eô  Eõ  ILð  MSñ  ITô  ITò  Tð  T�!ð  Tð  Tð  Tð  Tð  Uð  Ur(   ))ÚredÚgreenÚblue)Údiffuse_redÚdiffuse_greenÚdiffuse_blue)r¹   ÚgÚbc              3  ó$   •K  — | ]
}|‰v ¯|V — Œd S rS   rF   )rH   r=   r±  s     €r&   r»   zread_ply.<locals>.<genexpr>§  s'   øè è € ÐPÐP˜AÀAÈÀKÀK�aÀKÀKÀKÀKÐPÐPr(   )ÚalphaÚdiffuse_alphar=   c                óH   •— g | ]}t          ‰|         ‰|         ¦  «        ‘ŒS rF   )r¿  )rH   rê   Útypesr±  s     €€r&   r�   zread_ply.<locals>.<listcomp>¨  s+   ø€ ÐhÐhÐh¸q�: f¨Q¤i°°q´Ñ:Ô:ÐhÐhÐhr(   rF   c              3  ó\   •K  — | ]&}t          |¦  «        t          ‰¦  «        k    ¯"|V — Œ'd S rS   rÊ  rË  s     €r&   r»   zread_ply.<locals>.<genexpr>©  su   øè è € ð  Kð  K˜1ÕtwÐxyÑtzÔtzõ  Bð  CIñ  Jô  Jò  uJð  uJ�Qð  uJð  uJð  uJð  uJð  Kð  Kr(   )©ÚsrÈ   )ÚurJ   )Ú	texture_uÚ	texture_v)Ú	texture_sÚ	texture_tr   rÇ   c              3  ó$   •K  — | ]
}|‰v ¯|V — Œd S rS   rF   )rH   rê   rÇ   s     €r&   r»   zread_ply.<locals>.<genexpr>¬  s'   øè è € ÐRÐR˜QÈÈTÈ	È	�qÈ	È	È	È	ÐRÐRr(   )Úvertex_indicesÚvertex_indexzPLY file without facesÚtexcoordr+   z0PLY texcoord lists do not match the face cornersr   rY   c              3  óÆ   K  — | ]\}|                      d ¦  «        ¯t          |                     dd¦  «        ¦  «        dk    ¯>|                     dd¦  «        d         V — Œ]dS )ÚTextureFileNr   )rü   r   r‡   )rH   Úcs     r&   r»   zread_ply.<locals>.<genexpr>Á  sm   è è € Ð|Ð|°À!Ç,Â,È}ÑB]ÔB]Ð|ÕbeÐfg×fmÒfmÐnrÐtuÑfvÔfvÑbwÔbwÐz{Òb{Ðb{˜Ÿš  qÑ)Ô)¨!Ô,Ðb{Ðb{Ðb{Ðb{Ð|Ð|r(   rõ   )r   r»  rT   r   r1   rt   rÀ   r¹  r“  rì   rs  r   r4   Úarray_equalrÁ   r   r'   rò   ró   r\   rU   rP   r  )rQ   r>   ry  Úheaderrz  r@   rB   rí   rD   rÕ  Úuv_namesrC   Ú
index_namer×   r)   r2   Úcorner_verticesÚcoordsÚcoord_countsÚ
corner_uvsr  rÿ   r%   ÚsourcerA   rO   Útexture_namerÇ   rØ  r±  s                              @@@r&   Úread_plyrò  š  s�  øøø€ õ �‰:Œ:€DÝ!3°D·O²OÑ4EÔ4EÑ!FÔ!FÑ€Hˆf�hØ�hÔ€FØZÐZ ÐZÑZÔZ€EÝŒx˜ œ f¨S¤k°6¸#´;Ð?ÀÑCÔC×JÒJÍ2Ì:ÑVÔV€HØI[ÐI[ÐI[Õ_bÐciÑ_jÔ_jÒIjÐIj�bŒh˜˜tœ f¨T¤l°F¸4´LÐAÀ1ÑEÔEÐEÐpt€GÝð  Uð  Uð  Uð  UÐzð  Uñ  Uô  Uð  W[ñ  \ô  \€EØ€FØð mÝÐPÐPÐPÐPÐ!@ÐPÑPÔPÐRVÑWÔWˆÝ”ÐhÐhÐhÐhÐhÀEÐY^ÐMfÈeÈXÈXÐdfÑDgÐhÑhÔhÐjkÑlÔlˆÝð  Kð  Kð  Kð  KÐ pð  Kñ  Kô  Kð  MQñ  Rô  R€HØ\dÐ
n�"Œ(�F˜8 Aœ;Ô'¨¨V°H¸Q´KÔ-@×-GÒ-GÍÌ
Ñ-SÔ-SÑ)SÐTÐVWÑ
XÔ
XÐ
XÐjn€CØ�<Š<˜ Ñ#Ô#€DÝÐRÐRÐRÐRÐ"DÐRÑRÔRÐTXÑYÔY€JØÐÝÐ1Ñ2Ô2Ð2Ø˜
Ô#�L€Dˆ&Ø�;Š;•r”xÑ Ô €DÝ�V‘”€IØ˜9”o€OØ�TÐÑØ# JÔ/Ñˆ�ÝŒ~˜l¨A°©JÑ7Ô7ð 	QÝÐOÑPÔPÐPØ—^’^ B¨Ñ*Ô*¨9Ô5ˆ
ÝŒ~˜×6Ò6°r¸1Ñ=Ô=×DÒDÅRÄZÑPÔPÐR\×RdÒRdÐegÐijÑRkÔRkÐlÐnoÑpÔpˆÝ% dÑ+Ô+‰ˆ�Ø˜˜˜˜1˜”×$Ò$¥R¤XÑ.Ô.ˆÝŒh˜˜q˜q˜q !˜tœ a¨&°°°°A°¬,Ñ&6Ð7¸Ñ;Ô;ˆØ$,¨VÔ$4¸g¸o°d°dÐSZÐ[aÔSbÐlrÐlzÐdhÐdhð  AGð  HNô  AO˜6�'ˆØ—’  AÑ&Ô&ˆˆàˆØ€HÝÐ|Ð|°hÐ|Ñ|Ô|ð  Cñ  Dô  D€LØð ^˜˜¨T¬[¸<Ñ-G×,PÒ,PÑ,RÔ,R˜Ý!2µ=ÀÄÈ|ÑA[Ñ3\Ô3\Ñ!]Ô!]ˆ�ÑÝ�F˜H e¨W°cÀ6À>¸4¸4ÐW]×WbÒWbÐcdÐfgÑWhÔWhÐuÐuÐltÐuÐuÐur(   c                óú  ‡— t          | j        t          j        ¦  «        }t          | j        €t          | j        | j        ¦  «        n| j        t          j        ¦  «        }g d¢}|dd…df         |dd…df         |dd…df         |dd…df         |dd…df         |dd…df         dœ}| j        �Et          | j        t          j        ¦  «        }|ddgz  }||dd…df         d|dd…df         z
  d	œz  }dŠ| j        � t          | j        t          j        ¦  «        ŠnM| j	        �F| j        �?t          t          | j	        ¦  «        t          | j        t          j        ¦  «        ¦  «        Š‰�Bd
d‰j        d         …         }|d„ |D ¦   «         z  }|ˆfd„t          |¦  «        D ¦   «         z  }t          j        t          |¦  «        t          j        |¦  «        ¦  «        }|                     ¦   «         D ]
\  }	}
|
||	<   Œt          j        t          | j        ¦  «        t          j        ddg¦  «        ¦  «        }dt          | j        t          j        ¦  «        c|d<   |d<   ddddt          |¦  «        › �g}|d„ |D ¦   «         z  }|dt          |¦  «        › �ddgz  }|› d�d                     |¦  «        dz                        d¦  «        |                     ¦   «         z   |                     ¦   «         z   iS )zâBinary little-endian PLY: float x y z, nx ny nz, s t (v upwards) when the mesh has uvs, uchar red green blue (alpha)
    sRGB colours (the vertex colours, or the base colour texture sampled at the vertex uvs), uchar/int faces.N))rœ   ú<f4)rÄ  rô  )rÅ  rô  )rÆ  rô  )rÇ  rô  )rÈ  rô  r   r   r+   )rœ   rÄ  rÅ  rÆ  rÇ  rÈ  )rÛ  rô  )rÈ   rô  rÚ  )rÌ  rÍ  rÎ  rÕ  c                ó   — g | ]}|d f‘ŒS )rW  rF   )rH   rê   s     r&   r�   zwrite_ply.<locals>.<listcomp>Ù  s   € Ð,Ð,Ð, �A�t�9Ð,Ð,Ð,r(   c           	     ó¼   •— i | ]X\  }}|t          j        ‰d d …|f                              dd¦  «        dz  ¦  «                             t           j        ¦  «        “ŒYS )Nr   r   rZ   )r   Úrintr  rt   rG   )rH   r�   rê   rD   s      €r&   rL   zwrite_ply.<locals>.<dictcomp>Ú  s]   ø€ ÐlÐlÐlÑSWÐSTÐVW�A•r”w˜v a a a¨ dœ|×0Ò0°°AÑ6Ô6¸Ñ<Ñ=Ô=×DÒDÅRÄXÑNÔNÐlÐlÐlr(   )rê   rW  )râ  z<i4©rY   rY   rê   râ  Úplyzformat binary_little_endian 1.0zcomment WanGP mesh3dzelement vertex c                ó4   — g | ]\  }}d |dk    rdnd› d|› �‘ŒS )z	property rô  rg   rV  r†   rF   )rH   rê   r—  s      r&   r�   zwrite_ply.<locals>.<listcomp>á  s9   € Ð]Ð]Ð]É7È1ÈdÐF d¨e¢m m˜7˜7¸ÐFÐFÀ1ÐFÐFÐ]Ð]Ð]r(   zelement face z&property list uchar int vertex_indicesÚ
end_headerz.plyr/  r´  )ru   r@   r   rM   rB   r   rA   rC   rD   rõ   rn   rÖ   r­  r    r   r8   rN   r_  r�   r0  Útobytes)r*  r+  r@   rB   r™  r2  rC   rí   Úrecordsr¬   r  rA   ré  rD   s                @r&   Ú	write_plyrþ  Ç  s:  ø€ õ �d”m¥R¤ZÑ0Ô0€HÝÀ$Ä,ÐBV•^ D¤M°4´:Ñ>Ô>Ð>Ð\`Ô\hÕjlÔjtÑuÔu€GØdÐdÐd€FØ˜Q˜Q˜Q ˜T”N¨°!°!°!°Q°$¬¸hÀqÀqÀqÈ!Àt¼nÐT[Ð\]Ð\]Ð\]Ð_`Ð\`ÔTaÐipÐqrÐqrÐqrÐtuÐquÔivð  Fð  GHð  GHð  GHð  JKð  GKô  Lð  Mð  M€GØ„xÐÝ�T”X�rœzÑ*Ô*ˆØ�< Ð.Ñ.ˆØ˜˜Q˜Q˜Q ˜Tœ¨¨S°°°°A°¬Y©Ð7Ð7Ñ7ˆØ€FØ„{ÐÝ˜œ¥R¤ZÑ0Ô0ˆˆØ	ŒÐ	$¨¬Ð)=Ý� ¤Ñ0Ô0µ&¸¼Å2Ä:Ñ2NÔ2NÑOÔOˆØÐØ1Ð2B°6´<À´?Ð2BÔCˆØÐ,Ð, eÐ,Ñ,Ô,Ñ,ˆØÐlÐlÐlÐlÕ[dÐejÑ[kÔ[kÐlÑlÔlÑlˆÝŒh•s˜8‘}”}¥b¤h¨vÑ&6Ô&6Ñ7Ô7€GØ—}’}‘”ð ð ‰ˆˆVØˆ�‰ˆÝŒH•S˜œ‘_”_¥b¤h°Ð=\Ð/]Ñ&^Ô&^Ñ_Ô_€EØ*+­V°D´JÅÄÑ-IÔ-IÐ'€Eˆ#�J�Ð&Ñ'ØÐ6Ð8NÐPqÕbeÐfnÑboÔboÐPqÐPqÐr€FØ
Ð]Ð]ÐV\Ð]Ñ]Ô]Ñ]€FØ
Ð+�s 5™zœzÐ+Ð+Ð-UÐWcÐdÑd€FØˆMˆMˆM˜DŸIšI fÑ-Ô-°Ñ4×<Ò<¸WÑEÔEÈÏÊÑHYÔHYÑYÐ\a×\iÒ\iÑ\kÔ\kÑkÐlÐlr(   c                óŠ  — t          | ¦  «                             ¦   «         }t          |d¬¦  «        \  }}}d„ |D ¦   «         }d„ |D ¦   «         }d„ |D ¦   «         }|d         }|                     d¦  «        r*t	          j        |d         |d         |d	         gd
¦  «        nt	          j        d¦  «        }	g }
|D �]}|                     d¦  «        rðt          | 	                    d d
¦  «        ¦  «        d
k    rÉt          | ¦  «        j
        | 	                    d d
¦  «        d
         z                       ¦   «         r†t          t          | ¦  «        j
        | 	                    d d
¦  «        d
         z  d¦  «        5 }|
                     t          t          |¦  «        ¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   �Œ
d|                     dd¦  «        |                     dd¦  «        t!          t#          |
¦  «        ¦  «        |
t          |	¦  «        rN|	                     d¦  «                             ¦   «         |	                     d¦  «                             ¦   «         gnd t#          h d£|z  pd|v ¦  «        t#          h d£|z  ¦  «        dd h d£|k    r|                     dd¦  «        ndt          |¦  «        dœS )N)r±  )rº  c                ó,   — i | ]}|d          |d         “ŒS )r+  rÔ   rF   )rH   rÃ  s     r&   rL   zply_stats.<locals>.<dictcomp>é  s"   € Ð4Ð4Ð4¨ˆa�Œi˜˜7œÐ4Ð4Ð4r(   c                óL   — h | ]!}|d          dk    ¯|d         D ]
}|d         ’ŒŒ"S )r+  r±  ro  r   rF   rÂ  s      r&   rA  zply_stats.<locals>.<setcomp>ê  s;   € Ð[Ð[Ð[˜Q¨A¨f¬I¸Ò,AÐ,AÈ1È\Ì?Ð,AÐ,AÀa�A�a”DÐ,AÐ,AÐ,AÐ,Ar(   c                óL   — h | ]!}|d          dk    ¯|d         D ]
}|d         ’ŒŒ"S )r+  rÇ   ro  r   rF   rÂ  s      r&   rA  zply_stats.<locals>.<setcomp>ë  s;   € ÐWÐWÐW˜1¨!¨F¬)°vÒ*=Ð*=ÀqÈÄÐ*=Ð*=À!�!�A”$Ð*=Ð*=Ð*=Ð*=r(   r±  rœ   rÄ  rÅ  r   )r   rY   ræ  r?  rù  r   rÇ   >   rÛ  rÜ  rß  rÝ  rä  >   r¹   rÌ  Úf_dc_0rÏ  >   Úrot_0r  ÚopacityÚscale_0rD  )r   rT   r»  rì   r   r1   r   rü   r   r‡   rò   ró   rM  rý   r	   r   rÏ   r   rN  r(  r¾   )rQ   rf  ry  ré  rz  r)   Úvertex_propsÚ
face_propsr±  r  rO   rl  rQ  s                r&   Ú	ply_statsr	  æ  sU  € Ý�‰:Œ:× Ò Ñ"Ô"€DÝ!3°DÀÐ!MÑ!MÔ!MÑ€Hˆf�hØ4Ð4¨VÐ4Ñ4Ô4€FØ[Ð[ &Ð[Ñ[Ô[€LØWÐW ÐWÑWÔW€JØ�hÔ€FØHNÏ
Ê
ÐS[ÑH\ÔH\Ðr•”˜& œ+ v¨c¤{°F¸3´KÐ@À!ÑDÔDÐDÕbdÔbjÐkqÑbrÔbr€IØ€HØð Añ AˆØ×Ò˜mÑ,Ô,ð 	Aµ°W·]²]À4ÈÑ5KÔ5KÑ1LÔ1LÈqÒ1PÐ1PÕVZÐ[_ÑV`ÔV`ÔVgÐjq×jwÒjwÐx|Ð~ñ  kAô  kAð  BCô  kDñ  WD÷  VMò  VMñ  VOô  VOÐ1PÝ•d˜4‘j”jÔ'¨'¯-ª-¸¸aÑ*@Ô*@ÀÔ*CÑCÀTÑJÔJð AÈfØ—’¥
­;°vÑ+>Ô+>Ñ ?Ô ?Ñ@Ô@Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Aùà¨¯ª°H¸aÑ)@Ô)@È6Ï:Ê:ÐV\Ð^_ÑK`ÔK`ÕorÕswð  yAñ  tBô  tBñ  pCô  pCð  QYÝNQÐR[ÉnÌnÐf�Y—]’] 1Ñ%Ô%×,Ò,Ñ.Ô.°	·²¸aÑ0@Ô0@×0GÒ0GÑ0IÔ0IÐJÐJÐbfÝÐ?Ð?Ð?À,ÑNÐjÐR\Ð`jÐRjÑkÔkÝÐDÐDÐDÀ|ÑSÑTÔTÐdeÐtxØ1ZÐ1ZÐ1ZÐ^jÒ1jÐ1j�f—j’j ¨1Ñ-Ô-Ð-Ðpqõ  ADð  EIñ  AJô  AJð	Kð Kð Ks   Å;0F7Æ7F;	Æ>F;	))Únormalrô  rø  )r  rô  )rY   rY   )Ú	attributez<u2c           	     ó  — t          | ¦  «        dk    rƒddt          j        d| d¦  «        d         z  z   t          | ¦  «        k    rPt          j        | t
          t          j        d| d¦  «        d         d¦  «        d                              dd¦  «        S | d d	…                              ¦   «         d
k    rFt          j        t          j
        d| ¦  «        t          j        ¦  «                             dd¦  «        S t          d¦  «        ‚)NéT   é2   ú<IéP   r   r  r   rY   é   s   solids   vertex\s+(\S+)\s+(\S+)\s+(\S+)zNot an STL file)r   ÚstructÚunpack_fromr   r‘  Ú_STL_RECORDrÁ   r¦   rV   r‰   ÚfindallrM   rs  )rf  s    r&   Ú_stl_cornersr  þ  sã   € Ý
ˆ4�y„y�B‚€˜2 ¥VÔ%7¸¸dÀBÑ%GÔ%GÈÔ%JÑ JÑJÍcÐRVÉiÌiÒWÐWÝŒ}˜T¥;µÔ0BÀ4ÈÈrÑ0RÔ0RÐSTÔ0UÐWYÑZÔZÐ[dÔe×mÒmÐnpÐrsÑtÔtÐtØˆBˆQˆB„x‡~‚~ÑÔ˜8Ò#Ð#ÝŒx�œ
Ð#EÀtÑLÔLÍbÌjÑYÔY×aÒaÐbdÐfgÑhÔhÐhÝ
Ð&Ñ
'Ô
'Ð'r(   c               óÈ   — t          t          t          | ¦  «                             ¦   «         ¦  «        ¦  «        \  }}t	          |||                     dd¦  «        ¦  «        S )zjMesh from a binary or ASCII STL; corners with identical positions are welded (stored normals are ignored).r   rY   )r'   r  r   rT   rP   rÁ   )rQ   r>   r@   r%   s       r&   Úread_stlr    sN   € å#¥Lµ°d±´×1FÒ1FÑ1HÔ1HÑ$IÔ$IÑJÔJÑ€HˆgÝ�F˜H g§o¢o°b¸!Ñ&<Ô&<Ñ=Ô=Ð=r(   c                óP  — t          | j        | j                 t          j        ¦  «        }t          j        |dd…df         |dd…df         z
  |dd…df         |dd…df         z
  ¦  «        }t          j        t          |¦  «        t          ¦  «        }|t          j	        t          j
                             |dd¬¦  «        d¦  «        z  |d<   ||d	<   |› d
�d                     dd¦  «        t          j        dt          |¦  «        ¦  «        z   |                     ¦   «         z   iS )zYBinary STL with unit face normals (STL has no units; see export_mesh for scale and Z-up).Nr   r   r+   T)rè   Úkeepdimsg ÂëþKH´9r
  r  z.stls   WanGP mesh3d binary STLr  ó    r  )ru   r@   rA   r   rM   Úcrossr   r   r  r-   Úlinalgr¢   Úljustr  Úpackrü  )r*  r+  r  rB   rý  s        r&   Ú	write_stlr     s
  € å�T”] 4¤:Ô.µ´
Ñ;Ô;€GÝŒh�w˜q˜q˜q !˜t”} w¨q¨q¨q°!¨t¤}Ñ4°g¸a¸a¸aÀ¸d´mÀgÈaÈaÈaÐQRÈdÄmÑ6SÑTÔT€GÝŒh•s˜7‘|”|¥[Ñ1Ô1€GØ¥"¤*­R¬Y¯^ª^¸GÈ!ÐVZ¨^Ñ-[Ô-[Ð]bÑ"cÔ"cÑc€GˆHÑØ €GˆIÑØˆMˆMˆMÐ5×;Ò;¸BÀÑEÔEÍÌÐTXÕZ]Ð^eÑZfÔZfÑHgÔHgÑgÐjq×jyÒjyÑj{Ôj{Ñ{Ð|Ð|r(   c                ó´  — t          | ¦  «                             ¦   «         }t          |¦  «        }dt          t	          |¦  «        d         ¦  «        t          |¦  «        dz  dg t          |¦  «        rN|                     d¦  «                             ¦   «         |                     d¦  «                             ¦   «         gnd dddd dt          |¦  «        dœS )NÚstlr   rY   FrD  )r   rT   r  r   r'   rN  r(  r¾   )rQ   rf  r  s      r&   Ú	stl_statsr#    sî   € Ý�‰:Œ:× Ò Ñ"Ô"€DÝ˜4Ñ Ô €GØ­­[¸Ñ-AÔ-AÀ!Ô-DÑ)EÔ)EÕPSÐT[ÑP\ÔP\Ð`aÑPaÐpqð  @BÝJMÈgÉ,Ì,Ð`�W—[’[ ‘^”^×*Ò*Ñ,Ô,¨g¯kªk¸!©n¬n×.CÒ.CÑ.EÔ.EÐFÐFÐ\`Ðlqð  BGð  WXð  gkð  wxõ  GJð  KOñ  GPô  GPðQð Qð Qr(   )r   r   r   r   )r)   r   r   r   )NNN)r   r   )rQ   r   r   r   )rV   r   r   r   )r]   r   rC   r   r   r   rS   )r   r   )rƒ   r„   r   r„   )rQ   r   r   r’   )r®   r¯   r   r   )rÃ   r¯   r   r   )rª   r„   rV   r   r   r„   )r*  )r*  r   r+  r„   r   r,  )rQ   r„   r   r:  )rf  rg  r   rh  )r~  rÏ   rn  r:  r  r„   r   r€  )r   r€  )r3  r„   ry  r¦  r   r’   )r°  )rf  rg  r   r²  )r  r   r—  r„   r   r   )rf  rg  r   r   )8Ú__doc__Ú
__future__r   rO  r‰   r  Úpathlibr   rk   r   r9   Úimagesr   r   r   r	   r
   r   r   r*  r   r   r   r   r'   r4   rP   rU   r\   rn   ru   rˆ   r‘   r­   rÂ   rÜ   r$  r)  r9  rR  ru  r}  r¤  r”  r¯  r»  r¿  rò  rþ  r	  r8   r  r  r  r   r#  rF   r(   r&   ú<module>r(     s‰  ððð ð
 #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø €€€à nÐ nÐ nÐ nÐ nÐ nÐ nÐ nÐ nÐ nÐ nÐ nÐ nÐ nÐ nÐ nÐ nÐ nØ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ Fð
#ð 
#ð 
#ð 
#ð@ð @ð @ð @ðlð lð lð lð lð+ð +ð +ð +ð[ð [ð [ð [ð
Hð Hð Hð HðGð Gð Gð Gð Gð Að  Að  A€ð ð  ð  ð  ðð ð ð ð @ð @ð @ð @ðHð Hð Hð Hð  #ð Vdð Vdð Vdð Vdð Vdð VdðrUð Uð Uð Uð
$ð $ð $ð $ð $ðNAð Að Að Að,Iˆf�dð I˜F Dð I¨'°4ð I¸À$ð IÈÐQUð IÐW^Ð`dð IÐfnÐptð IÐv~ð  AEð IØ�TðIØ" DðIØ*0°$ðIØ8@À$ðIØHOÐQUðIØW`ÐbfðIØhpÐrvðIð yBð  DHðI€
ð)ð )ð )ð )ð,/ð /ð /ð /ðdð ð ð ðð ð ð ð4
&ð 
&ð 
&ð 
&ð 
&ð-ð -ð -ð -ð
 #ð *vð *vð *vð *vð *vð *vðZmð mð mð mð mð>Kð Kð Kð Kð* ˆbŒhÐbÐbÐbÑcÔc€ð(ð (ð (ð (ð #ð >ð >ð >ð >ð >ð >ð}ð }ð }ð }ð }ðQð Qð Qð Qð Qð Qr(   