'''OpenGL extension NV.geometry_program4

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

Overview (from the spec)
	
	NV_geometry_program4 defines a new type of program available to be run on
	the GPU, called a geometry program.  Geometry programs are run on full
	primitives after vertices are transformed, but prior to flat shading and
	clipping.
	
	A geometry program begins with a single primitive - a point, line, or
	triangle.  Quads and polygons are allowed, but are decomposed into
	individual triangles prior to geometry program execution.  It can read the
	attributes of any of the vertex in the primitive and use them to generate
	new primitives.  A geometry program has a fixed output primitive type,
	either a point, a line strip, or a triangle strip.  It emits vertices
	(using the EMIT opcode) to define the output primitive.  The attributes of
	emitted vertices are specified by writing to the same set of result
	bindings (e.g., "result.position") provided for vertex programs.
	Additionally, a geometry program can emit multiple disconnected primitives
	by using the ENDPRIM opcode, which is roughly equivalent to calling End
	and then Begin again.  The primitives emitted by the geometry program are
	then clipped and then processed like an equivalent OpenGL primitive
	specified by the application.
	
	This extension provides four additional primitive types:  lines with
	adjacency, line strips with adjacency, separate triangles with adjacency,
	and triangle strips with adjacency.  Some of the vertices specified in
	these new primitive types are not part of the ordinary primitives.
	Instead, they represent neighboring vertices that are adjacent to the two
	line segment end points (lines/strips) or the three triangle edges
	(triangles/tstrips).  These "adjacency" vertices can be accessed by
	geometry programs and used to match up the outputs of the geometry program
	with those of neighboring primitives.
	
	Additionally, geometry programs allow for layered rendering, where entire
	three-dimensional, cube map, or array textures (EXT_texture_array) can be
	bound to the current framebuffer.  Geometry programs can use the
	"result.layer" binding to select a layer or cube map face to render to.
	Each primitive emitted by such a geometry program is rendered to the layer
	taken from its provoking vertex.
	
	Since geometry programs expect a specific input primitive type, an error
	will occur if the application presents primtives of a different type.  For
	example, if an enabled geometry program expects points, an error will
	occur at Begin() time, if a primitive mode of TRIANGLES is specified.

The official definition of this extension is available here:
http://www.opengl.org/registry/specs/NV/geometry_program4.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.geometry_program4 import *
from OpenGL.raw.GL.NV.geometry_program4 import _EXTENSION_NAME

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


### END AUTOGENERATED SECTION