|
"""Implementations for "held-pointers" of various types |
|
|
|
This argument type is special because it is stored, that is, it |
|
needs to be cached on our side so that the memory address does not |
|
go out-of-scope |
|
|
|
storedPointers = {} |
|
def glVertexPointerd( array ): |
|
"Natural writing of glVertexPointerd using standard ctypes" |
|
arg2 = GL_DOUBLE |
|
arg3 = 0 # stride |
|
arg4 = arrays.asArray(array, GL_DOUBLE) |
|
arg1 = arrays.arraySize( arg4, 'd' ) |
|
platform.PLATFORM.GL.glVertexPointer( arg1, arg2, arg3, arrays.ArrayDatatype.dataPointer(arg4) ) |
|
# only store if we successfully set the value... |
|
storedPointers[ GL_VERTEX_ARRAY ] = arg4 |
|
return arg4 |
|
""" |
|
from OpenGL import platform, error, wrapper, contextdata, converters, constant |
|
from OpenGL.arrays import arrayhelpers, arraydatatype |
|
from OpenGL.raw.GL.VERSION import GL_1_1 as _simple |
|
import ctypes |
|
|
|
GLsizei = ctypes.c_int |
|
GLenum = ctypes.c_uint |
|
GLint = ctypes.c_int |
|
|
|
GL_INTERLEAVED_ARRAY_POINTER = constant.Constant( 'GL_INTERLEAVED_ARRAY_POINTER', -32910 ) |
|
|
|
__all__ = ( |
|
'glColorPointer', |
|
'glColorPointerb','glColorPointerd','glColorPointerf','glColorPointeri', |
|
'glColorPointers','glColorPointerub','glColorPointerui','glColorPointerus', |
|
'glEdgeFlagPointer', |
|
'glEdgeFlagPointerb', |
|
'glIndexPointer', |
|
'glIndexPointerb','glIndexPointerd','glIndexPointerf', |
|
'glIndexPointeri','glIndexPointers','glIndexPointerub', |
|
'glNormalPointer', |
|
'glNormalPointerb', |
|
'glNormalPointerd','glNormalPointerf','glNormalPointeri','glNormalPointers', |
|
'glTexCoordPointer', |
|
'glTexCoordPointerb','glTexCoordPointerd','glTexCoordPointerf', |
|
'glTexCoordPointeri','glTexCoordPointers', |
|
'glVertexPointer', |
|
'glVertexPointerb','glVertexPointerd','glVertexPointerf','glVertexPointeri', |
|
'glVertexPointers', |
|
'glDrawElements','glDrawElementsui','glDrawElementsub','glDrawElementsus', |
|
'glFeedbackBuffer', |
|
'glSelectBuffer', |
|
'glRenderMode', |
|
'glGetPointerv', |
|
'glInterleavedArrays', |
|
'GL_INTERLEAVED_ARRAY_POINTER', |
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
POINTER_FUNCTION_DATA = [ |
|
('glColorPointerd', _simple.glColorPointer, _simple.GL_DOUBLE, _simple.GL_COLOR_ARRAY_POINTER, 0, 3), |
|
('glColorPointerf', _simple.glColorPointer, _simple.GL_FLOAT, _simple.GL_COLOR_ARRAY_POINTER, 0, 3), |
|
('glColorPointeri', _simple.glColorPointer, _simple.GL_INT, _simple.GL_COLOR_ARRAY_POINTER, 0, 3), |
|
('glColorPointers', _simple.glColorPointer, _simple.GL_SHORT, _simple.GL_COLOR_ARRAY_POINTER, 0, 3), |
|
('glColorPointerub', _simple.glColorPointer, _simple.GL_UNSIGNED_BYTE, _simple.GL_COLOR_ARRAY_POINTER, 0, 3), |
|
|
|
('glColorPointerb', _simple.glColorPointer, _simple.GL_BYTE, _simple.GL_COLOR_ARRAY_POINTER, 0, 3), |
|
('glColorPointerui', _simple.glColorPointer, _simple.GL_UNSIGNED_INT, _simple.GL_COLOR_ARRAY_POINTER, 0, 3), |
|
('glColorPointerus', _simple.glColorPointer, _simple.GL_UNSIGNED_SHORT, _simple.GL_COLOR_ARRAY_POINTER, 0, 3), |
|
|
|
('glEdgeFlagPointerb', _simple.glEdgeFlagPointer, _simple.GL_BYTE, _simple.GL_EDGE_FLAG_ARRAY_POINTER, 2, None), |
|
|
|
('glIndexPointerd', _simple.glIndexPointer, _simple.GL_DOUBLE, _simple.GL_INDEX_ARRAY_POINTER, 1, None), |
|
('glIndexPointerf', _simple.glIndexPointer, _simple.GL_FLOAT, _simple.GL_INDEX_ARRAY_POINTER, 1, None), |
|
('glIndexPointeri', _simple.glIndexPointer, _simple.GL_INT, _simple.GL_INDEX_ARRAY_POINTER, 1, None), |
|
('glIndexPointerub', _simple.glIndexPointer, _simple.GL_UNSIGNED_BYTE, _simple.GL_INDEX_ARRAY_POINTER, 1, None), |
|
('glIndexPointers', _simple.glIndexPointer, _simple.GL_SHORT, _simple.GL_INDEX_ARRAY_POINTER, 1, None), |
|
|
|
('glIndexPointerb', _simple.glIndexPointer, _simple.GL_BYTE, _simple.GL_INDEX_ARRAY_POINTER, 1, None), |
|
|
|
('glNormalPointerd', _simple.glNormalPointer, _simple.GL_DOUBLE, _simple.GL_NORMAL_ARRAY_POINTER, 1, None), |
|
('glNormalPointerf', _simple.glNormalPointer, _simple.GL_FLOAT, _simple.GL_NORMAL_ARRAY_POINTER, 1, None), |
|
('glNormalPointeri', _simple.glNormalPointer, _simple.GL_INT, _simple.GL_NORMAL_ARRAY_POINTER, 1, None), |
|
('glNormalPointerb', _simple.glNormalPointer, _simple.GL_BYTE, _simple.GL_NORMAL_ARRAY_POINTER, 1, None), |
|
('glNormalPointers', _simple.glNormalPointer, _simple.GL_SHORT, _simple.GL_NORMAL_ARRAY_POINTER, 1, None), |
|
|
|
('glTexCoordPointerd', _simple.glTexCoordPointer, _simple.GL_DOUBLE, _simple.GL_TEXTURE_COORD_ARRAY_POINTER, 0, 2), |
|
('glTexCoordPointerf', _simple.glTexCoordPointer, _simple.GL_FLOAT, _simple.GL_TEXTURE_COORD_ARRAY_POINTER, 0, 2), |
|
('glTexCoordPointeri', _simple.glTexCoordPointer, _simple.GL_INT, _simple.GL_TEXTURE_COORD_ARRAY_POINTER, 0, 2), |
|
('glTexCoordPointerb', _simple.glTexCoordPointer, _simple.GL_BYTE, _simple.GL_TEXTURE_COORD_ARRAY_POINTER, 0, 2), |
|
('glTexCoordPointers', _simple.glTexCoordPointer, _simple.GL_SHORT, _simple.GL_TEXTURE_COORD_ARRAY_POINTER, 0, 2), |
|
|
|
('glVertexPointerd', _simple.glVertexPointer, _simple.GL_DOUBLE, _simple.GL_VERTEX_ARRAY_POINTER, 0, 3), |
|
('glVertexPointerf', _simple.glVertexPointer, _simple.GL_FLOAT, _simple.GL_VERTEX_ARRAY_POINTER, 0, 3), |
|
('glVertexPointeri', _simple.glVertexPointer, _simple.GL_INT, _simple.GL_VERTEX_ARRAY_POINTER, 0, 3), |
|
('glVertexPointerb', _simple.glVertexPointer, _simple.GL_INT, _simple.GL_VERTEX_ARRAY_POINTER, 0, 3), |
|
('glVertexPointers', _simple.glVertexPointer, _simple.GL_SHORT, _simple.GL_VERTEX_ARRAY_POINTER, 0, 3), |
|
] |
|
def wrapPointerFunction( name, baseFunction, glType, arrayType,startArgs, defaultSize ): |
|
"""Wrap the given pointer-setting function""" |
|
function= wrapper.wrapper( baseFunction ) |
|
if 'ptr' in baseFunction.argNames: |
|
pointer_name = 'ptr' |
|
else: |
|
pointer_name = 'pointer' |
|
assert not getattr( function, 'pyConverters', None ), """Reusing wrappers?""" |
|
if arrayType: |
|
arrayModuleType = arraydatatype.GL_CONSTANT_TO_ARRAY_TYPE[ glType ] |
|
function.setPyConverter( pointer_name, arrayhelpers.asArrayType(arrayModuleType) ) |
|
else: |
|
function.setPyConverter( pointer_name, arrayhelpers.AsArrayOfType(pointer_name,'type') ) |
|
function.setCConverter( pointer_name, converters.getPyArgsName( pointer_name ) ) |
|
if 'size' in function.argNames: |
|
function.setPyConverter( 'size' ) |
|
function.setCConverter( 'size', arrayhelpers.arraySizeOfFirstType(arrayModuleType,defaultSize) ) |
|
if 'type' in function.argNames: |
|
function.setPyConverter( 'type' ) |
|
function.setCConverter( 'type', glType ) |
|
if 'stride' in function.argNames: |
|
function.setPyConverter( 'stride' ) |
|
function.setCConverter( 'stride', 0 ) |
|
function.setStoreValues( arrayhelpers.storePointerType( pointer_name, arrayType ) ) |
|
function.setReturnValues( wrapper.returnPyArgument( pointer_name ) ) |
|
return name,function |
|
|
|
|
|
|
|
for name,function in [ |
|
wrapPointerFunction( *args ) |
|
for args in POINTER_FUNCTION_DATA |
|
]: |
|
globals()[name] = function |
|
try: |
|
del name, function |
|
except NameError as err: |
|
pass |
|
|
|
glVertexPointer = wrapper.wrapper( _simple.glVertexPointer ).setPyConverter( |
|
'pointer', arrayhelpers.AsArrayOfType( 'pointer', 'type' ), |
|
).setStoreValues( |
|
arrayhelpers.storePointerType( 'pointer', _simple.GL_VERTEX_ARRAY_POINTER ) |
|
).setReturnValues( |
|
wrapper.returnPyArgument( 'pointer' ) |
|
) |
|
glTexCoordPointer = wrapper.wrapper( _simple.glTexCoordPointer ).setPyConverter( |
|
'pointer', arrayhelpers.AsArrayOfType( 'pointer', 'type' ), |
|
).setStoreValues( |
|
arrayhelpers.storePointerType( 'pointer', _simple.GL_TEXTURE_COORD_ARRAY_POINTER ) |
|
).setReturnValues( |
|
wrapper.returnPyArgument( 'pointer' ) |
|
) |
|
glNormalPointer = wrapper.wrapper( _simple.glNormalPointer ).setPyConverter( |
|
'pointer', arrayhelpers.AsArrayOfType( 'pointer', 'type' ), |
|
).setStoreValues( |
|
arrayhelpers.storePointerType( 'pointer', _simple.GL_NORMAL_ARRAY_POINTER ) |
|
).setReturnValues( |
|
wrapper.returnPyArgument( 'pointer' ) |
|
) |
|
glIndexPointer = wrapper.wrapper( _simple.glIndexPointer ).setPyConverter( |
|
'pointer', arrayhelpers.AsArrayOfType( 'pointer', 'type' ), |
|
).setStoreValues( |
|
arrayhelpers.storePointerType( 'pointer', _simple.GL_INDEX_ARRAY_POINTER ) |
|
).setReturnValues( |
|
wrapper.returnPyArgument( 'pointer' ) |
|
) |
|
glEdgeFlagPointer = wrapper.wrapper( _simple.glEdgeFlagPointer ).setPyConverter( |
|
|
|
'pointer', arrayhelpers.AsArrayTyped( 'pointer', arraydatatype.GLushortArray ), |
|
).setStoreValues( |
|
arrayhelpers.storePointerType( 'pointer', _simple.GL_EDGE_FLAG_ARRAY_POINTER ) |
|
).setReturnValues( |
|
wrapper.returnPyArgument( 'pointer' ) |
|
) |
|
glColorPointer = wrapper.wrapper( _simple.glColorPointer ).setPyConverter( |
|
'pointer', arrayhelpers.AsArrayOfType( 'pointer', 'type' ), |
|
).setStoreValues( |
|
arrayhelpers.storePointerType( 'pointer', _simple.GL_COLOR_ARRAY_POINTER ) |
|
).setReturnValues( |
|
wrapper.returnPyArgument( 'pointer' ) |
|
) |
|
glInterleavedArrays = wrapper.wrapper( _simple.glInterleavedArrays ).setStoreValues( |
|
arrayhelpers.storePointerType( 'pointer', GL_INTERLEAVED_ARRAY_POINTER ) |
|
).setReturnValues( |
|
wrapper.returnPyArgument( 'pointer' ) |
|
) |
|
|
|
|
|
glDrawElements = wrapper.wrapper( _simple.glDrawElements ).setPyConverter( |
|
'indices', arrayhelpers.AsArrayOfType( 'indices', 'type' ), |
|
).setReturnValues( |
|
wrapper.returnPyArgument( 'indices' ) |
|
) |
|
|
|
def glDrawElementsTyped( type, suffix ): |
|
arrayType = arraydatatype.GL_CONSTANT_TO_ARRAY_TYPE[ type ] |
|
function = wrapper.wrapper( |
|
_simple.glDrawElements |
|
).setPyConverter('type').setCConverter( |
|
'type', type |
|
).setPyConverter('count').setCConverter( |
|
'count', arrayhelpers.AsArrayTypedSize( 'indices', arrayType ), |
|
).setPyConverter( |
|
'indices', arrayhelpers.AsArrayTyped( 'indices', arrayType ), |
|
).setReturnValues( |
|
wrapper.returnPyArgument( 'indices' ) |
|
) |
|
return function |
|
for type,suffix in ((_simple.GL_UNSIGNED_BYTE,'ub'),(_simple.GL_UNSIGNED_INT,'ui'),(_simple.GL_UNSIGNED_SHORT,'us')): |
|
globals()['glDrawElements%(suffix)s'%globals()] = glDrawElementsTyped( type,suffix ) |
|
try: |
|
del type,suffix,glDrawElementsTyped |
|
except NameError as err: |
|
pass |
|
|
|
|
|
|
|
|
|
def glSelectBuffer( size, buffer = None ): |
|
"""Create a selection buffer of the given size |
|
""" |
|
if buffer is None: |
|
buffer = arraydatatype.GLuintArray.zeros( (size,) ) |
|
_simple.glSelectBuffer( size, buffer ) |
|
contextdata.setValue( _simple.GL_SELECTION_BUFFER_POINTER, buffer ) |
|
return buffer |
|
def glFeedbackBuffer( size, type, buffer = None ): |
|
"""Create a selection buffer of the given size |
|
""" |
|
if buffer is None: |
|
buffer = arraydatatype.GLfloatArray.zeros( (size,) ) |
|
_simple.glFeedbackBuffer( size, type, buffer ) |
|
contextdata.setValue( _simple.GL_FEEDBACK_BUFFER_POINTER, buffer ) |
|
contextdata.setValue( "GL_FEEDBACK_BUFFER_TYPE", type ) |
|
return buffer |
|
|
|
def glRenderMode( newMode ): |
|
"""Change to the given rendering mode |
|
|
|
If the current mode is GL_FEEDBACK or GL_SELECT, return |
|
the current buffer appropriate to the mode |
|
""" |
|
|
|
from OpenGL.GL import glGetIntegerv |
|
from OpenGL.GL import selection, feedback |
|
currentMode = glGetIntegerv( _simple.GL_RENDER_MODE ) |
|
try: |
|
currentMode = currentMode[0] |
|
except (TypeError,ValueError,IndexError) as err: |
|
pass |
|
if currentMode in (_simple.GL_RENDER,0): |
|
|
|
return _simple.glRenderMode( newMode ) |
|
result = _simple.glRenderMode( newMode ) |
|
|
|
|
|
if result < 0: |
|
if currentMode == _simple.GL_SELECT: |
|
raise error.GLError( |
|
_simple.GL_STACK_OVERFLOW, |
|
"glSelectBuffer too small to hold selection results", |
|
) |
|
elif currentMode == _simple.GL_FEEDBACK: |
|
raise error.GLError( |
|
_simple.GL_STACK_OVERFLOW, |
|
"glFeedbackBuffer too small to hold selection results", |
|
) |
|
else: |
|
raise error.GLError( |
|
_simple.GL_STACK_OVERFLOW, |
|
"Unknown glRenderMode buffer (%s) too small to hold selection results"%( |
|
currentMode, |
|
), |
|
) |
|
|
|
|
|
context = platform.GetCurrentContext() |
|
if context == 0: |
|
raise error.Error( |
|
"""Returning from glRenderMode without a valid context!""" |
|
) |
|
arrayConstant, wrapperFunction = { |
|
_simple.GL_FEEDBACK: (_simple.GL_FEEDBACK_BUFFER_POINTER,feedback.parseFeedback), |
|
_simple.GL_SELECT: (_simple.GL_SELECTION_BUFFER_POINTER, selection.GLSelectRecord.fromArray), |
|
}[ currentMode ] |
|
current = contextdata.getValue( arrayConstant ) |
|
|
|
if current is None: |
|
current = glGetPointerv( arrayConstant ) |
|
|
|
if wrapperFunction: |
|
current = wrapperFunction( current, result ) |
|
return current |
|
|
|
|
|
def glGetPointerv( constant ): |
|
"""Retrieve a stored pointer constant""" |
|
|
|
|
|
vp = ctypes.voidp() |
|
_simple.glGetPointerv( constant, ctypes.byref(vp) ) |
|
current = contextdata.getValue( constant ) |
|
if current is not None: |
|
if arraydatatype.ArrayDatatype.dataPointer( current ) == vp.value: |
|
return current |
|
|
|
return vp |
|
|