SceneJellyfish: Save and restore custom GL state so other scenes are unaffected
when "reuse-context" is enabled.
diff --git a/src/scene-jellyfish.cpp b/src/scene-jellyfish.cpp
index 59fdf41..5253dd9 100644
--- a/src/scene-jellyfish.cpp
+++ b/src/scene-jellyfish.cpp
@@ -348,7 +348,12 @@
fresnelPower_(1.0),
rotation_(0.0),
currentTime_(0.0),
- lastUpdateTime_(0.0)
+ lastUpdateTime_(0.0),
+ cullFace_(0),
+ depthTest_(0),
+ blend_(0),
+ blendFuncSrc_(0),
+ blendFuncDst_(0)
{
static const string modelFilename(GLMARK_DATA_PATH"/models/jellyfish.jobj");
if (!load_obj(modelFilename))
@@ -467,6 +472,18 @@
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glBindTexture(GL_TEXTURE_2D, 0);
}
+
+ // Save the GL state we are changing so we can restore it later.
+ cullFace_ = glIsEnabled(GL_CULL_FACE);
+ depthTest_ = glIsEnabled(GL_DEPTH_TEST);
+ blend_ = glIsEnabled(GL_BLEND);
+ glGetIntegerv(GL_BLEND_SRC_RGB, &blendFuncSrc_);
+ glGetIntegerv(GL_BLEND_DST_RGB, &blendFuncDst_);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_DEPTH_TEST);
}
void
@@ -495,6 +512,21 @@
void
JellyfishPrivate::cleanup()
{
+ // Restore the GL state we changed for the scene.
+ glBlendFunc(blendFuncSrc_, blendFuncDst_);
+ if (GL_FALSE == blend_)
+ {
+ glDisable(GL_BLEND);
+ }
+ if (GL_TRUE == cullFace_)
+ {
+ glEnable(GL_CULL_FACE);
+ }
+ if (GL_TRUE == depthTest_)
+ {
+ glEnable(GL_DEPTH_TEST);
+ }
+
program_.stop();
program_.release();
@@ -554,12 +586,6 @@
glBindTexture(GL_TEXTURE_2D, textureObjects_[whichCaustic_]);
program_["uSampler1"] = 1;
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glDisable(GL_CULL_FACE);
- glDisable(GL_DEPTH_TEST);
-
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects_[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects_[1]);
diff --git a/src/scene-jellyfish.h b/src/scene-jellyfish.h
index 97dc5de..77be159 100644
--- a/src/scene-jellyfish.h
+++ b/src/scene-jellyfish.h
@@ -104,6 +104,12 @@
float rotation_;
float currentTime_;
double lastUpdateTime_;
+ // GL state we plan to override, so we can restore it cleanly.
+ unsigned int cullFace_;
+ unsigned int depthTest_;
+ unsigned int blend_;
+ int blendFuncSrc_;
+ int blendFuncDst_;
public:
JellyfishPrivate();