1'''OpenGL extension ARB.vertex_program
2
3This module customises the behaviour of the
4OpenGL.raw.GL.ARB.vertex_program to provide a more
5Python-friendly API
6
7Overview (from the spec)
8
9	Unextended OpenGL mandates a certain set of configurable per-vertex
10	computations defining vertex transformation, texture coordinate generation
11	and transformation, and lighting.  Several extensions have added further
12	per-vertex computations to OpenGL.  For example, extensions have defined
13	new texture coordinate generation modes (ARB_texture_cube_map,
14	NV_texgen_reflection, NV_texgen_emboss), new vertex transformation modes
15	(ARB_vertex_blend, EXT_vertex_weighting), new lighting modes (OpenGL 1.2's
16	separate specular and rescale normal functionality), several modes for fog
17	distance generation (NV_fog_distance), and eye-distance point size
18	attenuation (EXT/ARB_point_parameters).
19
20	Each such extension adds a small set of relatively inflexible
21	per-vertex computations.
22
23	This inflexibility is in contrast to the typical flexibility provided by
24	the underlying programmable floating point engines (whether micro-coded
25	vertex engines, DSPs, or CPUs) that are traditionally used to implement
26	OpenGL's per-vertex computations.  The purpose of this extension is to
27	expose to the OpenGL application writer a significant degree of per-vertex
28	programmability for computing vertex parameters.
29
30	For the purposes of discussing this extension, a vertex program is a
31	sequence of floating-point 4-component vector operations that determines
32	how a set of program parameters (defined outside of OpenGL's Begin/End
33	pair) and an input set of per-vertex parameters are transformed to a set
34	of per-vertex result parameters.
35
36	The per-vertex computations for standard OpenGL given a particular set of
37	lighting and texture coordinate generation modes (along with any state for
38	extensions defining per-vertex computations) is, in essence, a vertex
39	program.  However, the sequence of operations is defined implicitly by the
40	current OpenGL state settings rather than defined explicitly as a sequence
41	of instructions.
42
43	This extension provides an explicit mechanism for defining vertex program
44	instruction sequences for application-defined vertex programs.  In order
45	to define such vertex programs, this extension defines a vertex
46	programming model including a floating-point 4-component vector
47	instruction set and a relatively large set of floating-point 4-component
48	registers.
49
50	The extension's vertex programming model is designed for efficient
51	hardware implementation and to support a wide variety of vertex programs.
52	By design, the entire set of existing vertex programs defined by existing
53	OpenGL per-vertex computation extensions can be implemented using the
54	extension's vertex programming model.
55
56The official definition of this extension is available here:
57http://www.opengl.org/registry/specs/ARB/vertex_program.txt
58'''
59from OpenGL import platform, constant, arrays
60from OpenGL import extensions, wrapper
61import ctypes
62from OpenGL.raw.GL import _types, _glgets
63from OpenGL.raw.GL.ARB.vertex_program import *
64from OpenGL.raw.GL.ARB.vertex_program import _EXTENSION_NAME
65
66def glInitVertexProgramARB():
67    '''Return boolean indicating whether this extension is available'''
68    from OpenGL import extensions
69    return extensions.hasGLExtension( _EXTENSION_NAME )
70
71glVertexAttrib1dvARB=wrapper.wrapper(glVertexAttrib1dvARB).setInputArraySize(
72    'v', 1
73)
74glVertexAttrib1fvARB=wrapper.wrapper(glVertexAttrib1fvARB).setInputArraySize(
75    'v', 1
76)
77glVertexAttrib1svARB=wrapper.wrapper(glVertexAttrib1svARB).setInputArraySize(
78    'v', 1
79)
80glVertexAttrib2dvARB=wrapper.wrapper(glVertexAttrib2dvARB).setInputArraySize(
81    'v', 2
82)
83glVertexAttrib2fvARB=wrapper.wrapper(glVertexAttrib2fvARB).setInputArraySize(
84    'v', 2
85)
86glVertexAttrib2svARB=wrapper.wrapper(glVertexAttrib2svARB).setInputArraySize(
87    'v', 2
88)
89glVertexAttrib3dvARB=wrapper.wrapper(glVertexAttrib3dvARB).setInputArraySize(
90    'v', 3
91)
92glVertexAttrib3fvARB=wrapper.wrapper(glVertexAttrib3fvARB).setInputArraySize(
93    'v', 3
94)
95glVertexAttrib3svARB=wrapper.wrapper(glVertexAttrib3svARB).setInputArraySize(
96    'v', 3
97)
98glVertexAttrib4NbvARB=wrapper.wrapper(glVertexAttrib4NbvARB).setInputArraySize(
99    'v', 4
100)
101glVertexAttrib4NivARB=wrapper.wrapper(glVertexAttrib4NivARB).setInputArraySize(
102    'v', 4
103)
104glVertexAttrib4NsvARB=wrapper.wrapper(glVertexAttrib4NsvARB).setInputArraySize(
105    'v', 4
106)
107glVertexAttrib4NubvARB=wrapper.wrapper(glVertexAttrib4NubvARB).setInputArraySize(
108    'v', 4
109)
110glVertexAttrib4NuivARB=wrapper.wrapper(glVertexAttrib4NuivARB).setInputArraySize(
111    'v', 4
112)
113glVertexAttrib4NusvARB=wrapper.wrapper(glVertexAttrib4NusvARB).setInputArraySize(
114    'v', 4
115)
116glVertexAttrib4bvARB=wrapper.wrapper(glVertexAttrib4bvARB).setInputArraySize(
117    'v', 4
118)
119glVertexAttrib4dvARB=wrapper.wrapper(glVertexAttrib4dvARB).setInputArraySize(
120    'v', 4
121)
122glVertexAttrib4fvARB=wrapper.wrapper(glVertexAttrib4fvARB).setInputArraySize(
123    'v', 4
124)
125glVertexAttrib4ivARB=wrapper.wrapper(glVertexAttrib4ivARB).setInputArraySize(
126    'v', 4
127)
128glVertexAttrib4svARB=wrapper.wrapper(glVertexAttrib4svARB).setInputArraySize(
129    'v', 4
130)
131glVertexAttrib4ubvARB=wrapper.wrapper(glVertexAttrib4ubvARB).setInputArraySize(
132    'v', 4
133)
134glVertexAttrib4uivARB=wrapper.wrapper(glVertexAttrib4uivARB).setInputArraySize(
135    'v', 4
136)
137glVertexAttrib4usvARB=wrapper.wrapper(glVertexAttrib4usvARB).setInputArraySize(
138    'v', 4
139)
140# INPUT glVertexAttribPointerARB.pointer size not checked against 'size,type,stride'
141glVertexAttribPointerARB=wrapper.wrapper(glVertexAttribPointerARB).setInputArraySize(
142    'pointer', None
143)
144# INPUT glProgramStringARB.string size not checked against len
145glProgramStringARB=wrapper.wrapper(glProgramStringARB).setInputArraySize(
146    'string', None
147)
148# INPUT glDeleteProgramsARB.programs size not checked against n
149glDeleteProgramsARB=wrapper.wrapper(glDeleteProgramsARB).setInputArraySize(
150    'programs', None
151)
152glGenProgramsARB=wrapper.wrapper(glGenProgramsARB).setOutput(
153    'programs',size=lambda x:(x,),pnameArg='n',orPassIn=True
154)
155glProgramEnvParameter4dvARB=wrapper.wrapper(glProgramEnvParameter4dvARB).setInputArraySize(
156    'params', 4
157)
158glProgramEnvParameter4fvARB=wrapper.wrapper(glProgramEnvParameter4fvARB).setInputArraySize(
159    'params', 4
160)
161glProgramLocalParameter4dvARB=wrapper.wrapper(glProgramLocalParameter4dvARB).setInputArraySize(
162    'params', 4
163)
164glProgramLocalParameter4fvARB=wrapper.wrapper(glProgramLocalParameter4fvARB).setInputArraySize(
165    'params', 4
166)
167glGetProgramEnvParameterdvARB=wrapper.wrapper(glGetProgramEnvParameterdvARB).setOutput(
168    'params',size=(4,),orPassIn=True
169)
170glGetProgramEnvParameterfvARB=wrapper.wrapper(glGetProgramEnvParameterfvARB).setOutput(
171    'params',size=(4,),orPassIn=True
172)
173glGetProgramLocalParameterdvARB=wrapper.wrapper(glGetProgramLocalParameterdvARB).setOutput(
174    'params',size=(4,),orPassIn=True
175)
176glGetProgramLocalParameterfvARB=wrapper.wrapper(glGetProgramLocalParameterfvARB).setOutput(
177    'params',size=(4,),orPassIn=True
178)
179glGetProgramivARB=wrapper.wrapper(glGetProgramivARB).setOutput(
180    'params',size=(1,),orPassIn=True
181)
182# OUTPUT glGetProgramStringARB.string COMPSIZE(target, pname)
183glGetVertexAttribdvARB=wrapper.wrapper(glGetVertexAttribdvARB).setOutput(
184    'params',size=(4,),orPassIn=True
185)
186glGetVertexAttribfvARB=wrapper.wrapper(glGetVertexAttribfvARB).setOutput(
187    'params',size=(4,),orPassIn=True
188)
189glGetVertexAttribivARB=wrapper.wrapper(glGetVertexAttribivARB).setOutput(
190    'params',size=(4,),orPassIn=True
191)
192glGetVertexAttribPointervARB=wrapper.wrapper(glGetVertexAttribPointervARB).setOutput(
193    'pointer',size=(1,),orPassIn=True
194)
195### END AUTOGENERATED SECTION
196from OpenGL.lazywrapper import lazy as _lazy
197
198from OpenGL import converters, error, contextdata
199from OpenGL.arrays.arraydatatype import ArrayDatatype
200# Note: sizes here are == the only documented sizes I could find,
201# may need a lookup table some day...
202
203@_lazy( glVertexAttribPointerARB )
204def glVertexAttribPointerARB(
205    baseOperation, index, size, type,
206    normalized, stride, pointer,
207):
208    """Set an attribute pointer for a given shader (index)
209
210    index -- the index of the generic vertex to bind, see
211        glGetAttribLocation for retrieval of the value,
212        note that index is a global variable, not per-shader
213    size -- number of basic elements per record, 1,2,3, or 4
214    type -- enum constant for data-type
215    normalized -- whether to perform int to float
216        normalization on integer-type values
217    stride -- stride in machine units (bytes) between
218        consecutive records, normally used to create
219        "interleaved" arrays
220    pointer -- data-pointer which provides the data-values,
221        normally a vertex-buffer-object or offset into the
222        same.
223
224    This implementation stores a copy of the data-pointer
225    in the contextdata structure in order to prevent null-
226    reference errors in the renderer.
227    """
228    array = ArrayDatatype.asArray( pointer, type )
229    key = ('vertex-attrib',index)
230    contextdata.setValue( key, array )
231    return baseOperation(
232        index, size, type,
233        normalized, stride,
234        ArrayDatatype.voidDataPointer( array )
235    )
236