Ë
    :vžj0  ã                   óf   — d Z ddlZddlmZ d\  ZZZd„ Zdd„Z	dd„Z
dd	„Zd
„ Zdd„Zd„ Zd„ Zd„ Zy)z]
rendering.py
--------------

Functions to convert trimesh objects to pyglet/opengl objects.
é    Né   )Úutil)r   r   é   c                 ó¸  — t        j                  | d«      rt        | fi |¤ŽS t        j                  | d«      rt        | fi |¤ŽS t        j                  | d«      r"t	        | j
                  fd| j                  i|¤ŽS t        j                  | d«      rt	        | fi |¤ŽS t        j                  | d«      rt         | j                  di |¤Žfi |¤ŽS t        d«      ‚)	a[  
    Try to convert various geometry objects to the constructor
    args for a pyglet indexed vertex list.

    Parameters
    ------------
    obj : Trimesh, Path2D, Path3D, (n,2) float, (n,3) float
      Object to render

    Returns
    ------------
    args : tuple
      Args to be passed to pyglet indexed vertex list
      constructor.
    ÚTrimeshÚPathÚ
PointCloudÚcolorsÚndarrayÚ	VoxelGridz'Geometry passed is not a viewable type!© )	r   Úis_instance_namedÚmesh_to_vertexlistÚpath_to_vertexlistÚpoints_to_vertexlistÚverticesr
   Úas_boxesÚ
ValueError)ÚgeometryÚkwargss     úb/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/trimesh/rendering.pyÚconvert_to_vertexlistr      sÓ   € ô  ×Ñ˜h¨	Ô2Ü! (Ñ5¨fÑ5Ð5Ü	×	Ñ	 ¨&Ô	1ô " (Ñ5¨fÑ5Ð5Ü	×	Ñ	 ¨,Ô	7ä# H×$5Ñ$5ÑX¸h¿o¹oÐXÐQWÑXÐXÜ	×	Ñ	 ¨)Ô	4ä# HÑ7°Ñ7Ð7Ü	×	Ñ	 ¨+Ô	6ä!Ð"3 (×"3Ñ"3Ñ"=°fÑ"=ÑHÀÑHÐHäÐBÓCÐCó    c           	      ó’  — t        | j                  j                  «      dk(  rd| j                  j                  d   dk(  rHt        j                  | j                  t        j
                  t        | j                  «      «      f«      }n| j                  }t        | j                  d«      �rt        |«      }| j                  }| j                  }| j                  j                  }| j                  j                  }	t        |	d«      r|	j                  du }
nt        |	d«      r|	j                  du }
nd}
|�|
st        |«      |k7  rt        |	j                  |«      }�n„|j                  d   dkD  r|dd…dd…f   }d|j!                  t        j"                  «      j%                  d	«      j'                  «       f}�n'|rtt        | j                  «      |k  r\| j(                  }|j                  }t        |«      }|j                  }|j                  }t        |j                  j*                  |«      }n±t        | j                  «      d
z  }t        j,                  | j.                  d«      }|| j                     }t        j0                  |t        j2                  ¬«      }t        j,                  | j                  j4                  d«      j%                  d«      }t        ||«      }|t6        ||j%                  d	«      j'                  «       d|j%                  d	«      j'                  «       fd|j%                  d	«      j'                  «       f|f}|S )aÒ  
    Convert a Trimesh object to arguments for an
    indexed vertex list constructor.

    Parameters
    -------------
    mesh : trimesh.Trimesh
      Mesh to be rendered
    group : str
      Rendering group for the vertex list
    smooth : bool
      Should we try to smooth shade the mesh
    smooth_threshold : int
      Maximum number of faces to smooth shade

    Returns
    --------------
    args : (7,) tuple
      Args for vertex list constructor

    é   r   ÚuvÚimageNÚbaseColorTextureTz
t2f/staticéÿÿÿÿé   )r   r    ©Údtype)r   r   ú
v3f/staticz
n3f/static)Úlenr   ÚshapeÚnpÚcolumn_stackÚzerosÚhasattrÚvisualÚvertex_normalsÚfacesr   Úmaterialr   r   Úcolors_to_glÚ
main_colorÚastypeÚfloat64ÚreshapeÚtolistÚsmooth_shadedÚvertex_colorsÚtileÚface_normalsÚarangeÚint64Úface_colorsÚGL_TRIANGLES)ÚmeshÚgroupÚsmoothÚsmooth_thresholdr   Úvertex_countÚnormalsr,   r   r-   Úno_imageÚcolor_glr
   Úargss                 r   r   r   4   s›  € ô. ˆ4�=‰=×ÑÓ 1Ò$¨¯©×)<Ñ)<¸QÑ)?À1Ò)DÜ—?‘? D§M¡M´2·8±8¼CÀÇÁÓ<NÓ3OÐ#PÓQ‰à—=‘=ˆäˆt�{‰{˜DÕ!ä˜8“}ˆØ×%Ñ%ˆØ—
‘
ˆð �[‰[�^‰^ˆð —;‘;×'Ñ'ˆÜ�8˜WÔ%à—~‘~¨Ð-‰HÜ�XÐ1Ô2Ø×0Ñ0°DÐ8‰HàˆHð ˆ:™¤S¨£W°Ò%<ô $ H×$7Ñ$7¸ÓFŠHð �x‰x˜‰{˜QŠØš˜2˜A˜2˜‘Y�à$ b§i¡i´·
±
Ó&;×&CÑ&CÀBÓ&G×&NÑ&NÓ&PÐQŠHá	”C˜Ÿ
™
“OÐ&6Ò6ð ×#Ñ#ˆØ—?‘?ˆÜ˜8“}ˆØ×'Ñ'ˆØ—‘ˆÜ §¡× ;Ñ ;¸\ÓJ‰ô ˜4Ÿ:™:“¨Ñ*ˆÜ—'‘'˜$×+Ñ+¨VÓ4ˆØ˜DŸJ™JÑ'ˆÜ—	‘	˜,¬b¯h©hÔ7ˆÜ—‘˜Ÿ™×0Ñ0°&Ó9×AÑAÀ'ÓJˆÜ ¨Ó5ˆð
 	ÜØØ�‰�bÓ× Ñ Ó"Ø	�x×'Ñ'¨Ó+×2Ñ2Ó4Ð5Ø	�w—‘ rÓ*×1Ñ1Ó3Ð4Øð€Dð €Kr   c                 óH  — | j                   }| j                  D �cg c]&  }t        j                  |j	                  |«      «      ‘Œ( }}t        j
                  |«      }t        |«      }t        j                  |d«      rD|j                  d«      }t        j                  |t        j                  t        |«      «      f«      }t        j                  |«      j                  «       }| j                  }	|	�zt        j                  t!        || j                  «      D �
�cg c]E  \  }
}t        j"                  t        |
«      df«      |z  j%                  t        j&                  «      ‘ŒG c}}
«      }	t)        |	|¬«      }|t*        ||d|j                  d«      f|f}|S c c}w c c}}
w )aY  
    Convert a Path3D object to arguments for a
    pyglet indexed vertex list constructor.

    Parameters
    -------------
    path : trimesh.path.Path3D object
      Mesh to be rendered
    group : str
      Rendering group for the vertex list

    Returns
    --------------
    args : (7,) tuple
      Args for vertex list constructor
    ©r   r   r   )Úcountr#   r   )r   Úentitiesr   Ústack_linesÚdiscreteÚvstack_emptyr$   Úis_shaper2   r&   r'   r(   r8   r3   r
   ÚvstackÚzipÚonesr0   Úuint8r.   ÚGL_LINES)Úpathr=   r   r   ÚeÚstackedÚlinesrG   Úindexr
   ÚsÚcÚ	gl_colorsrD   s                 r   r   r   ’   se  € ð$ �}‰}€Hð @D¿}º}ÓM¹}¸!Œt×Ñ §
¡
¨8Ó 4Õ5¸}€GÐMÜ×Ñ˜gÓ&€EÜ�‹J€Eô ‡}�}�X˜wÔ'Ø—‘˜gÓ&ˆÜ—‘ ¬¯©´°U³Ó(<Ð =Ó>ˆä�I‰I�eÓ×#Ñ#Ó%€Eð �[‰[€FØÐÜ—‘ô   ¨¯©Ô5ôá5‘D�A�qô —‘œ#˜a›& !˜Ó%¨Ñ)×1Ñ1´"·(±(Õ;Ø5òó
ˆô ˜V¨5Ô1€Ið 	ÜØØØ	�u—}‘} RÓ(Ð)Øð€Dð €KùòA Nùós   ›+FÄA
F
c                 óð  — t        j                  | t         j                  ¬«      } t        j                  | d«      r4t        j
                  | t        j                  t        | «      «      f«      } n!t        j                  | d«      st        d«      ‚t        j                  t        | «      «      j                  «       }t        | «      t        ||d| j                  d«      ft        |t        | «      «      f}|S )a†  
    Convert a numpy array of 3D points to args for
    a vertex list constructor.

    Parameters
    -------------
    points : (n, 3) float
      Points to be rendered
    colors : (n, 3) or (n, 4) float
      Colors for each point
    group : str
      Rendering group for the vertex list

    Returns
    --------------
    args : (7,) tuple
      Args for vertex list constructor
    r!   rF   )r   r    zPointcloud must be (n,3)!r#   r   )r&   Ú
asanyarrayr1   r   rL   r'   r(   r$   r   r8   r3   Ú	GL_POINTSr2   r.   )Úpointsr
   r=   r   rV   rD   s         r   r   r   Ê   sº   € ô& �]‰]˜6¬¯©Ô4€Fä‡}�}�V˜WÔ%Ü—‘ &¬"¯(©(´3°v³;Ó*?Ð!@ÓA‰Ü�]‰]˜6 7Ô+ÜÐ4Ó5Ð5ä�I‰I”c˜&“kÓ"×)Ñ)Ó+€Eô 	ˆF‹ÜØØØ	�v—~‘~ bÓ)Ð*Ü�VœS ›[Ó)ð€Dð €Kr   c                 óº  — t        j                  | «      } t        |«      }ddddœ}| j                  j                  |v r|| j                  j                     }nd}|�Pt        j                  | |df«      r8d| j                  d   › |› d�}| j                  d	«      j                  «       }||fS |�q| j                  d
v rct        j                  || j                  f| j                  ¬«      | z  j                  d	«      j                  «       }d| j                  › |› d�}||fS t        j                  g d¢|df«      j                  d	«      j                  «       }d}||fS )a8  
    Given a list of colors (or None) return a GL-acceptable
    list of colors.

    Parameters
    ------------
    colors: (count, (3 or 4)) float
      Input colors as an array

    Returns
    ---------
    colors_type : str
      Color type
    colors_gl : (count,) list
      Colors to pass to pyglet
    ÚfÚB)r_   ÚiÚuN)r    r   rX   r   z/staticr   ))r    )r   r!   )ç        rc   rc   z
c3f/static)r&   r[   Úintr"   Úkindr   rL   r%   r2   r3   rO   Úsizer6   )r
   rG   Úcolors_dtypesr"   Úcolors_typerY   s         r   r.   r.   ñ   sQ  € ô$ �]‰]˜6Ó"€FÜ�‹J€Eà C¨cÑ2€Mà‡|�|×Ñ˜MÑ)Ø˜fŸl™l×/Ñ/Ñ0‰àˆàÐœTŸ]™]¨6°E¸6°?ÔCà˜&Ÿ,™, q™/Ð*¨5¨'°Ð9ˆà—N‘N 2Ó&×-Ñ-Ó/ˆ	ð" ˜	Ð!Ð!ð! 
Ð	˜vŸ|™|¨|Ñ;ô �W‰W�e˜VŸ[™[Ð)°·±Ô>ÀÑGß‰W�R‹[ß‰V‹Xð 	ð ˜&Ÿ+™+˜ u g¨WÐ5ˆð ˜	Ð!Ð!ô	 —G‘GšO¨e°Q¨ZÓ8×@Ñ@ÀÓD×KÑKÓMˆ	à"ˆà˜	Ð!Ð!r   c                 óŽ  — ddl }t        | d«      r| j                  }nt        | d«      r| j                  }ny|€y|rddlm}  ||«      }t        j                  «       5 }|j                  |d¬«       |j                  d«       |j                  j                  d	|¬
«      }ddd«       j                  «       }|S # 1 sw Y   ŒxY w)aº  
    Convert a trimesh.visual.texture.Material object into
    a pyglet-compatible texture object.

    Parameters
    --------------
    material : trimesh.visual.texture.Material
      Material to be converted
    upsize: bool
      If True, will upscale textures to their nearest power
      of two resolution to avoid weirdness

    Returns
    ---------------
    texture : pyglet.image.Texture
      Texture loaded into pyglet form
    r   Nr   r   r   )Úpower_resizeÚpng)Úformatz.png)ÚfilenameÚfile)Úpygletr)   r   r   Úvisual.texturerj   r   ÚBytesIOÚsaveÚseekÚloadÚget_texture)r-   Úupsizero   Úimgrj   r_   Úgl_imageÚtextures           r   Úmaterial_to_texturerz   %  s´   € ó$ ô ˆx˜Ô!Ø�n‰n‰Ü	�Ð-Ô	.Ø×'Ñ'‰àð €{Øñ Ý0á˜3Óˆô 
�‰Œ˜1à�‰�˜5ˆÔ!Ø	�‰ˆqŒ	à—<‘<×$Ñ$¨f¸1Ð$Ó=ˆ÷ 
ð ×"Ñ"Ó$€Gà€N÷ 
ˆús   ÁAB;Â;Cc                 ó¨   — ddl m}  |j                  dz  t        j                  | t        j
                  ¬«      j                  j                  «       Ž S )a9  
    Convert a numpy row-major homogeneous transformation matrix
    to a flat column-major GLfloat transformation.

    Parameters
    -------------
    matrix : (4,4) float
      Row-major homogeneous transform

    Returns
    -------------
    glmatrix : (16,) gl.GLfloat
      Transform in pyglet format
    r   ©Úglé   r!   )ro   r}   ÚGLfloatr&   ÚarrayÚfloat32ÚTÚravel)Úmatrixr}   s     r   Úmatrix_to_glr…   Z  s<   € õ ð ˆB�J‰J˜‰OœbŸh™h v´R·Z±ZÔ@×BÑB×HÑHÓJÐKÐKr   c                 óº   — ddl m} t        j                  | «      } t	        |«      dkD  rt        j
                  | |«      }  |j                  t	        | «      z  | Ž }|S )z[
    Convert an array and an optional set of args into a
    flat vector of gl.GLfloat
    r   r|   )ro   r}   r&   r€   r$   Úappendr   )r€   rD   r}   Úvectors       r   Úvector_to_glr‰   o  sM   € õ
 ä�H‰H�U‹O€EÜ
ˆ4ƒy�1‚}Ü—	‘	˜% Ó&ˆØ%ˆb�j‰jœ3˜u›:Ñ%¨Ð.€FØ€Mr   c                 ó4  — ddl m} t        | j                  j	                  t
        j                  «      dz  «      }t        |«      dk(  sJ ‚t        |dd…df   «      }||j                  |f||j                  |f||j                  |f||j                  |fg}|S )aä  
    Convert trimesh.scene.lighting.Light objects into
    args for gl.glLightFv calls

    Parameters
    --------------
    light : trimesh.scene.lighting.Light
      Light object to be converted to GL
    transform : (4, 4) float
      Transformation matrix of light
    lightN : int
      Result of gl.GL_LIGHT0, gl.GL_LIGHT1, etc

    Returns
    --------------
    multiarg : [tuple]
      List of args to pass to gl.glLightFv eg:
      [gl.glLightfb(*a) for a in multiarg]
    r   r|   g     ào@r   Nr    )ro   r}   r‰   Úcolorr0   r&   r1   r$   ÚGL_POSITIONÚGL_SPECULARÚ
GL_DIFFUSEÚ
GL_AMBIENT)ÚlightÚ	transformÚlightNr}   Úgl_colorÚgl_positionrD   s          r   Úlight_to_glr•   }  sž   € õ( ô ˜EŸK™K×.Ñ.¬r¯z©zÓ:¸UÑBÓC€HÜˆx‹=˜AÒÐÐô ˜y¨¨!¨¨Q¨Ñ/Ó0€Kð 
�—‘ Ð-Ø	�—‘ Ð*Ø	�—‘ Ð)Ø	�—‘ Ð)ð	€Dð €Kr   )NTi`ê  )N)NN)T)Ú__doc__Únumpyr&   Ú r   r\   rQ   r;   r   r   r   r   r.   rz   r…   r‰   r•   r   r   r   Ú<module>r™      sV   ðñó å ð %.Ñ !€	ˆ8�\ò DóF[ó|5óp$òN1"óh2òjLò*ó$r   