| """Utility module to parse a Feedback buffer""" |
| from OpenGL import contextdata |
| from OpenGL.GL.VERSION import GL_1_1 as _simple |
|
|
| def parseFeedback( buffer, entryCount ): |
| """Parse the feedback buffer into Python object records""" |
| bufferIndex = 0 |
| result = [] |
| getVertex = createGetVertex( ) |
| while bufferIndex < entryCount: |
| token = int(buffer[bufferIndex]) |
| bufferIndex += 1 |
| if token in SINGLE_VERTEX_TOKENS: |
| vData, bufferIndex = getVertex( buffer, bufferIndex ) |
| result.append( (SINGLE_VERTEX_TOKENS.get(token), Vertex(*vData)) ) |
| elif token in DOUBLE_VERTEX_TOKENS: |
| vData, bufferIndex = getVertex( buffer, bufferIndex ) |
| vData2, bufferIndex = getVertex( buffer, bufferIndex ) |
| result.append( ( |
| DOUBLE_VERTEX_TOKENS.get(token), |
| Vertex(*vData), |
| Vertex(*vData2), |
| ) ) |
| elif token == _simple.GL_PASS_THROUGH_TOKEN: |
| result.append( (_simple.GL_PASS_THROUGH_TOKEN, buffer[bufferIndex])) |
| bufferIndex += 1 |
| elif token == _simple.GL_POLYGON_TOKEN: |
| temp = [_simple.GL_POLYGON_TOKEN] |
| count = int(buffer[bufferIndex]) |
| bufferIndex += 1 |
| for item in range(count): |
| vData,bufferIndex = getVertex( buffer, bufferIndex ) |
| temp.append( Vertex(*vData)) |
| result.append( tuple(temp)) |
| else: |
| raise ValueError( |
| """Unrecognised token %r in feedback stream"""%(token,) |
| ) |
| return result |
|
|
| SINGLE_VERTEX_TOKENS = { |
| _simple.GL_BITMAP_TOKEN: _simple.GL_BITMAP_TOKEN, |
| _simple.GL_COPY_PIXEL_TOKEN: _simple.GL_COPY_PIXEL_TOKEN, |
| _simple.GL_DRAW_PIXEL_TOKEN: _simple.GL_DRAW_PIXEL_TOKEN, |
| _simple.GL_POINT_TOKEN: _simple.GL_POINT_TOKEN, |
| } |
| DOUBLE_VERTEX_TOKENS = { |
| _simple.GL_LINE_TOKEN: _simple.GL_LINE_TOKEN, |
| _simple.GL_LINE_RESET_TOKEN: _simple.GL_LINE_RESET_TOKEN, |
| } |
| class Vertex( object ): |
| """Simplistic holder for vertex data from a feedback buffer""" |
| __slots__ = ('vertex','color','texture') |
| def __init__( self, vertex,color=None,texture=None): |
| """Store values for access""" |
| self.vertex = vertex |
| self.color = color |
| self.texture = texture |
| def createGetVertex( ): |
| mode = contextdata.getValue( "GL_FEEDBACK_BUFFER_TYPE" ) |
| indexMode = _simple.glGetBooleanv( _simple.GL_INDEX_MODE ) |
| colorSize = [ 4,1 ][ int(indexMode) ] |
| if mode in (_simple.GL_2D,_simple.GL_3D): |
| if mode == _simple.GL_2D: |
| size = 2 |
| else: |
| size = 3 |
| def getVertex( buffer, bufferIndex ): |
| end = bufferIndex+size |
| return (buffer[bufferIndex:end],None,None),end |
| elif mode == _simple.GL_3D_COLOR: |
| def getVertex( buffer, bufferIndex ): |
| end = bufferIndex+3 |
| colorEnd = end + colorSize |
| return (buffer[bufferIndex:end],buffer[end:colorEnd],None),colorEnd |
| else: |
| if mode == _simple.GL_3D_COLOR_TEXTURE: |
| size = 3 |
| else: |
| size = 4 |
| def getVertex( buffer, bufferIndex ): |
| end = bufferIndex+size |
| colorEnd = end + colorSize |
| textureEnd = colorEnd + 4 |
| return (buffer[bufferIndex:end],buffer[end:colorEnd],buffer[colorEnd:textureEnd]),textureEnd |
| return getVertex |
|
|