
    e_                         d dl  d dlmc mZ d dlmZmZmZm	Z	 d dl
ZddlmZ ddlmZ ddlmZ ddlmZmZmZ  G d	 d
      Z G d deej,                        Zy)    )*N)cosradianssintan   )Vector)	functions)getConfigOption)QtCoreQtGui	QtWidgetsc                        e Zd Zdd fd
Zd Zd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd&dZd&dZd Zd Zd&dZd'dZd(dZd)dZd Zd Zd Zd Zd*dZd Zd Zd Zd Zd Zd Zd  Z d! Z!d" Z"e#e$d#d$fd%Z% xZ&S )+GLViewMixineuler)rotationMethodc          	      "   t        |   |i | |dvrt        d      t        ddd      t	        j
                  dddd      ddddd	|d
| _        | j                          g | _        t        j                  j                  j                  t        j                  j                  j                  t        j                  j                  j                  t        j                  j                  j                  t        j                  j                  j                   t        j                  j                  j"                  g| _        i | _        t        j(                         | _        | j*                  j,                  j/                  | j0                         y	)a  
        Mixin class providing functionality for GLViewWidget

        ================ ==============================================================
        **Arguments:**
        rotationMethod   (str): Mechanism to drive the rotation method, options are
                         'euler' and 'quaternion'. Defaults to 'euler'.
        ================ ==============================================================
        )r   
quaternionz8Rotation method should be either 'euler' or 'quaternion'r            $@<      -   N)centerrotationdistancefov	elevationazimuthviewportr   )super__init__
ValueErrorr	   r   QQuaternionoptsresetitemsr   QtKey	Key_RightKey_LeftKey_UpKey_Down
Key_PageUpKey_PageDownnoRepeatKeyskeysPressedQTimerkeyTimertimeoutconnectevalKeyState)selfr   argskwargs	__class__s       ?/usr/lib/python3/dist-packages/pyqtgraph/opengl/GLViewWidget.pyr"   zGLViewMixin.__init__   s`    	$)&)!88WXX Qqm**1Qq3,
	 	


#YY]]44fiimm6L6LfiimmNbNbdjdmdmdqdqdzdz  }C  }F  }F  }J  }J  }U  }U  W]  W`  W`  Wd  Wd  Wq  Wq  r%%d&7&78    c                 Z    | j                         }t        | j                         |z        S N)devicePixelRatioFintwidthr7   dprs     r;   deviceWidthzGLViewMixin.deviceWidth0   s&    $$&4::<#%&&r<   c                 Z    | j                         }t        | j                         |z        S r>   )r?   r@   heightrB   s     r;   deviceHeightzGLViewMixin.deviceHeight4   s&    $$&4;;=3&''r<   c                    t        ddd      | j                  d<   d| j                  d<   d| j                  d<   d| j                  d<   d	| j                  d
<   d| j                  d<   | j                  t        d             y)z_
        Initialize the widget state or reset the current state to the original state.
        r   r   r   r   r   r   r   r   r   r   Nr    
background)r	   r%   setBackgroundColorr   r7   s    r;   r&   zGLViewMixin.reset8   ss     %Qqm		( $		*		%!#		+!		) $		* =>r<   c                     | j                   j                  |       | j                         r|j                          |j	                  |        | j                          y r>   )r'   appendisValid
initialize_setViewupdater7   items     r;   addItemzGLViewMixin.addItemE   s<    

$<<>OOdr<   c                 |    | j                   j                  |       |j                  d       | j                          y)z1
        Remove the item from the scene.
        N)r'   removerP   rQ   rR   s     r;   
removeItemzGLViewMixin.removeItemN   s+     	

$dr<   c                 v    | j                   D ]  }|j                  d        g | _         | j                          y)z2
        Remove all items from the scene.
        N)r'   rP   rQ   rR   s     r;   clearzGLViewMixin.clearV   s3     JJ 	 DMM$	 
r<   c                 (   | j                         }|j                         }|j                         s|j                         dk  rt	        t
              }t        d|z        | j                  D ]#  }|j                         r|j                          % y)zN
        Initialize items that were not initialized during addItem().
        )r   r   z;pyqtgraph.opengl: Requires >= OpenGL 2.0 (not ES); Found %sN)
contextformat
isOpenGLESversionglGetString
GL_VERSIONRuntimeErrorr'   isInitializedrO   )r7   ctxfmt	verStringrS   s        r;   initializeGLzGLViewMixin.initializeGL_   s|     llnjjl>>s{{}v5#J/IMPYY  JJ 	"D%%'!	"r<   c                     t        j                  |i |j                         | j                  d<   | j	                          y)z{
        Set the background color of the widget. Accepts the same arguments as
        :func:`~pyqtgraph.mkColor`.
        bgcolorN)fnmkColorgetRgbFr%   rQ   )r7   r8   kwdss      r;   rJ   zGLViewMixin.setBackgroundColoro   s2    
  "zz4848@@B		)r<   c                 l    | j                   d   }|"dd| j                         | j                         fS |S )Nr    r   )r%   rD   rG   )r7   vps     r;   getViewportzGLViewMixin.getViewportw   s;    YYz":q$**,d.?.?.ABBIr<   c                     | j                  |      }t        t               t        t	        j
                  |j                         t        j                               y Ndtype)projectionMatrixglMatrixModeGL_PROJECTIONglLoadMatrixfnparraydatafloat32)r7   regionms      r;   setProjectionzGLViewMixin.setProjection~   s7    !!&)]#bhhqvvxrzz:;r<   c                    |"dd| j                         | j                         f}| j                         \  }}}}| j                  d   }| j                  d   }|dz  }|dz  }	|t	        dt        |      z        z  }
|
|z  |z  }|
|d   |z
  d|z  z  dz
  z  }|
|d   |d	   z   |z
  d|z  z  dz
  z  }||d   |z
  d|z  z  dz
  z  }||d   |d
   z   |z
  d|z  z  dz
  z  }t        j                         }|j                  ||||||	       |S )Nr   r   r   gMbP?g     @@      ?       @r   r      )	rD   rG   ro   r%   r   r   r   
QMatrix4x4frustum)r7   r|   x0y0whdistr   nearClipfarCliprtleftrightbottomtoptrs                    r;   rt   zGLViewMixin.projectionMatrix   sO   >D,,.0A0A0CDF'')B1yy$ii%<,s3-..EAI fQils1u-12fQiq	)",Q7!;<vay|A.23vay*2-#a%81<=


4Xw?	r<   c                     | j                         }t        t               t        t	        j
                  |j                         t        j                               y rq   )
viewMatrixru   GL_MODELVIEWrw   rx   ry   rz   r{   )r7   r}   s     r;   setModelviewzGLViewMixin.setModelview   s3    OO\"bhhqvvxrzz:;r<   c                     t        j                         }|j                  dd| j                  d           | j                  d   dk(  r|j	                  | j                  d          nH|j	                  | j                  d   dz
  dd	d	       |j	                  | j                  d
   dz   d	d	d       | j                  d   }|j                  |j                          |j                          |j                                 |S )Ng        r   r   r   r   r   Z   r   r   r   r   )r   r   	translater%   rotatexyz)r7   r   r   s      r;   r   zGLViewMixin.viewMatrix   s    
c3:!6 6799%&,6IIdii
+, IIdii,R/Aq9IIdii	*2-q!R88$
fhhj[688:+
{;	r<   c                    |d   | j                         |d   |d   z   z
  |d   |d   f}t        d      }	 t        t               t	                t        d       i | _        | j                  |d       t        t              }|D cg c]  }|j                  |j                  d   f }}|j                  d 	       |D cg c]  }| j                  |d       c}S # t        t              }w xY wc c}w c c}w )
zy
        Return a list of the items displayed in the region (x, y, w, h)
        relative to the widget.        
        r   r   r   r   i T)r|   useItemNamesc                     | d   S )Nr    )is    r;   <lambda>z%GLViewMixin.itemsAt.<locals>.<lambda>   s
    1 r<   key)rG   glSelectBufferglRenderMode	GL_SELECTglInitNames
glPushName
_itemNamespaintGL	GL_RENDERnearnamessort)r7   r|   bufhitsr   r'   r   s          r;   itemsAtzGLViewMixin.itemsAt   s    
 )T..0&)F1I2EFq	SYZ[S\] V$	+#MqM DOLLTL:  	*D/34!!&&!''!*%44

~
&/45!!%55	  	*D45s   >C "C2C7C/c                    |t        | j                           nt        |  | j                  |       | j                          | j                  d   }t        |  t        t        t        z         | j                  |       y)a  
        viewport specifies the arguments to glViewport. If None, then we use self.opts['viewport']
        region specifies the sub-region of self.opts['viewport'] that should be rendered.
        Note that we may use viewport != self.opts['viewport'] when exporting.
        N)r|   rh   r   )

glViewportro   r~   r   r%   glClearColorglClearGL_DEPTH_BUFFER_BITGL_COLOR_BUFFER_BITdrawItemTree)r7   r|   r    r   rh   s        r;   r   zGLViewMixin.paintGL   sv     ((*+!&)))I&g$'::<|4r<   c                    |+| j                   D cg c]  }|j                         | }}n!|j                         }|j                  |       |j	                  d        |D ]  }|j                         s||u r[	 t        t               |r.t        |j                         || j                  |j                  <   |j                          t#                tt%        t&               t)                	 |j+                         }t-        t/        j0                  |j3                         t.        j4                               | j7                  ||       t%        t&               t9                 y c c}w #  ddlm} |j                          t        dt!        |      z         Y xY w# t#                w xY w# t%        t&               t9                w xY w)Nc                 "    | j                         S r>   )
depthValue)as    r;   r   z*GLViewMixin.drawItemTree.<locals>.<lambda>   s     r<   r   r   )debugzError while drawing item %s.rr   r   )r'   
parentItem
childItemsrM   r   visibleglPushAttribGL_ALL_ATTRIB_BITS
glLoadName_idr   paint r   printExcprintstrglPopAttribru   r   glPushMatrix	transformglMultMatrixfrx   ry   rz   r{   r   glPopMatrix)r7   rS   r   r   r'   r   r   r   s           r;   r   zGLViewMixin.drawItemTree   sP   < $

E1alln.DQEEEOO%ELL

/
0 	"A99;Dy" !34#"155)12.GGI  M\*"B!"((2779BJJ"GH%%al%C .M5	" FF(NN$83t9DE  M !.Ms0   E.E.>AE32AF63/F$"F''F36Gc                    ||t        d      |t        d      ||| j                  d<   ||| j                  d<   | j                  d   dk(  r||v| j                  d   j                         }||j                  | dz
         ||j	                  |dz
         t
        j                  j                  |      | j                  d<   ||| j                  d<   nu||| j                  d	<   ||| j                  d
<   |Q|j                         }|j                         dz   | j                  d	<   |j                          dz
  | j                  d
<   | j                          y )Nz&cannot set both rotation and elevationz$cannot set both rotation and azimuthr   r   r   r   r   r   r   r   )r#   r%   toEulerAnglessetZsetXr   r$   fromEulerAnglesr   r   rQ   )r7   posr   r   r   r   eus          r;   setCameraPositionzGLViewMixin.setCameraPosition   sa   $ !IJJ" !GHH?"%DIIh$,DIIj!99%&,6$(;YYz*88:&GGWHRK((GGIbL)(-(9(9(I(I"(M		*%#(0		*% $)2		+&"'.		)$#++-)+"		+&(*w|		)$r<   c           
      ,   | j                   d   }| j                   d   }| j                   d   dk(  r7t        || j                   d   j                  t        dd|            z
        }|S t        | j                   d         }t        | j                   d         }t        |j	                         |t        |      z  t        |      z  z   |j                         |t        |      z  t        |      z  z   |j                         |t        |      z  z         }|S )	zOReturn current position of camera based on center, dist, elevation, and azimuthr   r   r   r   r   r   r   r   )	r%   r	   rotatedVectorr   r   r   r   r   r   )r7   r   r   r   elevazims         r;   cameraPositionzGLViewMixin.cameraPosition  s    8$yy$99%&,6$))J"7"E"EfQqQUFV"XXYC 
 499[12D499Y/0D
TCI-D	99
TCI-D	99
TCI--C
 
r<   c           	      :   h d}|j                  |      st        d|       | j                  |j                  d      |j                  d      |j                  d      |j                  d      |j                  d             d	|v r|d	   | j                  d	<   y y )
N>   r   r   r   r   r   r   zvalid keywords are r   r   r   r   r   )r   r   r   r   r   r   )
issupersetr#   r   getr%   )r7   rl   
valid_keyss      r;   setCameraParamszGLViewMixin.setCameraParams-  s    V
$$T*2:,?@@488H#5@T)-+)>QZH[(,(< 	 	> D=#E{DIIe r<   c                 P    h d}|D ci c]  }|| j                   |    c}S c c}w )N>   r   r   r   r   r   r   )r%   )r7   r   ks      r;   cameraParamszGLViewMixin.cameraParams8  s(    V
+57aTYYq\!777s   #c                 f   | j                   d   dk(  rDt        j                  j                  || d      }|| j                   d   z  }|| j                   d<   nK| j                   dxx   |z  cc<   t	        j
                  | j                   d   |z   dd      | j                   d<   | j                          y	)
zUOrbits the camera around the center position. *azim* and *elev* are given in degrees.r   r   r   r   r   r   g     Vg     V@N)r%   r   r$   r   ri   clip_scalarrQ   )r7   r   r   qs       r;   orbitzGLViewMixin.orbit<  s    99%&,6!!114%A :&&A$%DIIj!IIi D( %'^^DIIk4JT4QSWY\%]DIIk"r<   c                    |dk(  r.| j                   dxx   t        j                  |||      z  cc<   n3|dk(  r| j                         }| j                   d   |z
  }|j	                         }|dz  t        dt        | j                   d         z        z  }|| j                         z  }	t        j                  ddd      }
t        j                  j                  |
|      j                         }t        j                  j                  ||
      j                         }| j                   d   ||	z  |z  z   ||	z  |z  z   |
|	z  |z  z   | j                   d<   n|d	k(  r| j                   d
   dk(  r| j                   d   j                         }|j                  t        ddd            }|j                  t        ddd            }|j                  t        ddd            }| j                  | j                   d         }| j                   dxx   ||| z  ||z  z   ||z  z   z  z  cc<   n?t        | j                   d         }t        | j                   d         }t        | j                   d         }| j                   d   | j                         z
  j	                         }t        |dz        dz  }||z  | j                         z  }|t        |      z  |z  }|t        |      |z  t        |      t        |      z  |z  z
  z  }|t        |      |z  t        |      t        |      z  |z  z   z  }| j                   dxx   t        j                  || |      z  cc<   nt!        d      | j#                          y)a  
        Moves the center (look-at) position while holding the camera in place. 
        
        ==============  =======================================================
        **Arguments:**
        *dx*            Distance to pan in x direction
        *dy*            Distance to pan in y direction
        *dz*            Distance to pan in z direction
        *relative*      String that determines the direction of dx,dy,dz. 
                        If "global", then the global coordinate system is used.
                        If "view", then the z axis is aligned with the view
                        direction, and x and y axes are in the plane of the
                        view: +x points right, +y points up. 
                        If "view-upright", then x is in the global xy plane and
                        points to the right side of the view, y is in the
                        global xy plane and orthogonal to x, and z points in
                        the global z direction.
        ==============  =======================================================
        
        Distances are scaled roughly such that a value of 1.0 moves
        by one pixel on screen.
        globalr   view-uprightr   r   r   r   r   viewr   r   r   r   r   r   z7relative argument must be global, view, or view-uprightN)r%   r   	QVector3Dr   lengthr   r   rA   crossProduct
normalized
conjugatedr   r	   	pixelSizer   r   r#   rQ   )r7   dxdydzrelativecPoscVecr   xDistxScalezVecxVecyVecqcxvyvzvscale_factorr   r   r   
fov_factorr   r   r   s                            r;   panzGLViewMixin.panI  s   . xIIh5??2r2#>>'&&(D99X&-D;;=D2IC'$))E2B*C$C DDETZZ\)F??1Qq)D??//d;FFHD??//d;FFHD"&))H"5v8J"JTTZ]]_M_"_bfiobortbt"tDIIh yy)*l:YYz*557%%va!}6%%va!}6%%va!}6#~~tyy/BD 		(#|r2#v2~27M'NN#tyy56tyy34dii./		(+d.A.A.CCKKM q\A-
#j04::<? 3t9,r1 CINSYT5JR5O$OP CINSYT5JR5O$OP		(#uq1"a'@@#VWWr<   c                    | j                         }t        |t        j                        rSt        j                  |      j                  d|j                  dz
  z  dz         }||z
  dz  j                  d      dz  }n||z
  j                         }|dz  t        dt        | j                  d	         z        z  }|| j                         z  S )
z
        Return the approximate size of a screen pixel at the location pos
        Pos may be a Vector or an (N,3) array of locations
        )r   r   )r   r   r   )axisr   r   r   )r   
isinstancerx   ndarrayry   reshapendimsumr   r   r   r%   rA   )r7   r   camr   r   s        r;   r   zGLViewMixin.pixelSize  s    
 !!#c2::&((3-''chhqj(9$(>?CWqL%%2%.3DG##%Dr	Cgdii.>&? ?@@tzz|##r<   c                 j    t        |d      r|j                         n|j                         }|| _        y )Nposition)hasattrr  localPosmousePos)r7   evlposs      r;   mousePressEventzGLViewMixin.mousePressEvent  s%     'J 7r{{}R[[]r<   c                    t        |d      r|j                         n|j                         }t        | d      s|| _        || j                  z
  }|| _        |j	                         t
        j                  j                  j                  k(  r|j                         t
        j                  j                  j                  z  r2| j                  |j                         |j                         dd       y | j                  |j                          |j                                y |j	                         t
        j                  j                  j                   k(  r|j                         t
        j                  j                  j                  z  r2| j                  |j                         d|j                         d       y | j                  |j                         |j                         dd       y y )Nr  r  r   r   )r   r   )r  r  r  r  buttonsr   r(   MouseButton
LeftButton	modifiersKeyboardModifierControlModifierr  r   r   r   MiddleButton)r7   r  r  diffs       r;   mouseMoveEventzGLViewMixin.mouseMoveEvent  s>    'J 7r{{}R[[]tZ( DMdmm#::<69900;;;!;!;!K!KK4668Q@

DFFH9dffh/ZZ\VYY22???!;!;!K!KK1dffhH4668QH	 @r<   c                      y r>   r   r7   r  s     r;   mouseReleaseEventzGLViewMixin.mouseReleaseEvent  s    r<   c                 z   |j                         j                         }|dk(  r|j                         j                         }|j                         t        j
                  j                  j                  z  r| j                  dxx   d|z  z  cc<   n| j                  dxx   d|z  z  cc<   | j                          y )Nr   r   g+?r   )

angleDeltar   r   r  r   r(   r  r  r%   rQ   )r7   r  deltas      r;   
wheelEventzGLViewMixin.wheelEvent  s    !!#A:MMO%%'ELLNVYY77GGGIIeu,IIj!UE\1!r<   c                     |j                         | j                  v rO|j                          |j                         ry d| j                  |j                         <   | j                          y y )Nr   )r   r0   acceptisAutoRepeatr1   r6   r#  s     r;   keyPressEventzGLViewMixin.keyPressEvent  sS    668t(((IIK )*DRVVX& )r<   c                    |j                         | j                  v rN|j                          |j                         ry 	 | j                  |j                         = | j                          y y # t
        $ r
 i | _        Y $w xY wr>   )r   r0   r*  r+  r1   KeyErrorr6   r#  s     r;   keyReleaseEventzGLViewMixin.keyReleaseEvent  sq    668t(((IIK &$$RVVX.  )  &#% &s   A, ,A?>A?c                 J   d}t        | j                        dkD  rn| j                  D ]]  }|t        j                  j                  j
                  k(  r| j                  | d       n|t        j                  j                  j                  k(  r| j                  |d       n|t        j                  j                  j                  k(  r| j                  d|        n|t        j                  j                  j                  k(  r| j                  d|       nP|t        j                  j                  j                  k(  rn(|t        j                  j                  j                  k(  r	 | j                  j                  d       ` y | j                  j                          y )Nr   r   )r   r      )lenr1   r   r(   r)   r*   r   r+   r,   r-   r.   r/   r3   startstop)r7   speedr   s      r;   r6   zGLViewMixin.evalKeyState  s!   t 1$'' (&))--111JJUFJ3FIIMM222JJEJ2FIIMM000JJAUFJ3FIIMM222JJAEJ2FIIMM444FIIMM666##B'( MM r<   c                 "    | j                         S )zA
        Read the current buffer pixels out as a QImage.
        )grabFramebufferrK   s    r;   
readQImagezGLViewMixin.readQImage  s     ##%%r<   i      c                    t        t        |      \  }}| j                          d }d }	d }
	 t        j                  ||dft        j
                        }t        j                  d      }	t        j                  t        j                  |	       t        t               t        d      }t        t        |       |}t        j                  ||dft        j
                        }t        t         dt"        ||dt"        t$        d 	       t'        t         dt(              dk(  rt+        d|j,                  d d z        t        t        dt"        ||dt"        t$        |	       t/        d      }
t1        t2        |
       t5        t2        t6        ||       t9        t        t:        t2        |
       dd||f| j<                  d<   d|z  }t?        | ||z
  ||z
        D ].  }t?        | ||z
  ||z
        D ]  }tA        ||z   ||z         }tA        ||z   ||z         }||z
  }||z
  }t        jB                  t        j                  t        jD                  t        |d       | jG                  |||z
  |z
  ||fdd||f       t        t        |       tI        t        d||      }t        jJ                  |t        j
                        jM                  ||d      d d d	d
f   }|||z
   | |||z
  f   |||z   ||z
  ||z   ||z
  f<    1 	 d | j<                  d<   t        j                  t        j                  d       t        t        d       |tO        |g       |	t        jP                  |	g       |
tS        d|
g       |S # d | j<                  d<   t        j                  t        j                  d       t        t        d       |tO        |g       |	t        jP                  |	g       |
tS        d|
g       w w xY w)N   rr   r   r   zHOpenGL failed to create 2D texture (%dx%d); too large for this hardware.r   r    )r|   r    r   .)*mapr@   makeCurrentrx   emptyubyteglfboglGenFramebuffersglBindFramebufferGL_FRAMEBUFFERglEnableGL_TEXTURE_2DglGenTexturesglBindTexturezerosglTexImage2DGL_PROXY_TEXTURE_2DGL_RGBAGL_UNSIGNED_BYTEglGetTexLevelParameterivGL_TEXTURE_WIDTHra   shapeglGenRenderbuffersglBindRenderbufferGL_RENDERBUFFERglRenderbufferStorageGL_DEPTH_COMPONENTglFramebufferRenderbufferGL_DEPTH_ATTACHMENTr%   rangeminglFramebufferTexture2DGL_COLOR_ATTACHMENT0r   glGetTexImage
frombufferr  glDeleteTexturesglDeleteFramebuffersglDeleteRenderbuffers)r7   sizer\   typetextureSizepaddingr   r   texfb	depth_bufoutputtexwidthrz   p2r   r   x2y2w2h2s                        r;   renderToArrayzGLViewMixin.renderToArray  s   #tn!	6	6XXq!Qirxx8F((+B##E$8$8">]#"C--"H88Xhq1BD ,a(HaQXZjlpq'(;Q@PQUVV"#mptpzpz{}|}p~#~7Hh7Tdfjk +1-I	:!/3ExQYZ%n6I?\ef%&1aLDIIj!WBG8QwY< zx7HRK@ zAQxZ73BQxZ73BABAB 001E1EuGaGacpruwxyLLAaCFB(;q!RQSnLU!-5 )64HD==RXX>FFxPXYZ[\`^`\`be\efDIMPRSZPZm]d\dNdfmnpqxnxfxNxIyF1W9RZ/72g:1EEFzz& %)DIIj!##E$8$8!<-+ #'~**B40$%a)5 %)DIIj!##E$8$8!<-+ #'~**B40$%a)5 %s   KM= =A;O8r>   )NNF)NF)NNNNN)r   )'__name__
__module____qualname__r"   rD   rG   r&   rT   rW   rY   rf   rJ   ro   r~   rt   r   r   r   r   r   r   r   r   r   r   r  r   r  r!  r$  r(  r,  r/  r6   r8  GL_BGRArL  rn  __classcell__r:   s   @r;   r   r      s    -4 !9F'(?" <
.<
6.5"!"F#J"	+8?B$I$ 	 !(& *17GUYcf ?r<   r   c                   $     e Zd Zdd fd
Z xZS )GLViewWidgetN)devicePixelRatioc                    t        |   |i | | j                  t        j                  j
                  j                         y)a  
        Basic widget for displaying 3D data
          - Rotation/scale controls
          - Axis/grid display
          - Export options

        ================ ==============================================================
        **Arguments:**
        parent           (QObject, optional): Parent QObject. Defaults to None.
        devicePixelRatio No longer in use. High-DPI displays should automatically
                         detect the correct resolution.
        rotationMethod   (str): Mechanism to drive the rotation method, options are
                         'euler' and 'quaternion'. Defaults to 'euler'.
        ================ ==============================================================
        N)r!   r"   setFocusPolicyr   r(   FocusPolicy
ClickFocus)r7   rw  r8   r9   r:   s       r;   r"   zGLViewWidget.__init__5  s5      	$)&)FII11<<=r<   )ro  rp  rq  r"   rs  rt  s   @r;   rv  rv  4  s    /3 > >r<   rv  )	OpenGL.GLOpenGL.GL.framebufferobjectsGLframebufferobjectsr@  mathr   r   r   r   numpyrx   r   r	   r
   ri   r   r(   r   r   r   r   QOpenGLWidgetrv  r   r<   r;   <module>r     sG     , , ' '     ) )e eP>;	 7 7 >r<   