| | """Numbers passed as array handling code for PyOpenGL |
| | """ |
| | REGISTRY_NAME = 'numbers' |
| | from OpenGL.raw.GL import _types |
| | from OpenGL.raw.GL.VERSION import GL_1_1 |
| | from OpenGL.arrays import formathandler |
| | import ctypes |
| | from OpenGL._bytes import long, integer_types |
| |
|
| | class NumberHandler( formathandler.FormatHandler ): |
| | """Allows the user to pass a bald Python float,int, etceteras as an array-of-1""" |
| | HANDLED_TYPES = integer_types + ( |
| | float, |
| | _types.GLdouble, |
| | _types.GLfloat, |
| | _types.GLint, |
| | _types.GLshort, |
| | _types.GLuint, |
| | _types.GLulong, |
| | _types.GLushort, |
| | _types.GLclampf, |
| | _types.GLclampd, |
| | ) |
| | def from_param( self, value, typeCode=None ): |
| | """If it's a ctypes value, pass on, otherwise do asArray""" |
| | try: |
| | return ctypes.byref(value) |
| | except TypeError as err: |
| | err.args += (' If you have ERROR_ON_COPY enabled, remember to pass in an array to array-requiring functions.', ) |
| | raise |
| | dataPointer = from_param |
| | def zeros( self, dims, typeCode=None ): |
| | """Currently don't allow Number as output types!""" |
| | raise NotImplemented( """Number data-type not allowed as an output array format""" ) |
| | def ones( self, dims, typeCode=None ): |
| | """Currently don't allow Number as output types!""" |
| | raise NotImplemented( """Number data-type not allowed as an output array format""" ) |
| | def arrayToGLType( self, value ): |
| | """Given a value, guess OpenGL type of the corresponding pointer""" |
| | if value.__class__ in TARGET_TYPES: |
| | return TARGET_TYPES[ value.__class__ ] |
| | else: |
| | guess = DEFAULT_TYPES.get( value.__class__ ) |
| | if guess is not None: |
| | return guess[1] |
| | raise TypeError( """Can't guess array data-type for %r types"""%(type(value))) |
| | def arraySize( self, value, typeCode = None ): |
| | """Given a data-value, calculate ravelled size for the array""" |
| | return 1 |
| | def asArray( self, value, typeCode=None ): |
| | """Convert given value to an array value of given typeCode""" |
| |
|
| | if value.__class__ in TARGET_TYPES: |
| | return value |
| | targetType = CONSTANT_TO_TYPE.get( typeCode ) |
| | if targetType is not None: |
| | return targetType( value ) |
| | raise TypeError( """Don't know how to convert %r to an array type"""%( |
| | typeCode, |
| | )) |
| | def unitSize( self, value, typeCode=None ): |
| | """Determine unit size of an array (if possible)""" |
| | return 1 |
| | def registerEquivalent( self, typ, base ): |
| | """Register a sub-class for handling as the base-type""" |
| | global TARGET_TYPE_TUPLE |
| | for source in (DEFAULT_TYPES, TARGET_TYPES, BYTE_SIZES): |
| | if base in source: |
| | source[typ] = source[base] |
| | if base in TARGET_TYPES: |
| | TARGET_TYPE_TUPLE = TARGET_TYPE_TUPLE + (base,) |
| |
|
| | DEFAULT_TYPES = { |
| | float: (_types.GLdouble,GL_1_1.GL_DOUBLE), |
| | int: (_types.GLint,GL_1_1.GL_INT), |
| | long: (_types.GLint,GL_1_1.GL_INT), |
| | } |
| | TARGET_TYPES = dict([ |
| | (getattr( _types,n),c) |
| | for (n,c) in _types.ARRAY_TYPE_TO_CONSTANT |
| | ]) |
| | TARGET_TYPE_TUPLE = tuple([ |
| | getattr(_types,n) |
| | for (n,c) in _types.ARRAY_TYPE_TO_CONSTANT |
| | ]) |
| | CONSTANT_TO_TYPE = dict([ |
| | (c,getattr( _types, n)) |
| | for (n,c) in _types.ARRAY_TYPE_TO_CONSTANT |
| | ]) |
| |
|
| | BYTE_SIZES = dict([ |
| | ( c, ctypes.sizeof( getattr( _types, n) ) ) |
| | for (n,c) in _types.ARRAY_TYPE_TO_CONSTANT |
| | ]) |
| |
|
| | try: |
| | del n,c |
| | except NameError as err: |
| | pass |
| |
|