ó
ÉÝ{Tc           @   s=  d  Z  d d l Z d d l Td d l Td d l Td d l Td 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 Td 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	 d „  ƒ  YZ d „  Z d e j f d „  ƒ  YZ d S(
   s@  
     pygl/MG.py: CCP4MG Molecular Graphics Program
     Copyright (C) 2001-2008 University of York, CCLRC

     This library is free software: you can redistribute it and/or
     modify it under the terms of the GNU Lesser General Public License
     version 3, modified in accordance with the provisions of the 
     license to address the requirements of UK law.
 
     You should have received a copy of the modified GNU Lesser General 
     Public License along with this library.  If not, copies may be 
     downloaded from http://www.ccp4.ac.uk/ccp4license.php
 
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU Lesser General Public License for more details.
iÿÿÿÿN(   t   *t   cubec           B   sY   e  Z e ƒ  Z e ƒ  Z e ƒ  Z e ƒ  Z e ƒ  Z e ƒ  Z e ƒ  Z	 e ƒ  Z
 d  „  Z RS(   c         C   s   d  S(   N(    (   t   self(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   __init__.   s    (   t   __name__t
   __module__t	   Cartesiant   p0t   p1t   p2t   p3t   p4t   p5t   p6t   p7R   (    (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR   +   s   	 	 	 		 	 	 	c           C   s   d  S(   N(    (    (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   nullfunc1   s    t
   GLUTThreadc           B   s°  e  Z d  Z d Z d Z d Z e j ƒ  Z d e	 e ƒ Z
 d Z d d d f Z e j d d d d ƒ Z d Z d Z d d f \ Z Z d Z d Z e j ƒ  Z e j ƒ  Z e j d ƒ Z d Z d Z d Z d Z d Z  d Z! i  Z" d Z# d Z$ d Z% d Z& d d d g Z' d Z( d Z) d Z* e+ Z, e- Z. e/ Z0 e1 Z2 d Z3 d	 Z4 d
 Z5 d Z6 d Z7 d Z8 d Z9 d Z: d Z; d Z< d Z= e5 Z> d Z? d Z@ d ZA d ZB d	 ZC d
 ZD d ZE d ZF d ZG d ZH d ZI d ZJ d ZK d ZL d ZM d	 ZN d ZO d ZP eO ZQ eP ZQ d ZR d ZS d ZT d ZU d ZV d ZW d ZX d d d g ZY d ZZ d Z[ d Z\ d d f Z] e[ d e\ d f Z^ e_ ƒ  Z` d Za d Zb d Zc d Zd ea Ze eb Zf d Zg d Zh d Zi e$ Zj d Zk eI Zl eQ eO k rÄd Zm n d Zm d Zn d Zo d  Zp d Zq d Zr d Zs d! Zt d Zu d" Zv ew Zx d Zy d Zz d Z{ d	 Z| e{ Z} d Z~ d Z d Z€ d Z� d Z‚ d Zƒ eƒ Z„ e… j… ƒ  Z† e† Z‡ d Zˆ d Z‰ d ZŠ d Z‹ d ZŒ g  Z� d# ZŽ d Z� d Z� i d d$ 6Z‘ d Z’ d Z“ d% Z” d Z• d Z– d Z— d Z˜ d Z™ d Zš d Z› d Zœ d Z� d Zž d ZŸ d# Z  d Z¡ e j¢ d e£ ƒ Z¤ e¤ j¥ ƒ  d# Z¦ d# Z§ d# Z¨ d Z© d Zª d Z« d& Z¬ d' Z­ d Z® d( Z¯ d( Z° d Z± d Z² d Z³ d Z´ d) Zµ d* „  Z¶ d# d+ „ Z· d, „  Z¸ d- „  Z¹ d# d. „ Zº d# d# d e» e» d# e» d/ „ Z¼ d0 „  Z½ d1 „  Z¾ d2 „  Z¿ d3 „  ZÀ d4 „  ZÁ d5 „  ZÂ d6 „  ZÃ d7 „  ZÄ d# d# d8 „ ZÅ d9 „  ZÆ d: „  ZÇ d; „  ZÈ g  d< „ ZÉ g  d= „ ZÊ d> „  ZË d? „  ZÌ d@ „  ZÍ dA „  ZÎ e» dB „ ZÏ dC „  ZÐ dD „  ZÑ dE „  ZÒ dF „  ZÓ dG „  ZÔ dH „  ZÕ dI „  ZÖ dJ „  Z× dK „  ZØ dL „  ZÙ dM „  ZÚ dN „  ZÛ dO „  ZÜ d dP „ ZÝ dQ „  ZÞ dR „  Zß d( dS „ Zà dT „  Zá d# d# dU „ Zâ d# dV „ Zã d dW „ Zä d dX „ Zå d dY „ Zæ dZ „  Zç d[ „  Zè d# d# d\ „ Zé d] „  Zê d^ „  Zë d_ „  Zì d` „  Zí da „  Zî db „  Zï dc „  Zð dd „  Zñ de „  Zò df „  Zó dg „  Zô dh „  Zõ di „  Zö dj „  Z÷ dk „  Zø dl „  Zù dm „  Zú dn „  Zû do „  Zü dp „  Zý dq „  Zþ dr „  Zÿ ds „  Z d# dt „ Zdu „  Zdv „  Zdw „  Zdx „  Zdy „  Zdz „  Zd{ „  Zd| „  Z	d} „  Z
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 d d d( d( d d‰ „ Zd dŠ „ Zd d‹ „ ZdŒ „  Zd d� „ ZdŽ „  Zd� „  Zd� „  Zd‘ „  Zd’ „  Zd“ „  Z d” „  Z!RS(•   sw  
    An OpenGL/Glut thread class.
    This class is a high level self-standing data instance
    which uses the GLUT API to open and control a window 
    containing an OpenGL (or similar) context. 
    Instances of
    the class are intended to run in their own threads:
    GRAPHICS_thread = MG.GLUTThread()
    GRAPHICS_thread.setDaemon(1)
    GRAPHICS_thread.start()
    i    s   CCP4 Molecular Graphics Programg      N@g        g      ð?g-Cëâ6?i   i   i   i   i   i   i   i   i   i	   i
   i   s   screendump.ppms   screendump.pst   A4s   screendump.povid   iûÿÿÿiè  iÐ  g       @i   iZ   g      ø?iúÿÿÿg{®Gáz”?i   g¸…ëQ¸Ž?t    t   openglg      $@s   -1gš™™™™™É?iÿÿÿÿg      à?c         C   sg   |  j  j d ƒ |  j d k sI |  j sI |  j d k sI |  j sI |  j rS t ƒ  n t j	 |  j
 ƒ d  S(   Ni¸  i    i   (   t   glpauset   waitt   sectiont   movingt   redrawt   keyboard_is_activet   special_is_activet   glutPostRedisplayt   timet   sleept
   idle_pause(   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   IdleFunction  s    9
c         C   s5   t  ƒ  } | r1 | r | Gn  | GHt j j ƒ  n  d  S(   N(   t
   glGetErrort   syst   stdoutt   flush(   R   t   infot   err(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   CheckErrors  s    	  c   
      C   s„  d d  l  } | j  j j d ƒ } t d ƒ |  _ | d |  j d <| d |  j d <| d |  j d <| d |  j d <g  |  _ d d	 d
 d d d g } g  } | j  j j d ƒ } x; | j | ƒ d k rí | j | ƒ | j  j j | ƒ } q³ Wg  } x‰ | D]� } | j | ƒ sû | j  j j | ƒ } t d ƒ }	 | d |	 d <| d |	 d <| d |	 d <| d |	 d <|  j j |	 ƒ qû qû Wd  S(   Niÿÿÿÿt   whitei   i    i   i   i   t   greent   redt   bluet   blackt   yellowt   default(	   t   COLOURt   instst   RGBt   doubleat   whitept   symcolpt   nextt   countt   append(
   R   R.   R'   t   excludest   excludeR4   t   finalt   colt   rgbR3   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   setup_colour_pointers  s0       	   c   
      C   so  t  j d k r! |  j ƒ  |  _ n  |  j d k r4 d St |  j ƒ d k  rM d S|  j } t | d | d | d ƒ } t | d | d | d ƒ } t | d | d	 | d ƒ } t | d	 | d | d ƒ } t | d
 | d | d ƒ } t | d | d | d	 ƒ } t ƒ  }	 |	 j | ƒ |	 j | ƒ |	 j | ƒ |	 j | ƒ |	 j t	 | d | d | d ƒ ƒ S(   Nt   win32R   i   i   i    i   i   i   i   i   (
   R!   t   platformt   GetScreenBoxt
   screen_boxt   lent   Planet   Volumet   AddPlanet   PointInVolumeR   (
   R   t   oR@   R   R	   R
   R   R   R   t   v(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   IsPointOnScreen+  s&    		  c         C   s   | r | |  _  n  d  S(   N(   t   viewsize(   R   RI   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   set_viewsize>  s     c         C   sL  d } | r? t  j | j ƒ  | ƒ }	 t  j |  j ƒ }
 d } n0 | ro t  j | ƒ }	 t  j |  j ƒ }
 d } n  | s{ | rÀ t  j j |
 |	 ƒ t  j j |
 |	 ƒ } } | | k  rÀ |	 }	 qÀ n  |  j } |  j } | r|  j r| rö t | ƒ } q|  j	 } n	 |  j } | r| } n | } | d k sB| d k r‡|  j
 r‡|  j ƒ  | |  _ | |  _ | rp|	 |  _ n  |  j ƒ  d |  _ d  S|  j | ƒ sd } x` |  j | ƒ rþ| d k  rþt j d ƒ |  j j d ƒ | d } |  j d |  _ d |  _ qŸWt j d ƒ |  j } n  t j ƒ  } d	 } d
 } x| |  j | k  rG| |  j k  rqt | ƒ t |  j ƒ } n d } d | } | | d | | d | | d | | d | | d | | d g } | | | | } t j | ƒ t j ƒ  | } |  j j d ƒ | |  _ | |  _ | r;|	 | |
 | |  _ n  d |  _ q3Wd  S(   Ni    i   R   i2   g{®Gáz”?i¸  g       @g{®Gáz¤?g        g{®Gázt?g      ð?i   (   t
   pygl_coordt   Quatt
   get_normalt   quatt   Distancet   RADIUSt   rpost   set_camera_reset_radiust   floatt   set_camera_zoom_radiust   set_camera_glidet   Pauset   UnPauseR   RH   R   R   t   glreadyR   t   set_camera_time(   R   t   o_int   radiust   zoomt   planet   plane_upRU   RN   t   set_quatt   quat_newt   quat_oldt   l1t   l2t   rad_oldt   rpos_oldt   rad_newt   rpos_newR5   t   t1t   elapsedt   delayt   f1t   f0t   rpos_curt   rad_cur(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   set_camera_originA  sx    		, 				"
		 
	

K		 c         C   sÌ  d } t  j j | | ƒ t  j j | | ƒ } } | | k  rH | } n  | s–t j ƒ  } d }	 | }
 | } |  j } d } x|	 d k r’|	 d k  rŸ |	 } n d } | } d | } | | | | |  _ | |
 d | | d | |
 d | | d | |
 d | | d g } t j d ƒ t j ƒ  | }	 |  j j d	 ƒ | |  _	 d |  _
 t ƒ  t r~ | | | | } | |  _ d |  _
 t ƒ  q~ q~ Wn  |  j j d	 ƒ | |  _	 | |  _ d |  _
 t ƒ  d  S(
   Ni   g        i
   gR¸…ëQð?g      ð?i    i   g{®Gáz”?i¸  (   RK   RL   RO   R   RP   RN   R   RX   R   RQ   R   R   R\   (   R   t   o1t   o2t   q1t   q2t   quickRb   Rc   Rh   Ri   Re   Rg   Rd   Rf   t   it   fit   fipRm   Rn   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   TransformBetweenTwoViews�  sF    , 
		
K							c   	      C   sö  t  ƒ  } | j d ƒ d d g } t | | ƒ g  |  _ g  |  _ g  |  _ t d d ƒ t |  j |  j	 ƒ t
 t ƒ } yi | j d ƒ d } d | d d	 d
 } t j | ƒ } | rÏ t ƒ  |  _ t ƒ  } n d |  _ d } Wn t ƒ  |  _ t ƒ  } n X| rt t Bt Bt Bt B} n t t Bt Bt B} |  j d k rK| t O} n  t | ƒ t |  j ƒ |  _ t |  j ƒ t |  j ƒ t  |  j! ƒ t" |  j# ƒ t$ |  j% ƒ t& |  j' ƒ t( |  j) ƒ t* |  j+ ƒ t, |  j- ƒ t. d ƒ t/ ƒ  |  _0 d  S(   Ni   t   CCP4MGR   i
   t   unames   "OpenGL renderer string:"s   glxinfo| grep s
   |grep -q "s-   Mesa DRI Intel(R) 945GM 20050225 x86/MMX/SSE2s   "i    i   (1   t   intpt   assignt   glutInitt
   displayobjt   visibility_listt
   alpha_listt   glutInitWindowPositiont   glutInitWindowSizet   start_widtht   start_heightt   dirt   ost   indext   systemt   CheckIfAlphaStereoAvailablet   alpha_availablet   CheckIfStereoAvailablet   CheckIfAlphaAvailablet
   GLUT_ACCUMt   GLUT_DOUBLEt
   GLUT_DEPTHt   GLUT_RGBt   GLUT_STEREOt
   GLUT_ALPHAt   glutInitDisplayModet   glutCreateWindowt   titlet   winidt   glutDisplayFunct   orientt   glutReshapeFunct
   changeSizet   glutIdleFuncR   t   glutMouseFunct   mouset   glutSpecialFunct   specialt   glutSpecialUpFunct
   special_upt   glutMotionFunct   motiont   glutKeyboardFunct   keyboardt   glutKeyboardUpFunct   keyboard_upt   glutIgnoreKeyRepeatt   OnScreenBuffert   onscreen_buffer(	   R   t   argct   argvt   at   renderer_stringt   commandt   rc1t   stereo_availablet
   glut_flags(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   glutinit¸  sR    					


c         C   s   d d l  m } d |  _ t t ƒ } yí | j d ƒ d } d } d } xÇ | D]¿ } t j ƒ  d | d k rN d | d	 | d
 d } t j | ƒ } d | d	 | d d } t j | ƒ }	 d | d	 | d d } t j | ƒ }
 | r|	 r|
 rd
 |  _ qqN qN WWn n Xd  S(   Niÿÿÿÿ(   t   BrokenDriversi    Rz   s   "OpenGL renderer string:"s   "OpenGL version string:"s   "direct rendering:"s   glxinfo| grep s
   |grep -q "i   s   "i   i   (   t   GLBrokenDriver_dbR´   t   glbrokenR…   R†   R‡   Rz   Rˆ   (   R   R´   R­   R®   t   version_stringt   direct_rendering_stringt   driverR¯   R°   t   rc2t   rc3(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   TestIfGLIsBrokenì  s(    	c         C   sÜ  |  t  _ t j ƒ  |  _ d |  _ t j |  ƒ |  _ |  j ƒ  |  j	 rS |  j
 ƒ  n  t j j |  d d ƒd |  _ t j t j d d d ƒ |  j t j d d d ƒ ƒ |  _ |  j j d ƒ g  |  _ x$ t d ƒ D] } |  j j d ƒ qÑ Wg  |  _ x$ t d ƒ D] } |  j j d ƒ qWg  |  _ x$ t d ƒ D] } |  j j d ƒ q1Wg  |  _ x$ t d ƒ D] } |  j j d ƒ qaW|  j ƒ  |  j d	 r§d
 |  j ƒ  f GHn  |  j |  _ |  j |  _  d d l! } | j! j j" d ƒ |  _# t j$ ƒ  } | j! j j" d ƒ } | j% d | d | d | d ƒ g  } | j! j j& d ƒ } xy | j' | ƒ d k r¼| j! j j" | ƒ } | j% | | d | d | d | d ƒ | j | ƒ | j! j j& | ƒ } qDWg  |  _( g  |  _) d |  _* d S(   s9   
        Constructor, setting initial variables.
        g      ð?t   names   Glut ThreadR   g{®Gáz”?i    i   i€   R   s	   %s startsiÿÿÿÿNR+   R-   i   i   i   (+   R   R/   t	   threadingt   Eventt
   _stopeventt   _sleepperiodt   gleventt   GLEventR¼   R¶   R³   t   ThreadR   t   fps_textt   cprimt   BillBoardTextRK   R   t   fps_primt   SetFontSizet   key_pressest   rangeR6   t   old_key_pressest   special_pressest   old_special_pressesR<   t
   diagnostict   getNameRƒ   t   win_wR„   t   win_hR.   R0   t   bgcolort   RGBRepst	   AddColourR4   R5   t   dl_linest	   dl_solidst   rebuild_lists(   R   Ru   R.   t   rgbrepsR:   R8   R4   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR     sV    		
		9				
 ")		c         C   s   |  j  j d ƒ d |  _ d  S(   Ni¸  i   (   RX   R   t   do_exit(   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   ExitC  s    c         C   sV   |  j  j d ƒ |  j  j ƒ  g  |  _ g  |  _ g  |  _ |  j  j ƒ  |  j j ƒ  d  S(   Ni¸  (   RX   R   t   clearR~   RÖ   R×   t   setR   (   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRÜ   G  s    			c         C   s7   |  j  j d ƒ |  j j | ƒ | j ƒ  d |  _ d S(   sc   
        Recieve info about display-objects and 
        ask idle function to build lists.
        i¸  i   N(   RX   R   R~   R6   t   rebuildR   (   R   R~   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   addobjP  s    
c         C   s‰   |  j  j d ƒ d |  _ |  j r5 |  j j | ƒ n  t |  j ƒ | k r] |  j j | ƒ n  t |  j ƒ | k r… |  j j | ƒ n  d S(   sk   
        Delete a display object instance
        and the GL display list which corresponds to it.
        i¸  i   N(   RX   R   R   R~   t   popRA   RÖ   R×   (   R   t   id(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt	   deleteobjZ  s    		   c         C   sA   | r | |  _  n  | r$ | |  _ n  |  j j d | d | ƒ d S(   sv   
        A function which tells the thread
        which Python Queue it is meant to 
        push events to.
        t   jqt	   interruptN(   Rã   t
   interruptqRÂ   t   registerqueue(   R   Rã   Rä   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRæ   e  s
      c         C   sx   |  j  d k r4 |  j d j ƒ  |  j d j ƒ  n" |  j d j ƒ  |  j d j ƒ  x |  j D] } | j ƒ  q` Wd  S(   Ni   i    (   t   slab_ont   clip_planest   turn_ont   turn_offt   apply(   R   R]   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   setup_clippingo  s    c         C   s…   g  |  _  |  j  j t j t ƒ ƒ |  j  j t j t ƒ ƒ d d d |  j d f |  j  d _ d d d |  j d f |  j  d _ d  S(   Ni    i   i   iÿÿÿÿ(   Rè   R6   t   clipt   clippingt   GL_CLIP_PLANE0t   GL_CLIP_PLANE1t
   slab_widtht   eqn(   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   initialize_clippingz  s
    	#c         C   sI   g  } x< |  j  D]1 } | j | j | j | j | j | j g ƒ q W| S(   N(   t   lightsR6   t   ont   positiont   ambientt   speculart   diffuse(   R   t   paramst   light(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   get_lighting_params„  s
    c         C   s«  | rÚ d } t  t |  j ƒ t | ƒ ƒ } x÷t d | ƒ D]™ } | | d |  j | _ | | d |  j | _ | | d |  j | _ | | d |  j | _ | | d rÂ |  j | j ƒ  q: |  j | j	 ƒ  q: WnJd |  j d _ d |  j d _ d |  j d _ d |  j d _ |  j d j ƒ  d |  j d _ d |  j d _ d |  j d _ d |  j d _ |  j d j	 ƒ  d |  j d _ d |  j d _ d |  j d _ d |  j d _ |  j d j	 ƒ  d |  j d _ d |  j d _ d |  j d _ d |  j d _ |  j d j	 ƒ  d } d } d  } d! } d" } xh t | d ƒ D]W } | |  j | _ | |  j | _ | |  j | _ | |  j | _ |  j | j	 ƒ  qLWd  S(#   Ni    i   i   i   i   g        g      N@g      ð?gš™™™™™É?gffffffæ?g      NÀgš™™™™™¹?gš™™™™™Ù?i   (   g        g        g      N@(   g        g        g        (   g      ð?g      ð?g      ð?(   g      ð?g      ð?g      ð?(   g        g        g      N@(   gš™™™™™É?gš™™™™™É?gš™™™™™É?(   g        g        g        (   gffffffæ?gffffffæ?gffffffæ?(   g      NÀg      N@g      N@(   gš™™™™™¹?gš™™™™™¹?gš™™™™™¹?(   gffffffæ?gffffffæ?gffffffæ?(   gš™™™™™Ù?gš™™™™™Ù?gš™™™™™Ù?(   g        g      N@g      N@(   gš™™™™™¹?gš™™™™™¹?gš™™™™™¹?(   gffffffæ?gffffffæ?gffffffæ?(   gš™™™™™Ù?gš™™™™™Ù?gš™™™™™Ù?(   gš™™™™™¹?gš™™™™™¹?gš™™™™™¹?(   gffffffæ?gffffffæ?gffffffæ?(   gffffffæ?gffffffæ?gffffffæ?(   g      N@g      N@g      N@(
   t   minRA   Rô   RË   Rö   R÷   Rø   Rù   Ré   Rê   (   R   Rú   Ru   t   doneR÷   Rø   Rù   Rö   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   set_lighting_params‹  sT    c         C   s“   t  t t t t t t t g } g  |  _ t	 t
 ƒ d } d } d } d } x3 | D]+ } |  j j t j | | | | | ƒ ƒ qP W|  j d | ƒ d  S(	   Ngš™™™™™¹?gffffffæ?g      N@Rú   (   gš™™™™™¹?gš™™™™™¹?gš™™™™™¹?(   gffffffæ?gffffffæ?gffffffæ?(   gffffffæ?gffffffæ?gffffffæ?(   g      N@g      N@g      N@(   t	   GL_LIGHT0t	   GL_LIGHT1t	   GL_LIGHT2t	   GL_LIGHT3t	   GL_LIGHT4t	   GL_LIGHT5t	   GL_LIGHT6t	   GL_LIGHT7Rô   t   glEnablet   GL_LIGHTINGR6   t   LightRÿ   (   R   Rú   t   light_namesR÷   Rø   Rù   Rö   R½   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   initialize_lighting¿  s    	
)c         C   sY   |  j  d k r t t ƒ n t t ƒ d St t t ƒ x |  j D] } | j ƒ  qA Wd S(   s.   
        Setup OpenGL lighting model.
        i    N(	   t   lightingR  R	  t	   glDisablet   glLightModelit   GL_LIGHT_MODEL_LOCAL_VIEWERt   GL_TRUERô   Rë   (   R   Rû   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   setup_lightingÏ  s    
c         C   sk  d Gt  t t ƒ ƒ GHd Gt  t t ƒ ƒ GHd Gt  t t ƒ ƒ GHd Gt  t t ƒ ƒ GHd Gt  t t ƒ ƒ GHd Gt  t t ƒ ƒ GHt	 ƒ  } t
 t | ƒ d G| j ƒ  GHt
 t | ƒ d G| j ƒ  GHt
 t | ƒ d	 G| j ƒ  GHt
 t | ƒ d
 G| j ƒ  GHt
 t | ƒ d G| j ƒ  GHt
 t | ƒ d G| j ƒ  GHt
 t | ƒ d G| j ƒ  GHt
 t | ƒ d G| j ƒ  GHd S(   s"   
        Get OpenGL info.
        s
   GL Vendor:s   GL Renderer:s   GL Version:s   GL Extensions:s   GLU Version:s   GLU Extensions:s   Max clipping planes:s   Max modelview stack depth:s   Auxiliary bufferss   Double buffered:s   Accum red bits:s   Accum green bits:s   Accum blue bits:s   Accum alpha bits:N(   t
   glbyte2strt   glGetStringt	   GL_VENDORt   GL_RENDERERt
   GL_VERSIONt   GL_EXTENSIONSt   gluGetStringt   GLU_VERSIONt   GLU_EXTENSIONSR{   t   glGetIntegervt   GL_MAX_CLIP_PLANESt   valuet   GL_MAX_MODELVIEW_STACK_DEPTHt   GL_AUX_BUFFERSt   GL_DOUBLEBUFFERt   GL_ACCUM_RED_BITSt   GL_ACCUM_GREEN_BITSt   GL_ACCUM_BLUE_BITSt   GL_ACCUM_ALPHA_BITS(   R   Rú   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   print_glinfoß  s.    	c         C   s   d  S(   N(    (   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   simple_orientû  s    c         C   s¾  |  j  s |  j ƒ  n  d |  _ |  j j ƒ  t |  j ƒ |  _ |  j d rZ d G|  j GHn  t	 ƒ  } t
 t | ƒ | j ƒ  r” |  j |  _ d |  _ n  |  j j ƒ  |  j j ƒ  t j t j d ƒ rð t j t j d ƒ rð t j t j d ƒ rð n  t t t ƒ t t ƒ t t ƒ t t t ƒ t t ƒ t t  ƒ t! t" t# ƒ |  j$ ƒ  |  j% ƒ  |  j& ƒ  t' t( ƒ t) ƒ  |  j* ƒ  |  j d r’|  j+ ƒ  n  t, ƒ  |  _- t. t/ t0 ƒ ƒ |  _1 t2 ƒ  d  S(   Ni    R   s   GLUT Window ID isi   s   Red Hat Linuxs	   GCC 3.3.1s   2.2.3(3   R¶   R³   t   stopRX   RÜ   t   GetGLUTWindowIDt   pidt	   window_idRÏ   R{   R  t	   GL_STEREOR  t
   QUADBUFFERt   stereo_modet   hardware_stereo_availableRÝ   R   t   stringR5   R!   t   versiont   glColorMaterialt   GL_FRONTt   GL_AMBIENT_AND_DIFFUSER  t   GL_COLOR_MATERIALt   GL_DEPTH_TESTt   glPolygonModet   GL_FILLt   glEnableClientStatet   GL_VERTEX_ARRAYt   GL_NORMAL_ARRAYt   glHintt   GL_LINE_SMOOTH_HINTt	   GL_NICESTRó   R  R  t   glMatrixModet   GL_PROJECTIONt   glLoadIdentityt   BuildPrimitiveDisplayListR&  t   OpenJoystickst   joysR  R  R  t   gl_renderert   glutMainLoop(   R   Rú   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   runþ  sD    		 	?








 c         C   s=   d |  _  |  j j ƒ  |  j j d ƒ t j j |  | ƒ d S(   s;   
        Stop the thread. Shouldn't ever get here.
        i   i¸  N(   R(  RÀ   RÝ   RX   R   R¾   RÄ   t   join(   R   t   timeout(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRH  .  s    	c         C   s(   |  j  d k r d |  _  n	 d |  _  d  S(   Ni   i    (   t   rocking(   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   toggle_rocking7  s    c         C   sÕ  |  j  s¦ t j d  d k r1 t |  j ƒ |  _ n  |  j d rM d G|  j GHn  |  j } t | ƒ } t ƒ  } | | k r¢ d |  _	 d |  _  |  j
 |  j |  j ƒ n  d St j d k rÇ |  j ƒ  |  _ n  |  j d k rd |  _ |  j
 |  j |  j ƒ d |  _	 n  |  j r2t |  j ƒ d k r2t |  j d ƒ } | j d |  _ | j d |  _ | j |  _ |  j d k s||  j d k r2t j ƒ  d d	 k r½|  j d
 d |  _ |  j d
 d |  _ n  i  } |  j | d <|  j | d <t ƒ  | d <|  j | d <|  j | d <|  j | g } |  j j | ƒ d |  _	 q2n  i  } |  j | d <|  j | d <d } |  j  d k råx{ t! |  j j" d ƒ ƒ D]^ } |  j | j# d ƒ | } |  j$ | |  j% |  j& |  j' | g } | d } |  j j | ƒ q€Wn  d } |  j  d k r…xˆ t! |  j j" d ƒ ƒ D]k } |  j | j# d ƒ | } |  j( | |  j% |  j& |  j' | g } d |  j | <| d } |  j j | ƒ qWn  d } |  j) d k rx{ t! |  j* j" d ƒ ƒ D]^ } |  j* | j# d ƒ | } |  j+ | |  j% |  j& |  j' | g } |  j j | ƒ | d } q³Wn  d } |  j) d k r¸xˆ t! |  j* j" d ƒ ƒ D]k } |  j* | j# d ƒ | } |  j, | |  j% |  j& |  j' | g } d |  j* | <|  j j | ƒ | d } qFWn  |  j j" d ƒ d k rô|  j j" d ƒ d k rôd |  _  n  |  j* j" d ƒ d k r0|  j* j" d ƒ d k r0d |  _) n  |  j- rFt j. ƒ  n  |  j/ rµ|  j% |  j0 }	 |  j& |  j1 }
 |	 s{|
 rš|  j2 |	 |
 |  j0 |  j1 ƒ n  |  j% |  _0 |  j& |  _1 n  |  j	 d k rÈd Sd |  _	 d S(   s¯   
        The idle function. Notices certain
        changes of state which have been
        triggered outside the thread and takes
        action within this thread.
        i   t   irix64R   s   GLUT Window ID isi   NR=   i    t   Darwini €  i°  t   xt   yt   windowt
   joybuttonsRÊ   t   screenxt   screenyiÿÿÿÿ(3   t
   reparentedR!   R>   R)  R*  R+  RÏ   t   GetParentWindowt   GetRootWindowIDR   Rš   RÑ   RÒ   R?   R@   t   resizeRD  RA   t   GetJoystickEventt   axest   joy_xt   joy_yt   buttonsRQ  R†   Rz   t   glutGetWindowRÊ   t   JOYSTICK_AXISRÂ   t   screen_xt   screen_yR   RË   R5   R‡   t   KEYBOARDt   mouse_xt   mouse_yt	   modifierst   KEYBOARD_UPR   RÍ   t   SPECIALt
   SPECIAL_UPRÚ   t   exitR   t   start_xt   start_yt   SendMotionEvent(   R   t   glutt   parentt   roott   joyeventt   binfot   jobt   keyt   iit   dxt   dy(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   CheckKeysAndMouseStatus=  s¬    
	 					$
$
$$00		c         C   sŸ  |  j  | } | j ƒ  d k r# d St |  j | t ƒ |  j r³ |  j |  j k r³ |  j |  j k r³ |  j |  j	 k r³ |  j |  j
 k r³ | j ƒ  d k rØ | j |  j d ƒ qØ n% | j ƒ  d k rØ | j d d ƒ n  t ƒ  t |  j | t ƒ |  j ro|  j |  j k ro|  j |  j k ro|  j |  j	 k ro|  j |  j
 k ro| j ƒ  d k r”| j |  j d ƒ q”n% | j ƒ  d k r”| j d d ƒ n  t ƒ  d S(   s®   
        This function does the business of turning
        display-object data containing primitives, and other stuff
        into display lists and auxiliary info.
        i   Ni    t   NULL(   R~   t   BuildDisplayListt	   glNewListRÖ   t
   GL_COMPILEt	   stereo_onR.  R-  t
   SIDEBYSIDEt   LEFTSTEREOONLYt   RIGHTSTEREOONLYt   get_transparentt
   draw_linesR2   t	   glEndListR×   t   draw_solids(   R   t   listidR~   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt	   buildlist±  s"    QQc         C   sG   |  j  |  j k r! |  j |  _  n |  j |  _  |  j |  j |  j ƒ d S(   sV   
        Switch between orthographic and
        perspective representations.
        N(   t   projectmodet   PERSPECTIVEt   ORTHORš   RÑ   RÒ   (   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   switch_projectionÏ  s    c         C   s(   |  j  d k r d |  _  n	 d |  _  d  S(   Ni    i   (   t	   antialias(   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   toggle_antialiasingÚ  s    c         C   ss  t  t t Bƒ t t ƒ t d |  j d d |  j d d |  j d ƒ t d ƒ t t	 ƒ t
 |  j j j ƒ  |  j j j ƒ  |  j j j ƒ  ƒ t
 |  j j j ƒ  |  j j j ƒ  |  j j j ƒ  ƒ t
 |  j j j ƒ  |  j j j ƒ  |  j j j ƒ  ƒ t
 |  j j j ƒ  |  j j j ƒ  |  j j j ƒ  ƒ t
 |  j j j ƒ  |  j j j ƒ  |  j j j ƒ  ƒ t ƒ  t ƒ  d  S(   Ni   i    i   g      ð?(   t   glPushAttribt   GL_ENABLE_BITt   GL_CURRENT_BITR  R	  t	   glColor3fRÓ   t   glLineWidtht   glBegint   GL_LINE_STRIPt
   glVertex3ft   rubber_band_boxR   t   get_xt   get_yt   get_zR   R	   R
   t   glEndt   glPopAttrib(   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   DrawRubberBandà  s    
1

44444c         C   sÏ   |  j  r | |  j k r d  S| |  _ |  j |  j k s\ |  j |  j k s\ |  j |  j k r† |  j |  j k rz d |  _ q­ d |  _ n' |  j |  j k r¤ d |  _ n	 d |  _ x |  j	 D] } | j
 ƒ  q· Wd  S(   Ni   g      ø?i
   (   R/  R-  R.  R}  R~  R|  t   stereo_view_stylet   ROTATION_STEREOt   stereoseparationR~   RÞ   (   R   R.  t   obj(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   SetStereoModeï  s    	6	c         C   s   | |  _  d |  _ d  S(   Ni   (   t	   show_axesR   (   R   t   axes_on(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   SetAxes   s    	c         C   s   | |  _  d |  _ d  S(   Ni   (   t   fog_onR   (   R   R¢  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   SetFog  s    	c         C   s4   | |  _  x |  j D] } | j ƒ  q Wd |  _ d  S(   Ni   (   R{  R~   RÞ   R   (   R   R{  R�  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt	   SetStereo  s    	c         C   s0  t  d ƒ } d | d <| d <| d <| d <t j d d d ƒ t j d d d ƒ t j d d d ƒ t j d d d ƒ t j d d d ƒ t ƒ  } | j t d d d ƒ ƒ | j t d d d ƒ ƒ t j | d d d d ƒ t j | d d d d ƒ t j | d d	 d d ƒ t j | d d
 d d ƒ d  S(   Ni   g        i    i   i   i   g      ð?i   i   i    (   R1   RÆ   t   spheret   CartesianVectorR6   R   t   draw_cylinder(   R   R:   t   carts(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRB    s     "	c         C   s   |  j  |  _ d |  _ d  S(   Ni    (   t   default_output_buffert   offscreen_buffert   offscreen_buffer_override(   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   SetDefaultOutputBuffer  s    c         C   s   | |  _  d |  _ d  S(   Ni   (   Rª  R«  (   R   t   buffer(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   SetOffScreenBuffer!  s    	c         C   s  d } |  j  |  j k rö d } xÕ |  j D]Ç } | j ƒ  d k sL | d k rå | t |  j ƒ k rÂ |  j j t d ƒ ƒ |  j j t d ƒ ƒ t	 j	 ƒ  } |  j
 t |  j ƒ d ƒ t	 j	 ƒ  } n |  j
 | ƒ | j d ƒ d } n  | d } q( Wn  d |  _ | S(   Ni    i   (   t
   rendermodet   DISPLAYLISTSR~   t   get_rebuildRA   RÖ   R6   t
   glGenListsR×   R   R„  RÞ   RØ   (   R   t   forcet   rebuiltRu   R�  Rh   t   t2(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt
   BuildLists%  s"    		c         C   s™   d } d } d } d g } |  j  } t j | ƒ } t | ƒ d k rƒ t d ƒ } t t | ƒ d |  j d } d |  j d } n d } | | | | f S(   Ni    i   g        i   g      À?g      N@(   g        g        (   t   ACSIZEt   jittert
   get_jarrayRA   t   intaR  t   GL_VIEWPORTRP   (   R   t   xofft   yofft   acsizet   jarrayt   viewport(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   CalculateJitter:  s    		c         C   sÏ   | d k rË t  | | d | | d j ƒ  | | d | | d j ƒ  | | d | | d j ƒ  ƒ t  | | d | | d j ƒ  | | d | | d j ƒ  | | d | | d j ƒ  ƒ n  d  S(   Ni   i    (   t   glTranslatefR”  R•  R–  (   R   R¾  R¼  R½  R¿  t   jitRY  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   JitterO  s    ^c         C   s%   d |  _  | d k r! | |  _ n  d  S(   Ni   i    (   RØ   t   use_transparency(   R   t   transparency(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   SetTransparencyT  s    	 c      	   C   sb  t  t ƒ |  j |  j ƒ } |  j r< t  t ƒ t  t ƒ n t t ƒ t t ƒ d |  _ x: |  j	 D]/ } | j
 ƒ  d k rˆ d |  _ Pn  | j ƒ  qc W|  j r¬ t  t ƒ n  t t t ƒ t t ƒ t t ƒ t  t ƒ t t ƒ t t ƒ t  t ƒ t t t ƒ |  j ƒ  \ } } } } |  j d k rê|  j d k rê|  j ƒ  } d | } t ƒ  }	 x€ t  | ƒ D]r }
 d G|
 Gd G| GHt! j" j# ƒ  t$ t% t& Bƒ |  j' | | | | |
 | ƒ |  j( d ƒ t) t* d t+ | ƒ ƒ qdWt) t, d ƒ n |  j( d ƒ |  j d k s|  j d k r;|  j r+t  t ƒ n  |  j- d ƒ n  |  j r§t. |  j/ ƒ t. |  j	 ƒ k r›g  |  _/ d } x¤ |  j	 D] } |  j/ j0 | j1 ƒ q{Wn} d } x; |  j	 D]0 } |  j/ | | j1 k rÑd } Pn  | d } q«W| rg  |  _/ x' |  j	 D] } |  j/ j0 | j1 ƒ qøWn  t. |  j2 ƒ t. |  j	 ƒ k rrg  |  _2 d } xÔ |  j	 D] } |  j2 j0 | j3 ƒ  ƒ qOWnª d } xJ |  j	 D]? } | j1 r·|  j2 | | j3 ƒ  k r·d } Pq·n  | d } q‚W| rg  |  _2 x* |  j	 D] } |  j2 j0 | j3 ƒ  ƒ qÞWn  |  j |  j4 k rd } n  |  j ƒ  } t5 j6 ƒ  } x |  j	 D] } | j0 | ƒ q>Wt7 j8 ƒ  } x | D] } | j0 | ƒ qhWt7 j9 | | | | | | |  j | ƒ n  |  j |  _4 |  j: d ƒ t t ƒ t t ƒ |  j; sêt t ƒ n  t t ƒ t< t= t> ƒ t t ƒ t t t ƒ t? t@ t ƒ t? tA t ƒ t? tB d ƒ t? tC d ƒ t? tD d ƒ t? tE d ƒ t tF ƒ |  j: d d d ƒ|  jG d |  _G tH jH ƒ  } | |  jI d k r	|  jG |  jJ tH jH ƒ  |  jI } d | d } |  jK jL | ƒ |  jG |  _J | |  _I n  |  jM d k rCtN jO ƒ  jP ƒ  d k rC|  jK j: ƒ  qCn  t t ƒ t t ƒ tQ ƒ  d	 S(
   sg   
        Call the display lists and draw them at the
        correct position and orientation.
        i    i   g      ð?s   antialias stept   oft   texts   %4.0fs    fpsN(R   R  t   GL_NORMALIZER¶  RØ   t   smooth_linet   GL_LINE_SMOOTHt   GL_POINT_SMOOTHR  RÅ  R~   R  t   move_originR¢  t   GL_FOGt   glPixelTransferit   GL_MAP_COLORt   GL_FALSEt   GL_TEXTURE_2Dt   GL_BLENDR	  t   glDepthMaskR  t   glDepthFunct   GL_LESSR6  R7  R3  R8  RÁ  R‰  t   getaxesR{   RË   R!   R"   R#   t   glCleart   GL_COLOR_BUFFER_BITt   GL_DEPTH_BUFFER_BITRÄ  R‚  t   glAccumt   GL_ACCUMRS   t	   GL_RETURNR€  RA   R   R6   t   visibleR€   t   GetAlphat   old_antialiast   xmapviewt   DisplayobjectVectorRÆ   t   DoubleDoubleVectort   DrawSortedTransparentPrimitivest   drawt   cue_textt   glBlendFunct   GL_SRC_ALPHAt   GL_ONE_MINUS_SRC_ALPHAt   glPixelStoreit   GL_UNPACK_SWAP_BYTESt   GL_UNPACK_LSB_FIRSTt   GL_UNPACK_ROW_LENGTHt   GL_UNPACK_SKIP_ROWSt   GL_UNPACK_SKIP_PIXELSt   GL_UNPACK_ALIGNMENTt	   GL_ALWAYSt   nframesR   t   previous_timet   previous_framesRÈ   t   SetTextt   show_fpst
   font_cachet	   FontCachet   NumberOfFontst   glFlush(   R   R´  R~   R¾  R¼  R½  R¿  RY  t	   invacsizeRú   Ru   t   obt   iobt   cobjsRG   t   jt   tt   fpsRÅ   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt	   drawlistsY  sæ    
	


			






	 							 	(

	 


!

c   2   	   C   s–  t  j |  j ƒ } | d k r' | } n	 |  j } | d k rH |  j } n  d d  l } d d  l } | j | ƒ } | d k rþ |  j |  j	 |  j
 } d }	 d }
 t |	 | |
 ƒ } t |	 | |
 ƒ } d t | ƒ d t | ƒ d } | j | | | ƒ n | j | | | ƒ xq t t |  j ƒ ƒ D]Z } |  j | j d	 k r'|  j | j | | |  j |  j d	 |  j d
 |  j d ƒ q'q'W|  j rht d
 d	 d	 ƒ } t d	 d
 d	 ƒ } t d	 d	 d
 ƒ } |  j j ƒ  } | | } | | } | | } d | j ƒ  d } d | j ƒ  d } d | j ƒ  d } d | j ƒ  d } d | j ƒ  d } d | j ƒ  d } d | j ƒ  d } d | j ƒ  d } d | j ƒ  d } d | j ƒ  d } d | j ƒ  d } d | j ƒ  d } t  j d	 d	 d
 d
 d ƒ } | j ƒ  | }  | j ƒ  | }! | j ƒ  | }" | j ƒ  | }# | j ƒ  | }$ | j ƒ  | }% d |  j ƒ  d }& d |  j ƒ  d }' d |! j ƒ  d }( d |! j ƒ  d }) d |" j ƒ  d }* d |" j ƒ  d }+ d |# j ƒ  d }, d |# j ƒ  d }- d |$ j ƒ  d }. d |$ j ƒ  d }/ d |% j ƒ  d }0 d |% j ƒ  d }1 | j d t | ƒ d t | ƒ d ƒ | j d t | ƒ d t | ƒ d ƒ | j d t | ƒ d t | ƒ d ƒ | j d t | ƒ d t | ƒ d ƒ | j d t | ƒ d t | ƒ d ƒ | j d t | ƒ d t | ƒ d ƒ | j d t |& ƒ d t |' ƒ d t | ƒ d t | ƒ d t |( ƒ d t |) ƒ d ƒ | j d t |* ƒ d t |+ ƒ d t | ƒ d t | ƒ d t |, ƒ d t |- ƒ d ƒ | j d t |. ƒ d t |/ ƒ d t | ƒ d t | ƒ d t |0 ƒ d t |1 ƒ d ƒ n  | j | ƒ | j ƒ  | j | |  j ƒ d  S(   NR   iÿÿÿÿt   BBoxi)  i¥  s   BoundingBox: s    0 s    843i    i   i   i  i(   i  i2   i   i#   s   1.0 slw n 530.000 780.000 m t    s    l  cp 0 0 0 srgb s
s!   /CenturySchoolbookL ff 16 scf sf s(    m gs 1 1 sc (x) 0 0 0 srgb sh gr %TEXT
s(    m gs 1 1 sc (y) 0 0 0 srgb sh gr %TEXT
s(    m gs 1 1 sc (z) 0 0 0 srgb sh gr %TEXT
s
   1.0 slw n s    m s    l s    l cp fill gs 0 0 0 srgb s gr
(    RK   RL   RN   t   ps_filenamet   ps_papert   streamst   psutilt   ofstreamt   xyratioRÑ   RÒ   t   intt   strt   PSHeaderRË   RA   R~   Rß  t   DrawPostscriptRP   RQ   RŸ  R   t   getInvMatrixR”  R•  t	   getMatrixt   Printt   PSTailt   Closet   zsortpsR¢  (2   R   t
   psfilenamet   papert   qt   fnameR  R	  t   streamt   ratioR¼  R½  t   leftbbt   rightbbt   bounding_boxRu   t   x_axist   y_axist   z_axist   mt   x_xt   x_yt   y_xt   y_yt   z_xt   z_yt   x_x_tt   x_y_tt   y_x_tt   y_y_tt   z_x_tt   z_y_tt   arrowrott	   x_arrow_pt	   x_arrow_mt	   y_arrow_pt	   y_arrow_mt	   z_arrow_pt	   z_arrow_mt   x_arrow_p_xt   x_arrow_p_yt   x_arrow_m_xt   x_arrow_m_yt   y_arrow_p_xt   y_arrow_p_yt   y_arrow_m_xt   y_arrow_m_yt   z_arrow_p_xt   z_arrow_p_yt   z_arrow_m_xt   z_arrow_m_y(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR  ï  s�    		"B	


))))))aad
c      	   C   sS  t  j |  j ƒ } | d k r' | } n	 |  j } t j j | ƒ rR t j | ƒ n  | d } t j j | ƒ r~ t j | ƒ n  d d  l } | j	 | ƒ } | j
 d ƒ | j
 d ƒ | j
 d ƒ | j
 d ƒ | j
 d t |  j d	 |  j d
 ƒ d ƒ | j
 d t |  j d	 |  j d
 |  j |  j |  j ƒ d ƒ | j
 d ƒ | j
 d t |  j d ƒ d t |  j d ƒ d t |  j d	 ƒ d ƒ x| |  j D]q } | j d k rŸ| j
 d t | j d d ƒ d t | j d d ƒ d t | j d	 d ƒ d ƒ qŸqŸW|  j r~|  j d k r~| j
 d t |  j d ƒ d t |  j d ƒ d t |  j d	 ƒ d ƒ q~n  xq t t |  j ƒ ƒ D]Z } |  j | j d k r”|  j | j | | |  j |  j d |  j d |  j d	 ƒ q”q”W|  j r´
|  j d	 |  j d
 |  j |  j |  j d d }	 |  j d	 |  j d
 d d }
 t  j |	 |
 d ƒ } t  j |  j d	 |  j d
 |  j |  j d d d d ƒ } t  j d |  j d	 |  j d
 |  j |  j d d d ƒ } t  j d d |  j d	 |  j d
 |  j |  j d d ƒ } d |  j d	 |  j d
 |  j |  j d } | j ƒ  | } | j ƒ  | } | j ƒ  | } | | } | | } | | } | | d } | | d } | | d } d t  |  j d ƒ d t  |  j d ƒ d  t  |  j d	 ƒ } | d! k rd" } n d# } | j
 d$ ƒ | j
 d% t |	 ƒ d t |
 ƒ d& ƒ | j
 d' t | ƒ d( ƒ | j
 d) ƒ | j
 | ƒ | j
 d* ƒ | j
 d+ ƒ | j
 d ƒ | j
 d, ƒ | j
 d% t | j! ƒ  ƒ d t | j" ƒ  ƒ d- ƒ | j
 d' t | d	 ƒ d. ƒ | j
 d% t | j! ƒ  ƒ d t | j" ƒ  ƒ d- ƒ | j
 d/ ƒ | j
 d) ƒ | j
 | ƒ | j
 d* ƒ | j
 d+ ƒ | j
 d ƒ | j
 d, ƒ | j
 d% t | j! ƒ  ƒ d t | j" ƒ  ƒ d- ƒ | j
 d' t | d	 ƒ d. ƒ | j
 d% t | j! ƒ  ƒ d t | j" ƒ  ƒ d- ƒ | j
 d/ ƒ | j
 d) ƒ | j
 | ƒ | j
 d* ƒ | j
 d+ ƒ | j
 d ƒ | j
 d, ƒ | j
 d% t | j! ƒ  ƒ d t | j" ƒ  ƒ d- ƒ | j
 d' t | d	 ƒ d. ƒ | j
 d% t | j! ƒ  ƒ d t | j" ƒ  ƒ d- ƒ | j
 d/ ƒ | j
 d) ƒ | j
 | ƒ | j
 d* ƒ | j
 d+ ƒ | j
 d ƒ | j
 d0 ƒ | j
 d% t |	 ƒ d t |
 ƒ d- ƒ | j
 d% t | j! ƒ  ƒ d t | j" ƒ  ƒ d& ƒ | j
 d' t | ƒ d( ƒ | j
 d) ƒ | j
 | ƒ | j
 d* ƒ | j
 d+ ƒ | j
 d ƒ | j
 d0 ƒ | j
 d% t |	 ƒ d t |
 ƒ d- ƒ | j
 d% t | j! ƒ  ƒ d t | j" ƒ  ƒ d& ƒ | j
 d' t | ƒ d( ƒ | j
 d) ƒ | j
 | ƒ | j
 d* ƒ | j
 d+ ƒ | j
 d ƒ | j
 d0 ƒ | j
 d% t |	 ƒ d t |
 ƒ d- ƒ | j
 d% t | j! ƒ  ƒ d t | j" ƒ  ƒ d& ƒ | j
 d' t | ƒ d( ƒ | j
 d) ƒ | j
 | ƒ | j
 d* ƒ | j
 d+ ƒ | j
 d ƒ n  | j# ƒ  t j$ | | ƒ | } t | ƒ d1 k r| t | ƒ d1 d2 k r| t | ƒ d1  d3 } n
 | d3 } t j j | ƒ rGt j | ƒ n  | d } t j j | ƒ rst j | ƒ n  | j	 | ƒ } | j
 d4 ƒ | j
 d5 ƒ | j
 d6 ƒ | j
 d7 ƒ | j
 d8 ƒ | j
 d9 ƒ | j
 d: ƒ | j
 d; ƒ | j
 d< ƒ | j
 d= ƒ | j
 d> ƒ | j
 d? ƒ xq t t |  j ƒ ƒ D]Z } |  j | j d k r4|  j | j% | | |  j |  j d |  j d |  j d	 ƒ q4q4W|  j rÁt  j d@ d d ƒ } t  j d d@ d ƒ } t  j d d d@ ƒ } | j ƒ  | } | j ƒ  | } | j ƒ  | } t  j dA dA dB ƒ } | | } | | } | | } d t  |  j d ƒ d t  |  j d ƒ d  t  |  j d	 ƒ } | d! k r“dC } n dD } | j
 dE ƒ | j
 dF t | j! ƒ  ƒ d t | j" ƒ  ƒ dG ƒ | j
 dH ƒ | j
 dI ƒ | j
 dJ ƒ | j
 dK ƒ | j
 dL ƒ | j
 dM ƒ | j
 dN ƒ | j
 | ƒ | j
 dO ƒ | j
 dE ƒ | j
 dF t | j! ƒ  ƒ d t | j" ƒ  ƒ dG ƒ | j
 dH ƒ | j
 dI ƒ | j
 dJ ƒ | j
 dK ƒ | j
 dL ƒ | j
 dM ƒ | j
 dP ƒ | j
 | ƒ | j
 dO ƒ | j
 dE ƒ | j
 dF t | j! ƒ  ƒ d t | j" ƒ  ƒ dG ƒ | j
 dH ƒ | j
 dI ƒ | j
 dJ ƒ | j
 dK ƒ | j
 dL ƒ | j
 dM ƒ | j
 dQ ƒ | j
 | ƒ | j
 dO ƒ n  | j
 dR ƒ | j
 dS ƒ | j
 dT ƒ | j
 dU ƒ | j
 dV ƒ | j
 dW ƒ | j
 dX ƒ | j
 dY ƒ | j
 dZ ƒ | j
 d[ ƒ | j
 d\ ƒ | j
 d] ƒ | j
 d^ ƒ | j
 d_ ƒ | j
 d` ƒ | j
 da ƒ | j
 db ƒ | j
 dc ƒ | j
 db ƒ | j
 dd ƒ | j
 de ƒ | j
 df ƒ | j
 dV ƒ | j
 dg ƒ | j
 dh ƒ | j
 di ƒ | j
 dj ƒ | j
 dk ƒ | j
 dl ƒ | j
 dm ƒ | j
 dn ƒ | j
 do ƒ | j
 dp ƒ | j
 dq ƒ | j
 dr ƒ | j
 ds ƒ | j
 dt ƒ | j
 du ƒ | j
 dv ƒ | j
 dw ƒ | j
 dx ƒ | j
 dy ƒ | j
 dz ƒ | j
 d{ ƒ | j
 d| ƒ | j
 d} ƒ | j
 d~ ƒ | j
 d ƒ | j
 d€ ƒ | j
 d� ƒ | j
 d‚ ƒ | j
 dƒ ƒ | j
 d„ ƒ | j
 d… ƒ | j
 d† ƒ | j
 d‡ ƒ | j
 dˆ ƒ | j
 d‰ ƒ | j
 dŠ ƒ | j
 d‹ ƒ | j
 dŒ ƒ | j
 d� ƒ | j
 dŽ ƒ | j
 d� ƒ | j
 d} ƒ | j
 d� ƒ | j
 d‘ ƒ | j
 d’ ƒ | j# ƒ  t j$ | | ƒ d  S(“   NR   s   -tmpiÿÿÿÿs   #include "colors.inc"
s	   camera {
s    orthographic location <0,0,-60>
s   look_at <0,0,0>s   up <0,i   i<   s   ,0>s   right <s   ,0,0>s   }
s   background { color rgb <i    t   ,i   s   > }
s   light_source { <i
   s   >color  White}
gš™™™™™¹?s   fog { distance 100 colour rgb<g       @gš™™™™™é?i7   g{®Gáz„?g      ø?g‰A`åÐ"Ó?gbX9´Èâ?gÉv¾Ÿ/½?g      à?s$       pigment { color rgb <0, 0, 0> }
s$       pigment { color rgb <1, 1, 1> }
s	   sphere {
s    < s   ,-55>
R  s   
s    texture {
s&       finish {diffuse 1.0 specular 1.0}
s    }
s   cone {
s   ,-55>,
s   ,
s    0
s   cylinder {
i   s   .povs   -pov.pys   import image_info
s   import sys
s   import math
s   if len(sys.argv)<2:
s/     print "Usage: "+sys.argv[0]+" rendered_file"
s(     print "eg "+sys.argv[0]+" myfile.png"
s     sys.exit()
s   import font_cache
s   text_labels = []
s   image_labels = []
s   ok_font = ''
s   bad_fonts = []
g{®Gáz´?gÍÌÌÌÌÌì?g        s   label["colour"]=[0,0,0]
s   label["colour"]=[1,1,1]
s	   label={}
s   label["position"]=[s   ]
s	   font ={}
s&   font["family"]="Century Schoolbook L"
s   font["weight"]="medium"
s   font["slant"]="r"
s   font["size"]="24"
s   label["font"]=font
s   label["text"]="x"
s   text_labels.append(label)
s   label["text"]="y"
s   label["text"]="z"
s+   iinfo = image_info.image_info(sys.argv[1])
s"   new_name = "labelled"+sys.argv[1]
s   iinfo.write(new_name)
s   for image in image_labels:
s*     iinfo = image_info.image_info(new_name)
s;     overlay_iinfo = image_info.image_info(image["filename"])
s3     overlay_width = float(overlay_iinfo.get_width())
s5     overlay_height = float(overlay_iinfo.get_height())
s8     overlay_width = int(overlay_width * image["scale_w"])
s:     overlay_height = int(overlay_height * image["scale_h"])
s#     width = float(iinfo.get_width())
s%     height = float(iinfo.get_height())
s     overlay_iinfo.invert()
s9     overlay_iinfo.ScaleImage(overlay_width,overlay_height)
s2     x = int(math.floor(width*image["position"][0]))
s3     y = int(math.floor(height*image["position"][1]))
s     iinfo.invert()
s#     iinfo.Overlay(overlay_iinfo,x,y)
s     iinfo.write(new_name)
s&   font_cache.FontCache().LoadAllFonts()
s   for label in text_labels:
s     text = label["text"]
s     colour = label["colour"]
s$     red = hex(int(colour[0]*255))[2:]
s&     green = hex(int(colour[1]*255))[2:]
s%     blue = hex(int(colour[2]*255))[2:]
s      if len(red)==1: red = "0"+red
s&     if len(green)==1: green = "0"+green
s#     if len(blue)==1: blue = "0"+blue
s"     hex_colour = "#"+red+green+blue
s#     family = label["font"]["family"]
s#     weight = label["font"]["weight"]
s!     slant = label["font"]["slant"]
s$     size = int(label["font"]["size"])
s2     x = int(label["position"][0]*iinfo.get_width())
sK     y = iinfo.get_height()-int(label["position"][1]*iinfo.get_height())-size
s     idx = -1
s     try:
s'       idx=bad_fonts.index(label["font"])
s
     except:
s	       pass
s     if idx >-1 and ok_font:
s       finfo = ok_font
s     else:
sK       finfo = font_cache.FontCache().GetFont("",family,weight,slant,"",size)
s     if not finfo.isValid():
s$       bad_fonts.append(label["font"])
s.       finfo = font_cache.FontCache().GetFont(0)
s     if finfo.isValid():
s       if int(finfo.Size())==0:
sf         finfo2 = font_cache.FontCache().GetFont("",finfo.Family(),finfo.Weight(),finfo.Slant(),"",size)
s          if int(finfo2.Size())==0:
sm           newsize = font_cache.FontCache().FindNextFontSize(finfo.Family(),finfo.Weight(),finfo.Slant(),12,1);
sk           finfo2 = font_cache.FontCache().GetFont("",finfo.Family(),finfo.Weight(),finfo.Slant(),"",newsize)
s"           if int(finfo2.Size())==0:
sA             print "Failed to load any font to overlay text labels"
sL             print "Maybe you need to set DISPLAY (if on Unix/Linux/Mac OS X)"
s             sys.exit()
s         finfo = finfo2
s       ok_font = finfo
sf       iinfo2 = image_info.image_infoPtr(font_cache.OverlayTextOnImage(iinfo,finfo,x,y,text,hex_colour))
s       iinfo2.write(new_name)
s;       print "Failed to load any font to overlay text labels"
sF       print "Maybe you need to set DISPLAY (if on Unix/Linux/Mac OS X)"
s       sys.exit()
(&   RK   RL   RN   t   pov_filenameR†   t   patht   existst   removeR  R
  R  R  RI   RP   R  RÑ   RÒ   RÓ   Rô   Rõ   Rö   R¢  t   background_alphaRË   RA   R~   Rß  t
   DrawPovRayRQ   RŸ  R   R  RS   R”  R•  R  t   renamet   OutputTextLabels(   R   t   filenameR  R  t	   fname_tmpR  R  Rû   Ru   t   xpost   ypost   axot   xaxt   yaxt   zaxt   ax_widtht   xaxpt   yaxpt   zaxpt   xaxendt   yaxendt   zaxendt   xaxend2t   yaxend2t   zaxend2t   colour_yt   axes_col_labelt	   fname_old(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRH  O  s   		
-BL`	RB	5 ===.


A	)555555)5)5)5
,

B	


A	555
c   
   	   C   sÌ  t  j |  j ƒ } x³t t |  j ƒ ƒ D]œ} |  j | j d k r( |  j | } | | _ t ƒ  | j	 ƒ  | j
 ƒ  | d k rµ | j | |  j |  j d |  j d |  j d ƒ n
 | j ƒ  | j ƒ  } | j } t | j ƒ } | d k rºt | ƒ | k rºt | ƒ | k rº|  j d k rº| j ƒ  rºx‰ t | ƒ D]x }	 t ƒ  t | |	 j ƒ  j ƒ  ƒ | d k r¢| j | |  j |  j d |  j d |  j d ƒ n
 | j ƒ  t ƒ  q;Wn  t ƒ  q( q( Wd  S(   Ni    i   i   (   RK   RL   RN   RË   RA   R~   Rß  t   camera_quatt   glPushMatrixt   ApplyTranslationt   ApplyRotationt	   draw_textRP   RQ   t   draw_imagest   GetNumSymmetryMatricest   symm_nost   MatrixVectort   symm_matt   draw_symmetryt   GetDrawSymmetryt   glMultMatrixdt	   Transposet   to_dpt   glPopMatrix(
   R   t   transparentRÉ  R  Ru   R~   t   nsymRg  Ri  t   isym(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRæ  a  s.    	

4
	K4
c   
   	   C   så  t  j |  j ƒ } xÌt t |  j ƒ ƒ D]µ} |  j | j d k r( |  j | } | | _ t ƒ  | j	 ƒ  | j
 ƒ  | d k rµ | j | |  j |  j d |  j d |  j d ƒ nÖ |  j |  j k rí | j ƒ  d k rí t |  j | ƒ n  |  j |  j k s| j ƒ  d k r‹|  j rx|  j |  j k rx|  j |  j k rx|  j |  j k rx|  j |  j k rx| j |  j | ƒ q‹| j d | ƒ n  | j ƒ  } | j } t | j ƒ } | j  ƒ  rÈ| j! ƒ  n  | d k rÓt | ƒ | k rÓt | ƒ | k rÓ|  j" d k rÓ| j# ƒ  rÓx½t | ƒ D]¬}	 t ƒ  t$ | |	 j% ƒ  j& ƒ  ƒ | d k r‡| j | |  j |  j d |  j d |  j d ƒ n>|  j |  j k r'| j ƒ  d k r'|  j' r| j( ƒ  r| |	 t |  j) ƒ k  rú| j |  j) | |	 | d ƒ q$| j |  j | d ƒ q't |  j | ƒ n  |  j |  j k sK| j ƒ  d k rÅ|  j r²|  j |  j k r²|  j |  j k r²|  j |  j k r²|  j |  j k r²| j |  j | ƒ qÅ| j d | ƒ n  t* ƒ  q Wn  t* ƒ  q( q( Wd  S(   Ni    i   i   Rw  (+   RK   RL   RN   RË   RA   R~   Rß  R`  Ra  Rb  Rc  Rd  RP   RQ   R¯  R°  Rx  t
   glCallListRÖ   t	   IMMEDIATER{  R.  R-  R|  R}  R~  R€  R2   Rf  Rg  Rh  Ri  t   GetDrawUnitCellt   DrawUnitCellRj  Rk  Rl  Rm  Rn  t   symm_diff_colourt   GetDrawSymmetryColouredR3   Ro  (
   R   Rp  RÉ  R  Ru   R~   Rq  Rg  Ri  Rr  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR€  ˆ  sN    	

4$$Q	K4$!$Qc   
   	   C   s  t  j |  j ƒ } xùt t |  j ƒ ƒ D]â} |  j | j d k r( |  j | } | | _ t ƒ  | j	 ƒ  | j
 ƒ  | d k rµ | j | |  j |  j d |  j d |  j d ƒ nù |  j |  j k rí | j ƒ  d k rí t |  j | ƒ n  |  j |  j k s| j ƒ  d k r®t j j |  j ƒ |  j r‹|  j |  j k r‹|  j |  j k r‹|  j |  j k r‹|  j |  j k r‹| j |  j | ƒ n | j d | ƒ t j j d ƒ n  | j  ƒ  } | j! } t" | j# ƒ } | d k r t | ƒ | k r t | ƒ | k r |  j$ d k r | j% ƒ  r xàt | ƒ D]Ï}	 t ƒ  t& | |	 j' ƒ  j( ƒ  ƒ | d k r‘| j | |  j |  j d |  j d |  j d ƒ na|  j |  j k r1| j ƒ  d k r1|  j) r| j* ƒ  r| |	 t |  j+ ƒ k  r| j |  j+ | |	 | d ƒ q.| j |  j | d ƒ q1t |  j | ƒ n  |  j |  j k sU| j ƒ  d k ròt j j |  j ƒ |  j rÏ|  j |  j k rÏ|  j |  j k rÏ|  j |  j k rÏ|  j |  j k rÏ| j |  j | ƒ n | j d | ƒ t j j d ƒ n  t, ƒ  q*Wn  t, ƒ  q( q( Wd  S(   Ni    i   i   Rw  (-   RK   RL   RN   RË   RA   R~   Rß  R`  Ra  Rb  Rc  Rd  RP   RQ   R¯  R°  Rx  Rs  R×   Rt  RÆ   t   RenderQualityt   SetRenderQualityt   render_qualityR{  R.  R-  R|  R}  R~  R‚  R2   Rf  Rg  Rh  Ri  Rj  Rk  Rl  Rm  Rn  Rw  Rx  R3   Ro  (
   R   Rp  RÉ  R  Ru   R~   Rq  Rg  Ri  Rr  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR‚  Ä  sR    	

4$$Q	K4$!$Qc         C   s(   | |  j  k r$ | |  _  d |  _ n  d S(   s]   
        Get info about how big the viewport should
        be and request resizing.
        i   N(   RI   RW  (   R   t   size(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   setmaxviewsize  s    	c         C   s8   d |  _  |  j d j ƒ  |  j d j ƒ  d |  _ d  S(   Ni    i   (   Rç   Rè   Rê   R   (   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   UnDefineSlab  s
    		c         K   s�   | r$ t  | ƒ d k r$ d |  _ n  | r< t | ƒ |  _ n  d d d |  j d f |  j d _ d d d |  j d f |  j d _ d |  _ d  S(   Ni   i    i   iÿÿÿÿ(   R  Rç   RS   Rñ   Rè   Rò   R   (   R   t   widthRé   t   keywords(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt
   DefineSlab%  s      ##c         C   s   d  S(   N(    (   R   t   dist(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   MoveSlab,  s    c         C   s0   t  | ƒ } |  j | |  _ |  j |  j ƒ d  S(   N(   RS   Rñ   R�  (   R   t   delta(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt
   ExpandSlab0  s    c         C   s   |  j  |  j g S(   N(   RÑ   RÒ   (   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   GetWindowSize5  s    c         C   s   | |  _  | |  _ d |  _ d  S(   Ni   (   t   NEARt   FARRW  (   R   t   neart   far(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   set_default_clip_planes8  s    		c         C   s¡  |  j  | | } t t ƒ t ƒ  t d d | | ƒ |  j |  j k rc t d | |  j |  j	 ƒ n  |  j |  j
 k r�| d k r¹ t |  j | |  j | |  j |  j |  j |  j	 ƒ q�t t j |  j ƒ ƒ } | | } | | | | } |  j | d | | } |  j d | | }	 | | | | d }
 | d | | | d } | |	 | |	 d } | d |	 | |	 d } t |
 | | | |  j |  j	 ƒ n  d  S(   Ni    i-   iÿÿÿÿi   i   (   R  R?  R@  RA  t
   glViewportR…  R†  t   gluPerspectiveR‡  Rˆ  R‡  t   glOrthoRI   R  t   matht   sqrtt
   dumpbitmap(   R   R   t   wt   hR  t   nsecR   Ru   t   maxdim_xt   maxdim_yt   xstartt   xendt   ystartt   yend(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   SetScreenSection=  s&    
8
c         C   sq  | d k r d } n  | d k r* d } n  |  j  | | } t t ƒ t ƒ  t d d | | ƒ |  j |  j k r� t d | |  j |  j	 ƒ n  |  j |  j
 k rç t |  j | |  j | |  j |  j |  j |  j	 ƒ t j ƒ  j ƒ  n  d t |  j ƒ t | ƒ t |  j ƒ d |  _ d t |  j ƒ t | ƒ t |  j ƒ d |  _ d | |  _ d | |  _ |  j d	 d	 ƒ |  j | d
 | d
 ƒ | |  _ | |  _ |  j j d ƒ d k rft t ƒ } yF | j d ƒ d } d | d d d } t j | ƒ } | sd SWn d SX|  j  r-|  `  d |  _  n  t! |  j |  j ƒ |  _  |  j" d k rf|  j  |  _# qfn  t$ ƒ  d S(   s2   
        OpenGL resize callback function.
        i    i   i-   g       @g      N@g      à?i   i   iûÿÿÿi   s   Mesa DRIiÿÿÿÿRz   s   "OpenGL renderer string:"s   glxinfo| grep s
   |grep -q "s-   Mesa DRI Intel(R) 945GM 20050225 x86/MMX/SSE2s   "Ng      „@g      €@(%   R  R?  R@  RA  RŒ  R…  R†  R�  R‡  Rˆ  R‡  RŽ  RI   RÆ   RÇ   t   SetMatricesRS   RP   t
   movescalext
   movescaleyt	   rotscalext	   rotscaleyt   set_rubber_band_startt   set_rubber_band_endRÑ   RÒ   RE  t   findR…   R†   R‡   Rˆ   R©  t   OffScreenBufferR«  Rª  R   (   R   R’  R“  R  R­   R®   R¯   R°   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRš   Z  sN    		
511		 	c   
      C   s  | j  } | j } t j | d | d | d d ƒ } | j | ƒ | j ƒ  } t j | ƒ t j | ƒ } } t j d d d d d d d d d d d d d d d d d d g ƒ } t j d d d d d d d d d d d d d d d d d d g ƒ }	 | | } | |	 } | | f S(   sà   
        Apply the quaternion rotation +- a small variation
        to get two rotation matrices which will be used to
        rotate the stereo pair. Also apply the mean rotation
        to the actual display list.
        i    i   i   i   gš™™™™™¹¿gš™™™™™¹?(   RN   t   drotRK   RL   t   postMultR  t   matrix(
   R   R�  RN   R¥  t   rotQt   glrotmatt	   glrotmat1t	   glrotmat2t
   shear_plust   shear_minus(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   applystereoshearˆ  s"    		$

c         C   sÀ   | j  } | j } t j d |  j d d ƒ } | j | ƒ | j ƒ  } t j d d |  j d d ƒ } | j | ƒ | j ƒ  } t j | d | d |  j | d d ƒ } | j | ƒ | | f S(   sà   
        Apply the quaternion rotation +- a small variation
        to get two rotation matrices which will be used to
        rotate the stereo pair. Also apply the mean rotation
        to the actual display list.
        i    iþÿÿÿi   i   (   RN   R¥  RK   RL   t   stereo_angleR¦  R  (   R   R�  RN   R¥  R¨  Rª  R«  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   applystereorotation¥  s    		+c         C   s„   g  | j  _ | j  j j | j  j d ƒ | j  j j | j  j d ƒ | j  j j | j  j d ƒ | j  j j | j  j d ƒ d S(   s‡   
        Copy one objects quaternion representation
        to another. Probably should be in displayobject
        class ....
        i    i   i   i   N(   RN   t   dvalR6   (   R   t   obj1t   obj2(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   copyrotation½  s
    c         C   s   d d d d g | j  _ d S(   s`   
        Reset an objects quaternion representation
        to the unit representation.
        g      ð?g        N(   RN   R±  (   R   R�  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   resetrotationÉ  s    c         C   sâ   t  j d d d d d ƒ } t  j d d d d d ƒ } | j } | j } t  j | d | d | d d ƒ } | j | ƒ t  j | ƒ } | j | ƒ t  j | ƒ } | j | ƒ | j ƒ  }	 | j ƒ  }
 | j ƒ  } |	 |
 | f S(   sœ   
        Apply the rotation to the world's quaternion 
        and return the corresponding rotation matrix for the
        OpenGL transformations.
        i   i    iZ   i   (   RK   RL   RN   R¥  R¦  R  (   R   R�  t   quatxt   quatyRN   R¥  R¨  t   quat2xt   quat2yR©  t	   glrotmatxt	   glrotmaty(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   applyorthorotationsÐ  s    		$c         C   sS   | j  } | j } t j | d | d | d d ƒ } | j | ƒ | j ƒ  } | S(   sœ   
        Apply the rotation to the world's quaternion 
        and return the corresponding rotation matrix for the
        OpenGL transformations.
        i    i   i   (   RN   R¥  RK   RL   R¦  R  (   R   R�  RN   R¥  R¨  R©  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   applyrotationî  s    		$c         C   sí   |  j  t |  j d ƒ t |  j d ƒ ƒ } | d } | d } |  j  t |  j ƒ t |  j d ƒ ƒ } | d } |  j  t |  j d ƒ t |  j ƒ ƒ } | d } | | } | | }	 | | }
 | j ƒ  |	 j ƒ  |
 j ƒ  | |	 |
 f S(   s2   
        Return the eyes' x,y and z axes.
        i   i   i    (   t   getxyzRS   RÑ   RÒ   t	   normalize(   R   t   dumt   xyzot   xyzft   dum2t   xyzrt   dum3t   xyzut   xaxist   yaxist   zaxis(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRØ  ÿ  s    ,

(
(






c         C   s+  |  j  |  _ |  j |  _ |  j d k r5 t t ƒ d  Sd |  j |  j } t | d |  j |  j	 |  j ƒ } t
 |  j d ƒ } t
 | d |  j |  j	 |  j ƒ | |  j } t t ƒ t |  j d |  j d |  j d |  j d ƒ } t t t ƒ t t | ƒ t t | ƒ t t | ƒ t | ƒ d  S(	   Ni    g      à?g      4@g®Gáz®ï?g      D@i   i   i   (   R‡  t	   FOG_STARTRˆ  t   FOG_ENDR¢  R  RÏ  t   maxRñ   RP   Rý   t   fog_strengthR  t   newfv4RÓ   t   glFogit   GL_FOG_MODEt	   GL_LINEARt   glFogfvt   GL_FOG_COLORt   glFogft   GL_FOG_STARTt
   GL_FOG_ENDt   delcGLfp(   R   R‚  t   fog_nearRÍ  t   fog_fart	   fogcolour(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt	   setup_fog  s     
$/
1c         C   s®  t  t t t t ƒ | d k ræ |  j |  j k sU |  j |  j k sU |  j |  j k rk t  t t t t ƒ n  |  j |  j k r“ t  t t t t ƒ n  |  j |  j k r» t  t t t t ƒ n  |  j |  j	 k rªt  t t t t ƒ qªnÄ |  j |  j k rt  t t t t ƒ n  |  j |  j k r6t  t t t t ƒ n  |  j |  j k r^t  t t t t ƒ n  |  j |  j k s”|  j |  j k s”|  j |  j	 k rªt  t t t t ƒ n  d S(   si   
        Determine and set the colour mask for each eye
        when doing colour filter stereo.
        t   leftN(
   t   glColorMaskR  R.  t   REDBLUEt   REDGREENt   REDCYANRÒ  t   BLUEREDt   GREENREDt   CYANRED(   R   t   eye(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   set_colourmask4  s$    66c   	      C   s”  t  t ƒ t  t ƒ t ƒ  t ƒ  t t ƒ t  t ƒ t  t ƒ |  j	 rm t
 t ƒ t t t ƒ t
 t ƒ n
 t  t ƒ t d |  j d d |  j d d |  j d ƒ |  j | | } |  j | } |  j } t d d d ƒ t |  j |  j |  j ƒ t d | d d ƒ | j ƒ  } t | ƒ t | ƒ t d ƒ t t ƒ t d d d ƒ t d d d ƒ t d d d ƒ t d d d ƒ t d d d ƒ t d d d ƒ t d d d ƒ t d d	 d ƒ t d d d ƒ t d d
 d ƒ t d d d ƒ t d	 d d ƒ t d d d ƒ t d
 d d ƒ t d d d ƒ t d	 d d ƒ t d d d ƒ t d
 d d ƒ t ƒ  t  t ƒ t  t ƒ t t t ƒ t t t  ƒ t! t" t# ƒ t! t$ t# ƒ t! t% d ƒ t! t& d ƒ t! t' d ƒ t! t( d ƒ t) j* ƒ  j+ ƒ  d k r |  j, s|  j- s|  j. r t/ j0 d d d ƒ } t1 j2 t/ j0 d d d ƒ d | ƒ |  _, |  j, j3 d ƒ t/ j0 d d d ƒ } t1 j2 t/ j0 d d d ƒ d | ƒ |  _- |  j- j3 d ƒ t/ j0 d d d ƒ } t1 j2 t/ j0 d d d ƒ d | ƒ |  _. |  j. j3 d ƒ n  |  j, r|  j- r|  j. r|  j, j4 d |  j d d |  j d d |  j d d ƒ |  j, j5 ƒ  |  j- j5 ƒ  |  j. j5 ƒ  n  t6 ƒ  t t7 ƒ d  S(   Ni   i    i   iØÿÿÿgš™™™™™é?g      ð?gš™™™™™¹?g{®Gáz´?g{®Gáz„?g{®Gáz„¿g¤p=
×£À?RN  i   RO  t   z(8   R  Rï   Rð   Ra  RA  RÖ  Rò  RÔ  R	  RË  R  Rè  Ré  Rê  RÌ  RŽ  RÓ   R  RI   RÂ  t   glScalefRn  Rl  t   deldpR�  R�  t   GL_LINESR’  R—  RÏ  RÐ  RÑ  R  Rë  Rì  RÒ  Rí  Rî  Rï  Rð  Rñ  Rø  Rù  Rú  t   axes_xt   axes_yt   axes_zRK   R   RÆ   t   TextRÉ   t	   SetColourRæ  Ro  R×  (	   R   R©  R’  R“  R  t   scale_xt   scale_yt   matp1t   cart(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   DrawAxesM  sŒ    




	

1	





6''':c         C   sø  t  t ƒ t ƒ  |  j d k sK |  j d k  sK |  j |  j d k  sK d rb d |  j |  j } n d } t d d | ƒ |  j |  j k rÅ t d t	 |  j
 ƒ d t	 |  j
 ƒ d t	 |  j
 ƒ ƒ n  |  j ƒ  |  j ƒ  |  j ƒ  t |  j d |  j d |  j d |  j ƒ |  j r¤|  j d k r�|  j d k rpt t ƒ t t t Bt Bƒ t t ƒ t t t Bt Bƒ q¡t t ƒ t t t Bt Bƒ qt t t Bt Bƒ nz |  j d k r|  j d k rõt t ƒ t t t Bƒ t t ƒ t t t Bƒ qt t ƒ t t t Bƒ n t t t Bƒ t t t t t ƒ |  j d k r|  j |  j k rj|  j  |  ƒ \ } } n |  j! |  ƒ \ } } | j" ƒ  } t# | ƒ t$ | ƒ |  j% ƒ  \ |  _& |  _' |  _( |  j) |  j* |  j+ |  j, |  j- f ƒ |  _* |  j. ƒ  t |  j* d |  j* d |  j* d ƒ |  j/ } |  j0 |  j1 k r:d } n  |  j) d
 |  j
 d t	 | ƒ d d f ƒ \ } }	 }
 t | |	 |
 ƒ |  j0 |  j2 k sµ|  j0 |  j3 k sµ|  j0 |  j4 k rÅ|  j5 d ƒ n  |  j0 |  j6 k rä|  j7 ƒ  n  |  j0 |  j2 k s|  j0 |  j3 k s|  j0 |  j4 k r0t t t t t ƒ n  t  t ƒ t ƒ  |  j d k s{|  j d k  s{|  j |  j d k  s{d r’d |  j |  j } n d } t d d | ƒ |  j |  j k rõt d t	 |  j
 ƒ d t	 |  j
 ƒ d t	 |  j
 ƒ ƒ n  | j" ƒ  } t# | ƒ t$ | ƒ |  j% ƒ  \ |  _& |  _' |  _( t |  j* d |  j* d |  j* d ƒ |  j) d |  j
 d t	 | ƒ d d f ƒ \ } }	 }
 t | |	 |
 ƒ |  j0 |  j1 k r½t t ƒ n  |  j0 |  j2 k só|  j0 |  j3 k só|  j0 |  j4 k r|  j5 d	 ƒ n  |  j0 |  j1 k r0t t ƒ t t t Bƒ n  |  j0 |  j8 k rO|  j7 ƒ  n  |  j0 |  j2 k s…|  j0 |  j3 k s…|  j0 |  j4 k r›t t t t t ƒ n  |  j9 rÔ|  j0 |  j1 k rÔ|  j: | | d | | ƒ n  |  j9 rê|  j0 |  j1 k rê|  j: | | | ƒ |  j: | | | ƒ qênÏ |  j; |  ƒ } | j" ƒ  } t# | ƒ t$ | ƒ |  j% ƒ  \ |  _& |  _' |  _( |  j) |  j* |  j+ |  j, |  j- f ƒ |  _* |  j. ƒ  t |  j* d |  j* d |  j* d ƒ |  j7 ƒ  |  j9 rê|  j: | | | ƒ n  |  j ƒ  d  S(   Ni<   i   g      à?i    g      N@i   g        RÜ  t   right(   i    i    i    (   i    i    i    (<   R?  t   GL_MODELVIEWRA  R‡  Rˆ  RÂ  R…  R‡  Rç  RS   RP   R  Rì   RÛ  t   glClearColorRÓ   RG  R‰  R/  R{  t   glDrawBuffert   GL_BACK_LEFTRÙ  RÚ  RÛ  t   GL_ACCUM_BUFFER_BITt   GL_BACK_RIGHTt   GL_BACKRÝ  R  Rš  t   SHEAR_STEREOR®  R°  Rn  Rl  Rè  RØ  RÇ  RÈ  RÉ  t   movexyzRQ   Rt  Ru  t   dzt   calculate_extentsRœ  R.  R-  RÞ  Rß  Rà  Rå  R}  R  R~  RŸ  Ró  R½  (   R   R’  R“  R‚  Rª  R«  Rñ  Rœ  t   stereoxt   stereoyt   stereozt   matp2R©  t   matp(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt
   draw_sceneš  sÂ    
::


+	







*
%		566
::

%66
6

*
%
	c      	   C   s{  |  j  ƒ  |  j r= |  j r= d |  _ d |  _ |  j |  _ n |  j |  _ |  j rÜ|  j rÜt	 j
 d k r<t t ƒ } t t ƒ } |  j j ƒ  | k s¬ |  j j ƒ  | k r<|  j j ƒ  | d | } |  j j ƒ  | d | } t | | ƒ } |  j j ƒ  | } |  j j ƒ  | } | | |  _ t | | ƒ |  _ q<n  |  j ƒ  |  j ƒ  |  j ƒ  |  j |  j j ƒ  |  j j ƒ  } |  j j ƒ  t t ƒ t t t ƒ t t ƒ t t t ƒ t  j! ƒ  t t" ƒ t# t t$ ƒ t% t& ƒ t' ƒ  |  j( ƒ  t) d d |  j j ƒ  |  j j ƒ  ƒ t* |  j+ | |  j+ | |  j+ |  j+ t |  j, |  j- ƒ t. |  j/ |  j+ |  j0 ƒ ƒ |  j j ƒ  }	 |  j j ƒ  }
 t  j1 ƒ  j2 ƒ  d |  _ t t" ƒ t t3 ƒ t# t t$ ƒ t4 t5 ƒ t4 t6 ƒ n7 |  j7 }	 |  j8 }
 |  j9 rt  j1 ƒ  j2 ƒ  d |  _9 n  |  j: d k r&d  S|  j; d ƒ |  j< j= ƒ  |  j> } |  j d k rp|  j? rpd |  _> qpn  |  j d k rð|  j@ |  j k rÅd |  _ d |  _@ |  jA d |	 |
 ƒ |  jB |  _C qð|  j d k rð|  jA |  j@ |	 |
 ƒ qðn  |  jD |	 |
 ƒ |  j r;|  j r;|  jE r;|  jF j ƒ  |  jD |	 |
 ƒ n  d |  _G d |  _H d |  _I d |  _J |  j d k rö|  j d k r™t	 j
 d k r™tK tL ƒ n  |  jM ƒ  |  j@ d |  _@ |  j d k rÞt	 j
 d k rÞtK t ƒ n  d |  _ |  j |  _ n  |  j d k r¬|  j d k r0t	 j
 d k r0tK tL ƒ n  tN ƒ  |  jM ƒ  d |  _ |  j d k rut	 j
 d k rutK t ƒ n  |  j r”t  jO ƒ  d |  _9 n  d |  _ |  j |  _ n  |  j s¿tP ƒ  n  |  j rá|  j rá|  jF j ƒ  n  |  jQ d k r|  jR ƒ  d |  _Q n  |  jS d k r+|  jT ƒ  d |  _S n  |  j? r@| |  _> n  |  j< jU ƒ  |  j d k rw|  j rw|  ` d |  _ n  d  S(	   Ni   R=   i    s   CheckErrors at start of orientiÿÿÿÿg        t   darwin(   g        g        g        (V   Rv  R‘  t   request_render_qualityRØ   R{  Rt  R¯  R°  Rª  R!   R>   t   glutGett   GLUT_SCREEN_WIDTHt   GLUT_SCREEN_HEIGHTt   GetWidtht	   GetHeightRÌ  R¤  R  Rì   RÛ  R  t   MakeCurrentR  R5  R2  R3  R4  RÊ  R<  R=  R>  RÆ   t   ForceLoadTexturesR6  R7  R8  R?  R@  RA  RB  RŒ  RŽ  RI   RÊ  R‡  Rý   RË  Rˆ  RÇ   Rœ  R	  R9  R:  R;  RÑ   RÒ   t   update_matricesR(  R&   RX   RÜ   R‰  t   antialias_screenshotR   R›  t   old_idle_pauseR   R  t   mirror_buffersRª   Rt  Ru  Rþ  R¥  t   glReadBufferRû  t
   screenshotRû  t   UnForceLoadTexturest   glutSwapBufferst   dumppsR  t   dumppovRH  RÝ   (   R   t   screen_widtht   screen_heightt   ntiles_wt   ntiles_ht   ntilest	   new_widtht
   new_heightR  R’  R“  t	   orig_anti(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR˜    	  sÞ    
		*


#





%T 	


	 										 
 	 
	 	
		


	c         C   sO   |  j  | d | d | d ƒ \ } } } | d | | d | | d | f S(   Ni    i   i   (   t	   getdxdydz(   R   t   rt   drRt  Ru  Rþ  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRý  «	  s    *c   	      C   sµ  |  j  |  j |  j } } } |  j |  j |  j } |  j d |  j | | j ƒ  |  j | j ƒ  |  j d |  j | | j	 ƒ  |  j | j	 ƒ  |  j d |  j | | j
 ƒ  d |  j | j
 ƒ  g } |  j d |  j | | j ƒ  |  j | j ƒ  |  j d |  j | | j	 ƒ  |  j | j	 ƒ  |  j d |  j | | j
 ƒ  d |  j | j
 ƒ  g } |  j d |  j | | j ƒ  |  j | j ƒ  |  j d |  j | | j	 ƒ  |  j | j	 ƒ  |  j d |  j | | j
 ƒ  d |  j | j
 ƒ  g } |  j d |  j | | j ƒ  |  j | j ƒ  |  j d |  j | | j	 ƒ  |  j | j	 ƒ  |  j d |  j | | j
 ƒ  d |  j | j
 ƒ  g } | | | | g |  _ d  S(   Ni    i   i   g       @(   RÇ  RÈ  RÉ  R  RÑ   RÒ   RQ   RI   R”  R•  R–  t   extents(	   R   RÇ  RÈ  RÉ  R  t   trt   tlt   blt   br(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRÿ  ¯	  s    ššššc   
      C   sY  |  j  |  j |  j } } } g  } | j | | j ƒ  ƒ | j | | j ƒ  ƒ | j | | j ƒ  ƒ g  } | j | | j ƒ  ƒ | j | | j ƒ  ƒ | j | | j ƒ  ƒ g  }	 |	 j | | j ƒ  ƒ |	 j | | j ƒ  ƒ |	 j | | j ƒ  ƒ | d | d |	 d } | d | d |	 d } | d | d |	 d } | | | g S(   si   
        Calculate movement in real coordinates
        corresponding to one in eye coordinates.
        i    i   i   (   RÇ  RÈ  RÉ  R6   R”  R•  R–  (
   R   Rt  Ru  Rþ  RÇ  RÈ  RÉ  R#  t   dut   df(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR!  ¹	  s"    c         C   s1   d d l  } | j  j j | ƒ |  _ d |  _ d S(   s,   
        Set the background colour.
        iÿÿÿÿNi   (   R.   R/   R0   RÓ   R   (   R   t   colourR.   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   bgcolourÕ	  s    c         C   sÌ   |  j  r. |  j |  j | |  j d |  _ n |  j |  j | |  _ |  j d k  r` d |  _ n  d t |  j ƒ t |  j ƒ t |  j ƒ d |  _ d t |  j ƒ t |  j ƒ t |  j ƒ d |  _ d S(   s!   
        Zoom in and out
        g      >@g      à?g       @g      N@N(   t   weighted_zoomRP   t	   zoom_warpRS   RI   RÑ   R�  Rž  (   R   R\   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   zoom_cameraÝ	  s    	%4c         C   s   | r | |  _  n  d |  _ d S(   s/   
        Define a standard orientation
        i   N(   RN   R   (   R   R  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   SetRotationì	  s     c         C   s4   |  j  | |  _  |  j | |  _ |  j | |  _ d S(   s%   
        Move camera around.
        N(   Rt  Ru  Rþ  (   R   Rt  Ru  Rþ  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   move_cameraó	  s    c         C   s>   |  j  t | ƒ |  j t | ƒ |  j t | ƒ |  j ƒ d  S(   N(   R1  RS   R�  Rž  (   R   Rt  Ru  Rþ  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   move_camera_scaleû	  s    c         C   sC   | d |  j  d | d |  j  d | d |  j  d f |  _  d S(   sj   
        Pick up info about world rotation which
        will be used in quaternion calculations.
        i    i   i   N(   R¥  (   R   R¥  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   rotate_cameraÿ	  s    c         C   s    t  ƒ  } d } d } d } | t B| k r4 d } n  | t B| k rM d } n  | t B| k rf d } n  d d d g } | | |  j <| | |  j <| | |  j <| S(   s7   
        Find out which modifiers are pressed.
        i    i   (   t   glutGetModifierst   GLUT_ACTIVE_SHIFTt   GLUT_ACTIVE_CTRLt   GLUT_ACTIVE_ALTt   SHIFTt   CTRLt   ALT(   R   t   glmodst   shiftt   ctrlt   altt   mods(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   getmodifiers
  s    				c         C   sA   t  ƒ  } t  ƒ  } t | | ƒ | j ƒ  } | j ƒ  } | | f S(   N(   R{   t   GetWorldMousePositionR  (   R   t   world_xt   world_yRN  RO  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt
   GetWorldXY
  s    		c         C   s;  |  j  d |  j ƒ |  j  d d ƒ |  j  |  j d ƒ |  j  |  j |  j ƒ g } |  j sc t ƒ  } n, |  j } x  t | ƒ d k rŽ | j ƒ  qo W| j | d d ƒ | j | d d ƒ | j | d d ƒ | j | d d ƒ | j | d d ƒ | j | d d ƒ | j | d d ƒ | j | d d ƒ | S(   Ni    i   i   i   (   R¾  RÒ   RÑ   R@   R¦  RA   Rà   R6   (   R   t   xyzst   xyzbox(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR?   $
  s    N		      c         C   s  |  j  | d | d ƒ |  j  | d | d ƒ |  j  | d | d ƒ |  j  | d | d ƒ g } t ƒ  } | j | d d ƒ | j | d d ƒ | j | d d ƒ | j | d d ƒ | j | d d ƒ | j | d d ƒ | j | d d ƒ | j | d d ƒ | S(   Ni
   i    i   i   i   (   R¾  R¦  R6   (   R   RN  RO  RE  RF  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt	   GetXYZBox3
  s    b	      c         C   s›  |  j  ƒ  \ } } |  j | | ƒ } |  j ƒ  |  _ t j d k rz | d k rz |  j d d k rz d } d |  j d <qz n  | t k rÚ | t k r¡ |  j |  _	 qÚ | t
 k r¼ |  j |  _	 qÚ | t k rÚ |  j |  _	 qÚ n  i  } | | d <| | d <| | d <| | d <| | d	 <| | d
 <| | d <t ƒ  | d <|  j | d <t j ƒ  | d <| d k rn|  j | g }	 nK | d k rŒ|  j | g }	 n- | d k rª|  j | g }	 n |  j | g }	 | t k rÚ| |  _ | |  _ n/ |  j r g  |  _ d |  _ t ƒ  d Sd |  _ | d k s-| d k s-| d k r@|  j j |	 ƒ nP|  j j |	 ƒ |  j t |  j ƒ d }
 |  j d } t |  j ƒ d k s¡t |  j ƒ d k ro|  j d } t |  j ƒ d k r'd | d <|  j j ƒ  t j d t  ƒ |  _ |  j j! ƒ  |  j | g }	 |  j j |	 ƒ g  |  _ qot j d |  j" ƒ |  _ |  j j! ƒ  |  j j | ƒ |  j j | ƒ n  t |  j ƒ d k r�g  |  _ n  t ƒ  d S(   sP   
        Mouse callback function. Dispatch events
        to job queue.
        R  i    i   i   t   buttont   stateRN  RO  RF  RR  RS  RP  RÊ   R   i   i   Ng        g      à?(#   RD  RG  R@  Rd  R!   R>   t	   GLUT_DOWNt   GLUT_LEFT_BUTTONt   LEFT_MOTIONt   BUTTON_PRESSEDt   GLUT_RIGHT_BUTTONt   RIGHT_MOTIONt   GLUT_MIDDLE_BUTTONt   MIDDLE_MOTIONR]  RÊ   R   t   WHEEL_UPt
   WHEEL_DOWNt   MOUSERi  Rj  R   t   mouse_eventR   RÂ   R6   RA   t   click_timert   cancelR¾   t   TimerR   t   startt   ClearMouseEvents(   R   RH  RI  RN  RO  RR  RS  RF  Rp  Rq  t   endjobt   job1t   job2(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR�   :
  s~    






					$*
c         C   s/   g  |  _  t j d t ƒ |  _ |  j j ƒ  d  S(   Ng        (   RU  R¾   RX  R   RV  RY  (   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRZ  �
  s    	c         C   s«   | t  k rh x˜ t d ƒ D]H } |  j | |  j | <d |  j | <|  j | |  j | <d |  j | <q Wn? x< t d ƒ D]. } |  j | |  j | <|  j | |  j | <qu Wd  S(   Ni€   i    (   t	   GLUT_LEFTRË   RÊ   RÌ   RÎ   RÍ   (   R   RI  Rr  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   entry’
  s    c         C   s  | d k r d  S|  j  | r- d |  j  | <n  |  j ƒ  |  _ t | ƒ } | d k rq |  j  | rq d |  j  | <n  t | ƒ } | d k r¦ |  j  | r¦ d |  j  | <n  |  j ƒ  \ |  _ |  _ |  j  j d ƒ d k sî |  j  j d ƒ d k rú d |  _	 n	 d |  _	 t
 ƒ  d  S(   Ni€   iÿÿÿÿi   i    (   RÊ   R@  Rd  t   ShiftKeyt
   NoShiftKeyRD  R_  R`  R5   R   R   (   R   Rr  RN  RO  t	   shift_keyt   no_shift_key(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR§   ž
  s       0	c         C   s”   | d k r d S|  j  ƒ  |  _ d |  j | <|  j ƒ  \ |  _ |  _ |  j j d ƒ d k st |  j j d ƒ d k r€ d |  _ n	 d |  _ t ƒ  d S(   sS   
        Keyboard callback function. Dispatch events
        to job queue.
        i€   Ni   i    iÿÿÿÿ(	   R@  Rd  RÊ   RD  R_  R`  R5   R   R   (   R   Rr  RN  RO  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR¥   ¯
  s     0	c         C   s”   | d k r d Sd |  j  | <|  j ƒ  |  _ |  j ƒ  \ |  _ |  _ |  j  j d ƒ d k st |  j  j d ƒ d k r€ d |  _ n	 d |  _ t ƒ  d S(   sV   
        Special Key callback function. Dispatch events
        to job queue.
        i€   Ni   i    iÿÿÿÿ(	   RÍ   R@  Rd  RD  R_  R`  R5   R   R   (   R   Rr  RN  RO  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRŸ   ¾
  s     0	c         C   s”   | d k r d  Sd |  j  | <|  j ƒ  |  _ |  j ƒ  \ |  _ |  _ |  j  j d ƒ d k st |  j  j d ƒ d k r€ d |  _ n	 d |  _ t ƒ  d  S(   Ni€   i    i   iÿÿÿÿ(	   RÍ   R@  Rd  RD  R_  R`  R5   R   R   (   R   Rr  RN  RO  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR¡   Í
  s     0	c         C   s   | |  _  | |  _ d  S(   N(   Rb  Rc  (   R   RN  RO  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   passiveØ
  s    	c         C   s;  t  ƒ  } | d k r´ d } d } d } | t B| k r@ d } n  | t B| k rY d } n  | t B| k rr d } n  d d d g } | | |  j <| | |  j <| | |  j <| |  _ n  |  j | | ƒ }	 i  }
 | |
 d <| |
 d <| |
 d <| |
 d <|	 |
 d <t	 ƒ  |
 d	 <|  j
 |
 d
 <|  j |
 g } |  j j | ƒ d  S(   Niÿÿÿÿi    i   RN  RO  Rt  Ru  RF  RP  RÊ   (   t   CheckModifiersR5  R6  R7  R8  R9  R:  Rd  RG  R]  RÊ   RM  RÂ   (   R   Rt  Ru  RN  RO  R?  R<  R=  R>  RF  Rp  Rq  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRk  Ý
  s6    				




c         C   s&   d |  _  | |  _ | |  _ t ƒ  d  S(   Ni   (   R   Rb  Rc  R   (   R   RN  RO  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR£   þ
  s    			c      
   C   s=  t  d ƒ } t d ƒ } t d ƒ } t ƒ  } t ƒ  } t ƒ  } t t | ƒ t t | ƒ t t | ƒ | d | d }	 t | |	 d | | | | | | ƒ	 t	 | j
 ƒ  | j
 ƒ  | j
 ƒ  ƒ }
 t | |	 d | | | | | | ƒ	 t	 | j
 ƒ  | j
 ƒ  | j
 ƒ  ƒ } t ƒ  } | j |
 ƒ | j | ƒ ~ ~ ~ ~ ~ ~ | S(   sG   
        Work out world x,y,z at near and far clipping planes.
        i   i   i   i   g        g      ð?(   Rº  R1   t   doublepR  R»  t   glGetDoublevt   GL_PROJECTION_MATRIXt   GL_MODELVIEW_MATRIXt   gluUnProjectR   R  R¦  R6   (   R   RN  RO  RÀ  t   mvmatrixt
   projmatrixt   wxt   wyt   wzt   realyt   cart1t   cart2t   cv(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR¾    s0    			"$"$	c         C   s"   t  t t t j |  j ƒ ƒ ƒ ƒ S(   N(   t   image_infoPtrt   get_pixdataR  R�  t   ceilRG  (   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRu  %  s    c         C   s‘  d d  l  } d d  l } d d  l } | j ƒ  } | d k r­ | } |  j r |  j j | |  j |  j t t	 j
 |  j ƒ ƒ ƒ q�t | |  j |  j t t	 j
 |  j ƒ ƒ ƒ nà|  j } | } |  j d k r%|  j d k ré t ƒ  |  _ n  |  j rt |  j j t t	 j
 |  j ƒ ƒ ƒ ƒ } n |  j ƒ  } | j ƒ  |  j j | ƒ |  j |  j d k r�t t	 j |  j ƒ ƒ } g  } xS t | ƒ D]E }	 g  }
 x) t | ƒ D] } |
 j |	 | | ƒ qŸW| j |
 ƒ q†W| j ƒ  t ƒ  } x | D] }
 | j |
 ƒ qéWt |  j | ƒ } | j | ƒ q�nh |  j rb|  j j | |  j |  j t t	 j
 |  j ƒ ƒ ƒ n+ t | |  j |  j t t	 j
 |  j ƒ ƒ ƒ d  S(   NiÿÿÿÿR   i   i    (   t   tempfileR†   t   shutilt   mktempRª  t   Writet   screenshot_widtht   screenshot_heightR  R�  Rv  RG  t   write_pixdatat   screenshot_filenameR‘  R   t   ImageInfoVectort   screen_sectionsRt  Ru  t   invertR6   R�  RË   t   reverset   IntIntVectort
   image_infot   write(   R   R½   Rw  R†   Rx  t   temp_filenamet   iinfoR”  t   bRu   R­   R   Rs  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR  (  sJ    	4.		-

		4+c         C   sµ   | |  _  | r/ |  j j d ƒ |  j j ƒ  n  | rA d |  _ n	 d |  _ | |  _ | |  _ | |  _ | d k r’ | |  _ |  j	 |  _
 d |  _	 n	 d |  _ | r± |  j j ƒ  n  d S(   s    
        Save a Bitmap.
        i¸  i   i    g        N(   R  RX   R   RÝ   R  R~  R{  R|  R‘  R   R  RÜ   (   R   RK  R‰  t   sectionst   blockingR  t   heightR{  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   request_screenshot[  s"    							c         C   s   | |  _  d |  _ d S(   s)   
        Save a PostScript File.
        i   N(   R  R  (   R   RK  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   request_screenshot_psu  s    	c         C   s   | |  _  d |  _ d S(   s+   
        Save a PovRay input File.
        i   N(   RC  R  (   R   RK  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   request_screenshot_pov|  s    	c         C   s   d |  _  |  j j ƒ  d  S(   Ni   (   R   R   RÝ   (   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRW   ƒ  s    	c         C   s*   | r |  j  j d ƒ n  |  j j ƒ  d  S(   Ni¸  (   RX   R   R   RÜ   (   R   t   hard(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyRV   ‡  s    c         C   s!   |  j  j d ƒ |  j  j ƒ  d S(   sQ   
        This blocks until end of self.orient, ie rendering is finished.
        i¸  N(   RX   R   RÜ   (   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   WaitŒ  s    c         C   s1   |  j  j d ƒ |  j  j ƒ  |  j  j d ƒ d S(   sQ   
        This blocks until end of self.orient, ie rendering is finished.
        i¸  N(   RX   R   RÜ   (   R   (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   Flush“  s    c         C   s,   | | f |  _  | | f |  _ |  j ƒ  d  S(   N(   t   rubber_band_startt   rubber_band_endt   define_rubber_band_cube(   R   RN  RO  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR¡  ›  s    c         C   s   | | f |  _  |  j ƒ  d  S(   N(   R“  R”  (   R   RN  RO  (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR¢     s    c         C   s  |  j  |  j d |  j d ƒ } |  j  |  j d |  j d ƒ } |  j  |  j d |  j d ƒ } |  j  |  j d |  j d ƒ } | d |  j _ | d |  j _ | d |  j _ | d |  j _ | d |  j _ | d |  j _	 | d |  j _
 | d |  j _ d  S(   Ni    i   (   R¾  R’  R“  R“  R   R   R	   R
   R   R   R   R   (   R   t   xyz1t   xyz2t   xyz3t   xyz4(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR”  ¤  s        c         C   s9  |  j  j ƒ  } g  } x|  j D]} g  } t j | j ƒ } t j | | d ƒ } t j | |  j ƒ } t j | |  j ƒ } | j	 | ƒ t j | | d ƒ } t j | |  j ƒ } t j | |  j ƒ } | j	 | ƒ t j | | d ƒ } t j | |  j ƒ } t j | |  j ƒ } | j	 | ƒ | j	 | ƒ q W| S(   Ni   i    i   (
   RN   R  Rè   t   utilt   find_points_on_planeRò   t   matrixXvectort   vsubvRQ   R6   (   R   t   Mt	   trianglesR]   t   triangle_rotatedt   trianglet   rotatedpt	   transrotp(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   get_clipping_planes³  s&    c      	   C   s�   |  j  } 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 S(   s¯   
        This returns sets of planes defined by what is rubber banded
        on screen. It should have a better name and also
        return general clipping planes.
        (
   R“  RB   R   R   R	   R   R   R   R   R
   (   R   t   box(    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   get_rubber_band_planesË  s    	("  R   R   t   __doc__t
   NOGRAPHICSRN  RO  R†   t   getpidR*  R  R•   RP   R¥  RK   RL   RN   RÑ   RÒ   R_  R`  RJ  RW  R¾   R¿   RX   R   t   QueueRã   RŸ  R   R�  Rž  t	   joyscalext	   joyscaleyRQ  R†  R‡  RI   R  RQ   Rt  Ru  Rþ  t   GLUT_KEY_LEFTt   keyleftt   GLUT_KEY_RIGHTt   keyrightt   GLUT_KEY_UPt   keyupt   GLUT_KEY_DOWNt   keydownRT  Ra  RL  RO  RQ  RR  RS  Rf  t   MENUR^  Re  RM  t   CENTRE_ON_PRIMITIVEt   LABEL_PRIMITIVEt   NOSTEREORÞ  Rß  Rà  Rá  Râ  Rã  R-  R|  R}  R~  R8  R9  R:  R›  Rü  Rš  R~  R  R  RC  R‘  R  R  Rd  R   Rƒ   R„   R’  R“  R   R“  t   near_mint   far_maxt   fog_far_maxt   min_slab_deltaR‡  Rˆ  RÊ  RË  RÍ  R…  R{  R.  Rœ  R/  R¯  t   shearR‰  Rá  R  R·  R¢  t   fog_densityt   GL_EXP2t   fog_modeR  Rt  R°  t   VERTEXARRAYR¯  Rj  Rw  t	   multiviewRZ  R[  Ró  Rõ  R   t   initial_timeRô  R÷  RŸ  R   RË  t   smooth_polygonsRU  R@   RÚ   RT  RÏ   RU   RR   RT   RY   RG  R   R   R   Rª  Rª   R  R©  R«  RÅ  RE  R  RX  R   RV  RY  Rê  Rë  Rì  R{  R  t   fsaa_ont   frame_countR   Rç  R{  R|  Rñ   Rç   RŠ   R-  R.  R   R&   R<   RH   RJ   t   NoneRo   Rx   R³   R¼   R   RÛ   RÜ   Rß   Râ   Ræ   Rì   Ró   Rü   Rÿ   R  R  R&  R'  RG  RH  RK  Rv  R„  Rˆ  RŠ  R™  Rž  R¡  R£  R¤  RB  R¬  R®  R¶  RÁ  RÄ  RÇ  R  R  RH  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/  R0  R1  R2  R3  R@  RD  R?   RG  R�   RZ  R_  R§   R¥   RŸ   R¡   Rd  Rk  R£   R¾  Ru  R  RŒ  R�  RŽ  RW   RV   R�  R‘  R¡  R¢  R”  R£  R¥  (    (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyR   4   s$        		

			O	(	4		@				
	
		
	4				0			t														–`ÿ '<D									.								 		M	†	‹		
											S								!		 	3							(    (   R¦  R!   Ro  RK   R   t   point_funcst	   eventdefsR   R¾   R©  t   displayobjectR™  R¸  R
  Rí   R„  R0  R�  RÆ   RÂ   R†   Râ  R   R   RÄ   R   (    (    (    s4   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/MG.pyt   <module>   s.   




	