| """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 |
|
|