| '''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 ) |
|
|
| |
| glDrawElementsBaseVertex=wrapper.wrapper(glDrawElementsBaseVertex).setInputArraySize( |
| 'indices', None |
| ) |
| |
| glDrawRangeElementsBaseVertex=wrapper.wrapper(glDrawRangeElementsBaseVertex).setInputArraySize( |
| 'indices', None |
| ) |
| |
| glDrawElementsInstancedBaseVertex=wrapper.wrapper(glDrawElementsInstancedBaseVertex).setInputArraySize( |
| 'indices', None |
| ) |
| |
| |
| |
| glMultiDrawElementsBaseVertex=wrapper.wrapper(glMultiDrawElementsBaseVertex).setInputArraySize( |
| 'count', None |
| ).setInputArraySize( |
| 'indices', None |
| ).setInputArraySize( |
| 'basevertex', None |
| ) |
| |