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