1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
"""ctypes data-pointers as a data-format mechanism
"""
REGISTRY_NAME = 'ctypespointers'
import ctypes, _ctypes
from OpenGL.raw.GL import _types
from OpenGL.arrays import _arrayconstants as GL_1_1
from OpenGL import constant
from OpenGL.arrays import formathandler
import operator
class CtypesPointerHandler( formathandler.FormatHandler ):
"""Ctypes Pointer-type-specific data-type handler for OpenGL
Because pointers do not have size information we can't use
them for output of data, but they can be used for certain
types of input...
"""
@classmethod
def from_param( cls, value, typeCode=None ):
return value
@classmethod
def dataPointer( cls, value ):
return value.value
HANDLED_TYPES = (ctypes._Pointer, )
isOutput=False
def voidDataPointer( cls, value ):
"""Given value in a known data-pointer type, return void_p for pointer"""
return ctypes.cast( value, ctypes.c_void_p )
def zeros( self, dims, typeCode ):
"""Return Numpy array of zeros in given size"""
raise NotImplementedError( """Sized output doesn't yet work...""" )
def ones( self, dims, typeCode='d' ):
"""Return numpy array of ones in given size"""
raise NotImplementedError( """Haven't got a good ones implementation yet""" )
def arrayToGLType( self, value ):
"""Given a value, guess OpenGL type of the corresponding pointer"""
result = ARRAY_TO_GL_TYPE_MAPPING.get( value._type_ )
if result is not None:
return result
raise TypeError(
"""Don't know GL type for array of type %r, known types: %s\nvalue:%s"""%(
value._type_, list(ARRAY_TO_GL_TYPE_MAPPING.keys()), value,
)
)
def arraySize( self, value, typeCode = None ):
"""Given a data-value, calculate dimensions for the array"""
raise NotImplementedError( """Haven't got an arraySize implementation""" )
def asArray( self, value, typeCode=None ):
"""Convert given value to an array value of given typeCode"""
return value
def unitSize( self, value, typeCode=None ):
"""Determine unit size of an array (if possible)"""
return 1
def dimensions( self, value, typeCode=None ):
"""Determine dimensions of the passed array value (if possible)"""
raise NotImplementedError( """Haven't got a dimensions implementation""" )
ARRAY_TO_GL_TYPE_MAPPING = {
_types.GLdouble: GL_1_1.GL_DOUBLE,
_types.GLfloat: GL_1_1.GL_FLOAT,
_types.GLint: GL_1_1.GL_INT,
_types.GLuint: GL_1_1.GL_UNSIGNED_INT,
_types.GLshort: GL_1_1.GL_SHORT,
_types.GLushort: GL_1_1.GL_UNSIGNED_SHORT,
_types.GLchar: GL_1_1.GL_CHAR,
_types.GLbyte: GL_1_1.GL_BYTE,
_types.GLubyte: GL_1_1.GL_UNSIGNED_BYTE,
}
GL_TYPE_TO_ARRAY_MAPPING = {
GL_1_1.GL_DOUBLE: _types.GLdouble,
GL_1_1.GL_FLOAT: _types.GLfloat,
GL_1_1.GL_INT: _types.GLint,
GL_1_1.GL_UNSIGNED_INT: _types.GLuint,
GL_1_1.GL_SHORT: _types.GLshort,
GL_1_1.GL_UNSIGNED_SHORT: _types.GLushort,
GL_1_1.GL_CHAR: _types.GLchar,
GL_1_1.GL_BYTE: _types.GLbyte,
GL_1_1.GL_UNSIGNED_BYTE: _types.GLubyte,
'f': _types.GLfloat,
'd': _types.GLdouble,
'i': _types.GLint,
'I': _types.GLuint,
'h': _types.GLshort,
'H': _types.GLushort,
'b': _types.GLbyte,
'B': _types.GLubyte,
's': _types.GLchar,
}
|