
    3jA                     J   S r SSKrSSKrSSKr\R                  " S5      rSSK7  SSK7   SSKJ	r	  SSK7  SSKJ
r
  SSKrS rS	 rS
 rS rS rSrSrS r\	c  \" 5       r	\R4                  S:  a  SrOSr \R8                  R;                  \R8                  R=                  \5      S\R@                  -   \-   5      r!\R8                  RG                  \!5      (       d  \RI                  S\!5        \RK                  S\!5        \	RL                  RO                  SS\!5         \	RL                  RO                  SSS5        \	RL                  RQ                  S5        SSK+r+S r,\+RZ                  " \,5         " S S\.5      r/ " S S \.\05      r1 " S! S"\15      r2g! \ a;  r SSKJ	r	  SSK7  SSKr
 SrCGNq! \ a  r\R                  S5        e SrCff = fSrCff = f! \" a  rSr! SrCGN(SrCff = f! \) a0  r\R                  S\5        \	(       a  \	RT                  " 5         e SrCff = f)#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)dialogzUnable 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                     [        [        5        [        [        5      n[	        5         [        XU-
  -  XU-
  -  S5        [        U5        g )N        )glMatrixModeGL_MODELVIEWglGetDoublevGL_MODELVIEW_MATRIXglLoadIdentityglTranslatefglMultMatrixd)sxymousexmouseymats         L/home/wildlama/miniconda3/lib/python3.13/site-packages/OpenGL/Tk/__init__.pyglTranslateScener   ,   s=    
*
+C&j!1
#3S9#    c                     [        [        5        [        [        5      n[	        5         [        XU5        [        XU-
  -  SSS5        [        XU-
  -  SSS5        [        U* U* U* 5        [        U5        g )N      ?r   )r   r	   r
   r   r   r   	glRotatefr   )	r   xcenterycenterzcenterr   r   r   r   r   s	            r   glRotateScener   4   si    
*
+C7+av:B+av:B+'G8gX.#r   c                 .    [        [        S X5      5      $ )Nc                 
    X-
  $ N )abs     r   <lambda>sub.<locals>.<lambda>@   s    r   )listmapr   r   s     r   subr*   ?   s    $a+,,r   c                 X    Sn[        [        U 5      5       H  nX U   X   -  -   nM     U$ Nr   )rangelen)r   r   tis       r   dotr1   C   s/    	A3q6]!QT	M Hr   c                     [        [        S X!5      5      n[        [        S X5      5      n[        XD5      [        X45      S-  [        X35      -  -
  $ )Nc                 
    X-
  $ r!   r"   r)   s     r   r%    glDistFromLine.<locals>.<lambda>K       acr   c                 
    X-
  $ r!   r"   r)   s     r   r%   r4   L   r5   r      )r'   r(   r1   )r   p1p2fgs        r   glDistFromLiner<   J   sF    S!2*+AS!1)*Aq9s1y!|CI---r      r7   c                     U S   US   -
  U S   US   -
  U S   US   -
  4nUS   US   -  US   US   -  -   US   US   -  -   $ )Nr   r=   r7   r"   )r#   r$   ds      r   v3distsqr@   T   sf    
A$1+qtad{AaD1Q4K1AQ4!9qtAaDy 1Q4!9,,r   l        z-64 ztogl-z#Expected Tk Togl installation in %szLoading Togl from: %slappend	auto_pathpackagerequireToglzload {} ToglzRFailure loading Togl package: %s, on debian systems this is provided by `libtogl2`c                       SS K n  U R                  (       a  U R                  R	                  5         S U l        g ! [         a    SS Kn  NDf = f! [
        [        4 a     N.f = fr,   )tkinterImportErrorTkinterr   destroyTclErrorAttributeError)rH   s    r   cleanuprN      s_    "  '"7"7"?"?"A !G  "!" ^$ s    : +A A
AA! A!c                       \ rS rSrSrS0 4S jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS rSrg)rF      z
Togl Widget
Keith Junius
Department of Biophysical Chemistry
University of Groningen, The Netherlands
Very basic widget which provides access to Togl functions.
Nc                 2    [         R                  XSX#5        g )Ntogl)Widget__init__selfmastercnfkws       r   rT   Togl.__init__   s    fc6r   c                     g r!   r"   rV   s    r   renderTogl.render   s    r   c                 P    U R                   R                  U R                  S5        g )Nswapbufferstkcall_wr\   s    r   r`   Togl.swapbuffers       TWWm,r   c                 P    U R                   R                  U R                  S5        g )Nmakecurrentra   r\   s    r   rh   Togl.makecurrent   rf   r   c           	          U R                   R                  U R                   R                  U R                  SXU5      5      $ )N
alloccolorrb   getintrc   rd   rV   redgreenblues       r   rk   Togl.alloccolor   s,    ww~~dggll477L#dSTTr   c                 R    U R                   R                  U R                  SU5        g )N	freecolorra   rV   indexs     r   rt   Togl.freecolor   s    TWWk51r   c                 T    U R                   R                  U R                  SXX45        g )Nsetcolorra   )rV   rv   ro   rp   rq   s        r   ry   Togl.setcolor   s    TWWj%eBr   c                     U R                   R                  U R                   R                  U R                  SU5      5      $ )Nloadbitmapfontrl   )rV   fontnames     r   r|   Togl.loadbitmapfont   s+    ww~~dggll4774DhOPPr   c                 R    U R                   R                  U R                  SU5        g )Nunloadbitmapfontra   )rV   fontbases     r   r   Togl.unloadbitmapfont   s    TWW0(;r   c                 R    U R                   R                  U R                  SU5        g )Nuselayerra   )rV   layers     r   r   Togl.uselayer   s    TWWj%0r   c                 P    U R                   R                  U R                  S5        g )Nshowoverlayra   r\   s    r   r   Togl.showoverlay   rf   r   c                 P    U R                   R                  U R                  S5        g )Nhideoverlayra   r\   s    r   r   Togl.hideoverlay   rf   r   c                     U R                   R                  U R                   R                  U R                  S5      5      $ )Nexistsoverlayrb   
getbooleanrc   rd   r\   s    r   r   Togl.existsoverlay   s*    ww!!$'',,tww"HIIr   c                     U R                   R                  U R                   R                  U R                  S5      5      $ )Ngetoverlaytransparentvaluerl   r\   s    r   r   Togl.getoverlaytransparentvalue   s)    ww~~dggll4774PQRRr   c                     U R                   R                  U R                   R                  U R                  S5      5      $ )Nismappedoverlayr   r\   s    r   r   Togl.ismappedoverlay   s+    ww!!$'',,tww8I"JKKr   c           	          U R                   R                  U R                   R                  U R                  SXU5      5      $ )Nalloccoloroverlayrl   rn   s       r   r   Togl.alloccoloroverlay   s.    ww~~dggll4774GUYZ[[r   c                 R    U R                   R                  U R                  SU5        g )Nfreecoloroverlayra   ru   s     r   r   Togl.freecoloroverlay   s    TWW0%8r   r"   )__name__
__module____qualname____firstlineno____doc__rT   r]   r`   rh   rk   rt   ry   r|   r   r   r   r   r   r   r   r   r   __static_attributes__r"   r   r   rF   rF      sj     # 7--U2CQ<1--JSL\9r   c                   8    \ rS rSrSrS0 4S jrS rS rS rSr	g)		RawOpengl   z=Widget without any sophisticated bindings    by Tom SchwallerNc                     [         R                  XSX#5        U R                  SU R                  5        U R                  SU R                  5        U R                  SU R                  5        g )NrR   <Map><Expose><Configure>)rS   rT   bindtkMaptkExposerU   s       r   rT   RawOpengl.__init__   sH    fc6		'4::&		*dmm,		-/r   c                    U R                  5         U R                  R                  U R                  S5        [	        [
        5      n [        [        5        [        5          U R                  5         [        5         [        5          [        U5        U R                  R                  U R                  S5        g ! [        5         f = f! [        U5        f = f)Nrh   r`   )update_idletasksrb   rc   rd   r
   GL_MATRIX_MODEr   GL_PROJECTIONglPushMatrixredrawglFlushglPopMatrix)rV   dummy_modes      r   tkRedrawRawOpengl.tkRedraw   s     	TWWm,^,		 'N	TWWm, s$   C !B8 ;
C 8CC Cc                 $    U R                  5         g r!   r   rV   r   s     r   r   RawOpengl.tkMap       r   c                 $    U R                  5         g r!   )r   r   s     r   r   RawOpengl.tkExpose   r   r   r"   )
r   r   r   r   r   rT   r   r   r   r   r"   r   r   r   r      s"     # 0-&r   r   c                       \ rS rSrSrS0 4S jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)Opengli  zTkinter bindings for an Opengl widget.
Mike Hartshorn
Department of Chemistry
University of York, UK
http://www.yorvic.york.ac.uk/~mjh/
Nc                 n   [         R                  " XU40 UD6  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        U R#                  SU R$                  5        U R#                  S	U R&                  5        U R#                  S
U R&                  5        U R#                  SU R(                  5        U R#                  SU R*                  5        U R#                  SU R,                  5        U R#                  SU R.                  5        U R#                  SU R0                  5        U R#                  SU R2                  5        U R#                  SU R*                  5        U R#                  SU R4                  5        g)z`Create an opengl widget.
Arrange for redraws when the window is exposed or when
it changes size.r   r   r   g      $@g      >@g?g     @@r   r   r   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)r   rT   initialisedxmouseymouser   r   r   r_backg_backb_backdistancefovynearfarautospin_allowedautospinr   r   r   tkHandlePicktkRecordMousetkTranslateStartRotatetkRotate
tkAutoSpintkScalerU   s       r   rT   Opengl.__init__  sk    	T3/626     	 	 !"  			'4::&		*dmm,		-/		$d&7&78		, 2 23		-!1!12		, 0 01		-/		%t7		, 2 23		-.r   c           	      P    [         R                  " SSSSSSS.5      nU(       d   eg)zHelp for the widget.NzViewer helpz]Button-1: Translate
Button-2: Rotate
Button-3: Zoom
Reset: Resets transformation to identity
	questheadr   )DoneOk)titletextbitmapdefaultstrings)r   Dialog)rV   r?   s     r   helpOpengl.helpD  s5     MM$-*V ,7,-,:!< = qr   c                 P    U R                   R                  U R                  S5        g)zCCause this Opengl widget to be the current destination for drawing.rh   Nra   r\   s    r   activateOpengl.activateQ  s     	TWWm,r   c                     U R                  5         Sn[        [        [        U5        [	        [
        5        [	        [        5        [        [        5        [	        [        5        [        [        5        [        5         g)z\Set up some basic lighting (single infinite light source).

Also switch on the depth buffer.)r=   r=   r=   r   N)r   	glLightfv	GL_LIGHT0GL_POSITIONglEnableGL_LIGHTINGglDepthFuncGL_LESSGL_DEPTH_TESTr   r	   r   )rV   light_positions     r   basic_lightingOpengl.basic_lightingY  sL     	%)[.9G\"r   c                 H    Xl         X l        X0l        U R                  5         g)z+Change the background colour of the widget.N)r   r   r   r   )rV   rr;   r$   s       r   set_backgroundOpengl.set_backgroundi  s     r   c                 H    Xl         X l        X0l        U R                  5         g)zESet the new center point for the model.
This is where we are looking.N)r   r   r   r   )rV   r   r   zs       r   set_centerpointOpengl.set_centerpoints  s     r   c                 0    Xl         U R                  5         g)z8Set how far the eye is from the position we are looking.N)r   r   )rV   r   s     r   set_eyepointOpengl.set_eyepoint~  s     !r   c                 V    [        [        5        [        5         U R                  5         g)z&Reset rotation matrix for this widget.N)r   r	   r   r   r\   s    r   resetOpengl.reset  s     	\"r   c                    [        U S5      (       au  U R                  5       UR                  -
  n[        UR                  US5      n[        UR                  US5      nU R                  XU5      (       a   U R                  5         ggg)zHandle a pick on the scene.pickr   r   N)hasattrwinfo_heightr   gluUnProjectr   r  r   )rV   eventrealyr8   r9   s        r   r   Opengl.tkHandlePick  su     4   %%'%''1Eeggub1Beggub1Byy2&&J ' !r   c                 H    UR                   U l        UR                  U l        g)z"Record the current mouse position.N)r   r   r   r   rV   r  s     r   r   Opengl.tkRecordMouse  s     ggggr   c                 4    SU l         U R                  U5        g r,   )r   r   r  s     r   r   Opengl.StartRotate  s     5!r   c                     SSUR                   U R                  -
  -  -
  nUS:  a  SnOUS:  a  SnU R                  U-  U l        U R                  5         U R	                  U5        g)zlScale the scene.  Achieved by moving the eye position.

Dragging up zooms in, while dragging down zooms out
r=   g{Gz?gMbP?i  N)r   r   r   r   r   )rV   r  scales      r   r   Opengl.tkScale  sa    
 DEGGdkk122 5=ET\E-5!r   c           
      (   U R                  5         [        SU R                  U R                  U R                  U R
                  U R                  SS5        U R                  5         U R                  (       a  U R                  SU R                  5        g g )N      ?r   
   )r   r   r   r   r   yspinxspinr   r   afterdo_AutoSpinr\   s    r   r  Opengl.do_AutoSpin  sc    c4<<t||TZZQUQ[Q[]^`ab==JJr4++, r   c                 6   U R                  S5        U R                  5         U R                  R                  U R                  R	                  SSU R
                  5      5      nU R                  R                  U R                  R	                  SSU R
                  5      5      nU R                  (       a%  X!R                  :w  a  X1R                  :w  a  SU l	        X!R                  -
  U l
        X1R                  -
  U l        U R                  SU R                  5        g)zPerform autospin of scene.   winfopointerxpointeryr=   r  N)r  r   rb   rm   rc   rd   r   x_rooty_rootr   r  r  r  )rV   r  r   r   s       r   r   Opengl.tkAutoSpin  s     	

1 GGNN477<<TWWEFGGNN477<<TWWEF  LL Q,,%6 !%
%


2t''(r   c           
         U R                  5         [        SU R                  U R                  U R                  UR
                  UR                  U R                  U R                  5        U R                  5         U R                  U5        g)zPerform rotation of scene.r  N)r   r   r   r   r   r   r   r   r   r   r   r  s     r   r   Opengl.tkRotate  s\     	c4<<t||UWWeggW[WbWbdhdodop5!r   c                    U R                  5         [        SU R                  5       5      nU R                  U R                  U R
                  4n[        US   US   US   5      n[        US   US   SU-  -   US   5      n[        R                  " [        XS5      5      n[        USU-  -  5      n[        XqR                  UR                  U R                  U R                   5        U R#                  5         U R%                  U5        g)zPerform translation of scene.r=   r   r7   r  N)r   maxr  r   r   r   
gluProjectr  mathsqrtr@   absr   r   r   r   r   r   r   )rV   r  
win_heightobj_cwinobjdistr  s           r   r   Opengl.tkTranslate  s     	 !D--/1
LL$,,>58U1XuQx8SVSVcJ.>%>AG))Xs35tj 024$++t{{K5!r   c                    U R                   (       d  gU R                  5         [        5         U R                  5         U R                  5         U R	                  5       nU R                  5       n[        SSX#5        [        U R                  U R                  U R                  S5        [        [        [        -  5        [        [        5        [!        5         [#        U R$                  ['        U5      ['        U5      -  U R(                  U R*                  5         [?        U R4                  U R6                  U R8                  U R:                  -   U R4                  U R6                  U R8                  SSS5	        [        [,        5        U RA                  U 5        [C        5         [E        5         U RF                  RI                  U RJ                  S5        g))Cause the opengl widget to redraw itself.Nr   r   r   r`   )&r   r   r   r   winfo_widthr  
glViewportglClearColorr   r   r   glClearGL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BITr   r   r   gluPerspectiver   floatr   r   r	   r
   r   r   r   r   r   r   r   	gluLookAtr   r   r   rb   rc   rd   )rV   r   whr   s        r   r   Opengl.tkRedraw  s4    1a 	T[[$++t{{B?#&99:]#tyy%(58"3TYYI dllDLL$,,2NdllDLLB & 	D	TWWm,r   c                     g)z<Prevent access errors if user doesn't set redraw fast enoughNr"   )rV   argsnameds      r   r   Opengl.redraw&  s    r   c                 $    U R                  5         g)r1  Nr   r   s     r   r   Opengl.tkMap*       	r   c                     U R                  5         U R                  (       d  U R                  5         SU l        U R                  5         g)zRedraw 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.r=   N)r   r   r   r   r   s     r   r   Opengl.tkExpose0  s3     	! Dr   c                 $    U R                  5         g)z?Turn the current scene into PostScript via the feedback buffer.N)r   )rV   files     r   tkPrintOpengl.tkPrint=  rD  r   )r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r   )r   r   r   r   r   rT   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   rI  r   r"   r   r   r   r     sz     # 4/n-  ,"""-).""$'-PK
r   r   )3r   ossyslogging	getLogger_log	OpenGL.GL
OpenGL.GLUrH   r   r   rI   errrJ   r   errorr'  r   r   r*   r1   r<   TOGL_NORMALTOGL_OVERLAYr@   Tkmaxsizesuffixpathjoindirname__file__platformTOGL_DLL_PATH	NameErrorisdirwarninginforb   rc   evalrL   rK   atexitrN   registerrS   rF   Miscr   r   r"   r   r   <module>rg     s  2  +'  % -. - DM ;;FFGGLL
!&M 
ww}}m%%LL7H 		"M 3     im <
)Y7.) 	!  I96 I9Z$ $R|Y |E  ) 

  v  	xX  M  
JJhjmo		
s`   F 7AG 8G, GF..G4GGGGG)G$$G),H"2+HH"