| '''OpenGL extension NV.evaluators |
| |
| This module customises the behaviour of the |
| OpenGL.raw.GL.NV.evaluators to provide a more |
| Python-friendly API |
| |
| Overview (from the spec) |
| |
| OpenGL evaluators provide applications with the capability to |
| specify polynomial or rational curves and surfaces using control |
| points relative to the Bezier basis. The curves and surfaces are |
| then drawn by evaluating the polynomials provided at various values |
| for the u parameter of a curve or the (u,v) parameters of a surface. |
| A tensor product formulation is used for the surfaces. |
| |
| For various historical reasons, evaluators have not been |
| particularly popular as an interface for drawing curves and surfaces. |
| This extension proposes a new interface for surfaces that provides a |
| number of significant enhancements to the functionality provided by |
| the original OpenGL evaluators. |
| |
| Many implementations never optimized evaluators, so applications |
| often implemented their own algorithms instead. This extension |
| relaxes some restrictions that make it difficult to optimize |
| evaluators. |
| |
| Also, new vertex attributes have been added to OpenGL through |
| extensions, including multiple sets of texture coordinates, a |
| secondary color, a fog coordinate, a vertex weight, and others. |
| The extensions which added these vertex attributes never bothered |
| to update the functionality of evaluators, since they were used so |
| little in the first place. In turn, evaluators have become more and |
| more out of date, making it even less likely that developers will |
| want to use them. Most of the attributes are not a big loss, but |
| support for multiple sets of texture coordinates would be absolutely |
| essential to developers considering the use of evaluators. |
| |
| OpenGL evaluators only support rectangular patches, not triangular |
| patches. Although triangular patches can be converted into |
| rectangular patches, direct support for triangular patches is likely |
| to be more efficient. |
| |
| The tessellation algorithm used is too inflexible for most purposes; |
| only the number of rows and columns can be specified. Adjacent |
| patches must then have identical numbers of rows and columns, or |
| severe cracking will occur. Ideally, a number of subdivisions could |
| be specified for all four sides of a rectangular patch and for all |
| three of a triangular patch. This extension goes one step further |
| and allows those numbers to be specified in floating-point, providing |
| a mechanism for smoothly changing the level of detail of the surface. |
| |
| Meshes evaluated with EvalMesh are required to match up exactly |
| with equivalent meshes evaluated with EvalCoord or EvalPoint. |
| This makes it difficult or impossible to use optimizations such as |
| forward differencing. |
| |
| Finally, little attention is given to some of the difficult problems |
| that can arise when multiple patches are drawn. Depending on the |
| way evaluators are implemented, and depending on the orientation of |
| edges, numerical accuracy problems can cause cracks to appear between |
| patches with the same boundary control points. This extension makes |
| guarantees that an edge shared between two patches will match up |
| exactly under certain conditions. |
| |
| The official definition of this extension is available here: |
| http://www.opengl.org/registry/specs/NV/evaluators.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.NV.evaluators import * |
| from OpenGL.raw.GL.NV.evaluators import _EXTENSION_NAME |
|
|
| def glInitEvaluatorsNV(): |
| '''Return boolean indicating whether this extension is available''' |
| from OpenGL import extensions |
| return extensions.hasGLExtension( _EXTENSION_NAME ) |
|
|
| |
| glMapControlPointsNV=wrapper.wrapper(glMapControlPointsNV).setInputArraySize( |
| 'points', None |
| ) |
| |
| glMapParameterivNV=wrapper.wrapper(glMapParameterivNV).setInputArraySize( |
| 'params', None |
| ) |
| |
| glMapParameterfvNV=wrapper.wrapper(glMapParameterfvNV).setInputArraySize( |
| 'params', None |
| ) |
| glGetMapControlPointsNV=wrapper.wrapper(glGetMapControlPointsNV).setOutput( |
| 'points',size=_glgets._glget_size_mapping,pnameArg='target',orPassIn=True |
| ) |
| |
| |
| glGetMapAttribParameterivNV=wrapper.wrapper(glGetMapAttribParameterivNV).setOutput( |
| 'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True |
| ) |
| glGetMapAttribParameterfvNV=wrapper.wrapper(glGetMapAttribParameterfvNV).setOutput( |
| 'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True |
| ) |
| |