a
    ij#  ć                   @   s  d Z ddlmZmZmZ ddlmZmZ ddlZddlm	Z	m
Z
 ddlT ddlmZ dd	 Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e” d
d”Ze e ” d
d”Z e e!” d
d”Z!e e"” d
d”Z"e e#” d
d”Z#e e$” d
d”Z$e e%” d
d”Z%e e&” dd”Z&e e'” dd”Z'e e(”j)ddd dddZ(e e*” dd”Z*e e+” dd”Z+e e,” dd”Z,e e-” dd”Z-e e.”j)ddddZ.e e/”j)ddddZ/e e0”j)ddddZ0e e1”j)ddddZ1e e2”j)ddddZ2e e3”j)ddddZ3e e4”j)ddddZ4e e5”j)ddddZ5e e6”j)ddddZ6ddl7m8Z9 ddlm:Z:m;Z;m<Z< ddl=m>Z> e9e?dd Z?dS ) al  OpenGL extension ARB.vertex_program

This module customises the behaviour of the 
OpenGL.raw.GL.ARB.vertex_program to provide a more 
Python-friendly API

Overview (from the spec)
	
	Unextended OpenGL mandates a certain set of configurable per-vertex
	computations defining vertex transformation, texture coordinate generation
	and transformation, and lighting.  Several extensions have added further
	per-vertex computations to OpenGL.  For example, extensions have defined
	new texture coordinate generation modes (ARB_texture_cube_map,
	NV_texgen_reflection, NV_texgen_emboss), new vertex transformation modes
	(ARB_vertex_blend, EXT_vertex_weighting), new lighting modes (OpenGL 1.2's
	separate specular and rescale normal functionality), several modes for fog
	distance generation (NV_fog_distance), and eye-distance point size
	attenuation (EXT/ARB_point_parameters).
	
	Each such extension adds a small set of relatively inflexible
	per-vertex computations.
	
	This inflexibility is in contrast to the typical flexibility provided by
	the underlying programmable floating point engines (whether micro-coded
	vertex engines, DSPs, or CPUs) that are traditionally used to implement
	OpenGL's per-vertex computations.  The purpose of this extension is to
	expose to the OpenGL application writer a significant degree of per-vertex
	programmability for computing vertex parameters.
	
	For the purposes of discussing this extension, a vertex program is a
	sequence of floating-point 4-component vector operations that determines
	how a set of program parameters (defined outside of OpenGL's Begin/End
	pair) and an input set of per-vertex parameters are transformed to a set
	of per-vertex result parameters.
	
	The per-vertex computations for standard OpenGL given a particular set of
	lighting and texture coordinate generation modes (along with any state for
	extensions defining per-vertex computations) is, in essence, a vertex
	program.  However, the sequence of operations is defined implicitly by the
	current OpenGL state settings rather than defined explicitly as a sequence
	of instructions.
	
	This extension provides an explicit mechanism for defining vertex program
	instruction sequences for application-defined vertex programs.  In order
	to define such vertex programs, this extension defines a vertex
	programming model including a floating-point 4-component vector
	instruction set and a relatively large set of floating-point 4-component
	registers.
	
	The extension's vertex programming model is designed for efficient
	hardware implementation and to support a wide variety of vertex programs.
	By design, the entire set of existing vertex programs defined by existing
	OpenGL per-vertex computation extensions can be implemented using the
	extension's vertex programming model.

The official definition of this extension is available here:
http://www.opengl.org/registry/specs/ARB/vertex_program.txt
é    )ŚplatformŚconstantŚarrays)Ś
extensionsŚwrapperN)Ś_typesŚ_glgets)Ś*)Ś_EXTENSION_NAMEc                  C   s   ddl m}  |  t”S )z=Return boolean indicating whether this extension is availabler   ©r   )ŚOpenGLr   ZhasGLExtensionr
   r   © r   śZ/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/OpenGL/GL/ARB/vertex_program.pyŚglInitVertexProgramARBB   s    r   Śvé   é   é   é   ŚstringZprogramsc                 C   s   | fS )Nr   )Śxr   r   r   Ś<lambda>   ó    r   ŚnT)ŚsizeZpnameArgŚorPassInŚparams)r   )r   r   )r   Śpointer)Ślazy)Ś
convertersŚerrorŚcontextdata)ŚArrayDatatypec           	   	   C   s8   t  ||”}d|f}t ||” | |||||t  |”S )ae  Set an attribute pointer for a given shader (index)
    
    index -- the index of the generic vertex to bind, see 
        glGetAttribLocation for retrieval of the value,
        note that index is a global variable, not per-shader
    size -- number of basic elements per record, 1,2,3, or 4
    type -- enum constant for data-type 
    normalized -- whether to perform int to float 
        normalization on integer-type values
    stride -- stride in machine units (bytes) between 
        consecutive records, normally used to create 
        "interleaved" arrays 
    pointer -- data-pointer which provides the data-values,
        normally a vertex-buffer-object or offset into the 
        same.
    
    This implementation stores a copy of the data-pointer 
    in the contextdata structure in order to prevent null-
    reference errors in the renderer.
    zvertex-attrib)r"   ZasArrayr!   ZsetValueZvoidDataPointer)	ZbaseOperationŚindexr   ŚtypeŚ
normalizedZstrider   ŚarrayŚkeyr   r   r   ŚglVertexAttribPointerARBĒ   s    żr(   )@Ś__doc__r   r   r   r   r   r   ŚctypesZOpenGL.raw.GLr   r   Z OpenGL.raw.GL.ARB.vertex_programr
   r   ZglVertexAttrib1dvARBZsetInputArraySizeZglVertexAttrib1fvARBZglVertexAttrib1svARBZglVertexAttrib2dvARBZglVertexAttrib2fvARBZglVertexAttrib2svARBZglVertexAttrib3dvARBZglVertexAttrib3fvARBZglVertexAttrib3svARBZglVertexAttrib4NbvARBZglVertexAttrib4NivARBZglVertexAttrib4NsvARBZglVertexAttrib4NubvARBZglVertexAttrib4NuivARBZglVertexAttrib4NusvARBZglVertexAttrib4bvARBZglVertexAttrib4dvARBZglVertexAttrib4fvARBZglVertexAttrib4ivARBZglVertexAttrib4svARBZglVertexAttrib4ubvARBZglVertexAttrib4uivARBZglVertexAttrib4usvARBZglProgramStringARBZglDeleteProgramsARBZglGenProgramsARBZ	setOutputZglProgramEnvParameter4dvARBZglProgramEnvParameter4fvARBZglProgramLocalParameter4dvARBZglProgramLocalParameter4fvARBZglGetProgramEnvParameterdvARBZglGetProgramEnvParameterfvARBZglGetProgramLocalParameterdvARBZglGetProgramLocalParameterfvARBZglGetProgramivARBZglGetVertexAttribdvARBZglGetVertexAttribfvARBZglGetVertexAttribivARBZglGetVertexAttribPointervARBZOpenGL.lazywrapperr   Z_lazyr   r    r!   ZOpenGL.arrays.arraydatatyper"   r(   r   r   r   r   Ś<module>   s  :
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’
’