home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / lib / site-packages / OpenGL / GL / feedback.py < prev    next >
Encoding:
Python Source  |  2008-12-07  |  2.9 KB  |  88 lines

  1. """Utility module to parse a Feedback buffer"""
  2. from OpenGL import contextdata
  3. from OpenGL.raw import GL as simple
  4. from OpenGL.GL import glget
  5.  
  6. def parseFeedback( buffer, entryCount ):
  7.     """Parse the feedback buffer into Python object records"""
  8.     bufferIndex = 0
  9.     result = []
  10.     getVertex = createGetVertex( )
  11.     while bufferIndex < entryCount:
  12.         token = int(buffer[bufferIndex])
  13.         bufferIndex += 1
  14.         if SINGLE_VERTEX_TOKENS.has_key( token):
  15.             vData, bufferIndex = getVertex( buffer, bufferIndex )
  16.             result.append( (SINGLE_VERTEX_TOKENS.get(token), Vertex(*vData)) )
  17.         elif DOUBLE_VERTEX_TOKENS.has_key( token ):
  18.             vData, bufferIndex = getVertex( buffer, bufferIndex )
  19.             vData2, bufferIndex = getVertex( buffer, bufferIndex )
  20.             result.append( (
  21.                 DOUBLE_VERTEX_TOKENS.get(token), 
  22.                 Vertex(*vData),
  23.                 Vertex(*vData2),
  24.             ) )
  25.         elif token == simple.GL_PASS_THROUGH_TOKEN:
  26.             result.append( (simple.GL_PASS_THROUGH_TOKEN, buffer[bufferIndex]))
  27.             bufferIndex += 1
  28.         elif token == simple.GL_POLYGON_TOKEN:
  29.             temp = [simple.GL_POLYGON_TOKEN]
  30.             count = int(buffer[bufferIndex])
  31.             bufferIndex += 1
  32.             for item in range(count):
  33.                 vData,bufferIndex = getVertex( buffer, bufferIndex )
  34.                 temp.append( Vertex(*vData))
  35.             result.append( tuple(temp))
  36.         else:
  37.             raise ValueError( 
  38.                 """Unrecognised token %r in feedback stream"""%(token,)
  39.             )
  40.     return result
  41.  
  42. SINGLE_VERTEX_TOKENS = {
  43.     simple.GL_BITMAP_TOKEN: simple.GL_BITMAP_TOKEN,
  44.     simple.GL_COPY_PIXEL_TOKEN: simple.GL_COPY_PIXEL_TOKEN,
  45.     simple.GL_DRAW_PIXEL_TOKEN: simple.GL_DRAW_PIXEL_TOKEN,
  46.     simple.GL_POINT_TOKEN: simple.GL_POINT_TOKEN,
  47. }
  48. DOUBLE_VERTEX_TOKENS = {
  49.     simple.GL_LINE_TOKEN: simple.GL_LINE_TOKEN,
  50.     simple.GL_LINE_RESET_TOKEN: simple.GL_LINE_RESET_TOKEN,
  51. }
  52. class Vertex( object ):
  53.     """Simplistic holder for vertex data from a feedback buffer"""
  54.     __slots__ = ('vertex','color','texture')
  55.     def __init__( self, vertex,color=None,texture=None):
  56.         """Store values for access"""
  57.         self.vertex = vertex 
  58.         self.color = color 
  59.         self.texture = texture 
  60. def createGetVertex( ):
  61.     mode = contextdata.getValue( "GL_FEEDBACK_BUFFER_TYPE" )
  62.     indexMode = glget.glGetBoolean( simple.GL_INDEX_MODE )
  63.     colorSize = [ 4,1 ][ int(indexMode) ]
  64.     if mode in (simple.GL_2D,simple.GL_3D):
  65.         if mode == simple.GL_2D:
  66.             size = 2
  67.         else:
  68.             size = 3
  69.         def getVertex( buffer, bufferIndex ):
  70.             end = bufferIndex+size
  71.             return (buffer[bufferIndex:end],None,None),end 
  72.     elif mode == simple.GL_3D_COLOR:
  73.         def getVertex( buffer, bufferIndex ):
  74.             end = bufferIndex+3
  75.             colorEnd = end + colorSize
  76.             return (buffer[bufferIndex:end],buffer[end:colorEnd],None),colorEnd 
  77.     else:
  78.         if mode == simple.GL_3D_COLOR_TEXTURE:
  79.             size = 3
  80.         else:
  81.             size = 4
  82.         def getVertex( buffer, bufferIndex ):
  83.             end = bufferIndex+size
  84.             colorEnd = end + colorSize
  85.             textureEnd = colorEnd + 4
  86.             return (buffer[bufferIndex:end],buffer[end:colorEnd],buffer[colorEnd:textureEnd]),textureEnd
  87.     return getVertex
  88.