
    Ti                        d dl Z d dlZd dlmZmZ d dlZ	 d dlmZ n## e	$ rZ
ddlmZ  ee
          ZY dZ
[
ndZ
[
ww xY wddlmZ ddlmZmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ ddlmZmZ 	 	 	 	 	 	 	 d&dedee         dedededee         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(dS )*    N)defaultdictdeque)Image   )ExceptionWrapper)util)logtol)ResolverLike)DictLoadableOptional)to_floatSimpleMaterial)TextureVisualsunmerge_facesTFfile_objresolvergroup_materialskip_materialsmaintain_ordermetadatasplit_objectssplit_groupsreturnc           	        + |                                  }	t          j        |	          }	d                    |	                                                    dd                    }	|	                    dd          }	i }
|	                    d          }|s|dk    r|	|dz   |	                    d|                                                   }	 t          ||         |	          }d
 |                                D             }
nR# t          t          f$ r t          j        d|            Y n(t          $ r t          j        d| d           Y nw xY wt          |	          \  }}}}t          |	||          }|s|s|rt!          ||||          }t#          |          s|d|i}|||d<   |||d<   |S i }t#          |          dk    r|                                \  }}}}d t'          j        d|t&          j                  dd         D             }t#          |d                             dd                                                    +t-          +fd|D                       }|ryt/          j        d                    |                              dd          dt.          j                  }||dk    xx         dz  cc<   t7          |+|d                   \  }}}n't          j        d           t9          |          \  }}}g }|r||                    |           |r||                    |           |r7t#          |
          dk    r$|"|                    t=          |                     |rd                    |          } n?||} n:t?          d tA          |dd          tA          | d d          d!fD                       } t          j!        | |          } |"                                }!||9t#          |          t#          |          k    rtG          ||||"          \  }"}#}$}%nd}%tG          |||"          \  }"}#}$tH          j%        rVt/          j&        ||         ||#         |"                   sJ |"'                                t#          ||#                   k     sJ 	 ||$         }&n&# t          $ r t          j        d#           d}&Y nw xY w|!(                    ||#         "                                |"d$           nSd}&tH          j%        r'|'                                t#          |          k     sJ |4t/          j)        |          |j)        k    rtG          |||"          \  }"}#}%n|r)t/          j*        t#          |          tV          %          }#n(t/          j,        t#          |          tV          %          }#d|#|<   t/          j,        t#          |          t.          j        %          }'t/          j-        |#.                                          |'|#<   |'|         }"d}%|!(                    |"||#         "                                d&           |3	 ||#         |!d<   n&# t          $ r t          j        d'd           Y nw xY w|%	 ||%         }(|(j)        |!d         j)        k    rMt_          d(                    t=          |(j)                  t=          |!d         j)                                      |(|!d<   n&# t          $ r t          j        d)d           Y nw xY wd})||
v rta          |&|
|         *          })nS|&7t#          |&          t#          |!d                   k    rta          |&+          })n|t          j        d,| d-           |)|!d.<   |!|| <   t#          |          dk    d/ |1                                D             }*||*d0S )1a  
    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   c                 .    i | ]\  }}|t          d i |S ) r   .0kvs      N/DATA/AppData/hermes/venv/lib/python3.11/site-packages/trimesh/exchange/obj.py
<dictcomp>zload_obj.<locals>.<dictcomp>a   s,    TTTDAqN//Q//TTT    zunable to load materials from: Texc_info)textNverticesvertex_normalsvertex_colorsc                 j    g | ]0}|                     d d          d                                         1S r      r   )splitstripr%   is     r(   
<listcomp>zload_obj.<locals>.<listcomp>   sG     
 
 
 GGD!Q%%''
 
 
r*   z^f)flagsr3   / c              3      K   | ]=}t          |                    d d                                                    k    V  >dS )r:   r;   N)lenreplacer4   )r%   fcolumnss     r(   	<genexpr>zload_obj.<locals>.<genexpr>   sJ      YYC		#s(;(;(A(A(C(C$D$DDYYYYYYr*   sepdtype)arrayr@   sample_linez+faces have mixed data: using slow fallback!_c              3      K   | ]}||V  	d S Nr#   r6   s     r(   rA   zload_obj.<locals>.<genexpr>   s4        
 =  !=== r*   	file_namenamegeometry)maintain_facesz)index failed on UV coordinates, skipping!)r.   facesrD   )rN   r.   zfailed to load vertex_colorszincorrect normals {} != {}zfailed to load vertex_normals)uvmaterial)rP   zspecified material (z)  not loaded!visualc                     g | ]}||d S ))rL   frame_tor#   )r%   r&   s     r(   r8   zload_obj.<locals>.<listcomp>:  s     EEE!++EEEr*   )rL   graph)2readr   decode_textformatr5   r>   find	parse_mtlitemsOSError	TypeErrorr	   debugBaseException_parse_vertices_preprocess_faces	_group_byr=   poprer4   	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_kwargsr'   vnvtvcface_tuplespcrL   rQ   current_objectcurrent_groupchunk
face_lines
flat_arrayrE   rN   	faces_tex
faces_norm
name_partsrK   mesh	new_facesmask_vmask_vtmask_vnrP   inversenormalsrR   rU   r@   s,                                              @r(   load_objr      s 	   ^ ==??DD!!D ??4::<<//==>>D <<##D I99X&&L Sla// q(499T<+H+HHIOOQQ
	S'(:XNNNOTTO<Q<Q<S<STTTII# 	D 	D 	DIBBBCCCCC 	S 	S 	SIBBBTRRRRRR	S
 $...MAr2r $D-FFK
  Z Z, Z^]LYY { !_>#%B >"$B	 H
k

Q

9D9J9J6.-
 
XdE>>>qrrB
 
 

 jm++C55;;==>>YYYYjYYYYY
  	M M$$,,S#66Crx  E
 %!)! ,CW*Q-, , ,(E9jj ICDDD+@+L+L(E9j 
 	.^7n--- 	-M5m,,, 	-c)nnq00X5Ic(mm,,,  	88J''DD'!DD    Hk488Hfd33    D h// {{}}  %#j//SZZ*G*G6C9j7 7 73	67GG -:9^. . .*	67 z 8 {1U8QvYy-ABBBBB }}QvY7777 [    	EFFF
 KKQvY^^%5%5	JJKKKK Bz ,yy{{SVV++++~"(:"6"6%+"E"E-::n. . .*	677 " :WSVV4888FFXc!ffD999F $u (3q66:::"$)FJJLL"9"9#EN	 KK)69I9IJJKKK >I(*6
_%%  I I I	84HHHHHHIJW+=D$4$:::$4;;..D4D4J0K0K   
 *1%&&  J J J	9DIIIIIIJ y  #rIh4GHHHFF^B3tJ/?+@+@ @ @#r***FF!IEXEEEFFFXe k

Q

j FEX]]__EEEE !5111sO   5D (E."EE9S  S%$S%0Y< < ZZ%A0\  \98\9c           
      *   t          j        |           } d}i }t                              t          |                                                     }ddddd}|D ])}|                                                                }t          |          dk    r=|d                                         }|d	k    r-||||d
         <   d
d                    |dd                   i}|dk    r|                                	                    d          dz   }	||	d                                         }
	 |
                    |
          }t          j        t          j        |                    |d<   t          j                            t          j                            t#          |dd          |
                    |d         j        d<   r# t&          $ r t)          j        dd           Y w xY w||                                v rk	 d |dd         D             }t          |          dk    r|d         }|||||         <   |||<   # t&          $ r t)          j        dd           Y w xY w||dd         ||<   +|r|||d
         <   |S )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nsr3   r   newmtlrK   r;   map_kdr!   imageparentr   	file_pathzfailed to load imageTr+   c                 ,    g | ]}t          |          S r#   )float)r%   xs     r(   r8   zparse_mtl.<locals>.<listcomp>  s    555aq555r*   zfailed to convert color!)r   rW   rn   
splitlinesr5   r4   r=   lowerri   indexgetr   openwrap_as_streamospathabspathrp   infor_   r	   r^   r~   )mtlr   rQ   r   linesmappedliner4   keyr   rJ   	file_datavalues                r(   rZ   rZ   @  s   " 
3

C HINN3s88>>++,,E YjUUF 5& 5&

""$$u::??Ahnn(?? #.6	(6*+ qrr 3 34HHH__JJLL&&x0014EUVV**,,IA$LL33	 %*Jt/B9/M/M$N$N!68gooGLL8R!@!@)LL7 7!&{33 ! A A A	04@@@@@@A FKKMM!!E5559555u::??!!HE',1HVC[)$)HSM  E E E	4tDDDDDDE !!!""IHSM /&.	(6"#s&   3BG G10G1AI I21I2c                    |                      d|f          } t          |                                                                          }t	          ||z            }t          j        |          |z  }| dd|f         }d\  }}||dz  k    rd                    d |                                D                                           d          }	|	|k    r| dd|dz   f         }ne|	t	          |dz            k    r| dd|dz   f         }n?t          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   | ]}|                     d           V  dS )r:   N)r5   r6   s     r(   rA   z*_parse_faces_vectorized.<locals>.<genexpr>  s,      BBBBBBBBr*   r:   r3   zface lines are weird:    )reshaper=   r5   r4   intrg   r{   ri   countr	   r^   )
rE   r@   rF   group_countper_refr   rN   r   r   r   s
             r(   rk   rk     s   0 MM2w-((E k''))//1122K 'K'((GIk""W,E!!!U(OE 'Iz+/!! BBk.?.?.A.ABBBBBHHMMG qqq%!)|,JJc'A+&&&& aaal+III<{<<====	K!O	#	# !!!UQY,'	111eai<(
)Z''r*   c                    g g g }}}| D ]}|                                                     d          d                                         t                    }|dk    rn|dk    r-d         d         d         d         d         d         gnd|dk    r8g }|j        fdt	          t                    dz
            D              |n&t          j        dt                     d	           D ]}|                    d
          |                    t          d                              	 |                    t          d                              n# t          $ r Y nw xY w	 |                    t          d                              # t          $ r Y w xY wt          j
        |t          j                                      d          }||dk    xx         dz  cc<   d\  }	}
t          |          t          |          k    rGt          j
        |t          j                                      d          }	|	|	dk    xx         dz  cc<   t          |          t          |          k    rGt          j
        |t          j                                      d          }
|
|
dk    xx         dz  cc<   ||	|
fS )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      r3   r   c           	          g | ]:} d                     |dz                       |dz                      g;S )r   r3   r   r#   )r%   r7   collect_appendr4   s     r(   r8   z)_parse_faces_fallback.<locals>.<listcomp>  sh        	 #N58,,"N5Q<00"N5Q<00  r*   zface needs more values 3>z
 skipping!r:   rO   )r   r   r   )r5   r4   r=   rm   ranger	   r^   r   r_   rg   rE   rj   r   )r   r'   r   r   r   	len_splitcollectr?   rN   r   r   r   r4   s              @@r(   rl   rl     s   " B2rA  . . 

""4((+1133JJ	>>!^^1XuQxq58U1XuQxPEE]]G %^N     s5zzA~..    EEIH#e**HHHIII  	 	AGGCLLEHHSq]]###		#eAh--((((    		#eAh--((((    	& HQbh'''//88E	%!)#Iw
2ww#a&&HRrx00088AA	)a-   A%   
2ww#a&&(2RX...66w??!!)W$$s$   <(E%%
E21E26(F
F,+F,c                 t     fddD             }t          d |                                D                       sdS  fd|                                D             }t          d |                                D                       }t	          d |                                D                       } ||                             dd	                              d
d	          fd|                                D             }d |                                D             }t          d           }|                                D ]\  }}	t          j        d	                    |	          dt          j
                  }
t          |	          ||         f}t          |
          t          j        |          k    r|
                    |          ||<   g fd|	D              t          d D                       t          j        fdD             t          j
                  ||<   |d         }d}|.|j        d         dk    r|ddddf         |ddddf         }}n!||j        d         dk    r|ddddf         }|d         }||ddddf         }|d         }t           j        r|t          |                               d          k    sJ |(t          |                               d          k    sJ |(t          |                               d          k    sJ ||||fS )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
    c                 D    i | ]}|                     d | d          S )r   r;   )rY   )r%   r&   r-   s     r(   r)   z#_parse_vertices.<locals>.<dictcomp>K  s/    AAA!a9999%%AAAr*   )r'   r   r   c              3   "   K   | ]
}|d k    V  dS r   Nr#   )r%   r'   s     r(   rA   z"_parse_vertices.<locals>.<genexpr>N  s&      //!qAv//////r*   )NNNNc                     i | ]L\  }}|d k    |                     d                    d| d          dz   t          |          z             MS )r   r   r;   r   )rY   rfindr=   )r%   r&   r'   r-   s      r(   r)   z#_parse_vertices.<locals>.<dictcomp>R  sb       Aq66 	
499T4::i1iii0014s1vv=>>66r*   c              3   &   K   | ]}|d k    |V  dS r   r#   )r%   ss     r(   rA   z"_parse_vertices.<locals>.<genexpr>Y  s&      55aa1ffffff55r*   c              3   &   K   | ]}|d k    |V  dS r   r#   )r%   es     r(   rA   z"_parse_vertices.<locals>.<genexpr>Z  s&      11A!q&&a&&&&11r*   z+er   z-ec           	      z    i | ]7\  }}|d k    |d                      d| d          dd         D             8S )r   c                 F    g | ]}|                     d d          d         S r2   r4   r6   s     r(   r8   z._parse_vertices.<locals>.<dictcomp>.<listcomp>`  s+    DDDAAGGD!QDDDr*   r   r;   r3   Nr   )r%   r&   r'   r   s      r(   r)   z#_parse_vertices.<locals>.<dictcomp>_  s\       Aq66 	
DDY!YYY)?)?)CDDD66r*   c                 d    i | ]-\  }}|t          |d                                                    .S r   )r=   r4   r$   s      r(   r)   z#_parse_vertices.<locals>.<dictcomp>f  s2    ===1q#adjjll##===r*   c                      d S rI   r#   r#   r*   r(   <lambda>z!_parse_vertices.<locals>.<lambda>i  s     r*   r;   rB   c                 \    g | ](}fd t                               |          D             )S )c                     g | ];}                     |                                                                          <S r#   )rm   r5   r4   )r%   r'   r   s     r(   r8   z._parse_vertices.<locals>.<listcomp>.<listcomp>x  s7    III!ell17799??,,--IIIr*   )rn   r   )r%   r7   r   s     r(   r8   z#_parse_vertices.<locals>.<listcomp>x  s:    YYYaIIIIs~~a7H7HIIIYYYr*   c              3   4   K   | ]}t          |          V  d S rI   )r=   )r%   Ls     r(   rA   z"_parse_vertices.<locals>.<genexpr>z  s(      ..1A......r*   c                 $    g | ]}|d          S rI   r#   )r%   r   r   s     r(   r8   z#_parse_vertices.<locals>.<listcomp>|  s!    !;!;!;!FUF)!;!;!;r*   rO   r'   Nr3   r!   r   r   r   r   
v 
vn 
vt )anyvaluesr[   minru   r>   r   rg   rh   ri   float64r=   prodr   rE   rw   r
   rs   r   )r-   startsendsstartenddataper_rowresultr&   r   rE   rw   r'   r   r   r   r   r   r   s   `               @@@r(   r`   r`   0  s|   6 BAAA/@AAAF //v}}///// &%%   LLNN  D 556==??55555E
11111
1
1CsO##D#..66tSAAE   LLNN  D >=

===G &&FJJLL O O5chhuoo3bjIIIUWQZ(u::''e,,F1II
 EYYYYSXYYYY.......E!;!;!;!;U!;!;!;2:NNNF1II 	sA	B}q!!!RaR%!AAAqsF)2	
171:>>aaa!eH 
B	~2A2Y	B z 2 1vvF++++++>r77djj111111>r77djj111111b"b=r*   use_mtluse_obj	use_groupc                    t          d           }| D ]Z\  }}}}|r|nd|r|nd|r|ndf}	|||	         d<   |||	         d<   |||	         d<   ||	         d                             |           [|                                D ],}	d                    ||	         d                   ||	         d<   -t	          |                                          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*   r(   r   z_group_by.<locals>.<lambda>  s    2r2r"2 r*   Nr   r3   r   r   r   )r   rm   r~   ri   listr   )
r   r   r   r   groupedrQ   objgroupr   r   s
             r(   rb   rb     s    . 2233G'2 & &##ue  )HHT$CC(EED

 #QQQQu%%%%||~~ 5 5))GCLO44Q  !!!r*   c           	      v   g d}t          |           }|D ](}|                     |d|          }|dk     r ||k     r|})|                     d|                     d          dz             }|dk    r| ||         }n
| |d         }t          j        r.|                    d          |                     d          k    sJ t          j        d t          j	        d|          D             t          	          }	dt          |          g|	g}
|rK|
                    t          j        d
 t          j	        d|          D             t          	                     |rK|
                    t          j        d t          j	        d|          D             t          	                     t          j        t          j        t          |
                              }d}d}d}g }t          |dd         |dd                   D ]7\  }}|||                                         dz   }|                    d          r6|                    dd          \  }}|dd                                         }n|                    d          r6|                    dd          \  }}|dd                                         }nJ|                    d          r5|                    dd          \  }}|dd                                         }|                    d          sd|v r|                    ||||f           9|S )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   Nc                 8    g | ]}|                     d           S r   r   r%   ms     r(   r8   z%_preprocess_faces.<locals>.<listcomp>  s"    LLLq

LLLr*   usemtl rO   c                 8    g | ]}|                     d           S r   r   r   s     r(   r8   z%_preprocess_faces.<locals>.<listcomp>  "    GGGQaggajjGGGr*   r   c                 8    g | ]}|                     d           S r   r   r   s     r(   r8   z%_preprocess_faces.<locals>.<listcomp>
  r  r*   r   r   r3   zo r   usemtlr!   zg f z
f)r=   rY   r   r
   rs   r   rg   rE   rd   finditerr   rm   uniqueconcatenatetuplezipr5   
startswithr4   )r-   r   
use_groupsstartersf_startstsearchf_endf_chunkidx_mtl
split_idxssplitscurrent_objcurrent_mtlr   r   r   r   r   s                      r(   ra   ra     sg   ( =<<H$iiG  2q'**A:: GGIIdDJJv..233Ezzwu}% wxx.
z ;}}V$$

6(:(::::: hLLBK	7,K,KLLLTWXXXGc'll#W-J  
HGG"+fg*F*FGGGsSSS	
 	
 	
  
HGG"+fg*F*FGGGsSSS	
 	
 	

 Yr~eJ&7&78899F KKMK&"+vabbz22 Q Q
sc	"((**T1D!! 		6!&T1!5!5K%abb///11KKh'' 	6!&T1!5!5K%abb///11KKd## 	6#(;;tQ#7#7 M5)!""-3355M D!! 	QUe^^[-OPPPr*      !https://github.com/mikedh/trimeshc
           
      D   ddddd}
t          j        | d          r| g}nRt          j        | d          r|                                 }n(t          j        | d          r| g}nt          d	          t	                      }d
d
d
d}i }t                      }|D ]}dg}|rf|j        j        dv rXt          |j        j	                  r?t          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 }|rr	 t          j        |j        dd|          }|                    d           |                    d|z              n&# t&          $ r t)          j        dd           Y nw xY w|rwt-          |j        d          ra	 |j        j        }t-          |d          r|                                }t3          |          }||vrHt          j        |j        |          }|                    |           |                    |          ||<   ||         d         }t          t          j        t?          |j        dd                              dk    rOt          j        |j        j         dd |          }|                    d!           |                    d"|z              |!                    d#|            n&# t&          $ r t)          j        d$d           Y nw xY w|
tE          |                   }t-          |d%          r?|                    d&t          j        |j#        dz   |d         z   dd'|(          z              |dxx         t          |j                  z  cc<   d)|j$        v r3|!                    d*%                    |j$        d)                              |                    d+&                    |                     i }t          |          d
k    rg }|'                                D ]}\  }}|(                                D ]c\  }}|)                                *                    d,          r|                    |           B||vr|||<   Lt)          j+        d-|            d~|d.}|	d/|	 d0,                                } nd1} | d2&                    |          z   ||<   |!                    d3|            |	|!                    d/|	            |                    d+           d+&                    |          }!|r53t          |          d
k    r fd4|(                                D              |r|!|fS |!S )5a  
    Export a mesh as a Wavefront OBJ file.
    TODO: scenes with textured meshes

    Parameters
    -----------
    mesh : trimesh.Trimesh
      Mesh to be exported
    include_normals : Optional[bool]
      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{}/{}/{}))r'   )r'   r   )r'   r   r'   r   r   TrimeshScene
PointCloudzmust be Trimesh or Scene!r   r  r'   )vertexfaceNr   zv r;   r   )	col_delim	row_delimdigitsr/   r   r   zvn z failed to convert vertex normalsTr+   rP   	to_simple)rK   r3   r   r   r   zvt r  z failed to convert UV coordinatesrN   r  r   )r#  r$  value_formatrK   z
o {}r   z.mtlznot writing zmaterial.mtlz# z

r*   s   

zmtllib c                 B    g | ]\  }}                     ||          S r#   )write)r%   r&   r'   r   s      r(   r8   zexport_obj.<locals>.<listcomp>  s+    ;;;$!Q1		;;;r*   )-r   is_instance_nameddumpr}   r   setrR   kindr=   r0   rg   column_stackr.   r   array_to_string_cachecacher/   rm   r_   r	   r^   hasattrrQ   r&  hashrq   rK   addto_objrw   rp   rP   
appendleftr  rN   r   rX   ri   r   r[   r   endswithwarningencode)"r   include_normalsinclude_colorinclude_texturereturn_texturewrite_texturer   r%  mtl_nameheaderface_formatsmeshesobjectscountsr   materials_namecurrent	face_typev_blobexport	convertedrQ   hashedrK   tex_nameface_formatmtl_datamtl_libr   rG   rJ   r   prependr-   s"         `                           r(   
export_objrQ  +  s   h %	 L dI.. 6		g	.	. 6		l	3	3 64555 ggGAQ''FIUUN f* f*E	 	&#'999GN011 : _!8GN,HBQB,O#P#PQ FF
 %F &cVF  
 
 ".'.2FFO 	MM 0*!%!	  	   &&&ei/0000  M M M	<tLLLLLLM   	Mww~t<<  	MM">28[11 4'1133H h**+HM>JJD"&&t,,,(0T(B(BIf% %V,Q/ rxd C CDDEEJJ $ 4)SGTZ! ! !I $$T***MM%)"3444!!"6H"6"67777  M M M	<tLLLLLLM #5#3#347G$$ 		MM&MA%s3!$!,	     	ss7+,,, W%%%hoog.>v.FGGHHHtyy(()))) H
9~~ !'')) 		< 		<GD!(,

 < <$	9??$$--f55 <NN9----h..*3HY''K :y : :;;;;< %H '6'''..00GGG %w||G'<'<</X//000===))) NN4 99WD  <-#i..12D2D;;;;(..*:*:;;;;  X~Ks&   A
F F98F9D9L L32L3r   )NTFFNFFrI   )FF)	NTTFTNr  Nr  ))r   rd   collectionsr   r   numpyrg   PILr   r_   E
exceptionsr   r   r   	constantsr	   r
   	resolversr   typedr   r   r   visual.colorr   visual.materialr   visual.texturer   r   ry   r   rZ   rk   rl   r`   rb   ra   rQ  _obj_loadersr#   r*   r(   <module>r^     s   				 				 * * * * * * * *    	         .-----QEEEEEE                        $ $ $ $ $ $ , , , , , , , , , , # # # # # # , , , , , , : : : : : : : :
 (,  #b2 b2b2|$b2 b2 	b2
 b2 tnb2 b2 b2 
b2 b2 b2 b2J	W W W Wt@( @( @(FP% P% P%fm m m`)"D )"4 )"D )" )" )" )"X\ \ \ \B .i i i iX x s    =8=