File: draw_elements_base_vertex.py

package info (click to toggle)
pyopengl 3.1.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 11,184 kB
  • ctags: 21,473
  • sloc: python: 80,468; makefile: 4
file content (101 lines) | stat: -rw-r--r-- 4,190 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
'''OpenGL extension ARB.draw_elements_base_vertex

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

Overview (from the spec)
	
	This extension provides a method to specify a "base vertex offset"
	value which is effectively added to every vertex index that is
	transferred through DrawElements.
	
	This mechanism can be used to decouple a set of indices from the
	actual vertex array that it is referencing. This is useful if an
	application stores multiple indexed models in a single vertex array.
	The same index array can be used to draw the model no matter where
	it ends up in a larger vertex array simply by changing the base
	vertex value. Without this functionality, it would be necessary to
	rebind all the vertex attributes every time geometry is switched and
	this can have larger performance penalty.
	
	For example consider the (very contrived and simple) example of
	drawing two triangles to form a quad. In the typical example you
	have the following setup:
	
	      vertices                indices
	     ----------                -----
	  0 | (-1,  1) |            0 |  0  |
	  1 | (-1, -1) |            1 |  1  |
	  2 | ( 1, -1) |            2 |  2  |
	  3 | ( 1,  1) |            3 |  3  |
	     ----------             4 |  0  |
	                            5 |  2  |
	                               -----
	which is normally rendered with the call
	
	   DrawElements(TRIANGLES, 6, UNSIGNED_BYTE, &indices).
	
	Now consider the case where the vertices you want to draw are not at
	the start of a vertex array but are instead located at offset 100
	into a larger array:
	
	       vertices2             indices2
	       ----------             -----
	          ....             0 | 100 |
	  100 | (-1,  1) |         1 | 101 |
	  101 | (-1, -1) |         2 | 102 |
	  102 | ( 1, -1) |         3 | 103 |
	  103 | ( 1,  1) |         4 | 100 |
	          ....             5 | 102 |
	       ----------             -----
	
	The typical choices for rendering this are to rebind your vertex
	attributes with an additional offset of 100*stride, or to create an
	new array of indices (as indices2 in the example). However both
	rebinding vertex attributes and rebuilding index arrays can be quite
	costly activities.
	
	With the new drawing commands introduced by this extension you can
	instead draw using vertices2 and the new draw call:
	
	   DrawElementsBaseVertex(TRIANGLES, 6, UNSIGNED_BYTE, &indices, 100)

The official definition of this extension is available here:
http://www.opengl.org/registry/specs/ARB/draw_elements_base_vertex.txt
'''
from OpenGL import platform, constant, arrays
from OpenGL import extensions, wrapper
import ctypes
from OpenGL.raw.GL import _types, _glgets
from OpenGL.raw.GL.ARB.draw_elements_base_vertex import *
from OpenGL.raw.GL.ARB.draw_elements_base_vertex import _EXTENSION_NAME

def glInitDrawElementsBaseVertexARB():
    '''Return boolean indicating whether this extension is available'''
    from OpenGL import extensions
    return extensions.hasGLExtension( _EXTENSION_NAME )

# INPUT glDrawElementsBaseVertex.indices size not checked against 'count,type'
glDrawElementsBaseVertex=wrapper.wrapper(glDrawElementsBaseVertex).setInputArraySize(
    'indices', None
)
# INPUT glDrawRangeElementsBaseVertex.indices size not checked against 'count,type'
glDrawRangeElementsBaseVertex=wrapper.wrapper(glDrawRangeElementsBaseVertex).setInputArraySize(
    'indices', None
)
# INPUT glDrawElementsInstancedBaseVertex.indices size not checked against 'count,type'
glDrawElementsInstancedBaseVertex=wrapper.wrapper(glDrawElementsInstancedBaseVertex).setInputArraySize(
    'indices', None
)
# INPUT glMultiDrawElementsBaseVertex.count size not checked against 'drawcount'
# INPUT glMultiDrawElementsBaseVertex.indices size not checked against 'drawcount'
# INPUT glMultiDrawElementsBaseVertex.basevertex size not checked against 'drawcount'
glMultiDrawElementsBaseVertex=wrapper.wrapper(glMultiDrawElementsBaseVertex).setInputArraySize(
    'count', None
).setInputArraySize(
    'indices', None
).setInputArraySize(
    'basevertex', None
)
### END AUTOGENERATED SECTION