
    hkt                         S SK r S SKrS SKrS SKrS SKrS SKrS SKJr  S SK	J
r
  \" \R                  5      \" S5      :  rS rS rS r\\\S.r " S	 S
5      r " S S\5      r " S S\5      r " S S5      rg)    N)Version)warnz3.2.0c                     SSK Jn  U" X5      $ Nr   )	GLContext)
mujoco.eglr   widthheightr   s      `/home/james-whalen/.local/lib/python3.13/site-packages/gymnasium/envs/mujoco/mujoco_rendering.py_import_eglr      s    $U##    c                     SSK Jn  U" X5      $ r   )mujoco.glfwr   r	   s      r   _import_glfwr      s    %U##r   c                     SSK Jn  U" X5      $ r   )mujoco.osmesar   r	   s      r   _import_osmesar      s    'U##r   )glfweglosmesac                       \ rS rSrS0 4SSSSS\S\S	\S
\\\4   4S jjrS rS r	S\S\
S\
4S jrS rS\4S jrS\4S jrS rSrg)
BaseRender+     modelmujoco.MjModeldatamujoco.MjDatar
   r   max_geomvisual_optionsc                 x   Xl         X l        / U l        0 U l        [        R
                  " SSX45      U l        [        R                  " U R                   U5      U l        [        R                  " 5       U l
        [        R                  " 5       U l        [        R                  " 5       U l        UR                  5        H  u  pxXR                  R                   U'   M     U R#                  5         [        R$                  " U R                   [        R&                  R(                  5      U l        U R-                  5         g)z=Render context superclass for offscreen and window rendering.r   N)r   r   _markers	_overlaysmujocoMjrRectviewportMjvScenescn	MjvCameracam	MjvOptionvopt
MjvPerturbpertitemsflagsmake_context_current
MjrContextmjtFontScalemjFONTSCALE_150con_set_mujoco_buffer)	selfr   r   r
   r   r    r!   flagvalues	            r   __init__BaseRender.__init__,   s     
	q!U; ??4::x8##%$$&	%%'	)//1KD$)IIOOD! 2 	!!# $$TZZ1D1D1T1TU!r   c                     [         eNNotImplementedErrorr8   s    r   r7   BaseRender._set_mujoco_bufferN       !!r   c                     [         er>   r?   rA   s    r   r2   BaseRender.make_context_currentQ   rC   r   gridpostext1text2c                     XR                   ;  a  SS/U R                   U'   U R                   U   S==   US-   -  ss'   U R                   U   S==   US-   -  ss'   g)zOverlays text on the scene. r   
   N)r$   )r8   rF   rG   rH   s       r   add_overlayBaseRender.add_overlayT   sX    ..(')2hDNN7#w"edl2"w"edl2"r   c                 :    U R                   R                  U5        g r>   )r#   append)r8   marker_paramss     r   
add_markerBaseRender.add_marker[   s    ]+r   markerc           	      R   U R                   R                  U R                   R                  :  a"  [        SU R                   R                   35      e[        (       a  U R                  U5        GOUR                  S[        R                  R                  5      nUR                  S[        R                  " / SQ5      5      nUR                  S[        R                  " / SQ5      5      nUR                  S[        R                  " S5      R                  5       5      nUR                  S	[        R                  " / S
Q5      5      n[        R                  " U R                   R                  U R                   R                     UUUUUS9  U R                   =R                  S-  sl        g )NzRan out of geoms. maxgeom: typesize){Gz?rX   rX   pos)        rZ   rZ   mat   rgba)      ?r^   r^   r^   )rW   rY   r[   r]   rL   )r)   ngeommaxgeomRuntimeError_MUJOCO_MARKER_LEGACY_MODE_legacy_add_marker_to_scenegetr%   mjtGeommjGEOM_SPHEREnparrayeyeflattenmjv_initGeomgeoms)r8   rT   	geom_typerW   rY   r[   r]   s          r   _add_marker_to_sceneBaseRender._add_marker_to_scene^   s   88>>TXX---!<TXX=M=M<NOPP%%,,V4

66>>+G+GHI::fbhh/A&BCD**UBHH_$=>C**UBFF1I$5$5$78C::fbhh/C&DEDtxx~~. 	!r   c           	      "   U R                   R                  U R                   R                     nSUl        [        R
                  R                  Ul        SUl        [        R                  R                  Ul        SUl        SUl        SUR                  S'   SUR                  S'   SUl        SUl        SUl        SUl        [        R&                  R(                  Ul        [,        R.                  " S5      S-  UR0                  SS& [,        R2                  " S5      UR4                  SS& [,        R.                  " S5      UR6                  SS& UR9                  5        GH.  u  p4[;        U[<        [>        [        R@                  R&                  45      (       a  [C        X#U5        MH  [;        U[D        [F        [,        RH                  45      (       a?  [K        X#5      n[,        RL                  " U5      RO                  URP                  5      USS& M  [;        U[R        5      (       a)  US	:X  d   S
5       eUc  SURT                  S'   M  XBl*        M  [W        X#5      (       a$  [Y        SR[                  U[+        U5      5      5      e[Y        SU-  5      e   g)a>  Add a marker to the scene compatible with older versions of MuJoCo.

MuJoCo 3.2 introduced breaking changes to the visual geometries API. To maintain
compatibility with older versions, we use the legacy API when an older version of MuJoCo is
detected.

Args:
    marker: A dictionary containing the marker parameters.
r   rL   g      ?r\   皙?N   labelz"Only label is a string in mjtGeom.z*mjtGeom has attr {} but type {} is invalidzmjtGeom doesn't have field %s).r)   rl   r_   dataidr%   mjtObjmjOBJ_UNKNOWNobjtypeobjid	mjtCatBitmjCAT_DECORcategorytexid
texuniform	texrepeatemissionspecular	shininessreflectancere   
mjGEOM_BOXrV   rg   onesrW   ri   r[   r]   r0   
isinstanceintfloat_enumssetattrtuplelistndarraygetattrasarrayreshapeshapestrrt   hasattr
ValueErrorformat)r8   rT   gkeyr:   attrs         r   rc   &BaseRender._legacy_add_marker_to_sceneu   s    HHNN488>>*MM//	%%11
AA

**GGAJ$q	66!9aGGAJq	 ,,.JC%#ufmm.C.C!DEE&EE4#<==q**U+33DJJ?QE3''g~K'KK~=!"AGGAJ#G @GGT%[  !!@3!FGG' )r   c                     [         e)zhOverride close in your rendering subclass to perform any necessary cleanup
after env.close() is called.
r?   rA   s    r   closeBaseRender.close   s
     "!r   )
r#   r$   r+   r6   r   r   r/   r)   r'   r-   N)__name__
__module____qualname____firstlineno__r   dictboolr;   r7   r2   r   rM   rR   rn   rc   r   __static_attributes__ r   r   r   r   +   s     *, " "  " 	 "
  "  " S$Y "D""33 3s 33 3,4 .0H$ 0Hd"r   r   c                      ^  \ rS rSrSrS0 4SSSSS\S	\S
\S\\\4   4U 4S jjjrS r	S\S	\4S jr
S rS rS rS r  SS\S-  S\S-  S\4S jjrS rSrU =r$ )OffScreenViewer   z.Offscreen rendering class with opengl context.r   r   zmujoco.MjMujocor   r   r
   r   r    r!   c                 j   > U R                  X45        [        TU ]	  XX4XV5        U R                  5         g r>   )_get_opengl_backendsuperr;   _init_camera)r8   r   r   r
   r   r    r!   	__class__s          r   r;   OffScreenViewer.__init__   s0     	  /eXNr   c                    [         R                  R                  U R                  l        SU R                  l        [        S5       HK  n[        R                  " U R                  R                  S S 2U4   5      U R                  R                  U'   MM     U R                  R                  R                  U R                  l        g )Nrq   r\   )r%   	mjtCameramjCAMERA_FREEr+   rV   
fixedcamidrangerg   medianr   	geom_xposlookatr   statextentdistance)r8   is     r   r   OffScreenViewer._init_camera   s{    ((66 qA!#499+>+>q!t+D!EDHHOOA  JJOO22r   c           
         [         R                  R                  S5      U l        U R                  b    [        U R                     " X5      U l        g [        R                  5        H   u  pE [        U   " X5      U l        X@l          O   U R                  c  [        S5      eg ! [         a9  n[        SS S[        R                  5       < SU R                  < S35      UeS nAff = f!    M  = f)N	MUJOCO_GLzEnvironment variable z must be one of z: got .zlNo OpenGL backend could be imported. Attempting to create a rendering context will result in a RuntimeError.)
osenvironrd   backend_ALL_RENDERERSopengl_contextKeyErrorra   keysr0   )r8   r
   r   ename_s         r   r   #OffScreenViewer._get_opengl_backend   s    zz~~k2<<#&4T\\&B5&Q# *//1*8*>u*MD'#'L	 2 ||#"G  $  "+K=8HI\I\I^Haaghlhthtgwwxys#   B# ,C)#
C&-4C!!C&)C.c                 v    [         R                  " [         R                  R                  U R                  5        g r>   )r%   mjr_setBuffermjtFramebuffermjFB_OFFSCREENr6   rA   s    r   r7   "OffScreenViewer._set_mujoco_buffer   s"    V22AA488Lr   c                 8    U R                   R                  5         g r>   )r   make_currentrA   s    r   r2   $OffScreenViewer.make_context_current   s    ((*r   c                 8    U R                   R                  5         g r>   )r   freerA   s    r   r   OffScreenViewer.free   s      "r   c                 $    U R                  5         g r>   r   rA   s    r   __del__OffScreenViewer.__del__   s    		r   Nrender_mode	camera_idsegmentationc           	      
   Ubi  US:X  a*  [         R                  R                  U R                  l        O)[         R                  R
                  U R                  l        X R                  l        [         R                  " U R                  U R                  U R                  U R                  U R                  [         R                  R                  U R                  5        U(       ab  SU R                  R                  [         R                   R"                  '   SU R                  R                  [         R                   R$                  '   U R&                   H  nU R)                  U5        M     [         R*                  " U R,                  U R                  U R.                  5        U R0                  R3                  5        Hk  u  nu  pg[         R4                  " [         R6                  R8                  UU R,                  UR;                  5       UR;                  5       U R.                  5        Mm     U(       ab  SU R                  R                  [         R                   R"                  '   SU R                  R                  [         R                   R$                  '   [<        R>                  " SU R,                  R@                  -  U R,                  RB                  -  [<        RD                  S9n[<        R>                  " U R,                  R@                  U R,                  RB                  -  [<        RF                  S9n	[         RH                  " XU R,                  U R.                  5        US;   aG  U	RK                  U R,                  RB                  U R,                  R@                  45      n
U
S S S2S S 24   n
US;   Gaf  URK                  U R,                  RB                  U R,                  R@                  S45      nUS S S2S S 24   nU(       Ga  US S 2S S 2S4   US S 2S S 2S4   S-  -   US S 2S S 2S	4   S
-  -   nSXU R                  RL                  S-   :  '   [<        RN                  " U R                  RL                  S-   S	4S[<        RP                  S9n[S        U R                  RL                  5       Hh  nU R                  RT                  U   nURV                  S:w  d  M.  URX                  XRV                  S-   S4'   URZ                  XRV                  S-   S4'   Mj     X   nU R&                  R]                  5         US:X  a  W$ US:X  a  W
$ WW
4$ )Nrq   rL   r   r\   dtype)depth_array
rgbd_tuple)	rgb_arrayr         i   )
fill_valuer   r   r   )/r%   r   r   r+   rV   mjCAMERA_FIXEDr   mjv_updateScener   r   r-   r/   rz   	mjCAT_ALLr)   r1   
mjtRndFlagmjRND_SEGMENTmjRND_IDCOLORr#   rn   
mjr_renderr'   r6   r$   r0   mjr_overlayr4   r5   encoderg   zerosr
   r   uint8float32mjr_readPixelsr   r_   fullint32r   rl   segidrx   ry   clear)r8   r   r   r   rQ   rF   rG   rH   rgb_arr	depth_arr	depth_imgrgb_imgseg_imgseg_idsr   geoms                   r   renderOffScreenViewer.render   s     B & 0 0 > > & 0 0 ? ?"+HHJJIIIIIIHH&&HH	
 >?DHHNN6,,::;>?DHHNN6,,::;!]]M%%m4 + 	$--488<'+~~';';'=#G^e##33 (> >?DHHNN6,,::;>?DHHNN6,,::;((###dmm&:&::"((
 HHMM$--"6"66bjj
	 	g$--J 77!))4==+?+?ATAT*UVI!$B$'*I55oot}}';';T]]=P=PRS&TUGddAg&GAq!G$aAg&$/0aAg&%01 
 <=DHHNNQ$678''XX^^a'+"(( txx~~.A88>>!,DzzR'59\\

Q 1259ZZ

Q 12	 /
 "*+%NM)I%%r   c                 N    U R                  5         [        R                  " 5         g r>   r   r   	terminaterA   s    r   r   OffScreenViewer.closeH      		r   )r   r   )NF)r   r   r   r   __doc__r   r   r   r;   r   r   r7   r2   r   r   r   r   r   r   __classcell__r   s   @r   r   r      s    8 *,   	
   S$Y  3 c 0M+# !%"	Z&4ZZ& :Z& 	Z&x r   r   c                      ^  \ rS rSrSrSSS0 4SSSSS	\S-  S
\S-  S\S\\\4   4U 4S jjjrS r	S r
S rS rS rS rS\S\4S jrSSS\S\4S jrS!S jrS\4S jrS rS rU =r$ )"WindowVieweriM  z6Class for window rendering in all MuJoCo environments.Nr   r   r   r   r   r
   r   r    r!   c                   > [         R                  " 5         SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        SU l
        SU l        SU l        SU l        SU l        SU l        SU l        [         R"                  " [         R$                  " 5       5      R&                  u  pxUc  US-  OUnUc  US-  OUn[         R(                  " [         R*                  S5        [         R,                  " X4S	S S 5      U l        [         R0                  " U R.                  5      u  U l        U l        [         R6                  " U R.                  5      u  pU R2                  S-  U	-  U l        [         R:                  " U R.                  U R<                  5        [         R>                  " U R.                  U R@                  5        [         RB                  " U R.                  U RD                  5        [         RF                  " U R.                  U RH                  5        [J        TU ]  XX4XV5        [         RN                  " S5        g )
NFr   Tz/tmp/frame_%07d.pngg?r^   r   rL   r%   )(r   init_button_left_pressed_button_right_pressed_last_mouse_x_last_mouse_y_paused_transparent	_contacts_render_every_frame
_image_idx_image_path_time_per_render
_run_speed_loop_count_advance_by_one_step
_hide_menuget_video_modeget_primary_monitorrW   window_hintVISIBLEcreate_windowwindowget_framebuffer_sizer
   r   get_window_size_scaleset_cursor_pos_callback_cursor_pos_callbackset_mouse_button_callback_mouse_button_callbackset_scroll_callback_scroll_callbackset_key_callback_key_callbackr   r;   swap_interval)r8   r   r   r
   r   r    r!   monitor_widthmonitor_heightwindow_widthr   r   s              r   r;   WindowViewer.__init__P  s    			$)!%*"!#' 0 ($)!(,(;(;$$&)

$ 	& ',m"(.1$Fq)(($M"&";";DKK"H
DK..t{{;jj3&5 	$$T[[$2K2KL&&t{{D4O4OP  d.C.CDdkk4+=+=>eXN1r   c                 v    [         R                  " [         R                  R                  U R                  5        g r>   )r%   r   r   mjFB_WINDOWr6   rA   s    r   r7   WindowViewer._set_mujoco_buffer  s"    V22>>Ir   c                 D    [         R                  " U R                  5        g r>   )r   r2   r  rA   s    r   r2   !WindowViewer.make_context_current  s    !!$++.r   c                      U R                   (       aa  [        R                  " 5       U R                   :X  a  [        R                  " S5        [        R                  " U R                   5        SU l         gg! [
         a    [        S5         gf = f)z
Safely frees the OpenGL context and destroys the GLFW window,
handling potential issues during interpreter shutdown or resource cleanup.
NzEnvironment was not properly closed using 'env.close()'. Please ensure to close the environment explicitly. GLFW module or dependencies are unloaded. Window cleanup might not have completed.)r  r   get_current_contextr2   destroy_windowAttributeErrorr   rA   s    r   r   WindowViewer.free  sn    
	{{++-<--d3##DKK0"	 
  	e	s   A1A5 5BBc                 $    U R                  5         g)z5Eliminate all of the OpenGL glfw contexts and windowsNr   rA   s    r   r   WindowViewer.__del__  s    		r   c                 l  ^  U 4S jnT R                   (       aE  T R                   (       a3  U" 5         T R                  (       a  ST l        OT R                   (       a  M3  OT =R                  T R                  R                  R
                  T R                  T R                  -  -  -  sl        T R                  (       a  ST l        T R                  S:  a.  U" 5         T =R                  S-  sl        T R                  S:  a  M.  T R                  R                  5         T R                  R                  5         g)a	  
Renders the environment geometries in the OpenGL glfw window:
    1. Create the overlay for the left side panel menu.
    2. Update the geometries used for rendering based on the current state of the model - `mujoco.mjv_updateScene()`.
    3. Add markers to scene, these are additional geometries to include in the model, i.e arrows, https://mujoco.readthedocs.io/en/latest/APIreference.html?highlight=arrow#mjtgeom.
        These markers are added with the `add_marker()` method before rendering.
    4. Render the 3D scene to the window context - `mujoco.mjr_render()`.
    5. Render overlays in the window context - `mujoco.mjr_overlay()`.
    6. Swap front and back buffer, https://www.glfw.org/docs/3.3/quick.html.
    7. Poll events like mouse clicks or keyboard input.
c            	      "  > TR                  5         [        R                  " 5       n TR                  c  g [        R                  " TR                  5      (       a5  [        R
                  " TR                  5        [        R                  " 5         [        R                  " TR                  5      u  TR                  l	        TR                  l
        [        R                  " TR                  TR                  TR                  [        R                   " 5       TR"                  [        R$                  R&                  R(                  TR*                  5        TR,                   H  nTR/                  U5        M     [        R0                  " TR                  TR*                  TR2                  5        TR4                  (       dm  TR6                  R9                  5        HO  u  nu  p4[        R:                  " [        R<                  R>                  UTR                  UUTR2                  5        MQ     [        R@                  " TR                  5        [        RB                  " 5         STRD                  -  S[        R                  " 5       U -
  -  -   Tl"        g )Ng?rr   )#_create_overlaytimer  r   window_should_closer6  r   r  r'   r
   r   r%   r   r   r   r-   r.   r+   rz   r   r:   r)   r#   rn   r   r6   r  r$   r0   r   r4   r5   swap_bufferspoll_eventsr  )render_startrT   rF   t1t2r8   s        r   update#WindowViewer.render.<locals>.update  s     "99;L{{"))$++66##DKK0 8<8Q8Q95DMM!5 ""

				!!#  **00 --))&1 ( dmmTXXtxx@ ??)-)=)=)?%GXb&&++;; *@ dkk*$'$*?*?$?#		l*C %D!r   FrL   r   N)r  r  r  r   opttimestepr  r  r  r$   r   r#   )r8   rE  s   ` r   r   WindowViewer.render  s    /	b <<,,,,05D-	 ,,, 

 7 7%%7!  ''#$ ""Q&  A%  ""Q&
 	r   c                 N    U R                  5         [        R                  " 5         g r>   r   rA   s    r   r   WindowViewer.close  r  r   r   actionc                 
   U[         R                  :w  a  g U[         R                  :X  a  U R                  =R                  S-  sl        [
        R                  R                  U R                  l        U R                  R                  U R                  R                  :  a:  SU R                  l        [
        R                  R                  U R                  l        GOU[         R                  :X  a%  U R                  b  U R                  (       + U l        GOU[         R                  :X  a  U R                  b  SU l        SU l        GOU[         R                   :X  a  U =R"                  S-  sl        GOoU[         R$                  :X  a  U =R"                  S-  sl        GODU[         R&                  :X  a  U R(                  (       + U l        GOU[         R*                  :X  a  [,        R.                  " [         R0                  " U R2                  5      S   [         R0                  " U R2                  5      S   S4[,        R4                  S9n[
        R6                  " US U R8                  U R:                  5        [<        R>                  " U R@                  U RB                  -  [,        RD                  " U5      5        U =RB                  S-  sl!        GOU[         RF                  :X  a  U RH                  (       + U l$        U RH                  U RJ                  RL                  [
        RN                  RP                  '   U RH                  U RJ                  RL                  [
        RN                  RR                  '   GOtU[         RT                  :X  a*  SU RJ                  RV                  -
  U RJ                  l+        GO6U[         RX                  :X  a  U RZ                  (       + U l-        GO
U[         R\                  :X  as  U R^                  (       + U l/        U R^                  (       a&  U R                  R`                  S S 2S4==   S-  ss'   OU R                  R`                  S S 2S4==   S-  ss'   OU[         Rb                  [         Rd                  [         Rf                  [         Rh                  [         Rj                  4;   a2  U RJ                  Rl                  U[         Rb                  -
  ==   S-  ss'   U[         Rn                  :X  aL  [q        S	5        [q        S
5        [         Rr                  " U R2                  5        [         Rt                  " 5         g g )NrL   rq   Tg       @r   r\   r   g      @zPressed ESCz	Quitting.);r   RELEASEKEY_TABr+   r   r%   r   r   rV   r   ncamr   	KEY_SPACEr  	KEY_RIGHTr  KEY_Sr  KEY_FKEY_Dr  KEY_Trg   r   r  r  r   r   r'   r6   imageioimwriter  r  flipudKEY_Cr  r-   r1   
mjtVisFlagmjVIS_CONTACTPOINTmjVIS_CONTACTFORCEKEY_EframeKEY_Hr  KEY_Rr  	geom_rgbaKEY_0KEY_1KEY_2KEY_3KEY_4	geomgroup
KEY_ESCAPEprintr6  r   )r8   r  r   scancoderL  modsimgs          r   r)  WindowViewer._key_callback  sN   T\\!DLL HH1$",,;;DHHMxx""djjoo5&(# & 0 0 > >DNN"t||'?#||+DLDNN"t||'?(,D%DLDJJOOs"ODJJOOs"ODJJ+/+C+C'CD$DJJ((--dkk:1=--dkk:1=
 hhC !!#tT]]DHHEOOD,,t>		#OOOq ODJJ!%/DNDHNNDIIOOF--@@ADHNNDIIOOF--@@ADJJ$))//1DIIODJJ"&//1DODJJ$($5$5 5D  

$$QT*c1*

$$QT*c1*TZZTZZTZZPPIIdjj 01Q61$//!- +,NN	 "r   r  glfw.LP__GLFWwindowxposyposc                 J   U R                   (       d  U R                  (       d  g [        R                  " U[        R                  5      [        R
                  :H  =(       d6    [        R                  " U[        R                  5      [        R
                  :H  nU R                  (       a<  U(       a  [        R                  R                  O[        R                  R                  nOgU R                   (       a<  U(       a  [        R                  R                  O[        R                  R                  nO[        R                  R                  n[        U R                  U-  5      U R                   -
  n[        U R                  U-  5      U R"                  -
  n[        R$                  " U5      u  p[        R&                  " U R(                  XVU-  Xy-  U R*                  U R,                  5        [        U R                  U-  5      U l        [        U R                  U-  5      U l        g r>   )r
  r  r   get_keyKEY_LEFT_SHIFTPRESSKEY_RIGHT_SHIFTr%   mjtMousemjMOUSE_MOVE_HmjMOUSE_MOVE_VmjMOUSE_ROTATE_HmjMOUSE_ROTATE_VmjMOUSE_ZOOMr   r!  r  r  r  mjv_moveCamerar   r)   r+   )
r8   r  rp  rq  	mod_shiftrL  dxdyr
   r   s
             r   r#  !WindowViewer._cursor_pos_callback8  sy    ))T-G-G LL!4!45C H||FD$8$89TZZG 	 %%  ..__33 
 &&  00__55  __11Ft#$t'9'99t#$t'9'9911&9JJU
BK488	
 !t!34 t!34r   c                    [         R                  " U[         R                  5      [         R                  :H  U l        [         R                  " U[         R
                  5      [         R                  :H  U l        [         R                  " U5      u  pV[        U R                  U-  5      U l
        [        U R                  U-  5      U l        g r>   )r   get_mouse_buttonMOUSE_BUTTON_LEFTru  r
  MOUSE_BUTTON_RIGHTr  get_cursor_posr   r!  r  r  )r8   r  buttonactrl  xys          r   r%  #WindowViewer._mouse_button_callback\  s    !!&$*@*@ATZZO 	! !!&$*A*ABdjjP 	" ""6* q1 q1r   y_offsetc                     [         R                  " U R                  [         R                  R                  SSU-  U R
                  U R                  5        g )Nr   g)r%   r}  r   rw  r|  r)   r+   )r8   r  x_offsetr  s       r   r'  WindowViewer._scroll_callbackh  s=    JJOO((HHHHH	
r   c           
         [         R                  R                  n[         R                  R                  nU R                  (       a  U R                  USS5        O U R                  USU R                  -  S5        U R                  USU R                  (       a  SOS5        U R                  USU R                  R                  S-   -  S	U R                  R                  -  5        U R                  US
U R                  (       a  SOS5        U R                  USU R                  (       a  SOS5        U R                  bK  U R                  (       d  U R                  USS5        O&U R                  USS5        U R                  USS5        U R                  USU R                  R                  S:X  a  SOS5        U R                  USS5        U R                   S:  a3  U R"                  U R                   S-
  -  nU R                  USSU-  5        OU R                  USS5        U R                  USS5        U R                  USSSU R$                  -  S4-  5        [         R&                  S:  a7  U R                  US[)        U R*                  R,                  S   S-   5      5        OG[         R&                  S:  a3  U R                  US[)        U R*                  R.                  S-   5      5        U R                  US[)        [1        U R*                  R2                  U R                  R4                  R6                  -  5      5      5        U R                  USSU R                  R4                  R6                  -  5        g )NrJ   zRun speed = %.3f x real timez[S]lower, [F]asterzRen[d]er every frameOnOffzSwitch camera (#cams = %d)rL   z[Tab] (camera ID = %d)z[C]ontact forceszT[r]ansparentStopz[Space]StartzAdvance simulation by one stepz[right arrow]zReferenc[e] framesz[H]ide Menur   zCap[t]ure framezSaved as %szToggle geomgroup visibilityz0-4FPSz%d%sz3.0.0zSolver iterationsSteprH  z%.5f)r%   
mjtGridPosmjGRID_TOPLEFTmjGRID_BOTTOMLEFTr  rM   r  r   rP  r+   r   r  r  r  r-   r_  r  r  r  __version__r   r   solver_nitersolver_iterroundr>  rG  rH  )r8   topleft
bottomleftfnames       r   r=  WindowViewer._create_overlayr  s   ##22&&88
##Wb"-.@$
 	+T5M5MTSX	
 	(DJJOOa,?@$txx':'::	

 	"4dnndRWX/4;L;L4RWX<<#<<  &)<  '9=  = 	)499??a3G4U	
 	-4??Q$$!(;<EW&79NOW&7<"?GUFa$:O:O6OQS5T,TU(/TYY5K5KA5NQR5R1S ')/TYY5J5JQ5N1O 	E$))..4::>>;R;R*R$S T	
 	Z$**..:Q:Q1QRr   )r  r
  r  r  r  r  r  r  r  r  r  r  r  r!  r  r  r   r
   r  )r  ro  )r   r   r   r   r  r   r   r   r;   r7   r2   r   r   r   r   r)  r   r#  r%  r'  r=  r   r  r  s   @r   r  r  M  s    @ !!*,// / Tz	/
 d
/ / S$Y/ /bJ/$RhA A AF"5+"538"5@E"5H
2
5 
5S 5Sr   r  c                       \ rS rSrSrSSSSSS0 4SSSSS	\S-  S
\S-  S\S-  S\S\S-  S\S-  S\\\4   4S jjr	S\S-  4S jr
S\S-  4S jrS rS rSrg)MujocoRendereri  a*  This is the MuJoCo renderer manager class for every MuJoCo environment.

The class has two main public methods available:
- :meth:`render` - Renders the environment in three possible modes: "human", "rgb_array", or "depth_array"
- :meth:`close` - Closes all contexts initialized with the renderer

Nr   r   r   r   r   default_cam_configr
   r   r    r   camera_namer!   c
                 X   Xl         X l        0 U l        SU l        X0l        X@l        XPl        X`l        Xl        Ub  Ub  [        S5      eUSL =(       a    USL n
U
(       a  SnUc@  [        R                  " U R                   [        R                  R                  U5      U l        gXpl        g)a  A wrapper for clipping continuous actions within the valid bound.

Args:
    model: MjModel data structure of the MuJoCo simulation
    data: MjData data structure of the MuJoCo simulation
    default_cam_config: dictionary with attribute values of the viewer's default camera, https://mujoco.readthedocs.io/en/latest/XMLreference.html?highlight=camera#visual-global
    width: width of the OpenGL rendering context
    height: height of the OpenGL rendering context
    max_geom: maximum number of geometries to render
    camera_id: The integer camera id from which to render the frame in the MuJoCo simulation
    camera_name: The string name of the camera from which to render the frame in the MuJoCo simulation. This argument should not be passed if using cameara_id instead and vice versa
NzHBoth `camera_id` and `camera_name` cannot be specified at the same time.track)r   r   _viewersviewerr  r
   r   r    _voptr   r%   
mj_name2idrv   mjOBJ_CAMERAr   )r8   r   r   r  r
   r   r    r   r  r!   no_camera_specifieds              r   r;   MujocoRenderer.__init__  s    0 
	"4
 #
  [%</ 
 *T1Gi46G!K#..

**DN 'Nr   r   c                    US:w  a<  U R                   b  U R                  c"   SU R                    SU R                   S35       eU R                  US9nUS;   a  UR                  XR                  S9$ US:X  a  UR                  5       $ g)	a  Renders a frame of the simulation in a specific format and camera view.

Args:
    render_mode: The format to render the frame, it can be: "human", "rgb_array", "depth_array", or "rgbd_tuple"

Returns:
    If render_mode is "rgb_array" or "depth_array" it returns a numpy array in the specified format. "rgbd_tuple" returns a tuple of numpy arrays of the form (rgb, depth). "human" render mode does not return anything.
humanNzThe width: z and height: z6 cannot be `None` when the render_mode is not `human`.)r   )r   r   r   )r   r   )r
   r   _get_viewerr   r   )r8   r   r  s      r   r   MujocoRenderer.render  s     '!

&4;;+BzTZZLdkk]BxyzB !!k!:DD==[NN=SSG#==?" $r   c                    U R                   R                  U5      U l        U R                  c  US:X  aR  [        U R                  U R
                  U R                  U R                  U R                  U R                  5      U l        OgUS;   aR  [        U R                  U R
                  U R                  U R                  U R                  U R                  5      U l        O[        SU S35      eU R                  5         U R                  U R                   U'   [        U R                   R                  5       5      S:  a  U R                  R                  5         U R                  $ )zInitializes and returns a viewer class depending on the render_mode
- `WindowViewer` class for "human" render mode
- `OffScreenViewer` class for "rgb_array", "depth_array", or "rgbd_tuple" render mode
r  >   r   r   r   zUnexpected mode: z>, expected modes: human, rgb_array, depth_array, or rgbd_tuplerL   )r  rd   r  r  r   r   r
   r   r    r  r   r7  _set_cam_configlenr   r2   )r8   r   s     r   r  MujocoRenderer._get_viewer  s   
 mm''4;;g%*JJIIJJKKMMJJ  JJ-JJIIJJKKMMJJ %'}4rs    ")-DMM+&t}}!!#$q(KK,,.{{r   c                 L   U R                   c   eU R                  b  U R                  R                  5        Hi  u  p[        U[        R
                  5      (       a%  U[        U R                   R                  U5      SS& MI  [        U R                   R                  X5        Mk     gg)z!Set the default camera parametersN)	r  r  r0   r   rg   r   r   r+   r   )r8   r   r:   s      r   r  MujocoRenderer._set_cam_config(  sz    {{&&&""."55;;=
eRZZ007<GDKKOOS1!4DKKOOS8	 > /r   c                 j    U R                   R                  5        H  u  pUR                  5         M     g)z7Close the OpenGL rendering contexts of all viewer modesN)r  r0   r   )r8   r   r  s      r   r   MujocoRenderer.close2  s$    ,,.IALLN /r   )
r  r  r   r   r  r   r    r   r  r
   )r   r   r   r   r  r   r   r   r   r;   r   r  r  r   r   r   r   r   r  r    s     +/ ! $"&*,4'4' 4' !4K	4'
 Tz4' d
4' 4' :4' 4Z4' S$Y4'l#4Z#0%sTz %N9r   r  )r   r>  r   rW  r%   numpyrg   packaging.versionr   gymnasium.loggerr   r  rb   r   r   r   r   r   r   r  r  r   r   r   <module>r     s    	      % !
 %V%7%7877;KK $$$ @" @"F\j \~ZS: ZSz
K Kr   