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