a
    i‚j A  ã                   @   sr  d Z ddlZddlZddlZe d¡ZddlT ddlT z$ddlm	Z	 ddlT ddlm
Z
 W nv eyÐ Z z^z ddlm	Z	 ddlT ddlZ
W n0 eyº Z ze d¡ ‚ W Y dZ[n
dZ[0 0 W Y dZ[n
dZ[0 0 ddlZdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ ZdZdZdd„ Ze	du r"eƒ Z	ejdkr4dZndZz$ej ej e¡dej  e ¡Z!W n* e"y† Z zdZ!W Y dZ[n
dZ[0 0 ej #e!¡s¢e $de!¡ e %de!¡ e	j& 'dde!¡ z e	j& 'ddd ¡ e	j& (d!¡ W nB e)y  Z z(e d"e¡ e	r
e	 *¡  ‚ W Y dZ[n
dZ[0 0 ddl+Z+d#d$„ Z,e+ -e,¡ G d%d „ d e.ƒZ/G d&d'„ d'e.e0ƒZ1G d(d)„ d)e1ƒZ2dS )*aÚ  Traditional PyOpenGL interface to Togl

This module provides access to the Tkinter Togl widget 
with a relatively "thick" wrapper API that creates a set 
of default "examination" operations.

Note that many (most) Linux distributions have 
now split out the Tkinter bindings into a separate package,
and that Togl must be separately downloaded (a script is 
provided in the source distribution which downloads and 
installs Togl 2.0 binaries for you).

Because of the complexity and fragility of the installation, 
it is recommended that you use Pygame, wxPython, PyGtk, or 
PyQt for real-world projects, and GLUT or Pygame for simple 
demo/testing interfaces.

The Togl project is located here:

    http://togl.sourceforge.net/
é    Nz	OpenGL.Tk)Ú*)Ú_default_root)ÚdialogzÛUnable to import Tkinter, likely need to install a separate package (python-tk) to have Tkinter support.  You likely also want to run the src/togl.py script in the PyOpenGL source distribution to install the Togl widgetc                 C   s>   t tƒ ttƒ}tƒ  t| ||  | ||  dƒ t|ƒ d S )Nç        )ÚglMatrixModeÚGL_MODELVIEWÚglGetDoublevÚGL_MODELVIEW_MATRIXÚglLoadIdentityÚglTranslatefÚglMultMatrixd)ÚsÚxÚyÚmousexÚmouseyÚmat© r   úP/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/OpenGL/Tk/__init__.pyÚglTranslateScene,   s
    r   c           	      C   sl   t tƒ ttƒ}tƒ  t|||ƒ t| ||  dddƒ t| ||  dddƒ t| | | ƒ t|ƒ d S )Nç      ð?r   )r   r   r   r	   r
   r   Z	glRotatefr   )	r   ÚxcenterÚycenterÚzcenterr   r   r   r   r   r   r   r   ÚglRotateScene4   s    r   c                 C   s   t tdd„ | |ƒƒS )Nc                 S   s   | | S ©Nr   )ÚaÚbr   r   r   Ú<lambda>@   ó    zsub.<locals>.<lambda>)ÚlistÚmap©r   r   r   r   r   Úsub?   s    r#   c                 C   s.   d}t t| ƒƒD ]}|| | ||   }q|S ©Nr   )ÚrangeÚlen)r   r   ÚtÚir   r   r   ÚdotC   s    r)   c                 C   sJ   t tdd„ ||ƒƒ}t tdd„ | |ƒƒ}t||ƒt||ƒd t||ƒ  S )Nc                 S   s   | | S r   r   r"   r   r   r   r   K   r   z glDistFromLine.<locals>.<lambda>c                 S   s   | | S r   r   r"   r   r   r   r   L   r   é   )r    r!   r)   )r   Úp1Úp2ÚfÚgr   r   r   ÚglDistFromLineJ   s    r/   é   r*   c                 C   s^   | d |d  | d |d  | d |d  f}|d |d  |d |d   |d |d   S )Nr   r0   r*   r   )r   r   Údr   r   r   Úv3distsqT   s    .r2   l        z-64Ú ztogl-z#Expected Tk Togl installation in %szLoading Togl from: %sÚlappendZ	auto_pathÚpackageÚrequireÚToglzload {} ToglzRFailure loading Togl package: %s, on debian systems this is provided by `libtogl2`c               	   C   s^   zdd l } W n ty&   dd l} Y n0 z| jr:| j ¡  W n ttfyR   Y n0 d | _d S r$   )ÚtkinterÚImportErrorÚTkinterr   ÚdestroyÚTclErrorÚAttributeError)r8   r   r   r   Úcleanup‚   s    r>   c                   @   sž   e Zd ZdZdi fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ ZdS )%r7   zº
    Togl Widget
    Keith Junius
    Department of Biophysical Chemistry
    University of Groningen, The Netherlands
    Very basic widget which provides access to Togl functions.
    Nc                 K   s   t  | |d||¡ d S )NÚtogl)ÚWidgetÚ__init__©ÚselfZmasterZcnfÚkwr   r   r   rA   –   s    zTogl.__init__c                 C   s   d S r   r   ©rC   r   r   r   Úrenderš   s    zTogl.renderc                 C   s   | j  | jd¡ d S )NÚswapbuffers©ÚtkÚcallÚ_wrE   r   r   r   rG   ž   s    zTogl.swapbuffersc                 C   s   | j  | jd¡ d S )NÚmakecurrentrH   rE   r   r   r   rL   ¢   s    zTogl.makecurrentc              	   C   s   | j  | j  | jd|||¡¡S )NÚ
alloccolor©rI   ÚgetintrJ   rK   ©rC   ÚredÚgreenÚbluer   r   r   rM   ¦   s    zTogl.alloccolorc                 C   s   | j  | jd|¡ d S )NÚ	freecolorrH   ©rC   Úindexr   r   r   rT   ª   s    zTogl.freecolorc                 C   s   | j  | jd||||¡ d S )NÚsetcolorrH   )rC   rV   rQ   rR   rS   r   r   r   rW   ®   s    zTogl.setcolorc                 C   s   | j  | j  | jd|¡¡S )NÚloadbitmapfontrN   )rC   Zfontnamer   r   r   rX   ²   s    zTogl.loadbitmapfontc                 C   s   | j  | jd|¡ d S )NÚunloadbitmapfontrH   )rC   Zfontbaser   r   r   rY   ¶   s    zTogl.unloadbitmapfontc                 C   s   | j  | jd|¡ d S )NÚuselayerrH   )rC   Úlayerr   r   r   rZ   º   s    zTogl.uselayerc                 C   s   | j  | jd¡ d S )NÚshowoverlayrH   rE   r   r   r   r\   ¾   s    zTogl.showoverlayc                 C   s   | j  | jd¡ d S )NÚhideoverlayrH   rE   r   r   r   r]   Â   s    zTogl.hideoverlayc                 C   s   | j  | j  | jd¡¡S )NÚexistsoverlay©rI   Ú
getbooleanrJ   rK   rE   r   r   r   r^   Æ   s    zTogl.existsoverlayc                 C   s   | j  | j  | jd¡¡S )NÚgetoverlaytransparentvaluerN   rE   r   r   r   ra   Ê   s    zTogl.getoverlaytransparentvaluec                 C   s   | j  | j  | jd¡¡S )NÚismappedoverlayr_   rE   r   r   r   rb   Î   s    zTogl.ismappedoverlayc              	   C   s   | j  | j  | jd|||¡¡S )NÚalloccoloroverlayrN   rP   r   r   r   rc   Ò   s    zTogl.alloccoloroverlayc                 C   s   | j  | jd|¡ d S )NÚfreecoloroverlayrH   rU   r   r   r   rd   Ö   s    zTogl.freecoloroverlay)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rA   rF   rG   rL   rM   rT   rW   rX   rY   rZ   r\   r]   r^   ra   rb   rc   rd   r   r   r   r   r7   Ž   s$   c                   @   s6   e Zd ZdZdi fdd„Zdd„ Zdd„ Zd	d
„ ZdS )Ú	RawOpenglz=Widget without any sophisticated bindings    by Tom SchwallerNc                 K   s@   t  | |d||¡ |  d| j¡ |  d| j¡ |  d| j¡ d S )Nr?   ú<Map>ú<Expose>ú<Configure>)r@   rA   ÚbindÚtkMapÚtkExposerB   r   r   r   rA   à   s    zRawOpengl.__init__c                 G   s|   |   ¡  | j | jd¡ ttƒ}z<ttƒ tƒ  z|  	¡  t
ƒ  W tƒ  ntƒ  0 W t|ƒ n
t|ƒ 0 | j | jd¡ d S )NrL   rG   )Úupdate_idletasksrI   rJ   rK   r   ZGL_MATRIX_MODEr   ÚGL_PROJECTIONÚglPushMatrixÚredrawÚglFlushÚglPopMatrix)rC   ÚdummyÚ_moder   r   r   ÚtkRedrawç   s    zRawOpengl.tkRedrawc                 G   s   |   ¡  d S r   ©ro   ©rC   rv   r   r   r   rn   ú   s    zRawOpengl.tkMapc                 G   s   |   ¡  d S r   )rx   rz   r   r   r   ro   þ   s    zRawOpengl.tkExpose)re   rf   rg   rh   rA   rx   rn   ro   r   r   r   r   ri   Û   s
   ri   c                   @   s¾   e Zd ZdZdi fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ ZdS )-ÚOpenglzˆTkinter bindings for an Opengl widget.
Mike Hartshorn
Department of Chemistry
University of York, UK
http://www.yorvic.york.ac.uk/~mjh/
Nc                 K   s  t j| ||fi |¤Ž d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _d| _d| _d| _d| _|  d| j¡ |  d	| j¡ |  d
| j¡ |  d| j¡ |  d| j¡ |  d| j¡ |  d| j¡ |  d| j¡ |  d| j¡ |  d| j¡ |  d| j¡ dS )zx        Create an opengl widget.
        Arrange for redraws when the window is exposed or when
        it changes size.r   r   r   g      $@g      >@gš™™™™™¹?g     @@rj   rk   rl   z<Shift-Button-1>z
<Button-1>z<B1-Motion>z
<Button-2>z<B2-Motion>z<ButtonRelease-2>z
<Button-3>z<B3-Motion>N)ri   rA   ÚinitialisedÚxmouseÚymouser   r   r   Úr_backÚg_backÚb_backÚdistanceÚfovyÚnearÚfarÚautospin_allowedÚautospinrm   rn   ro   ÚtkHandlePickÚtkRecordMouseÚtkTranslateÚStartRotateÚtkRotateÚ
tkAutoSpinÚtkScalerB   r   r   r   rA     s6    zOpengl.__init__c              	   C   s$   t  dddddddœ¡}|s J ‚dS )zHelp for the widget.NzViewer helpz]Button-1: Translate
Button-2: Rotate
Button-3: Zoom
Reset: Resets transformation to identity
Z	questheadr   )ÚDoneZOk)ÚtitleÚtextZbitmapÚdefaultÚstrings)r   ÚDialog)rC   r1   r   r   r   ÚhelpD  s    ùzOpengl.helpc                 C   s   | j  | jd¡ dS )zCCause this Opengl widget to be the current destination for drawing.rL   NrH   rE   r   r   r   ÚactivateQ  s    zOpengl.activatec                 C   sJ   |   ¡  d}ttt|ƒ ttƒ ttƒ ttƒ ttƒ t	t
ƒ tƒ  dS )zl        Set up some basic lighting (single infinite light source).

        Also switch on the depth buffer.)r0   r0   r0   r   N)r–   Z	glLightfvZ	GL_LIGHT0ZGL_POSITIONZglEnableZGL_LIGHTINGZglDepthFuncZGL_LESSZGL_DEPTH_TESTr   r   r
   )rC   Zlight_positionr   r   r   Úbasic_lightingY  s    zOpengl.basic_lightingc                 C   s   || _ || _|| _|  ¡  dS )z+Change the background colour of the widget.N)r   r€   r   rx   )rC   Úrr.   r   r   r   r   Úset_backgroundi  s    zOpengl.set_backgroundc                 C   s   || _ || _|| _|  ¡  dS )zMSet the new center point for the model.
        This is where we are looking.N)r   r   r   rx   )rC   r   r   Úzr   r   r   Úset_centerpoints  s    zOpengl.set_centerpointc                 C   s   || _ |  ¡  dS )z8Set how far the eye is from the position we are looking.N)r‚   rx   )rC   r‚   r   r   r   Úset_eyepoint~  s    zOpengl.set_eyepointc                 C   s   t tƒ tƒ  |  ¡  dS )z&Reset rotation matrix for this widget.N)r   r   r
   rx   rE   r   r   r   Úreset…  s    zOpengl.resetc                 C   sN   t | dƒrJ|  ¡ |j }t|j|dƒ}t|j|dƒ}|  | ||¡rJ|  ¡  dS )zHandle a pick on the scene.Úpickr   r   N)ÚhasattrÚwinfo_heightr   ÚgluUnProjectr   rž   rx   )rC   ÚeventZrealyr+   r,   r   r   r   rˆ     s    
zOpengl.tkHandlePickc                 C   s   |j | _|j| _dS )z"Record the current mouse position.N)r   r}   r   r~   ©rC   r¢   r   r   r   r‰   £  s    zOpengl.tkRecordMousec                 C   s   d| _ |  |¡ d S r$   )r‡   r‰   r£   r   r   r   r‹   ª  s    zOpengl.StartRotatec                 C   sP   dd|j | j   }|dk r"d}n|dkr.d}| j| | _|  ¡  |  |¡ dS )z|Scale the scene.  Achieved by moving the eye position.

        Dragging up zooms in, while dragging down zooms out
        r0   g{®Gáz„?gü©ñÒMbP?iè  N)r   r~   r‚   rx   r‰   )rC   r¢   Úscaler   r   r   rŽ   ±  s    zOpengl.tkScalec              	   C   sH   |   ¡  td| j| j| j| j| jddƒ |  ¡  | jrD|  	d| j
¡ d S )Nç      à?r   é
   )r–   r   r   r   r   ÚyspinÚxspinrx   r‡   ÚafterÚdo_AutoSpinrE   r   r   r   rª   Â  s
     zOpengl.do_AutoSpinc                 C   s   |   d¡ |  ¡  | j | j dd| j¡¡}| j | j dd| j¡¡}| jrf||jkrf||jkrfd| _	||j | _
||j | _|   d| j¡ dS )zPerform autospin of scene.é   ZwinfoZpointerxZpointeryr0   r¦   N)r©   rp   rI   rO   rJ   rK   r†   Zx_rootZy_rootr‡   r§   r¨   rª   )rC   r¢   r   r   r   r   r   r   Ì  s    
zOpengl.tkAutoSpinc              	   C   sB   |   ¡  td| j| j| j|j|j| j| jƒ |  	¡  |  
|¡ dS )zPerform rotation of scene.r¥   N)r–   r   r   r   r   r   r   r}   r~   rx   r‰   r£   r   r   r   rŒ   ã  s    $zOpengl.tkRotatec                 C   s¬   |   ¡  td|  ¡ ƒ}| j| j| jf}t|d |d |d ƒ}t|d |d d|  |d ƒ}t 	t
||ƒ¡}t|d|  ƒ}t||j|j| j| jƒ |  ¡  |  |¡ dS )zPerform translation of scene.r0   r   r*   r¥   N)r–   Úmaxr    r   r   r   Z
gluProjectr¡   ÚmathÚsqrtr2   Úabsr   r   r   r}   r~   rx   r‰   )rC   r¢   Z
win_heightZobj_cÚwinÚobjÚdistr¤   r   r   r   rŠ   ì  s     zOpengl.tkTranslatec              
   G   sð   | j s
dS |  ¡  tƒ  |  ¡  |  ¡  |  ¡ }|  ¡ }tdd||ƒ t| j| j	| j
dƒ tttB ƒ ttƒ tƒ  t| jt|ƒt|ƒ | j| jƒ t| j| j| j| j | j| j| jdddƒ	 ttƒ |   | ¡ t!ƒ  t"ƒ  | j# $| j%d¡ dS )ú)Cause the opengl widget to redraw itself.Nr   r   r   rG   )&r|   r–   rr   rp   Zwinfo_widthr    Z
glViewportZglClearColorr   r€   r   ZglClearZGL_COLOR_BUFFER_BITZGL_DEPTH_BUFFER_BITr   rq   r
   ZgluPerspectiverƒ   Úfloatr„   r…   r   r   r	   r   r   Z	gluLookAtr   r   r   r‚   rs   rt   ru   rI   rJ   rK   )rC   rv   ÚwÚhr   r   r   rx   þ  s,    
 
þ
zOpengl.tkRedrawc                 O   s   dS )z<Prevent access errors if user doesn't set redraw fast enoughNr   )rC   ÚargsÚnamedr   r   r   rs   &  s    zOpengl.redrawc                 G   s   |   ¡  dS )r³   Nry   rz   r   r   r   rn   *  s    zOpengl.tkMapc                 G   s(   |   ¡  | js|  ¡  d| _|  ¡  dS )zÂRedraw the widget.
        Make it active, update tk events, call redraw procedure and
        swap the buffers.  Note: swapbuffers is clever enough to
        only swap double buffered visuals.r0   N)r–   r|   r—   rx   rz   r   r   r   ro   0  s
    zOpengl.tkExposec                 C   s   |   ¡  dS )z?Turn the current scene into PostScript via the feedback buffer.N)r–   )rC   Úfiler   r   r   ÚtkPrint=  s    zOpengl.tkPrint)re   rf   rg   rh   rA   r•   r–   r—   r™   r›   rœ   r   rˆ   r‰   r‹   rŽ   rª   r   rŒ   rŠ   rx   rs   rn   ro   rº   r   r   r   r   r{     s,   7

	(r{   )3rh   ÚosÚsysÚloggingÚ	getLoggerÚ_logZ	OpenGL.GLZ
OpenGL.GLUr8   r   r   r9   Úerrr:   r”   Úerrorr­   r   r   r#   r)   r/   ZTOGL_NORMALZTOGL_OVERLAYr2   ZTkÚmaxsizeÚsuffixÚpathÚjoinÚdirnameÚ__file__ÚplatformZTOGL_DLL_PATHÚ	NameErrorÚisdirÚwarningÚinforI   rJ   Úevalr<   r;   Úatexitr>   Úregisterr@   r7   ZMiscri   r{   r   r   r   r   Ú<module>   sn   

.


þ

M)