
    j;                     N   d Z ddlZddlZddlZ eej                  j                  d      d         dk\  r ed      ddl	m
Z
mZ ddlmZ ddlmZmZmZmZmZmZ dd	lmZ d
dlmZ dej2                  d<   ddlmZ dZ G d dej:                  j<                        Zd Z 	 ddZ!y)z
windowed.py
---------------

Provides a pyglet- based windowed viewer to preview
Trimesh, Scene, PointCloud, and Path objects.

Works on all major platforms: Windows, Linux, and OSX.
    N.   z;`trimesh.viewer.windowed` requires `pip install "pyglet<2"`)	renderingutil)translation_matrix)	ArrayLikeCallableDictIterableNumberOptional)to_rgba   )	TrackballFshadow_windowaX  
# SceneViewer Controls

| Input                      | Action                                        |
|----------------------------|-----------------------------------------------|
| `mouse click + drag`       | Rotates the view                              |
| `ctl + mouse click + drag` | Pans the view                                 |
| `mouse wheel`              | Zooms the view                                |
| `z`                        | Resets to the initial view                    |
| `w`                        | Toggles wireframe mode                        |
| `c`                        | Toggles backface culling                      |
| `g`                        | Toggles an XY grid with Z set to lowest point |
| `a`                        | Toggles an XYZ-RGB axis marker between: off,  |
|                            | at world frame, or at every frame and world,  |
|                            | and at every frame                            |
| `f`                        | Toggles between fullscreen and windowed mode  |
| `h`                        | Prints this help message                      |
| `m`                        | Maximizes the window                          |
| `q`                        | Closes the window                             |
|----------------------------|-----------------------------------------------|
c                       e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d0dedee   dedee   dedededee   d	ee   d
ee	   dee
   dedee   dedef fdZd Zd Zd Zd Zd Zd Zd Zd1dZd Zed        Zed        Zed        Zed        Zed        Zed2d       Zed         Zd! Zd" Zd# Zd$ Z d% Z!d& Z"d' Z#d( Z$d) Z%d* Z&d+ Z'd, Z(d- Z) fd.Z*d/ Z+ xZ,S )3SceneViewersmoothflagsvisible
resolution
fullscreen	resizable
start_loopcallbackcallback_periodcaptionfixedoffset_linesline_settingsprofilerecordc           
      d   |x| _         | _        |	| _        |
| _        | j                  | j                   _        t        |      | _        || _        |j                  j                         | _
        t        dd| j                  r|j                  dz  ndg      | _        | j                          t        j                   j#                         | _        || _        t        |      | _        | j(                  rddlm} || _        t        |      | _        | j.                  rg | j                   j0                  d<   || _        d| _        d| _        i | _        i | _        i | _        || _        tA               | _!        i | _"        ||jF                  jH                  }n||jF                  _$        |d}tK        |      }|dz  |dz  d	| _&        || jL                  jO                  |       |7	 tQ        jR                  d
ddd      }tT        |   |||||d   |d
   |       ntT        |   |||||d   |d
   |       | j]                          | j_                           | j`                  |  || j                  |       | jc                          | j                  %|
d}
t        jd                  jg                  d |
       |rt        jh                  jk                          yy# t        jX                  jZ                  $ r5 tQ        jR                  d      }tT        |   |||||d   |d
   |       Y w xY w)aN  
        Create a window that will display a trimesh.Scene object
        in an OpenGL context via pyglet.

        Parameters
        ---------------
        scene : trimesh.scene.Scene
          Scene with geometry and transforms
        smooth
          If True try to smooth shade things
        flags
          If passed apply keys to self.view:
          ['cull', 'wireframe', etc]
        visible
          Display window or not
        resolution
          Initial resolution of window
        fullscreen
          Determines whether the window is rendered in fullscreen mode.
        resizable
          Determines whether the rendered window can be resized by the user.
        start_loop
          Call pyglet.app.run() at the end of init
        callback
          A function which can be called periodically to
          update things in the scene
        callback_period
          How often to call the callback, in seconds
        caption
          Caption for the window title
        fixed
          List of keys in scene.geometry to skip view
          transform on to keep fixed relative to camera
        offset_lines
          If True, will offset lines slightly so if drawn
          coplanar with mesh geometry they will be visible
        line_settings
          Override default line width and point size with keys
          'line_width' and 'point_size' in pixels
        background
          Color for background
        window_conf
          Passed to window init
        profile
          If set will run a `pyinstrument` profile for
          every call to `on_draw` and print the output.
        record
          If True, will save a list of `png` bytes to
          a list located in `scene.metadata['recording']`
        kwargs
          Additional arguments to pass, including
          'background' for to set background color
        r   i  )Profiler	recordingNz"Trimesh SceneViewer (`h` for help)   i  )
point_size
line_widthr         T)sample_bufferssamples
depth_sizedouble_buffer)configr   r   r   widthheightr   )r.   )r/   r   r   r   r0   r1   r   )r   g?c                     | S N )xs    D/DATA/.local/lib/python3.12/site-packages/trimesh/viewer/windowed.py<lambda>z&SceneViewer.__init__.<locals>.<lambda>  s    Q    )6scene_scener   r   _redrawboolr   
backgroundcamera_transformcopy_initial_camera_transformr   scale_line_offset
reset_viewpygletgraphicsBatchbatch_smooth_profilepyinstrumentr$   _recordmetadatakwargs_axis_gridvertex_listvertex_list_hashvertex_list_moder   set_nodes_hiddentexturescamerar   maxr    updateglConfigsuper__init__windowNoSuchConfigException_update_vertex_listinit_glset_sizeupdate_flagsclockschedule_intervalapprun)selfr9   r   r   r   r   r   r   r   r   r   r   r   r   r    r=   window_confr!   r"   rM   r$   rA   conf	__class__s                          r6   r\   zSceneViewer.__init__:   s   V $)(
T[ .!\\

 .$).)?)?)D)D)F& /):):5;;%B
 	__**,
W==-$DMF|<</1DJJ,  

 " "
 U 00J&0ELL#?:G J,1CKus{S$%%m4  yy#$aBd  #)'$Q-%a=# ! , G"%# m!!}   	  " 	z"OO%O( ==$&", LL**;HJJNN W ==66 
yyt4 )'#$Q-%a=# ! 
s   %5K AL/.L/c                 $    | j                          y r3   )on_drawrg   s    r6   r;   zSceneViewer._redraw  s    r8   c                    | j                   j                  j                         D ]a  \  }}|j                  rt	        |      | j
                  j                  |      k(  r;| j                  ||t        | j                               c y )N)namegeometryr   )
r9   rp   itemsis_empty_geometry_hashrQ   getadd_geometryr<   rH   )rg   ro   geoms      r6   r_   zSceneViewer._update_vertex_list
  sl    **--335JD$}}d#t'<'<'@'@'FF4$tDLL?QR 6r8   c                     | j                   R| j                  | j                         | j                          | j                  | j                  | j
                         y y r3   )r   r9   r_   _update_perspectiver0   r1   rm   s    r6   _update_mesheszSceneViewer._update_meshes  sE    ==$MM$**%$$&$$TZZ= %r8   c                 L   	 t        j                  |fi |} | j                  j                  | | j                  |<   t        |      | j                  |<   |d   | j                  |<   t        |dd      }t        |d      r@t        |d	      r3	 t        j                  |j                        }||| j                   |<   yyyy# t        $ r( t        j                  j                  d| dd       Y yw xY w# t        $ r$ t        j                  j                  d
d       Y yw xY w)aJ  
        Add a geometry to the viewer.

        Parameters
        --------------
        name : hashable
          Name that references geometry
        geometry : Trimesh, Path2D, Path3D, PointCloud
          Geometry to display in the viewer window
        kwargs **
          Passed to rendering.convert_to_vertexlist
        zfailed to add geometry ``Texc_infoNr   visualuvmaterialzfailed to load texture)r   convert_to_vertexlistBaseExceptionr   logwarningrG   add_indexedrP   rs   rQ   rR   getattrhasattrmaterial_to_texturer   rU   )rg   ro   rp   rM   argsr~   texs          r6   ru   zSceneViewer.add_geometry  s%   	228FvFD "8!7!7!>&4X&>d#&*1gd# 8T264 WVZ%@J33FOOD?*-DMM$' # &A   	HH7vQ?$O	$ ! J  !9D IJs#   C 0C6 .C32C36*D#"D#c                    | j                   j                  }|j                  D ch c]
  }||   d    }}| j                  D cg c]	  }||vs| }}|D ]r  }| j                  j	                  |d       | j
                  j	                  |d       | j                  j	                  |d       | j                  j	                  |d       t yc c}w c c}w )z[
        Remove any stored vertex lists that no longer
        exist in the scene.
        r   N)r9   graphnodes_geometryrP   poprQ   rR   rU   )rg   r   node	geom_keeprv   geom_deletes         r6   cleanup_geometrieszSceneViewer.cleanup_geometries?  s     

  050D0DE0DU4[^0D	E(,(8(8R(8D	<Qt(8RD  t,!!%%dD1!!%%dD1MMdD)   FRs   C	CCc                 :    | j                   j                  |       y)z
        If a node is hidden remove the flag and show the
        geometry on the next draw.

        Parameters
        -------------
        node : str
          Node to display
        N)rT   discardrg   r   s     r6   unhide_geometryzSceneViewer.unhide_geometryQ  s     	""4(r8   c                 :    | j                   j                  |       y)z
        Don't display the geometry contained at a node on
        the next draw.

        Parameters
        -------------
        node : str
          Node to not display
        N)rT   addr   s     r6   hide_geometryzSceneViewer.hide_geometry]  s     	t$r8   c                    dddddt        | j                  | j                  j                  j                  | j                  j
                  | j                  j                        d| _        	 t        |t              rG|j                         D ]#  \  }}|| j                  v s|| j                  |<   % | j                          yy# t        $ r Y yw xY w)z
        Set view to the default view.

        Parameters
        --------------
        flags : None or dict
          If any view key passed override the default
          e.g. {'cull': False}
        TF)posesizerA   target)cullaxisgridr   	wireframeballN)r   r@   r9   rV   r   rA   centroidview
isinstancedictrq   rb   r   )rg   r   kvs       r6   rC   zSceneViewer.reset_viewi  s     33ZZ&&11jj&&zz**	
		%&!KKMDAqDII~'(		! * !!#	 '
  		s   -4C "!C 	CCc                    | j                   t        j                  d      }n7t        | j                         }|j	                  t        j
                        dz  }| j                  |       | j                  | j                  j                         | j                          | j                           | j                  di | j                   | j                  | j                         y)z`
        Perform the magic incantations to create an
        OpenGL scene using pyglet.
        Nr)   g     o@r4   )r=   nponesr   astypefloat64_gl_set_background_gl_enable_depthr9   rV   _gl_enable_color_material_gl_enable_blending_gl_enable_smooth_linesr    _gl_enable_lighting)rg   r=   s     r6   r`   zSceneViewer.init_gl  s     ??"J !1J#**2::6>J
+djj//0&&(  "$$$:t'9'9:  ,r8   c                 (    t        j                  |   y r3   rY   glClearColor)r=   s    r6   r   zSceneViewer._gl_set_background  s    
$r8   c                  ,    t        j                  g d  y )N)r   r   r   r   r   r4   r8   r6   _gl_unset_backgroundz SceneViewer._gl_unset_background  s    
&r8   c                 F   t        j                  d       t        j                  t         j                         t        j                  t         j
                         t        j                  t         j                         t        j                  t         j                         y)zZ
        Enable depth test in OpenGL using distances
        from `scene.camera`.
        g      ?N)rY   glClearDepthglEnableGL_DEPTH_TESTglDepthFunc	GL_LEQUALGL_CULL_FACE)rV   s    r6   r   zSceneViewer._gl_enable_depth  sT     	
B$$%
r||$
B$$%
BOO$r8   c            	      
   t        j                  t         j                  t         j                         t        j                  t         j
                         t        j                  t         j                         t        j                  t         j                  t         j                  t        j                  ddd             t        j                  t         j                  t         j                  t        j                  ddd             t        j                  t         j                  t         j                  t        j                  ddd             t        j                  t         j                  t         j                   d       y )NgS㥛?g-=?gC?gI@)rY   glColorMaterialGL_FRONT_AND_BACKGL_AMBIENT_AND_DIFFUSEr   GL_COLOR_MATERIALglShadeModel	GL_SMOOTHglMaterialfvGL_FRONT
GL_AMBIENTr   vector_to_gl
GL_DIFFUSEGL_SPECULARglMaterialfGL_SHININESSr4   r8   r6   r   z%SceneViewer._gl_enable_color_material  s     	2//1J1JK
B(()
%
KKMM""8Xx@	

 	KKMM""8Xx@	

 	KKNN""9iC	
 	r{{BOO[Ar8   c                      t        j                  t         j                         t        j                  t         j                  t         j
                         y r3   )rY   r   GL_BLENDglBlendFuncGL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHAr4   r8   r6   r   zSceneViewer._gl_enable_blending  s,     	BKK 
r(A(ABr8   c                    t        j                  t         j                         t        j                  t         j                  t         j
                         t        j                  |        t        j                  |       y r3   )rY   r   GL_LINE_SMOOTHglHintGL_LINE_SMOOTH_HINT	GL_NICESTglLineWidthglPointSize)r(   r'   s     r6   r   z#SceneViewer._gl_enable_smooth_lines  sF     	B%%&
		"((",,7
z"
z"r8   c                    t        j                  t         j                         t        | j                  dd       D ]  \  }}t        d|       }| j                  j                  |j                        d   }t        j                  |||      }t        j                  |       |D ]  }t        j                  |    y)zb
        Take the lights defined in scene.lights and
        apply them as openGL lights.
        N   zgl.GL_LIGHTr   )light	transformlightN)rY   r   GL_LIGHTING	enumeratelightsevalr   rt   ro   r   light_to_gl	glLightfv)r9   ir   r   matrix	multiargsr   s          r6   r   zSceneViewer._gl_enable_lighting  s     	BNN#!%,,r"23HAuKs+,F [[__UZZ03F "--vfI
 KK!d# " 4r8   c                 ^    | j                   d    | j                   d<   | j                          y)z
        Toggle back face culling.

        It is on by default but if you are dealing with
        non- watertight meshes you probably want to be able
        to see the back sides.
        r   Nr   rb   rm   s    r6   toggle_cullingzSceneViewer.toggle_culling  s*     !%		& 11		&r8   c                 ^    | j                   d    | j                   d<   | j                          y)za
        Toggle wireframe mode

        Good for  looking inside meshes, off by default.
        r   Nr   rm   s    r6   toggle_wireframezSceneViewer.toggle_wireframe  s*     &*YY{%;!;		+r8   c                 ^    | j                   d    | j                   d<   | j                          y)z>
        Toggle between fullscreen and windowed mode.
        r   Nr   rm   s    r6   toggle_fullscreenzSceneViewer.toggle_fullscreen  s*     '+ii&="=		,r8   c                     g d}|j                  | j                  d         dz   t        |      z  }||   | j                  d<   | j                          y)z^
        Toggle a rendered XYZ/RGB axis marker:
        off, world frame, every frame
        )Fworldallwithout_worldr   r   N)indexr   lenrb   )rg   statesr   s      r6   toggle_axiszSceneViewer.toggle_axis  sL     :dii/014FC"5M		&r8   c                 ^    | j                   d    | j                   d<   | j                          y)z)
        Toggle a rendered grid.
        r   Nr   rm   s    r6   toggle_gridzSceneViewer.toggle_grid#  s*    
 !%		& 11		&r8   c                    | j                   d   r3t        j                  t        j                  t        j                         n2t        j                  t        j                  t        j
                         | j                  | j                   d          | j                   d   r$t        j                  t        j                         n#t        j                  t        j                         | j                   d   ro| j                  cddlm} |j                  | j                  j                  d	z  
      }t!        j"                  |      } | j$                  j&                  | | _
        n<| j                   d   s-| j                  !| j                  j)                          d| _
        | j                   d   r| j*                  	 ddlm} | j                  j0                  }|j3                  d      }|d   d   t5        j6                  |dddf         d	z  z
  |d<   t5        j6                  |d      dd j9                         } ||dt;        |            }t!        j<                  |      } | j$                  j&                  | | _        y| j                   d   s/| j*                  "| j*                  j)                          d| _        yyy# t>        $ r$ t@        jB                  jE                  dd       Y yw xY w)zG
        Check the view flags, and call required GL functions.
        r   r   )r   r   r   Nr   )creationd   )origin_sizer   )r   r   )r   r)   )sidecountr   zfailed to create grid!Tr|   )#r   rY   glPolygonModer   GL_LINEGL_FILLset_fullscreenr   r   	glDisablerN    r   r   r9   rA   r   mesh_to_vertexlistrG   r   deleterO   path.creationr   boundsmeanr   ptprW   r   r   r   r   r   r   )	rg   r   r   r   r   r	  centerr   	grid_meshs	            r6   rb   zSceneViewer.update_flags,  sH   
 99[!R112::>R112::> 	tyy'>? 99VKK(LL) 99V!3# ==TZZ-=-=-C=DD//5D///6DJ 6"tzz'=JJDJ99V!3J0**!, #1IaLBFF6!Q$<,@3,FGq	vvf1-bq1557 d!?QRX?YZ	 66yA3TZZ33T:
 6"tzz'=JJDJ (>" ! J  !9D IJs    CK *K54K5c                    	 | j                         \  }}t        j                  dd||       t        j                  t        j
                         t        j                          | j                  j                  }t        j                  |j                  d   |t        |      z  |j                  |j                         t        j                  t        j                         ||fS # t        $ r Y w xY w)Nr   r   )get_viewport_sizer   rY   
glViewportglMatrixModeGL_PROJECTIONglLoadIdentityr9   rV   gluPerspectivefovfloatz_nearz_farGL_MODELVIEW)rg   r0   r1   rV   s       r6   rx   zSceneViewer._update_perspectivej  s    	 !224ME6 	aE6*
(()
 "" 	JJqM55=0&--	
 	(f}%  		s   C& &	C21C2c                 0   | j                  ||      \  }}||f| j                  j                  _        | j                  d   j                  | j                  j                  j                         | j                  d   j                  | j                  _        y)z)
        Handle resized windows.
        r   N)rx   r9   rV   r   r   resizer   r>   )rg   r0   r1   s      r6   	on_resizezSceneViewer.on_resize  sr     00?v(-v

$		&  !2!2!=!=>&*ii&7&<&<

#r8   c                 j   | j                   d   j                  t        j                         |t        j
                  j                  j                  k(  r|t        j
                  j                  j                  z  }|t        j
                  j                  j                  z  }|r0|r.| j                   d   j                  t        j                         n|r-| j                   d   j                  t        j                         n|r| j                   d   j                  t        j                         n|t        j
                  j                  j                  k(  r-| j                   d   j                  t        j                         nS|t        j
                  j                  j                  k(  r,| j                   d   j                  t        j                         | j                   d   j!                  t#        j$                  ||g             | j                   d   j&                  | j(                  _        y)z2
        Set the start point of the drag.
        r   N)r   	set_stater   STATE_ROTATErD   r]   mouseLEFTkeyMOD_CTRL	MOD_SHIFT
STATE_ZOOM
STATE_ROLL	STATE_PANMIDDLERIGHTdownr   arrayr   r9   r>   )rg   r5   ybuttons	modifiersctrlshifts          r6   on_mouse_presszSceneViewer.on_mouse_press  sx    			&##I$:$:;fmm))...v}}00999D 1 1 ; ;;E		&!++I,@,@A		&!++I,@,@A		&!++I,?,?@++222IIf''	(;(;<++111IIf''	(<(<=		&rxxA/0&*ii&7&<&<

#r8   c                     | j                   d   j                  t        j                  ||g             | j                   d   j                  | j
                  _        y)z)
        Pan or rotate the view.
        r   N)r   dragr   r+  r   r9   r>   )rg   r5   r,  dxdyr-  r.  s          r6   on_mouse_dragzSceneViewer.on_mouse_drag  sC     			&rxxA/0&*ii&7&<&<

#r8   c                     | j                   d   j                  |       | j                   d   j                  | j                  _        y)z 
        Zoom the view.
        r   N)r   scrollr   r9   r>   )rg   r5   r,  r4  r5  s        r6   on_mouse_scrollzSceneViewer.on_mouse_scroll  s6     			&  $&*ii&7&<&<

#r8   c                    d}|t         j                  j                  j                  k(  r| j	                          n|t         j                  j                  j
                  k(  r| j                          n|t         j                  j                  j                  k(  r| j                          nO|t         j                  j                  j                  k(  r| j                          n|t         j                  j                  j                  k(  r| j                          n|t         j                  j                  j                  k(  r| j                          n|t         j                  j                  j                  k(  r| j!                          nn|t         j                  j                  j"                  k(  r| j%                          n6|t         j                  j                  j&                  k(  rt)        t*               |t         j                  j                  j,                  t         j                  j                  j.                  t         j                  j                  j0                  t         j                  j                  j2                  fv rj| j4                  d   j7                  ddg       |t         j                  j                  j,                  k(  r"| j4                  d   j9                  | dg       n|t         j                  j                  j.                  k(  r!| j4                  d   j9                  |dg       n|t         j                  j                  j0                  k(  r"| j4                  d   j9                  d| g       nG|t         j                  j                  j2                  k(  r | j4                  d   j9                  d|g       | j4                  d   j:                  | j<                  _        yy)z?
        Call appropriate functions given key presses.
        
   r   r   N) rD   r]   r"  Wr   ZrC   Cr   Ar   Gr   Qon_closeMmaximizeFr   Hprint_HELP_MESSAGEr!  r)  DOWNUPr   r*  r3  r   r9   r>   )rg   symbolr.  	magnitudes       r6   on_key_presszSceneViewer.on_key_press  s    	V]]&&(((!!#v}}((***OOv}}((***!v}}((***v}}((***v}}((***MMOv}}((***MMOv}}((***""$v}}((***- MM""MM##MM""MM  	
 
 IIf""Aq6***///		&!&&
A76==,,222		&!&&	1~66==,,111		&!&&I:76==,,///		&!&&9~6*.))F*;*@*@DJJ'
r8   c                 
   | j                   r | j                         }|j                          | j                          t	        j
                  t        j                  t        j                  z         t	        j                          t        j                  j                  | j                  j                        }t	        j                  t        j                   |             t#        j$                  | j                  j&                  j(                        }t+        |      }d}| j,                  r<| j.                  d   dk(  s*| j,                  j1                  t        j2                         | j4                  r*| j4                  j1                  t        j6                         | j                  j8                  }| j                  j&                  }t+        |      dkD  r:|dz  }|j;                         }|| j<                  v r3|j?                  |      \  }	}
|
|
| j@                  vrX| jB                  a|
| jB                  v rSt        j                  j                  t        jD                  | jF                  |            }t        jD                  |	|      }	||
   }|jH                  r| j@                  |
   }|t        j6                  k(  r@tK        jL                  |	t        j                  j                  |      | jN                  |g      }	t	        jP                          t	        j                  t        j                   |	             | j.                  d   dk(  r+| j,                  j1                  t        j2                         ng| j.                  d   dk(  rUtK        jR                  |	t        jT                  d	      d
      s*| j,                  j1                  t        j2                         tW        |d      rXtW        |jX                  d      rB|jX                  jZ                  r,||k  r'|j]                  |       t	        j^                          }d}|
| j`                  v rX| j`                  |
   }t	        jb                  |jd                         t	        jf                  |jd                  |jh                         | jj                  |
   j1                  |       t	        j^                          |t	        jl                  |jd                         t+        |      dkD  r:| j                   rAjo                          tJ        jp                  js                  |ju                  dd             yy)z,
        Run the actual draw calls.
        r   r   )moder   r   Nr   r)   gh㈵>)atolr~   transparencyT)unicodecolor);rI   r$   startry   rY   glClearGL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BITr  r   linalginvr9   r>   glMultMatrixfr   matrix_to_glcollectionsdequer   r   r   rN   r   drawGL_TRIANGLESrO   GL_LINESrp   popleftrT   rt   rR   r   dotr@   rr   r   	multi_dotrB   glPushMatrixallcloseeyer   r~   rR  appendglPopMatrixrU   r   r   glBindTextureidrP   r  stopr   debugoutput_text)rg   profilertransform_camera
node_namescount_originalr   rp   r   current_noder   geometry_nametransform_fixmeshrP  textures                  r6   rl   zSceneViewer.on_draw  s   
 ==}}HNN


2))B,B,BBC
 99==)D)DE 	//0@AB !&&tzz'7'7'F'FG
Z ::dii/?BJJOOO1::JJOOO- ::&&

  *o!QJE%--/Lt111 (-yy'>$I}$T=R=R(R zz%-4::*E "		FF499;KL! FF9m<	 M*D}}((7D r{{" NN!		&67))(		 OOY33I>? yy E)

R__56"o5}}Yq	EJJOOO9 h'DKK8KK,, >)%%l3NN$ G---6GNN+  < ]+00d0;NN "W^^,g *o!j ==MMOHHNN8//D/IJ r8   c                    t         |           | j                  rk| j                  t	        j
                               }|j                  d       | j                  j                  d   j                  |j                                y y )Nr   r%   )r[   fliprK   
save_imager   BytesIOseekr9   rL   rh  read)rg   imgrj   s     r6   ry  zSceneViewer.flipW  sZ    <<//$,,.1CHHQKJJ,33CHHJ? r8   c                     t         j                  j                         }|j                         }t	        |d      r|j                  |       |S |j                  |       |S )z
        Save the current color buffer to a file object
        in PNG format.

        Parameters
        -------------
        file_obj: file name, or file- like object
        write)file)filename)rD   imageget_buffer_managerget_color_bufferr   save)rg   file_objmanagercolorbuffers       r6   rz  zSceneViewer.save_imagea  s^     ,,113..08W%(+  h/r8   )TNTNFTTNNNNTNNNFFr3   )r)   r)   )-__name__
__module____qualname__r<   r   r
   r   r	   r   strr   r\   r;   r_   ry   ru   r   r   r   rC   r`   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   rb   rx   r  r1  r6  r9  rM  rl   ry  rz  __classcell__)rj   s   @r6   r   r   9   s     $*. '+,0!%$(!(,'K K ~	K
 K Y'K K K K 8$K "&)K #K !K K  ~K$ %K& 'KZS>#JJ*$
)
%B-0 % % ' ' 
% 
% B B0 C C
 # # $ $2	<|2==,=='AR|K|@r8   r   c                     t        t        |             }t        | d      r!|t        t        | j                              z  }|S )z
    Get a hash for a geometry object

    Parameters
    ------------
    geometry : object

    Returns
    ------------
    hash : str
    r~   )r  hashr   r~   )rp   hs     r6   rs   rs   t  s9     	DNAx"	Shoo&''Hr8   c           	         t        | fd||||d|}ddlm} dD ]  }t        j                  j                          |j                          |j                          |j                  d       |j                          |se |       }	|j                  |	       |	j                  d       |	j                         }
 |j                          
S )a  
    Render a preview of a scene to a PNG. Note that
    whether this works or not highly variable based on
    platform and graphics driver.

    Parameters
    ------------
    scene : trimesh.Scene
      Geometry to be rendered
    resolution : (2,) int or None
      Resolution in pixels or set from scene.camera
    visible : bool
      Show a window during rendering. Note that MANY
      platforms refuse to render with hidden windows
      and will likely return a blank image; this is a
      platform issue and cannot be fixed in Python.
    fullscreen : bool
      Determines whether the window is rendered in fullscreen mode.
      Defaults to False (windowed).
    resizable : bool
      Determines whether the rendered window can be resized by the user.
      Defaults to True (resizable).
    kwargs : **
      Passed to SceneViewer

    Returns
    ---------
    render : bytes
      Image in PNG format
    F)r   r   r   r   r   r   )r{  )FFTrl   r   )r   r   r{  rD   rc   tick	switch_todispatch_eventsdispatch_eventry  rz  r|  r}  close)r9   r   r   r   r   rM   r]   r{  r  r  renders              r6   render_scener    s    B  F  % i(yHh'MM!]]_F % LLNMr8   )NTFT)"__doc__r]  numpyr   rD   intversionsplitImportErrorr  r   r   transformationsr   typedr   r	   r
   r   r   r   r~   r   	trackballr   options	pyglet.glrY   rH  r]   Windowr   rs   r  r4   r8   r6   <module>r     s       v~~C #$)
S
TT  0 I I   "'  .x&--&& xv* GK<r8   