Viewing file: numeric.py (5.1 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
"""Original Numeric module implementation of the OpenGL-ctypes array interfaces
Eventual Goals: * Be able to register handlers for a given data-storage mechanism at run-time * Be able to choose what data-type to use for any given operation where we are getting return values and/or register a default format for return values (i.e. tell OpenGL to return ctypes pointers or Numeric arrays or Numarray arrays for glGet* calls) """ REGISTRY_NAME = 'numeric' try: import Numeric except ImportError, err: raise ImportError( """No Numeric module present: %s"""%(err)) import operator from OpenGL.arrays import _numeric
dataPointer = _numeric.dataPointer
from OpenGL import constants, constant from OpenGL.arrays import formathandler
class NumericHandler( formathandler.FormatHandler ): """Numeric-specific data-type handler for OpenGL""" HANDLED_TYPES = (Numeric.ArrayType, ) isOutput = True @classmethod def from_param( cls, value, typeCode=None ): return dataPointer( value ) dataPointer = staticmethod( dataPointer ) def voidDataPointer( cls, value ): """Given value in a known data-pointer type, return void_p for pointer""" return ctypes.c_void_p( self.dataPointer( value )) def zeros( self, dims, typeCode ): """Return Numeric array of zeros in given size""" return Numeric.zeros( dims, GL_TYPE_TO_ARRAY_MAPPING.get(typeCode) or typeCode ) def arrayToGLType( self, value ): """Given a value, guess OpenGL type of the corresponding pointer""" typeCode = value.typecode() constant = ARRAY_TO_GL_TYPE_MAPPING.get( typeCode ) if constant is None: raise TypeError( """Don't know GL type for array of type %r, known types: %s\nvalue:%s"""%( typeCode, ARRAY_TO_GL_TYPE_MAPPING.keys(), value, ) ) return constant def arraySize( self, value, typeCode = None ): """Given a data-value, calculate dimensions for the array""" try: dimValue = value.shape except AttributeError, err: # XXX it's a list or a tuple, how do we determine dimensions there??? # for now we'll just punt and convert to an array first... value = self.asArray( value, typeCode ) dimValue = value.shape dims = 1 for dim in dimValue: dims *= dim return dims def asArray( self, value, typeCode=None ): """Convert given value to an array value of given typeCode""" if value is None: return value else: return self.contiguous( value, typeCode )
def contiguous( self, source, typeCode=None ): """Get contiguous array from source source -- Numeric Python array (or compatible object) for use as the data source. If this is not a contiguous array of the given typeCode, a copy will be made, otherwise will just be returned unchanged. typeCode -- optional 1-character typeCode specifier for the Numeric.array function. All gl*Pointer calls should use contiguous arrays, as non- contiguous arrays will be re-copied on every rendering pass. Although this doesn't raise an error, it does tend to slow down rendering. """ typeCode = GL_TYPE_TO_ARRAY_MAPPING.get( typeCode ) if isinstance( source, Numeric.ArrayType): if source.iscontiguous() and (typeCode is None or typeCode==source.typecode()): return source else: if typeCode is None: typeCode = source.typecode() # We have to do astype to avoid errors about unsafe conversions # XXX Confirm that this will *always* create a new contiguous array # XXX Allow a way to make this raise an error for performance reasons # XXX Guard against wacky conversion types like uint to float, where # we really don't want to have the C-level conversion occur. return Numeric.array( source.astype( typeCode ), typeCode ) elif typeCode: return Numeric.array( source, typeCode ) else: return Numeric.array( source ) def unitSize( self, value, typeCode=None ): """Determine unit size of an array (if possible)""" return value.shape[-1] def dimensions( self, value, typeCode=None ): """Determine dimensions of the passed array value (if possible)""" return value.shape
ARRAY_TO_GL_TYPE_MAPPING = { 'd': constants.GL_DOUBLE, 'f': constants.GL_FLOAT, 'i': constants.GL_INT, 's': constants.GL_SHORT, 'c': constants.GL_UNSIGNED_BYTE, 'b': constants.GL_BYTE, 'I': constants.GL_UNSIGNED_INT, } GL_TYPE_TO_ARRAY_MAPPING = { constants.GL_DOUBLE: 'd', constants.GL_FLOAT:'f', constants.GL_INT: 'i', constants.GL_UNSIGNED_INT: 'i', constants.GL_UNSIGNED_BYTE: 'c', constants.GL_SHORT: 's', constants.GL_UNSIGNED_SHORT: 's', constants.GL_BYTE: 'b', }
|