>From what I've read, captureCurrentState just returns the current state 
>attributes in OSG - it's not actually capturing the current GL state.

But, you could flip the problem on its head and capture the actual OpenGL state 
just prior to calling your library, and then restoring it when your library is 
done with its drawing. Here is some code to start from that catches most of the 
stuff that's likely to change; for completeness, you'd want to capture all of 
the state documented at 
http://www.khronos.org/opengles/sdk/1.1/docs/man/glGet.xml as well.


Code:

typedef struct glState_S {
    GLboolean depthTest, blend, cullFace;
    GLboolean dither, colorLogicOp, polygonOffsetLine, polygonOffsetFill;
    GLboolean polygonOffsetPoint, polygonSmooth, scissorTest, stencilTest;
} glState;

static std::stack<glState> stateStack;

SILVERLININGDLL_API bool PushAllState(void)
{
    glState state;

    state.blend = glIsEnabled(GL_BLEND);
    state.depthTest = glIsEnabled(GL_DEPTH_TEST);
    state.cullFace = glIsEnabled(GL_CULL_FACE);
    state.dither = glIsEnabled(GL_DITHER);
    state.polygonOffsetFill = glIsEnabled(GL_POLYGON_OFFSET_FILL);
    state.scissorTest = glIsEnabled(GL_SCISSOR_TEST);
    state.stencilTest = glIsEnabled(GL_STENCIL_TEST);

    stateStack.push(state);

    CheckError(__LINE__);

    return true;
}

SILVERLININGDLL_API bool PopAllState(void)
{
    if (!stateStack.empty()) {
        glState state = stateStack.top();

        if (state.blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);
        if (state.depthTest) glEnable(GL_DEPTH_TEST); else 
glDisable(GL_DEPTH_TEST);
        if (state.cullFace) glEnable(GL_CULL_FACE); else 
glDisable(GL_CULL_FACE);
        if (state.dither) glEnable(GL_DITHER); else glDisable(GL_DITHER);
        if (state.polygonOffsetFill) glEnable(GL_POLYGON_OFFSET_FILL); else 
glDisable(GL_POLYGON_OFFSET_FILL);
        if (state.scissorTest) glEnable(GL_SCISSOR_TEST); else 
glDisable(GL_SCISSOR_TEST);
        if (state.stencilTest) glEnable(GL_STENCIL_TEST); else 
glDisable(GL_STENCIL_TEST);

        stateStack.pop();
    }

    CheckError(__LINE__);

    return true;
}




Best regards,
Frank Kane
Founder, Sundog Software LLC

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=48737#48737





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to