Skip to content

Instantly share code, notes, and snippets.

@lawrencelomax
Last active December 11, 2015 14:58
Show Gist options
  • Save lawrencelomax/4617449 to your computer and use it in GitHub Desktop.
Save lawrencelomax/4617449 to your computer and use it in GitHub Desktop.
Variadic Macros for Pushing and Popping GL State
extern void bilContext_glClientState(dispatch_block_t contextBlock, GLenum clientState, ... )
{
va_list arguments;
GLenum value;
va_start(arguments, clientState);
for (value = clientState; value > 0; value = va_arg(arguments, GLenum))
{
glEnableClientState(value);
}
va_end(arguments);
contextBlock();
va_start(arguments, clientState);
for (value = clientState; value > 0; value = va_arg(arguments, GLenum))
{
glDisableClientState(value);
}
va_end(arguments);
}
extern void bilContext_glEnable(dispatch_block_t contextBlock, GLenum feature, ... )
{
va_list arguments;
GLenum value;
va_start(arguments, feature);
for (value = feature; value > 0; value = va_arg(arguments, GLenum))
{
glEnable(value);
}
va_end(arguments);
contextBlock();
va_start(arguments, feature);
for (value = feature; value > 0; value = va_arg(arguments, GLenum))
{
glDisable(value);
}
va_end(arguments);
}
extern void bilContext_glMatrix4(dispatch_block_t contextBlock, GLKMatrix4 matrix)
{
glPushMatrix();
glMultMatrixf(matrix.m);
contextBlock();
glPopMatrix();
}
@whalec
Copy link

whalec commented Jan 24, 2013

// I'd even consider wrapping it in some simple block syntax.

[BILGLWrapper pushMatrix:^{
glMultMatrixf(normalizeScaleMatrix(self.particleModel, _glView).m);
drawPointSpriteOES1(view, _particles, _currentParticleCount, _textureInfo.name);
}];

@whalec
Copy link

whalec commented Jan 24, 2013

Is there a lot of these state change methods Lawrence?

@lawrencelomax
Copy link
Author

This

 // Load Tex
    glEnable(GL_TEXTURE_2D);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
    glBindTexture(GL_TEXTURE_2D, textureId);

    // Point Sprite Mode
    glEnable(GL_BLEND);
    glEnable(GL_POINT_SPRITE_OES);
    glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE);

    // Vertex Array Pointer
    glEnableClientState(GL_VERTEX_ARRAY);
    GLKVector2 * firstVectorPtr = &(_particles->position);
    glVertexPointer(2, GL_FLOAT, sizeof(BILGLParticle), firstVectorPtr);

    // Point Size Pointer
    //glPointSize(60);
    glEnableClientState(GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES);
    float * firstSizePtr = &(_particles->size);
    glPointSizePointerOES(GL_FLOAT, sizeof(BILGLParticle), firstSizePtr);

    // Color Pointer
    glEnableClientState(GL_COLOR_ARRAY);
    GLKVector4 * firstColorPtr = &(_particles->color);
    glColorPointer(4, GL_FLOAT, sizeof(BILGLParticle), firstColorPtr);

    // Perform the Draw
    glDrawArrays(GL_POINTS, 0, count);

    // Disable Client States
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES);
    glDisableClientState(GL_VERTEX_ARRAY);

    // End Tex
    glDisable(GL_TEXTURE_2D);

    // End Point Sprite Mode
    glDisable(GL_BLEND);
    glDisable(GL_POINT_SPRITE_OES);
    glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_FALSE);

Goes to this

    bilContext_glEnable(^{

        bilContext_glClientState(^{

            // Load Tex
            glBlendFunc(GL_SRC_ALPHA, GL_ONE);
            glBindTexture(GL_TEXTURE_2D, textureId);
            glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE);

            // Vertex Array Pointer
            GLKVector2 * firstVectorPtr = &(_particles->position);
            glVertexPointer(2, GL_FLOAT, sizeof(BILGLParticle), firstVectorPtr);

            // Point Size Pointer
            //glPointSize(60);
            float * firstSizePtr = &(_particles->size);
            glPointSizePointerOES(GL_FLOAT, sizeof(BILGLParticle), firstSizePtr);

            // Color Pointer
            GLKVector4 * firstColorPtr = &(_particles->color);
            glColorPointer(4, GL_FLOAT, sizeof(BILGLParticle), firstColorPtr);

            // Perform the Draw
            glDrawArrays(GL_POINTS, 0, count);

            // Disable 
            glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_FALSE);

        }, GL_COLOR_ARRAY, GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES, GL_VERTEX_ARRAY);


    }, GL_TEXTURE_2D, GL_BLEND, GL_POINT_SPRITE_OES);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment