1'''OpenGL extension VERSION.GLES2_2_0
2
3This module customises the behaviour of the
4OpenGL.raw.GLES2.VERSION.GLES2_2_0 to provide a more
5Python-friendly API
6
7The official definition of this extension is available here:
8http://www.opengl.org/registry/specs/VERSION/GLES2_2_0.txt
9'''
10from OpenGL import platform, constant, arrays
11from OpenGL import extensions, wrapper
12import ctypes
13from OpenGL.raw.GLES2 import _types, _glgets
14from OpenGL.raw.GLES2.VERSION.GLES2_2_0 import *
15from OpenGL.raw.GLES2.VERSION.GLES2_2_0 import _EXTENSION_NAME
16
17def glInitGles220VERSION():
18    '''Return boolean indicating whether this extension is available'''
19    from OpenGL import extensions
20    return extensions.hasGLExtension( _EXTENSION_NAME )
21
22# INPUT glBufferData.data size not checked against size
23glBufferData=wrapper.wrapper(glBufferData).setInputArraySize(
24    'data', None
25)
26# INPUT glBufferSubData.data size not checked against size
27glBufferSubData=wrapper.wrapper(glBufferSubData).setInputArraySize(
28    'data', None
29)
30# INPUT glCompressedTexImage2D.data size not checked against imageSize
31glCompressedTexImage2D=wrapper.wrapper(glCompressedTexImage2D).setInputArraySize(
32    'data', None
33)
34# INPUT glCompressedTexSubImage2D.data size not checked against imageSize
35glCompressedTexSubImage2D=wrapper.wrapper(glCompressedTexSubImage2D).setInputArraySize(
36    'data', None
37)
38# INPUT glDeleteBuffers.buffers size not checked against n
39glDeleteBuffers=wrapper.wrapper(glDeleteBuffers).setInputArraySize(
40    'buffers', None
41)
42# INPUT glDeleteFramebuffers.framebuffers size not checked against n
43glDeleteFramebuffers=wrapper.wrapper(glDeleteFramebuffers).setInputArraySize(
44    'framebuffers', None
45)
46# INPUT glDeleteRenderbuffers.renderbuffers size not checked against n
47glDeleteRenderbuffers=wrapper.wrapper(glDeleteRenderbuffers).setInputArraySize(
48    'renderbuffers', None
49)
50# INPUT glDeleteTextures.textures size not checked against n
51glDeleteTextures=wrapper.wrapper(glDeleteTextures).setInputArraySize(
52    'textures', None
53)
54# INPUT glDrawElements.indices size not checked against 'count,type'
55glDrawElements=wrapper.wrapper(glDrawElements).setInputArraySize(
56    'indices', None
57)
58glGenBuffers=wrapper.wrapper(glGenBuffers).setOutput(
59    'buffers',size=lambda x:(x,),pnameArg='n',orPassIn=True
60)
61glGenFramebuffers=wrapper.wrapper(glGenFramebuffers).setOutput(
62    'framebuffers',size=lambda x:(x,),pnameArg='n',orPassIn=True
63)
64glGenRenderbuffers=wrapper.wrapper(glGenRenderbuffers).setOutput(
65    'renderbuffers',size=lambda x:(x,),pnameArg='n',orPassIn=True
66)
67glGenTextures=wrapper.wrapper(glGenTextures).setOutput(
68    'textures',size=lambda x:(x,),pnameArg='n',orPassIn=True
69)
70glGetActiveAttrib=wrapper.wrapper(glGetActiveAttrib).setOutput(
71    'length',size=(1,),orPassIn=True
72).setOutput(
73    'type',size=(1,),orPassIn=True
74).setOutput(
75    'name',size=lambda x:(x,),pnameArg='bufSize',orPassIn=True
76).setOutput(
77    'size',size=(1,),orPassIn=True
78)
79glGetActiveUniform=wrapper.wrapper(glGetActiveUniform).setOutput(
80    'length',size=(1,),orPassIn=True
81).setOutput(
82    'type',size=(1,),orPassIn=True
83).setOutput(
84    'name',size=lambda x:(x,),pnameArg='bufSize',orPassIn=True
85).setOutput(
86    'size',size=(1,),orPassIn=True
87)
88# glGetAttachedShaders.obj is OUTPUT without known output size
89# INPUT glGetAttachedShaders.shaders size not checked against maxCount
90glGetAttachedShaders=wrapper.wrapper(glGetAttachedShaders).setOutput(
91    'count',size=(1,),orPassIn=True
92).setInputArraySize(
93    'shaders', None
94)
95glGetBooleanv=wrapper.wrapper(glGetBooleanv).setOutput(
96    'data',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True
97)
98glGetBufferParameteriv=wrapper.wrapper(glGetBufferParameteriv).setOutput(
99    'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True
100)
101glGetFloatv=wrapper.wrapper(glGetFloatv).setOutput(
102    'data',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True
103)
104glGetFramebufferAttachmentParameteriv=wrapper.wrapper(glGetFramebufferAttachmentParameteriv).setOutput(
105    'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True
106)
107glGetIntegerv=wrapper.wrapper(glGetIntegerv).setOutput(
108    'data',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True
109)
110glGetProgramiv=wrapper.wrapper(glGetProgramiv).setOutput(
111    'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True
112)
113glGetProgramInfoLog=wrapper.wrapper(glGetProgramInfoLog).setOutput(
114    'length',size=(1,),orPassIn=True
115).setOutput(
116    'infoLog',size=lambda x:(x,),pnameArg='bufSize',orPassIn=True
117)
118glGetRenderbufferParameteriv=wrapper.wrapper(glGetRenderbufferParameteriv).setOutput(
119    'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True
120)
121glGetShaderiv=wrapper.wrapper(glGetShaderiv).setOutput(
122    'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True
123)
124glGetShaderInfoLog=wrapper.wrapper(glGetShaderInfoLog).setOutput(
125    'length',size=(1,),orPassIn=True
126).setOutput(
127    'infoLog',size=lambda x:(x,),pnameArg='bufSize',orPassIn=True
128)
129glGetShaderPrecisionFormat=wrapper.wrapper(glGetShaderPrecisionFormat).setOutput(
130    'range',size=(2,),orPassIn=True
131).setOutput(
132    'precision',size=(2,),orPassIn=True
133)
134glGetShaderSource=wrapper.wrapper(glGetShaderSource).setOutput(
135    'source',size=lambda x:(x,),pnameArg='bufSize',orPassIn=True
136).setOutput(
137    'length',size=(1,),orPassIn=True
138)
139glGetTexParameterfv=wrapper.wrapper(glGetTexParameterfv).setOutput(
140    'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True
141)
142glGetTexParameteriv=wrapper.wrapper(glGetTexParameteriv).setOutput(
143    'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True
144)
145# glGetUniformfv.params is OUTPUT without known output size
146# glGetUniformiv.params is OUTPUT without known output size
147glGetVertexAttribfv=wrapper.wrapper(glGetVertexAttribfv).setOutput(
148    'params',size=(4,),orPassIn=True
149)
150glGetVertexAttribiv=wrapper.wrapper(glGetVertexAttribiv).setOutput(
151    'params',size=(4,),orPassIn=True
152)
153glGetVertexAttribPointerv=wrapper.wrapper(glGetVertexAttribPointerv).setOutput(
154    'pointer',size=(1,),orPassIn=True
155)
156# OUTPUT glReadPixels.pixels COMPSIZE(format,type,width,height)
157# INPUT glShaderBinary.binary size not checked against length
158# INPUT glShaderBinary.shaders size not checked against count
159glShaderBinary=wrapper.wrapper(glShaderBinary).setInputArraySize(
160    'binary', None
161).setInputArraySize(
162    'shaders', None
163)
164# INPUT glShaderSource.length size not checked against count
165# INPUT glShaderSource.string size not checked against count
166glShaderSource=wrapper.wrapper(glShaderSource).setInputArraySize(
167    'length', None
168).setInputArraySize(
169    'string', None
170)
171# INPUT glTexImage2D.pixels size not checked against 'format,type,width,height'
172glTexImage2D=wrapper.wrapper(glTexImage2D).setInputArraySize(
173    'pixels', None
174)
175# INPUT glTexParameterfv.params size not checked against 'pname'
176glTexParameterfv=wrapper.wrapper(glTexParameterfv).setInputArraySize(
177    'params', None
178)
179# INPUT glTexParameteriv.params size not checked against 'pname'
180glTexParameteriv=wrapper.wrapper(glTexParameteriv).setInputArraySize(
181    'params', None
182)
183# INPUT glTexSubImage2D.pixels size not checked against 'format,type,width,height'
184glTexSubImage2D=wrapper.wrapper(glTexSubImage2D).setInputArraySize(
185    'pixels', None
186)
187# INPUT glUniform1fv.value size not checked against count
188glUniform1fv=wrapper.wrapper(glUniform1fv).setInputArraySize(
189    'value', None
190)
191# INPUT glUniform1iv.value size not checked against count
192glUniform1iv=wrapper.wrapper(glUniform1iv).setInputArraySize(
193    'value', None
194)
195# INPUT glUniform2fv.value size not checked against count
196glUniform2fv=wrapper.wrapper(glUniform2fv).setInputArraySize(
197    'value', None
198)
199# INPUT glUniform2iv.value size not checked against count
200glUniform2iv=wrapper.wrapper(glUniform2iv).setInputArraySize(
201    'value', None
202)
203# INPUT glUniform3fv.value size not checked against count
204glUniform3fv=wrapper.wrapper(glUniform3fv).setInputArraySize(
205    'value', None
206)
207# INPUT glUniform3iv.value size not checked against count
208glUniform3iv=wrapper.wrapper(glUniform3iv).setInputArraySize(
209    'value', None
210)
211# INPUT glUniform4fv.value size not checked against count
212glUniform4fv=wrapper.wrapper(glUniform4fv).setInputArraySize(
213    'value', None
214)
215# INPUT glUniform4iv.value size not checked against count
216glUniform4iv=wrapper.wrapper(glUniform4iv).setInputArraySize(
217    'value', None
218)
219# INPUT glUniformMatrix2fv.value size not checked against count
220glUniformMatrix2fv=wrapper.wrapper(glUniformMatrix2fv).setInputArraySize(
221    'value', None
222)
223# INPUT glUniformMatrix3fv.value size not checked against count
224glUniformMatrix3fv=wrapper.wrapper(glUniformMatrix3fv).setInputArraySize(
225    'value', None
226)
227# INPUT glUniformMatrix4fv.value size not checked against count
228glUniformMatrix4fv=wrapper.wrapper(glUniformMatrix4fv).setInputArraySize(
229    'value', None
230)
231glVertexAttrib1fv=wrapper.wrapper(glVertexAttrib1fv).setInputArraySize(
232    'v', 1
233)
234glVertexAttrib2fv=wrapper.wrapper(glVertexAttrib2fv).setInputArraySize(
235    'v', 2
236)
237glVertexAttrib3fv=wrapper.wrapper(glVertexAttrib3fv).setInputArraySize(
238    'v', 3
239)
240glVertexAttrib4fv=wrapper.wrapper(glVertexAttrib4fv).setInputArraySize(
241    'v', 4
242)
243# INPUT glVertexAttribPointer.pointer size not checked against 'size,type,stride'
244glVertexAttribPointer=wrapper.wrapper(glVertexAttribPointer).setInputArraySize(
245    'pointer', None
246)
247### END AUTOGENERATED SECTION
248from OpenGL import converters
249from OpenGL.lazywrapper import lazy as _lazy
250
251glShaderSource = platform.createExtensionFunction(
252    'glShaderSource', dll=platform.PLATFORM.GLES2,
253    resultType=None,
254    argTypes=(_types.GLhandle, _types.GLsizei, ctypes.POINTER(ctypes.c_char_p), arrays.GLintArray,),
255    doc = 'glShaderSource( GLhandle(shaderObj),[bytes(string),...]) -> None',
256    argNames = ('shaderObj', 'count', 'string', 'length',),
257    extension = _EXTENSION_NAME,
258)
259
260conv = converters.StringLengths( name='string' )
261glShaderSource = wrapper.wrapper(
262    glShaderSource
263).setPyConverter(
264    'count' # number of strings
265).setPyConverter(
266    'length' # lengths of strings
267).setPyConverter(
268    'string', conv.stringArray
269).setCResolver(
270    'string', conv.stringArrayForC,
271).setCConverter(
272    'length', conv,
273).setCConverter(
274    'count', conv.totalCount,
275)
276try:
277    del conv
278except NameError as err:
279    pass
280
281glGetShaderiv = wrapper.wrapper( glGetShaderiv ).setOutput(
282    'params',
283    size=(1,),
284    arrayType=arrays.GLintArray,
285    orPassIn = True,
286)
287
288
289@_lazy( glGetShaderInfoLog )
290def glGetShaderInfoLog( baseOperation, obj ):
291    """Retrieve the shader's error messages as a Python string
292
293    returns string which is '' if no message
294    """
295    length = int(glGetShaderiv(obj, GL_INFO_LOG_LENGTH))
296    if length > 0:
297        log = ctypes.create_string_buffer(length)
298        baseOperation(obj, length, None, log)
299        return log.value.strip(_NULL_8_BYTE) # null-termination
300    return ''
301@_lazy( glGetProgramInfoLog )
302def glGetProgramInfoLog( baseOperation, obj ):
303    """Retrieve the shader program's error messages as a Python string
304
305    returns string which is '' if no message
306    """
307    length = int(glGetProgramiv(obj, GL_INFO_LOG_LENGTH))
308    if length > 0:
309        log = ctypes.create_string_buffer(length)
310        baseOperation(obj, length, None, log)
311        return log.value.strip(_NULL_8_BYTE) # null-termination
312    return ''
313
314@_lazy( glGetAttachedShaders )
315def glGetAttachedShaders( baseOperation, obj ):
316    """Retrieve the attached objects as an array of GLhandle instances"""
317    length= glGetProgramiv( obj, GL_ATTACHED_SHADERS )
318    if length > 0:
319        storage = arrays.GLuintArray.zeros( (length,))
320        baseOperation( obj, length, None, storage )
321        return storage
322    return arrays.GLuintArray.zeros( (0,))
323
324
325@_lazy( glGetShaderSource )
326def glGetShaderSource( baseOperation, obj ):
327    """Retrieve the program/shader's source code as a Python string
328
329    returns string which is '' if no source code
330    """
331    length = int(glGetShaderiv(obj, GL_OBJECT_SHADER_SOURCE_LENGTH))
332    if length > 0:
333        source = ctypes.create_string_buffer(length)
334        baseOperation(obj, length, None, source)
335        return source.value.strip(_NULL_8_BYTE) # null-termination
336    return ''
337
338@_lazy( glGetActiveUniform )
339def glGetActiveUniform(baseOperation,program, index):
340    """Retrieve the name, size and type of the uniform of the index in the program"""
341    max_index = int(glGetProgramiv( program, GL_OBJECT_ACTIVE_UNIFORMS ))
342    length = int(glGetProgramiv( program, GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH))
343    if index < max_index and index >= 0:
344        if length > 0:
345            name = ctypes.create_string_buffer(length)
346            size = arrays.GLintArray.zeros( (1,))
347            gl_type = arrays.GLenumArray.zeros( (1,))
348            namelen = arrays.GLsizeiArray.zeros( (1,))
349            baseOperation(program, index, length, namelen, size, gl_type, name)
350            return name.value[:int(namelen[0])], size[0], gl_type[0]
351        raise ValueError( """No currently specified uniform names""" )
352    raise IndexError( 'Index %s out of range 0 to %i' % (index, max_index - 1, ) )
353
354@_lazy( glGetUniformLocation )
355def glGetUniformLocation( baseOperation, program, name ):
356    """Check that name is a string with a null byte at the end of it"""
357    if not name:
358        raise ValueError( """Non-null name required""" )
359    name = as_8_bit( name )
360    if name[-1] != _NULL_8_BYTE:
361        name = name + _NULL_8_BYTE
362    return baseOperation( program, name )
363@_lazy( glGetAttribLocation )
364def glGetAttribLocation( baseOperation, program, name ):
365    """Check that name is a string with a null byte at the end of it"""
366    if not name:
367        raise ValueError( """Non-null name required""" )
368
369    name = as_8_bit( name )
370    if name[-1] != _NULL_8_BYTE:
371        name = name + _NULL_8_BYTE
372    return baseOperation( program, name )
373
374@_lazy( glVertexAttribPointer )
375def glVertexAttribPointer(
376    baseOperation, index, size, type,
377    normalized, stride, pointer,
378):
379    """Set an attribute pointer for a given shader (index)
380
381    index -- the index of the generic vertex to bind, see
382        glGetAttribLocation for retrieval of the value,
383        note that index is a global variable, not per-shader
384    size -- number of basic elements per record, 1,2,3, or 4
385    type -- enum constant for data-type
386    normalized -- whether to perform int to float
387        normalization on integer-type values
388    stride -- stride in machine units (bytes) between
389        consecutive records, normally used to create
390        "interleaved" arrays
391    pointer -- data-pointer which provides the data-values,
392        normally a vertex-buffer-object or offset into the
393        same.
394
395    This implementation stores a copy of the data-pointer
396    in the contextdata structure in order to prevent null-
397    reference errors in the renderer.
398    """
399    array = ArrayDatatype.asArray( pointer, type )
400    key = ('vertex-attrib',index)
401    contextdata.setValue( key, array )
402    return baseOperation(
403        index, size, type,
404        normalized, stride,
405        ArrayDatatype.voidDataPointer( array )
406    )
407
408