a
    ijk:                     @   s  U d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZmZmZ ddlZddlZddlZddlmZ ddlZejsedneejj dZdZdZeejejgdf Zeg eejejf f Zee gdf Z!eg eejeje"f f Z#eee#f Z$ej%Z&G d	d
 d
Z'G dd dej(dZ)dZ*ee) e+d< e"e#dddZ,d0e&e$eeg df  eeejejf  dddZ-e&ee$ dddZ.d1ddddddeej eej e/ee$ ed ee! e/e/dd	ddZ0d2ddddeej eej ee e/e/ddd d!Z1e"ddd"d#Z2dddd$ejejee! e/e/e'd%d&d'Z3e4d(krdd)l5m6Z6 dd*l5m7Z7 e78d+dd,Z9dd-d.d/Z:e6;e: dS )3z"Interactive GUI viewer for MuJoCo.    N)CallableOptionalTupleUnion)	_simulatez,GLFW dynamic library handle is not available)d   P   B   2   (   !               
      gffffff@      gffffff
@g      @   g?g?   g?gQ?g      ?g?gQ?g      ?g?g{Gz?gp=
ף?皙?r   gffffff?c                   @   s   e Zd ZdZeejejeje	ej
 dddZedd Zedd Zed	d
 Zedd Zedd Zedd Zdd Ze	e dddZedddZdd Zdd ZedddZedd d!Zed"d#d$Zd%d& Zd'd( Zd)S )*Handlez.A handle for interacting with a MuJoCo viewer.)simcamoptpertuser_scnc                 C   s(   t || _|| _|| _|| _|| _d S N)weakrefref_sim_cam_opt_pert	_user_scn)selfr   r   r   r   r    r'   M/home/ghrups/robot-bench/.venv/lib64/python3.9/site-packages/mujoco/viewer.py__init__C   s
    zHandle.__init__c                 C   s   | j S r   )r"   r&   r'   r'   r(   r   Q   s    z
Handle.camc                 C   s   | j S r   )r#   r*   r'   r'   r(   r   U   s    z
Handle.optc                 C   s   | j S r   )r$   r*   r'   r'   r(   perturbY   s    zHandle.perturbc                 C   s   | j S r   )r%   r*   r'   r'   r(   r   ]   s    zHandle.user_scnc                 C   s   |   }|d ur|jS d S r   )r!   mr&   r   r'   r'   r(   r,   a   s    zHandle.mc                 C   s   |   }|d ur|jS d S r   )r!   dr-   r'   r'   r(   r.   h   s    zHandle.dc                 C   s   |   }|d ur|  d S r   )r!   exitr-   r'   r'   r(   closeo   s    zHandle.closereturnc                 C   s@   |   }|d ur<z|jdkr |nd W S  tjy:   Y d S 0 d S )Nr   )r!   exitrequestmujocoZUnexpectedErrorr-   r'   r'   r(   _get_simt   s    zHandle._get_simc                 C   s   |   d uS r   )r5   r*   r'   r'   r(   
is_running   s    zHandle.is_runningc                 C   s    |   }|d ur| S t S r   )r5   lock
contextlibnullcontextr-   r'   r'   r(   r7      s    zHandle.lockc                 C   s   |   }|d ur|  d S r   )r5   syncr-   r'   r'   r(   r:      s    zHandle.sync)hfieldidc                 C   s   |   }|d ur|| d S r   )r5   update_hfield)r&   r;   r   r'   r'   r(   r<      s    zHandle.update_hfield)meshidc                 C   s   |   }|d ur|| d S r   )r5   update_mesh)r&   r=   r   r'   r'   r(   r>      s    zHandle.update_mesh)texidc                 C   s   |   }|d ur|| d S r   )r5   update_texture)r&   r?   r   r'   r'   r(   r@      s    zHandle.update_texturec                 C   s   | S r   r'   r*   r'   r'   r(   	__enter__   s    zHandle.__enter__c                 C   s   |    d S r   )r0   )r&   exc_typeexc_valexc_tbr'   r'   r(   __exit__   s    zHandle.__exit__N)__name__
__module____qualname____doc__	_Simulater4   	MjvCamera	MjvOption
MjvPerturbr   MjvScener)   propertyr   r   r+   r   r,   r.   r0   r5   boolr6   r7   r:   intr<   r>   r@   rA   rE   r'   r'   r'   r(   r   @   s:   





r   c                   @   s,   e Zd Zejejed ee dddZdS )_MjPythonBasequeue.Queue[Handle])modeldatahandle_returnkey_callbackc                 C   s   d S r   r'   )r&   rT   rU   rV   rW   r'   r'   r(   launch_on_ui_thread   s    z!_MjPythonBase.launch_on_ui_threadN)	rF   rG   rH   r4   MjModelMjDatar   KeyCallbackTyperX   r'   r'   r'   r(   rR      s
   rR   )	metaclass	_MJPYTHON)pathr2   c                 C   s$   | ft tjtjtf ddd}|S )z#Loads an MJCF model from file path.r1   c                 S   sJ   t | dkr*| dd  dkr*tj| }ntj| }t|}||| fS )Nr   z.mjb)lenr4   rY   Zfrom_binary_pathZfrom_xml_pathrZ   )r^   r,   r.   r'   r'   r(   load   s
    
z_file_loader.<locals>.load)r   r4   rY   rZ   str)r^   ra   r'   r'   r(   _file_loader   s     rc   )simulateloadernotify_loadedr2   c              
   C   s   z|  d | }W n6 tyJ } zt|| _|   W Y d}~nld}~0 0 |dd \}}|durl|duspJ t|dkr|d nd}| ||| d| _|r|  ||fS dS )z6Internal function for reloading a model in the viewer. Nr      )Zload_message	Exceptionrb   Z
load_errorZload_message_clearr`   ra   )rd   re   rf   
load_tupleer,   r.   r^   r'   r'   r(   _reload   s    


rl   )rd   re   c                 C   s  d}d}t g }d}d}d}| js| jr@d| _t| j}d}| jrR|   d}|r|durt| |}|dur|\}}t 	|j
f}d}| jdkr| jdkrtd n
td |   |dur|dusJ | jr|d}	t }
|
| }|j| }| jdkr|t|jj t| jtj }| jtd||   }t|j
D ]2}|||  |td  ||< || |j|< qHdt| j  }t|| | t k}|dk s|dk s|dks|s| j!r|
}|j}d| _!t"|| d}	nd}|j}t#| j$ }|j| | t | k rlt |
 |k rl|sH|rH|| | _%d}t"|| d}	|j|k r qlq |	r| &  nt'|| d| _!W d   q1 s0    Y  qdS )	z9Physics loop for the GUI, to be run in a separate thread.NTg        r   FgMbP?r   r   )(nparrayr3   Zdroploadrequestrc   ZdropfilenameZuiloadrequestZuiloadrequest_decrementrl   ZzerosnurunZbusywaittimesleepr7   Zctrl_noise_stdmathexpr   ZtimestepmaxZctrl_noise_rater4   ZmjMINVALsqrtrangeZmju_standardNormalZctrlPERCENT_REALTIMEZreal_time_indexabsMAX_SYNC_MISALIGNZspeed_changedZmj_stepSIM_REFRESH_FRACTIONZrefresh_rateZmeasured_slowdownZadd_to_history
mj_forward)rd   re   r,   r.   Z
ctrl_noisereloadZsynccpuZsyncsimresultZsteppedZstartcpuZ
elapsedcpuZ
elapsedsimZratescaleiZslowdownZ
misalignedZmeasuredZprevsimZrefreshtimer'   r'   r(   _physics_loop   s    








r   T)re   rV   rW   show_left_uishow_right_uirS   )	rT   rU   run_physics_threadre   rV   rW   r   r   r2   c                   s  | du r|durt dnHt| r4|dur4t dn.|durN| durNt dn|rbdurbt d|du r| dur| |fttjtjf ddd}|}t  t t | r|st	| t
jndt
 |||_|_tdu rt std	ttj d}	r2 fd
d}	|rLtjt|fd}
ntjt||	fd}
dd }|}t| |
    t| |
    dS )zHInternal API, so that the public API has more readable type annotations.Nz&mjData is specified but mjModel is notz=mjData should not be specified when an mjModel loader is usedz#model and loader are both specifiedz7run_physics_thread and handle_return are both specifiedr1   c                 S   s   |d u rt | }| |fS r   )r4   rZ   )r,   r.   r'   r'   r(   _loaderx  s    
z!_launch_internal.<locals>._loaderzcould not initialize GLFWc                      s    t S r   )
put_nowaitr   r'   r   rV   r   r   rd   r   r'   r(   <lambda>  s   z"_launch_internal.<locals>.<lambda>)targetargsc                    s    fdd}|S )Nc                      s       d S r   )r/   r'   rd   r'   r(   exit_simulate  s    z:_launch_internal.<locals>.make_exit.<locals>.exit_simulater'   )rd   r   r'   r   r(   	make_exit  s    z#_launch_internal.<locals>.make_exit)
ValueErrorcallabler   r4   rY   rZ   rK   rL   rM   rN   rJ   ZMAX_GEOMZ
ui0_enableZ
ui1_enabler]   glfwinitZ
FatalErroratexitregister	terminate	threadingThreadr   rl   startZrender_loop
unregisterjoindestroy)rT   rU   r   re   rV   rW   r   r   r   rf   Zside_threadr   r   r'   r   r(   _launch_internal_  s\    

 





r   )re   r   r   )rT   rU   re   r   r   r2   c                C   s   t | |d|||d dS )zLaunches the Simulate GUI.T)r   re   r   r   N)r   )rT   rU   re   r   r   r'   r'   r(   launch  s    	r   c                 C   s   t dt| d dS )z)Launches the Simulate GUI from file path.T)r   re   N)r   rc   )r^   r'   r'   r(   launch_from_path  s    r   )rW   r   r   )rT   rU   rW   r   r   r2   c             
   C   s   t | tjstd| t |tjs4td||durRt|sRtd|t| | td}t	j
dkrtjt| |ftd||||dd	}d
|_|  n&t ttstdt| ||||| | S )zDLaunches a passive Simulate GUI without blocking the running thread.z%`model` is not a mujoco.MjModel: got z#`data` is not a mujoco.MjData: got Nz$`key_callback` is not callable: got r   darwinF)r   rV   rW   r   r   )r   r   kwargsTzQ`launch_passive` requires that the Python script be run under `mjpython` on macOS)
isinstancer4   rY   r   rZ   r   r|   queueQueuesysplatformr   r   r   dictdaemonr   r]   rR   RuntimeErrorrX   get)rT   rU   rW   r   r   rV   threadr'   r'   r(   launch_passive  sF    	



	r   __main__)app)flagsZmjcfzPath to MJCF file.r1   c                 C   s*   ~ t jd ur ttjt j nt  d S r   )
_MJCF_PATHvaluer   osr^   
expanduserr   )argvr'   r'   r(   main  s    
r   )N)NN)NN)<rI   abcr   r8   rs   r   r   r   r   rq   typingr   r   r   r   r   r   r4   r   numpyrm   Z_glfwr   Zset_glfw_dlhandleZ_handlerx   rz   r{   rY   rZ   ZCallbackTypeZ
LoaderTyperQ   r[   rb   Z_LoaderWithPathTypeZ_InternalLoaderTypeZSimulaterJ   r   ABCMetarR   r]   __annotations__rc   rl   r   rP   r   r   r   r   rF   Zabslr   r   ZDEFINE_stringr   r   rp   r'   r'   r'   r(   <module>   s   
f !{  T  	3
