ó
˜†Kc        
   @   s\  d  Z  d d l Z e j ƒ  e j d ƒ Z d d l m Z d d l m Z m	 Z	 m
 Z
 m Z d d l m Z d d d	 d
 d d d d d d g
 Z d „  Z d g Z x¾ e e	 e
 e f D]ª Z x¡ e e ƒ D]“ Z d Z x_ d D]W Z e j e ƒ rÜ e Z e e e ƒ  Z e e k r3e e e ƒ r0e Z Pq0q3qÜ qÜ We e k rÉ e j d e j e ƒ qÉ qÉ Wq¶ We e j e j ƒ Z e e j  e j! ƒ Z  e e j" e j# ƒ Z" e e j$ e j% ƒ Z$ e e j& e j' ƒ Z& e e j( e j' ƒ Z( e e j) e j* ƒ Z) e e j+ e j* ƒ Z+ e j, Z, e j- Z- e j. Z. e j/ Z/ d e0 f d „  ƒ  YZ1 d „  Z2 d „  Z3 d S(   s  Convenience module providing common shader entry points

The point of this module is to allow client code to use
OpenGL 2.x style names to reference shader-related operations
even if the local hardware only supports ARB extension-based 
shader rendering.

There are also two utility methods compileProgram and compileShader
which make it easy to create demos which are shader-using.
iÿÿÿÿNs   OpenGL.GL.shaders(   t   GL(   t   shader_objectst   fragment_shadert   vertex_shadert   vertex_program(   t	   alternatet   glAttachShadert   glDeleteShadert   glGetProgramInfoLogt   glGetShaderInfoLogt   glGetProgramivt   glGetShaderivt   compileProgramt   compileShadert   GL_VALIDATE_STATUSt   GL_LINK_STATUSc         C   s‡   t  t |  ƒ rƒ t t |  ƒ } t  | d ƒ re t t t |  ƒ t t | ƒ ƒ t ƒ  |  <t j |  ƒ n | t ƒ  |  <t j |  ƒ t St	 S(   Nt   __call__(
   t   hasattrR    t   getattrR   t   modulet   globalst   __all__t   appendt   Truet   False(   t   baset   namet   root(    (    s2   C:\Python27\Lib\site-packages\OpenGL\GL\shaders.pyt   _alt    s    t	   ObjectARBt   _ARBt   ARBs   Found no alternate for: %s.%st   ShaderProgramc           B   s    e  Z d  Z d „  Z d „  Z RS(   s0   Integer sub-class with context-manager operationc         C   s   t  |  ƒ d S(   s   Start use of the programN(   t   glUseProgram(   t   self(    (    s2   C:\Python27\Lib\site-packages\OpenGL\GL\shaders.pyt	   __enter__Q   s    c         C   s   t  d ƒ d S(   s   Stop use of the programi    N(   R!   (   R"   t   typt   valt   tb(    (    s2   C:\Python27\Lib\site-packages\OpenGL\GL\shaders.pyt   __exit__T   s    (   t   __name__t
   __module__t   __doc__R#   R'   (    (    (    s2   C:\Python27\Lib\site-packages\OpenGL\GL\shaders.pyR    O   s   	c          G   sÔ   t  ƒ  } x |  D] } t | | ƒ q Wt | ƒ t | ƒ t | t ƒ } | t k ru t d | t | ƒ f ƒ ‚ n  t | t	 ƒ } | t k r¯ t d | t | ƒ f ƒ ‚ n  x |  D] } t
 | ƒ q¶ Wt | ƒ S(   sO  Create a new program, attach shaders and validate
    
    shaders -- arbitrary number of shaders to attach to the 
        generated program.
    
    This convenience function is *not* standard OpenGL,
    but it does wind up being fairly useful for demos 
    and the like.  You may wish to copy it to your code 
    base to guard against PyOpenGL changes.
    
    Usage:
    
        shader = compileProgram( 
            compileShader( source, GL_VERTEX_SHADER ),
            compileShader( source2, GL_FRAGMENT_SHADER ),
        )
        glUseProgram( shader )
    
    Note:
        If (and only if) validation of the linked program 
        *passes* then the passed-in shader objects will be 
        deleted from the GL.
    
    returns GLuint shader program reference
    raises RuntimeError when a link/validation failure occurs
    s   Validation failure (%s): %ss   Link failure (%s): %s(   t   glCreateProgramR   t   glLinkProgramt   glValidateProgramR
   R   t   GL_FALSEt   RuntimeErrorR   R   R   R    (   t   shaderst   programt   shadert
   validationt   link_status(    (    s2   C:\Python27\Lib\site-packages\OpenGL\GL\shaders.pyR   X   s(    	

c         C   s‚   t  |  t t f ƒ r! |  g }  n  t | ƒ } t | |  ƒ t | ƒ t | t ƒ } | s~ t d | t	 | ƒ f |  | ƒ ‚ n  | S(   s  Compile shader source of given type
    
    source -- GLSL source-code for the shader
    shaderType -- GLenum GL_VERTEX_SHADER, GL_FRAGMENT_SHADER, etc,
    
    returns GLuint compiled shader reference
    raises RuntimeError when a compilation failure occurs
    s   Shader compile failure (%s): %s(
   t
   isinstancet   strt   unicodet   glCreateShadert   glShaderSourcet   glCompileShaderR   t   GL_COMPILE_STATUSR/   R	   (   t   sourcet
   shaderTypeR2   t   result(    (    s2   C:\Python27\Lib\site-packages\OpenGL\GL\shaders.pyR   Š   s    	
(   R   R   R   (4   R*   t   loggingt   basicConfigt	   getLoggert   logt   OpenGLR    t   OpenGL.GL.ARBR   R   R   R   t   OpenGL.extensionsR   R   R   t	   _excludesR   t   dirR   t   Nonet   foundt   suffixt   endswithR   t   lenR   R   t   debugR(   R   t   glAttachObjectARBt   glDetachShadert   glDetachObjectARBR   t   glDeleteObjectARBt   glGetAttachedShaderst   glGetAttachedObjectsARBR   t   glGetInfoLogARBR	   R   t   glGetObjectParameterivARBR
   R   R;   R   R.   t   intR    R   R   (    (    (    s2   C:\Python27\Lib\site-packages\OpenGL\GL\shaders.pyt   <module>
   s^   
"										2