Ë
    :vžjx’  ã                   óv  — d dl Z d dlZd dlmZmZ d dlZ	 d dlmZ ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ 	 	 	 	 	 	 	 d"dededz  dededededz  dededefd„Zd#d„Z d„ Z!d„ Z"d„ Z#dededefd„Z$d$d„Z%	 	 	 	 	 	 	 	 	 d%d „Z&d!eiZ'y# e	$ rZ
ddlmZ  ee
«      ZY dZ
[
Œ—dZ
[
ww xY w)&é    N)ÚdefaultdictÚdeque)ÚImageé   )ÚExceptionWrapper)Úutil)ÚlogÚtol)ÚResolverLike)ÚLoadable)Úto_float)ÚSimpleMaterial)ÚTextureVisualsÚunmerge_facesÚfile_objÚresolverÚgroup_materialÚskip_materialsÚmaintain_orderÚmetadataÚsplit_objectsÚsplit_groupsÚreturnc           
      óX  ‡-— | j                  «       }	t        j                  |	«      }	dj                  |	j	                  «       j                  dd«      «      }	|	j                  dd«      }	i }
|	j                  d«      }|sh|dk\  rc|	|dz   |	j                  d|«       j	                  «       }	 t        ||   |¬	«      }|j                  «       D ��ci c]  \  }}|t        d/i |¤Ž“Œ }
}}t        |	¬«      \  }}}}t!        |	||«      }|s|s|rt#        ||||«      }t%        |«      s|�d|i}|�||d<   |�||d<   |S i }t%        |«      dkD  �ræ|j'                  «       \  }}}}t)        j*                  d|t(        j,                  ¬«      dd D �cg c]%  }|j+                  dd«      d   j	                  «       ‘Œ' }}t%        |d   j                  dd«      j+                  «       «      Š-t/        ˆ-fd„|D «       «      }|rkt1        j2                  dj5                  |«      j                  dd«      dt0        j6                  ¬«      }||dkD  xx   dz  cc<   t9        |‰-|d   ¬«      \  }}} n$t        j                  d«       t;        |«      \  }}} g }!|r|�|!j=                  |«       |r|�|!j=                  |«       |r*t%        |
«      dkD  r|�|!j=                  t?        |«      «       |!rdj5                  |!«      }"n0|�|}"n+tA        d„ tC        |dd«      tC        | dd«      dfD «       «      }"t        jD                  |"|«      }"|jG                  «       }#|�Á| �,t%        | «      t%        |«      k(  rtI        ||| |¬ «      \  }$}%}&}'nd}'tI        |||¬ «      \  }$}%}&tJ        jL                  rBt1        jN                  ||   ||%   |$   «      sJ ‚|$jQ                  «       t%        ||%   «      k  sJ ‚	 ||&   }(|#jS                  ||%   jG                  «       |$d"œ«       �n7d}(tJ        jL                  r|jQ                  «       t%        |«      k  sJ ‚|�5t1        jT                  | «      |jT                  k(  rtI        || |¬ «      \  }$}%}'n«|r%t1        jV                  t%        |«      tX        ¬#«      }%n$t1        jZ                  t%        |«      tX        ¬#«      }%d|%|<   t1        jZ                  t%        |«      t0        j6                  ¬#«      })t1        j\                  |%j_                  «       «      |)|%<   |)|   }$d}'|#jS                  |$||%   jG                  «       d$œ«       |�		 ||%   |#d<   |'�k	 ||'   }*|*jT                  |#d   jT                  k7  rDta        d&j                  t?        |*jT                  «      t?        |#d   jT                  «      «      «      ‚|*|#d<   d}+||
v rtc        |(|
|   ¬(«      }+nD|(�'t%        |(«      t%        |#d   «      k(  rtc        |(¬)«      }+n|�t        j                  d*|› d+�«       |+|#d,<   |#||"<   t%        |«      dkD  r�Œæ|je                  «       D �cg c]  }||d-œ‘Œ	 },}||,d.œS c c}}w # t        t        f$ r t        j                  d
|› �«       Y �ŒŸt        $ r t        j                  d
|› �d¬«       Y �ŒÄw xY wc c}w # t        $ r t        j                  d!«       d}(Y �Œñw xY w# t        $ r t        j                  d%d¬«       Y �Œ¯w xY w# t        $ r t        j                  d'd¬«       Y �Œiw xY wc c}w )0aÆ  
    Load a Wavefront OBJ file into kwargs for a trimesh.Scene
    object.

    Parameters
    --------------
    file_obj : file like object
      Contains OBJ data
    resolver : trimesh.visual.resolvers.Resolver
      Allow assets such as referenced textures and
      material files to be loaded
    group_material : bool
      Group faces that share the same material
      into the same mesh.
    skip_materials
      Don't load any materials.
    maintain_order
      Make the strongest attempt possible to not reorder faces
      or vertices which may result in visual artifacts and other
      odd behavior. The OBJ data structure is quite different than
      the "flat matching array" used by Trimesh and GLTF so this may
      not be completely possible.
    split_objects
      Whenever the loader encounters an `o` directive in the OBJ
      file, split the loaded result into a new Trimesh object.
    split_groups
        Whenever the loader encounters a `g` directive in the OBJ
        file, split the loaded result into a new Trimesh object.

    Returns
    -------------
    kwargs : dict
      Keyword arguments which can be loaded by
      trimesh.exchange.load.load_kwargs into a trimesh.Scene
    z
{}
z
Ú
z\
Ú Úmtllibr   é   )r   zunable to load materials from: T©Úexc_info)ÚtextNÚverticesÚvertex_normalsÚvertex_colorsz^f)Úflagsé   Ú/Ú c              3   óv   •K  — | ]0  }‰t        |j                  d d«      j                  «       «      k(  –— Œ2 y­w)r'   r(   N)ÚlenÚreplaceÚsplit)Ú.0ÚfÚcolumnss     €úe/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/trimesh/exchange/obj.pyÚ	<genexpr>zload_obj.<locals>.<genexpr>›   s0   øè ø€ ÐYÉjÈ˜¤C¨¯	©	°#°sÓ(;×(AÑ(AÓ(CÓ$DÕDÉjùs   ƒ69©ÚsepÚdtype)Úarrayr/   Úsample_linez+faces have mixed data: using slow fallback!Ú_c              3   ó$   K  — | ]  }|�|–— Œ
 y ­w©N© ©r-   Úis     r0   r1   zload_obj.<locals>.<genexpr>Æ   s#   è ø€ ð ñ�Að
 �=ô ñùs   ‚Ú	file_nameÚnameÚgeometry)Úmaintain_facesz)index failed on UV coordinates, skipping!)r"   Úfaces©r4   )rA   r"   zfailed to load vertex_colorszincorrect normals {} != {}zfailed to load vertex_normals)ÚuvÚmaterial)rC   zspecified material (z)  not loaded!Úvisual)r?   Úframe_to)r?   Úgraphr:   )3Úreadr   Údecode_textÚformatÚstripr+   ÚfindÚ	parse_mtlÚitemsr   ÚOSErrorÚ	TypeErrorr	   ÚdebugÚBaseExceptionÚ_parse_verticesÚ_preprocess_facesÚ	_group_byr*   ÚpopÚrer,   Ú	MULTILINEÚallÚnpÚ
fromstringÚjoinÚint64Ú_parse_faces_vectorizedÚ_parse_faces_fallbackÚappendÚstrÚnextÚgetattrÚunique_nameÚcopyr   r
   ÚstrictÚallcloseÚmaxÚupdateÚshapeÚonesÚboolÚzerosÚarangeÚsumÚ
ValueErrorr   Úkeys).r   r   r   r   r   r   r   r   Úkwargsr!   Ú	materialsÚmtl_positionÚmtl_pathÚmaterial_kwargsÚkÚvÚvnÚvtÚvcÚface_tuplesÚpcr?   rD   Úcurrent_objectÚcurrent_groupÚchunkr<   Ú
face_linesÚ
flat_arrayr5   rA   Ú	faces_texÚ
faces_normÚ
name_partsr>   ÚmeshÚ	new_facesÚmask_vÚmask_vtÚmask_vnrC   ÚinverseÚnormalsrE   rG   r/   s.                                                @r0   Úload_objr�      s*  ø€ ð^ �=‰=‹?€Dä×Ñ˜DÓ!€Dð �?‰?˜4Ÿ:™:›<×/Ñ/°¸Ó=Ó>€Dð �<‰<˜ Ó#€Dð €IØ—9‘9˜XÓ&€LÙ˜l¨aÒ/ð ˜ qÑ(¨4¯9©9°T¸<Ó+HÐI×OÑOÓQˆð
	Sä'¨°Ñ(:ÀXÔNˆOà<K×<QÑ<QÔ<SÔTÑ<S±D°A°q˜œNÑ/¨QÑ/Ñ/Ð<SˆIÑTô $¨Ô.�M€A€rˆ2ˆrô $ D¨-¸ÓF€Kñ
 ™©,Ü ¨^¸]ÈLÓYˆô ˆ{Ô  Ø˜!ˆ_ˆØˆ>Ø#%ˆBÐÑ Øˆ>Ø"$ˆBˆÑØˆ	ð €HÜ
ˆkÓ
˜QÓ
à9D¿¹Ó9JÑ6ˆ�. -°ô —X‘X˜d E´·±Ô>¸q¸rÑBó
áB�ð �G‰G�D˜!Ó˜QÑ×%Ñ%Õ'ØBð 	ð 
ô �j ‘m×+Ñ+¨C°Ó5×;Ñ;Ó=Ó>ˆÜÓYÉjÓYÓYˆ
ñ ô —M‘MØ—‘˜Ó$×,Ñ,¨S°#Ó6¸CÄrÇxÁxôˆEð
 �%˜!‘)Ó Ñ!Óô ,CØ W¸*ÀQ¹-ô,Ñ(ˆE�9™jô �I‰IÐCÔDÜ+@ÀÓ+LÑ(ˆE�9˜jð ˆ
Ù˜^Ð7Ø×Ñ˜nÔ-Ù˜MÐ5Ø×Ñ˜mÔ,Ùœc )›n¨qÒ0°XÐ5IØ×Ñœc (›mÔ,ñ Ø—8‘8˜JÓ'‰DØÐ'Ø!‰Dô ñ ô ˜H k°4Ó8Ü˜H f¨dÓ3Øñóó ˆDô ×Ñ  hÓ/ˆð �{‰{‹}ˆØÐ ð Ð%¬#¨j«/¼SÀ»ZÒ*GÜ6CØ˜9 jÀô7Ñ3�	˜6 7©Gð �ä-:Ø˜9°^ô.Ñ*�	˜6 7ô �zŠzô —{‘{ 1 U¡8¨Q¨v©Y°yÑ-AÔBÐBÐBà —}‘}“¬¨Q¨v©Y«Ò7Ð7Ð7ðð ˜‘[�ð �K‰K Q v¡Y§^¡^Ó%5À	ÑJÖKð ˆBä�zŠzØ—y‘y“{¤S¨£VÒ+Ð+Ð+Øˆ~¤"§(¡(¨:Ó"6¸%¿+¹+Ò"Eä-:Ø˜:°nô.Ñ*�	˜6¡7ñ "ÜŸW™W¤S¨£V´4Ô8‘FäŸX™X¤c¨!£f´DÔ9�FØ $��u‘ô Ÿ(™(¤3 q£6´·±Ô:�Ü"$§)¡)¨F¯J©J«LÓ"9�˜‘Ø# E™N�	à�ð �K‰K )¸¸6¹¿¹Ó9IÑJÔKð ˆ>ðIà(*¨6©
��_Ñ%ð ÐðJà˜W™+�Ø—=‘= D¨Ñ$4×$:Ñ$:Ò:Ü$Ø4×;Ñ;Ü §¡Ó.´°D¸Ñ4D×4JÑ4JÓ0Kóóð ð
 *1�Ð%Ñ&ð ˆØ�yÑ ä# r°I¸hÑ4GÔH‰FØˆ^¤ B£¬3¨t°JÑ/?Ó+@Ò @ä# rÔ*‰FØÐ!ä�I‰IÐ,¨X¨J°nÐEÔFàˆˆX‰àˆ�‰ôe ˆkÓ
˜QÔ
ðj 6>·]±]´_ÓE±_°˜!¨Ó+°_€EÐEð !¨5Ñ1Ð1ùóy UøÜœÐ#ò 	Dä�I‰IÐ7¸°zÐB×CÜò 	Sä�I‰IÐ7¸°zÐBÈT×RÐRð	Süò^
øôv !ò Ü—	‘	ÐEÔFØ“ðûôV !ò IÜ—	‘	Ð8À4×HÐHðIûô !ò JÜ—	‘	Ð9ÀD×IÐIðJüò& Fsm   Â)#Y ÃYÃ"Y Æ	*Z-ÏZ2 Õ[ ÕA*\  Ù\'ÙY Ù'Z*Ú"Z*Ú)Z*Ú2 [Û[Û [=Û<[=Ü  \$Ü#\$c                 ó  — t        j                  | «      } d}i }t        j                  t        | «      j	                  «       «      }dddddœ}|D �]Q  }|j	                  «       j                  «       }t        |«      dk  rŒ1|d   j                  «       }|d	k(  r!|�|||d
   <   d
dj                  |dd «      i}Œj|dk(  r…|j                  «       j                  d«      dz   }	||	d j	                  «       }
	 |j                  |
«      }t        j                  t        j                  |«      «      |d<   |
|d   j                  d<   Œô||j%                  «       v r@	 |dd D �cg c]  }t'        |«      ‘Œ }}t        |«      dk(  r|d   }|�||||   <   |||<   �ŒF|€�ŒJ|dd ||<   �ŒT |r|||d
   <   |S # t        $ r t!        j"                  dd¬«       Y �Œ„w xY wc c}w # t        $ r t!        j"                  dd¬«       Y �Œ°w xY w)a8  
    Parse a loaded MTL file.

    Parameters
    -------------
    mtl : str or bytes
      Data from an MTL file
    resolver : trimesh.Resolver
      Fetch assets by name from file system, web, or other

    Returns
    ------------
    mtllibs : list of dict
      Each dict has keys: newmtl, map_Kd, Kd
    NÚdiffuseÚambientÚspecularÚ
glossiness)ÚkdÚkaÚksÚnsr&   r   Únewmtlr>   r(   Úmap_kdr   ÚimageÚ	file_pathzfailed to load imageTr   zfailed to convert color!)r   rI   ra   Ú
splitlinesrK   r,   r*   Úlowerr\   ÚindexÚgetr   ÚopenÚwrap_as_streamÚinforR   r	   rQ   rq   Úfloat)Úmtlr   rD   rs   ÚlinesÚmappedÚliner,   Úkeyr�   r=   Ú	file_dataÚxÚvalues                 r0   rM   rM   @  s$  € ô" ×
Ñ
˜3Ó
€Cð €Hà€Iä�N‰Nœ3˜s›8Ÿ>™>Ó+Ó,€Eð  Y°jÈÑU€Fäˆà—
‘
“×"Ñ"Ó$ˆäˆu‹:˜Š?Øà�A‰h�n‰nÓˆà�(Š?ð Ð#à.6�	˜( 6Ñ*Ñ+ð  §¡¨¨q¨r¨Ó 3Ð4‰Hà�HŠ_à—J‘J“L×&Ñ& xÓ0°1Ñ4ˆEØ˜U˜V˜×*Ñ*Ó,ˆIð	AØ$ŸL™L¨Ó3�	ô %*§J¡J¬t×/BÑ/BÀ9Ó/MÓ$N�˜Ñ!à6?�˜Ñ!×&Ñ& {Ò3ð
 �F—K‘K“MÑ!ðEà+0°°©9Ó5©9 aœ˜q�¨9�Ð5ä�u“: ’?Ø! !™H�EØÐ'à,1�H˜V C™[Ñ)à$)�H˜S‘Mùð Ò!à! ! "˜IˆH�S‹Mðg ñj Ø&.ˆ	�(˜6Ñ"Ñ#àÐøô3 !ò AÜ—	‘	Ð0¸4×@Ð@ðAüò 6øô !ò EÜ—	‘	Ð4¸t×DÐDðEús7   Ã4AF0ÅGÅGÅ/$GÆ0 GÇGÇGÇ H Ç?H c                 ó4  — | j                  d|f«      } t        |j                  «       j                  «       «      }t	        ||z  «      }t        j                  |«      |z  }| dd…|f   }d\  }}||dz  k(  r~dj                  d„ |j                  «       D «       «      j                  d«      }	|	|k(  r| dd…|dz   f   }nW|	t	        |dz  «      k(  r| dd…|dz   f   }n9t        j                  d	|› �«       n ||d
z  k(  r| dd…|dz   f   }| dd…|dz   f   }|||fS )a  
    Parse loaded homogeneous (tri/quad) face data in a
    vectorized manner.

    Parameters
    ------------
    array : (n,) int
      Indices in order
    columns : int
      Number of columns in the file
    sample_line : str
      A single line so we can assess the ordering

    Returns
    --------------
    faces : (n, d) int
      Faces in space
    faces_tex : (n, d) int or None
      Texture for each vertex in face
    faces_norm : (n, d) int or None
      Normal index for each vertex in face
    éÿÿÿÿN©NNr   r   c              3   ó>   K  — | ]  }|j                  d «      –— Œ y­w)r'   N)rK   r;   s     r0   r1   z*_parse_faces_vectorized.<locals>.<genexpr>Å  s   è ø€ ÐBÑ.A¨˜Ÿ™ ŸÑ.Aùs   ‚r'   r&   zface lines are weird: é   )Úreshaper*   rK   r,   ÚintrZ   rn   r\   Úcountr	   rQ   )
r5   r/   r6   Úgroup_countÚper_refr�   rA   rƒ   r„   r²   s
             r0   r^   r^   ˜  s;  € ð0 �M‰M˜2˜w˜-Ó(€Eô �k×'Ñ'Ó)×/Ñ/Ó1Ó2€Kô �'˜KÑ'Ó(€Gä�I‰I�kÓ" WÑ,€Eà’!�U�(‰O€Eð 'Ñ€IˆzØ�+ ‘/Ò!ð —‘ÑB¨k×.?Ñ.?Ô.AÓBÓB×HÑHÈÓMˆØ�GÒð šq %¨!¡)˜|Ñ,‰JØ”c˜' A™+Ó&Ò&ð ša ¨¡˜lÑ+‰Iä�I‰IÐ.¨{¨mÐ<Õ=Ø	�K !‘OÒ	#ð š!˜U Q™Y˜,Ñ'ˆ	àš1˜e a™i˜<Ñ(ˆ
Ø�)˜ZÐ'Ð'ó    c                 ó  — g g g }}}| D �]W  }|j                  «       j                  d«      d   j                  «       }t        |«      }|dk(  rn¢|dk(  r|d   |d   |d   |d   |d   |d   g}n‚|dkD  rZg }|j                  }t	        t        |«      dz
  «      D �	cg c](  }	 ||d   «       |||	dz      «       |||	dz      «      g‘Œ* c}	 |}n#t        j                  dt        |«      › d�«       Œç|D ]l  }
|
j                  d	«      }|j                  t        |d   «      «       	 |j                  t        |d   «      «       	 |j                  t        |d   «      «       Œn �ŒZ t        j                  |t        j                  ¬
«      j                  d«      }||dkD  xx   dz  cc<   d\  }}t        |«      t        |«      k(  rDt        j                  |t        j                  ¬
«      j                  d«      }||dkD  xx   dz  cc<   t        |«      t        |«      k(  rDt        j                  |t        j                  ¬
«      j                  d«      }||dkD  xx   dz  cc<   |||fS c c}	w # t        $ r Y �Œ8w xY w# t        $ r Y �Œ—w xY w)aC  
    Use a slow but more flexible looping method to process
    face lines as a fallback option to faster vectorized methods.

    Parameters
    -------------
    lines : (n,) str
      List of lines with face information

    Returns
    -------------
    faces : (m, 3) int
      Clean numpy array of face triangles
    r   r   r¯   é   r&   r   zface needs more values 3>z
 skipping!r'   rB   )r¬   r¯   r­   )rK   r,   r*   r`   Úranger	   rQ   r±   rR   rZ   r5   r]   r°   )r¤   rx   rz   ry   r¦   r,   Ú	len_splitÚcollectÚcollect_appendr<   r.   rA   rƒ   rŒ   s                 r0   r_   r_   Û  s}  € ð" �B˜ˆ2€r€Aô ˆð —
‘
“×"Ñ" 4Ó(¨Ñ+×1Ñ1Ó3ˆä˜“Jˆ	Ø˜Š>ØØ˜!Š^à˜1‘X˜u Q™x¨¨q©°5¸±8¸UÀ1¹XÀuÈQÁxÐP‰EØ˜Š]àˆGð %Ÿ^™^ˆNô œs 5›z¨A™~Ô.óñ /�Añ	 # 5¨¡8Ó,Ù" 5¨¨Q©¡<Ó0Ù" 5¨¨Q©¡<Ó0òð
 /òð ‰Eä�I‰IÐ1´#°e³*°¸ZÐHÔIØó ˆAà—G‘G˜C“LˆEà�H‰H”S˜˜q™“]Ô#ðØ—	‘	œ#˜e A™h›-Ô(ðà—	‘	œ#˜e A™h›-Õ(ò ð? ôd �H‰H�QœbŸh™hÔ'×/Ñ/°Ó8€EØ	ˆ%�!‰)Ó˜ÑÓØ#Ñ€IˆwÜ
ˆ2ƒw”#�a“&ÒÜ—H‘H˜R¤r§x¡xÔ0×8Ñ8¸ÓAˆ	Ø�)˜a‘-Ó  AÑ%Ó Ü
ˆ2ƒw”#�a“&ÒÜ—(‘(˜2¤R§X¡XÔ.×6Ñ6°wÓ?ˆØ�˜!‘Ó Ñ!Óà�)˜WÐ$Ð$ùòWøô. !ò Úðûô
 !ò Úðús*   Â-I(Ä$I-ÅI=É-	I:É9I:É=	J
Ê	J
c                 óô  — dD �ci c]  }|| j                  d|› d�«      “Œ }}t        d„ |j                  «       D «       «      sy|j                  «       D ��ci c]?  \  }}|dk\  r5|| j                  d| j	                  d|› d�«      dz   t        |«      z   «      “ŒA }}}t        d„ |j                  «       D «       «      }t        d	„ |j                  «       D «       «      }| || j                  d
d«      j                  dd«      }|j                  «       D ���ci c]D  \  }}|dk\  r:||j                  d|› d�«      dd D �cg c]  }|j                  dd«      d   ‘Œ c}“ŒF }	}}}|	j                  «       D ��ci c]"  \  }}|t        |d   j                  «       «      “Œ$ }
}}t        d„ «      }|	j                  «       D �],  \  }}t        j                  dj                  |«      dt        j                  ¬«      }t        |«      |
|   f}t        |«      t        j                  |«      k(  r|j!                  |«      ||<   Œ‚g }|D ��cg c]P  }t"        j%                  |«      D �cg c]/  }|j'                  |j)                  «       j                  «       «      ‘Œ1 c}‘ŒR c}} t        d„ |D «       «      }t        j*                  |D �cg c]  }|d| ‘Œ	 c}t        j                  ¬«      ||<   �Œ/ |d   }d}|�)|j,                  d   dk\  r|dd…dd…f   |dd…dd…f   }}n|�|j,                  d   dkD  r|dd…dd…f   }|d   }|�|dd…dd…f   }|d   }t.        j0                  rat        |«      | j3                  d«      k(  sJ ‚|�t        |«      | j3                  d«      k(  sJ ‚|�t        |«      | j3                  d«      k(  sJ ‚||||fS c c}w c c}}w c c}w c c}}}w c c}}w c c}w c c}}w c c}w )a¦  
    Parse raw OBJ text into vertices, vertex normals,
    vertex colors, and vertex textures.

    Parameters
    -------------
    text : str
      Full text of an OBJ file

    Returns
    -------------
    v : (n, 3) float
      Vertices in space
    vn : (m, 3) float or None
      Vertex normals
    vt : (p, 2) float or None
      Vertex texture coordinates
    vc : (n, 3) float or None
      Per-vertex color
    )rx   rz   ry   r   r(   c              3   ó&   K  — | ]	  }|d k\  –— Œ y­w©r   Nr:   )r-   rx   s     r0   r1   z"_parse_vertices.<locals>.<genexpr>L  s   è ø€ Ð/™˜!ˆq�A�v™ùs   ‚)NNNNr   r   c              3   ó,   K  — | ]  }|d k\  sŒ	|–— Œ y­wr¾   r:   )r-   Úss     r0   r1   z"_parse_vertices.<locals>.<genexpr>W  s   è ø€ Ð5™?�a¨a°1«f”™?ùó   ‚
�c              3   ó,   K  — | ]  }|d k\  sŒ	|–— Œ y­wr¾   r:   )r-   Úes     r0   r1   z"_parse_vertices.<locals>.<genexpr>X  s   è ø€ Ð1™�A¨!¨q«&Œa™ùrÁ   z+erÃ   z-er&   Nc                   ó   — y r9   r:   r:   rµ   r0   Ú<lambda>z!_parse_vertices.<locals>.<lambda>g  s   €  rµ   r2   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr9   )r*   )r-   ÚLs     r0   r1   z"_parse_vertices.<locals>.<genexpr>x  s   è ø€ Ð.© 1œ˜AŸ©ùs   ‚rB   rx   r   r¯   rz   ry   ú
v ú
vn ú
vt )rL   ÚanyÚvaluesrN   Úrfindr*   Úminrh   r+   r,   r   rZ   r[   r\   Úfloat64Úprodr°   ra   r›   r`   rK   r5   rj   r
   rf   r²   )r!   rw   Ústartsrx   ÚendsÚstartÚendr€   r<   ÚdataÚper_rowÚresultrª   r5   rj   r¤   r²   rÇ   r{   rz   ry   s                        r0   rS   rS   .  sÒ  € ñ6 0AÓAÑ/@¨!ˆa�—‘˜R ˜s !˜9Ó%Ñ%Ð/@€FÐAô Ñ/˜vŸ}™}œÓ/Ô/Ø%ð
 —L‘L”Nôá"‰DˆAˆqØ�Š6ð 	
ˆ4�9‰9�T˜4Ÿ:™:¨¨1¨#¨Q iÓ0°1Ñ4´s¸1³vÑ=Ó>Ñ>Ø"ð 	ñ ô Ñ5˜6Ÿ=™=œ?Ó5Ó5€EÜ
Ñ1˜Ÿ™œÓ1Ó
1€Cà��sˆO×#Ñ# D¨#Ó.×6Ñ6°t¸SÓA€Eð
 —L‘L”Nõá"‰DˆAˆqØ�Š6ð 	
¨¯©°r¸!¸¸A°YÓ)?ÀÀÑ)CÓDÑ)C AˆA�G‰G�D˜!Ó˜QÓÐ)CÑDÑDØ"ð 	ò ð 15·
±
´Ô=±©¨¨1ˆq”#�a˜‘d—j‘j“lÓ#Ñ#°€GÑ=ô ™Ó&€FØ—J‘J—L‰ˆˆ5ä—‘˜cŸh™h u›o°3¼b¿j¹jÔIˆä�U“˜W Q™ZÐ(ˆäˆu‹:œŸ™ ›Ò'àŸ™ eÓ,ˆF�1ŠIð
 ˆEÙSXÔYÑSXÈa´s·~±~ÀaÔ7HÓIÑ7H°!ˆe�l‰l˜1Ÿ7™7›9Ÿ?™?Ó,Õ-Ð7HÓIÐSXÓYäÑ.©Ó.Ó.ˆEäŸ™±UÓ!;±U° ! F U¢)°UÑ!;Ä2Ç:Á:ÔNˆF�1‹Ið% !ð* 	ˆs‰€Aà	€BØ€}˜Ÿ™ ™ qšà’!�R�a�R�%‘˜!šA˜q ˜s˜F™)ˆ2‰Ø	
ˆ˜1Ÿ7™7 1™:¨š>àŠa��!�ˆe‰Hˆð 
�‰€BØ	€~à’�2�A�2�‰Yˆà	�‰€Bô ‡z‚zô �1‹v˜Ÿ™ FÓ+Ò+Ð+Ð+àˆ>Ü�r“7˜dŸj™j¨Ó1Ò1Ð1Ð1Øˆ>Ü�r“7˜dŸj™j¨Ó1Ò1Ð1Ð1àˆb�"�bˆ=Ðùòe Bùóùò Eùôùó >ùò$ JùÓYùò "<sH   …OÁAOÄ(OÅ OÅOÅ8'O$ÉO/É#4O*ÊO/ËO5
ÏOÏ*O/Úuse_mtlÚuse_objÚ	use_groupc                 óH  — t        d„ «      }| D ]G  \  }}}}|r|nd|r|nd|r|ndf}	|||	   d<   |||	   d<   |||	   d<   ||	   d   j                  |«       ŒI |j                  «       D ]  }	dj                  ||	   d   «      ||	   d<   Œ! t	        |j                  «       «      S )aü  
    For chunks of faces split by material group
    the chunks that share the same material.

    Parameters
    ------------
    face_tuples : (n,) list of (material, obj, chunk)
      The data containing faces
    use_mtl
      Group tuples by `usemtl` commands
    use_obj
      Group tuples by `o` commands
    use_group
      Group tuples by `g` commands

    Returns
    ------------
    grouped : (m,) list of tuples containing:
              `(material name, objectname, group name, raw chunk)`
    c                  ó   — dddg gS )Nr   r:   r:   rµ   r0   rÅ   z_group_by.<locals>.<lambda>µ  s   €  2 r¨2¨rÑ"2rµ   Nr   r&   r   r¯   r   )r   r`   rq   r\   ÚlistrÌ   )
r|   rØ   rÙ   rÚ   ÚgroupedrD   ÚobjÚgroupr€   r§   s
             r0   rU   rU   ž  sÃ   € ô. Ñ2Ó3€Gã'2Ñ#ˆ�#�u˜eñ  ‰H TÙ‰C Ù‰E Dð
ˆð
 #ˆ�‰�Q‰Øˆ�‰�Q‰Øˆ�‰�Q‰à�‰�Q‰×Ñ˜uÕ%ð (3ð �|‰|Ž~ˆØŸ)™) G¨C¡L°¡OÓ4ˆ�‰�QŠð ô �—‘Ó Ó!Ð!rµ   c           
      ó  — g d¢}t        | «      }|D ]#  }| j                  |d|«      }|dk  rŒ||k  sŒ"|}Œ% | j                  d| j                  d«      dz   «      }|dk\  r| || }n| |d }t        j                  r%|j                  d«      | j                  d«      k(  sJ ‚t        j                  t        j                  d|«      D �	cg c]  }	|	j                  d«      ‘Œ c}	t        ¬«      }
dt        |«      g|
g}|r[|j                  t        j                  t        j                  d	|«      D �	cg c]  }	|	j                  d«      ‘Œ c}	t        ¬«      «       |r[|j                  t        j                  t        j                  d
|«      D �	cg c]  }	|	j                  d«      ‘Œ c}	t        ¬«      «       t        j                  t        j                  t        |«      «      «      }d}d}d}g }t!        j"                  |«      D ]ó  \  }}||| j%                  «       dz   }|j'                  d«      r)|j)                  dd«      \  }}|dd j%                  «       }ns|j'                  d«      r)|j)                  dd«      \  }}|dd j%                  «       }n9|j'                  d«      r(|j)                  dd«      \  }}|dd j%                  «       }|j'                  d«      sd|v sŒß|j                  ||||f«       Œõ |S c c}	w c c}	w c c}	w )až  
    Pre-Process Face Text

    Rather than looking at each line in a loop we're
    going to split lines by directives which indicate
    a new mesh, specifically 'usemtl', 'o', and 'g' keys
    search for materials, objects, faces, or groups

    Parameters
    ------------
    text : str
      Raw file

    Returns
    ------------
    triple : (n, 3) tuple
      Tuples of (material, object, data-chunk)
    )z
usemtl ú
o ú
f ú
g z
s r   r   rã   r¯   Núusemtl rB   râ   rä   zo r&   r   Úusemtlr   zg úf z
f)r*   rL   rÍ   r
   rf   r²   rZ   r5   rW   ÚfinditerrÓ   r±   r`   ÚuniqueÚconcatenateÚtupleÚ	itertoolsÚpairwiserK   Ú
startswithr,   )r!   rÙ   Ú
use_groupsÚstartersÚf_startÚstÚsearchÚf_endÚf_chunkÚmÚidx_mtlÚ
split_idxsÚsplitsÚcurrent_objÚcurrent_mtlr   r|   rÓ   rÔ   r€   s                       r0   rT   rT   Ê  s×  € ò( =€HÜ�$‹i€GãˆØ—‘˜2˜q 'Ó*ˆà�AŠ:Øð �GÓØ‰Gð ð �I‰I�d˜DŸJ™J vÓ.°Ñ2Ó3€Eà�‚zà�w˜uÐ%‰ð �w�x�.ˆä
‡z‚zà�}‰}˜VÓ$¨¯
©
°6Ó(:Ò:Ð:Ð:ô �h‰h¬B¯K©K¸	À7Ô,KÓLÑ,K q˜Ÿ™ �
Ð,KÑLÔTWÔX€Gà”c˜'“lÐ# WÐ-€Jñ Ø×ÑÜ�H‰H¬"¯+©+°f¸gÔ*FÓGÑ*F Q�a—g‘g˜a•jÐ*FÑGÌsÔSô	
ñ Ø×ÑÜ�H‰H¬"¯+©+°f¸gÔ*FÓGÑ*F Q�a—g‘g˜a•jÐ*FÑGÌsÔSô	
ô
 �Y‰Y”r—~‘~¤e¨JÓ&7Ó8Ó9€Fð €KØ€KØ€Mà€Kä×(Ñ(¨Ö0‰
ˆˆsà˜˜cÐ"×(Ñ(Ó*¨TÑ1ˆØ×Ñ˜DÔ!Ø!&§¡¨T°1Ó!5ÑˆK˜Ø% a b˜/×/Ñ/Ó1‰KØ×Ñ˜hÔ'Ø!&§¡¨T°1Ó!5ÑˆK˜Ø% a b˜/×/Ñ/Ó1‰Kà×Ñ˜dÔ#Ø#(§;¡;¨t°QÓ#7Ñ ˆM˜5Ø)¨!¨"Ð-×3Ñ3Ó5ˆMð ×Ñ˜DÔ! U¨e¢^Ø×Ñ ¨[¸-ÈÐOÕPð! 1ð" ÐùòU Mùò Hùò
 Hs   ÃK<Ä0LÆLc
           
      óú
  — dddddœ}
t        j                  | d«      r| g}nLt        j                  | d«      r| j                  «       }n%t        j                  | d«      r| g}nt        d	«      ‚t	        «       }d
d
d
dœ}i }t        «       }|D �]7  }dg}|r|j                  j                  dv rgt        |j                  j                  «      rHt        j                  |j                  t        |j                  j                  dd…dd…f   «      f«      }n|j                  }t	        dt        j                  |dd|¬«      z   g«      }|€d|j                  j                   v }|rI	 t        j                  |j"                  dd|¬«      }|j%                  d«       |j%                  d|z   «       |�rCt-        |j                  d«      �r,	 |j                  j.                  }t-        |d«      r|j1                  «       }t3        |«      }||vrFt        j4                  |j6                  |«      }|j9                  |«       |j;                  |¬«      ||<   ||   d   }t        t        j<                  t?        |j                  dd«      «      «      dk(  rRt        j                  |j                  j@                  dd |¬«      }|j%                  d!«       |j%                  d"|z   «       |jC                  d#|› �«       |
tE        |«         }t-        |d%«      r>|j%                  d&t        j                  |jF                  dz   |d   z   dd'|¬(«      z   «       |dxx   t        |j                  «      z  cc<   d)|jH                  v r-|jC                  d*jK                  |jH                  d)   «      «       |j%                  d+jM                  |«      «       �Œ: i }t        |«      d
kD  rÍg }|jO                  «       D ]p  \  }}|jQ                  «       D ]X  \  }}|jS                  «       jU                  d,«      r|j%                  |«       Œ7||vr|||<   ŒAt)        jV                  d-|› �«       ŒZ Œr |€d.}|	�d/|	› d0�jY                  «       } nd1} | d2jM                  |«      z   ||<   |jC                  d3|› �«       |	�|jC                  d/|	› �«       |j%                  d+«       d+jM                  |«      }!|rC|�At        |«      d
kD  r3|jQ                  «       D �"�#cg c]  \  }"}#|j[                  |"|#«      ‘Œ c}#}" |r|!|fS |!S # t&        $ r t)        j*                  dd¬«       Y �Œ¡w xY w# t&        $ r t)        j*                  d$d¬«       Y �Œ‚w xY wc c}#}"w )4a�  
    Export a mesh as a Wavefront OBJ file.
    TODO: scenes with textured meshes

    Parameters
    -----------
    mesh : trimesh.Trimesh
      Mesh to be exported
    include_normals : bool or None
      Include vertex normals in export. If None
      will only be included if vertex normals are in cache.
    include_color : bool
      Include vertex color in export
    include_texture : bool
      Include `vt` texture in file text
    return_texture : bool
      If True, return a dict with texture files
    write_texture : bool
      If True and a writable resolver is passed
      write the referenced texture files with resolver
    resolver : None or trimesh.resolvers.Resolver
      Resolver which can write referenced text objects
    digits : int
      Number of digits to include for floating point
    mtl_name : None or str
      If passed, the file name of the MTL file.
    header : str or None
      Header string for top of file or None for no header.

    Returns
    -----------
    export : str
      OBJ format output
    texture : dict
      Contains files that need to be saved in the same
      directory as the exported mesh: {file name : bytes}
    z{}z{}//{}z{}/{}z{}/{}/{}))rx   )rx   ry   )rx   rz   ©rx   ry   rz   ÚTrimeshÚSceneÚ
PointCloudzmust be Trimesh or Scene!r   rý   rx   )ÚvertexÚfaceNr¯   zv r(   rÈ   )Ú	col_delimÚ	row_delimÚdigitsr#   rÉ   ry   zvn z failed to convert vertex normalsTr   rC   Ú	to_simple)r>   r&   r   rÊ   rz   zvt rå   z failed to convert UV coordinatesrA   rç   rã   )r  r  Úvalue_formatr>   z
o {}r   z.mtlznot writing zmaterial.mtlz# z

rµ   s   

zmtllib ).r   Úis_instance_namedÚdumprp   r   ÚsetrE   Úkindr*   r$   rZ   Úcolumn_stackr"   r   Úarray_to_stringÚ_cacheÚcacher#   r`   rR   r	   rQ   ÚhasattrrD   r  Úhashrd   r>   ÚaddÚto_objrj   rc   rC   Ú
appendleftrë   rA   r   rJ   r\   rÌ   rN   rœ   ÚendswithÚwarningÚencodeÚwrite)$r†   Úinclude_normalsÚinclude_colorÚinclude_textureÚreturn_textureÚwrite_texturer   r  Úmtl_nameÚheaderÚface_formatsÚmeshesÚobjectsÚcountsrs   Úmaterials_nameÚcurrentÚ	face_typeÚv_blobÚexportÚ	convertedrD   Úhashedr>   Útex_nameÚface_formatÚmtl_dataÚmtl_librÕ   r7   r=   r¨   Úprependr!   rw   rx   s$                                       r0   Ú
export_objr0  )  sK  € ðh ØØØ%ñ	€Lô ×Ñ˜d IÔ.Ø�‰Ü	×	Ñ	  gÔ	.Ø—‘“‰Ü	×	Ñ	  lÔ	3Ø�‰äÐ4Ó5Ð5ô ‹g€Gà˜A QÑ'€Fà€IÜ“U€Näˆà�Eˆ	ñ Ø—‘×#Ñ#Ð'9Ñ9Ü�G—N‘N×0Ñ0Ô1ô —_‘_Ø×!Ñ!¤8¨G¯N©N×,HÑ,HÊÈBÈQÈBÈÑ,OÓ#PÐQó‰Fð
 ×%Ñ%ˆFô àÜ×&Ñ&Ø c°VÀFôñðó
ˆð Ð"Ø.°'·.±.×2FÑ2FÐFˆOáðMÜ ×0Ñ0Ø×*Ñ*Ø!Ø%Ø!ô	�	ð × Ñ  Ô&Ø—‘˜e iÑ/Ô0ò
 œw w§~¡~°tÕ<ðMà"Ÿ>™>×2Ñ2�Ü˜8 [Ô1Ø'×1Ñ1Ó3�Hô ˜h›�Ø Ñ*ä×+Ñ+¨H¯M©M¸>ÓJ�Dà"×&Ñ& tÔ,à(0¯©¸T¨Ó(B�I˜fÑ%ð % VÑ,¨QÑ/�ô ”r—x‘x¤¨¯©¸¸dÓ CÓDÓEÈÒJÜ $× 4Ñ 4ØŸ™×)Ñ)°SÀGÐTZô!�Ið ×$Ñ$ TÔ*à—M‘M %¨)Ñ"3Ô4à×!Ñ! G¨H¨:Ð"6Ô7ð
 #¤5¨Ó#3Ñ4ˆä�7˜GÔ$Ø�M‰MØÜ×&Ñ&Ø—M‘M AÑ%¨¨s©Ñ3Ø!Ø$Ø!,ô	ñôð 	ˆs‹”s˜7×+Ñ+Ó,Ñ,‹ð �W×%Ñ%Ñ%Ø×Ñ˜hŸo™o¨g×.>Ñ.>¸vÑ.FÓGÔHà�‰�t—y‘y Ó(Ö)ðM ðR €Hä
ˆ9ƒ~˜Òàˆð !×'Ñ'Ö)‰GˆD�!Ø(,¯
©
®Ñ$�	˜9Ø—?‘?Ó$×-Ñ-¨fÔ5à—N‘N 9Õ-Ø hÑ.à*3�H˜YÒ'ä—K‘K ,¨y¨kÐ :Õ;ñ )5ð *ð Ðà%ˆHð ÐØ˜6˜( $Ð'×.Ñ.Ó0‰GàˆGð % w§|¡|°GÓ'<Ñ<ˆ�Ñà×Ñ˜W X JÐ/Ô0àÐà×Ñ˜R ˜x˜=Ô)ð ‡N�N�4Ôð �9‰9�WÓ€Dñ ˜Ð-´#°i³.À1Ò2Dà*2¯.©.Ô*:Ô;Ñ*:¡$ ! Qˆ�‰˜˜1Õ	Ð*:Ó;ñ Ø�Xˆ~Ðà€Køôc !ò MÜ—	‘	Ð<Àt×LÐLðMûôF !ò MÜ—	‘	Ð<Àt×LÐLðMüóP 	<s,   Å#AT)ÇD+UÔU7Ô) UÕUÕ U4Õ3U4rß   )NTFFNFFr9   )FF)	NTTFTNé   Nz!https://github.com/mikedh/trimesh)(rì   rW   Úcollectionsr   r   ÚnumpyrZ   ÚPILr   rR   ÚEÚ
exceptionsr   r   r   Ú	constantsr	   r
   Ú	resolversr   Útypedr   Úvisual.colorr   Úvisual.materialr   Úvisual.texturer   r   rl   Údictr�   rM   r^   r_   rS   rU   rT   r0  Ú_obj_loadersr:   rµ   r0   Ú<module>r?     sH  ðÛ Û 	ß *ã ð	 õ õ ß  Ý $Ý Ý #Ý ,ß :ð
 %)ØØ Ø Ø ØØñb2Øðb2à˜TÑ!ðb2ð ðb2ð ð	b2ð
 ðb2ð �T‰kðb2ð ðb2ð ðb2ð 
ób2óJ	Uòp@(òFP%òfmð`)" Dð )"°4ð )"ÀDó )"óX\ðB ØØØØØØØØ.óiðX �xÐ �øðU  ò  õ .á˜QÓ…Eûð ús   –B ÂB8Â B3Â3B8