You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.2 KiB
55 lines
1.2 KiB
#include <vector> |
|
#include <utility> |
|
#include <iostream> |
|
|
|
#include "graphics/glstate.h" |
|
#include "graphics/shader.h" |
|
|
|
namespace vtk { namespace gls { |
|
|
|
static GLuint activeShader(0); |
|
static bool trackingEnabled(false); |
|
static std::vector<std::pair<GLenum, bool> > flags; |
|
|
|
int setShader(const GLuint& shaderID) { |
|
//check that the shader we want to set isn't already active |
|
if (activeShader == shaderID){ return 0; } |
|
//set the shader |
|
glUseProgram(shaderID); |
|
activeShader = shaderID; |
|
return 1; |
|
} |
|
|
|
void setTracking(const bool& flag) { |
|
trackingEnabled = flag; |
|
} |
|
|
|
void setFlag(const GLenum& flag, const bool& newState) { |
|
if (trackingEnabled) { |
|
//check if flag already === newState |
|
GLboolean state; |
|
glGetBooleanv(flag, &state); |
|
if ((bool)state != newState) { |
|
//set flag and push the new status into the flags list |
|
if (newState) glEnable(flag); |
|
else glDisable(flag); |
|
|
|
flags.push_back(std::make_pair(flag,newState)); |
|
} |
|
} else { |
|
if (newState) glEnable(flag); |
|
else glDisable(flag); |
|
} |
|
} |
|
|
|
void restoreState() { |
|
if (flags.empty()) return; |
|
|
|
//iterate through flags and reset them |
|
for(auto& i : flags) { |
|
if(i.second) glDisable(i.first); |
|
else glEnable(i.first); |
|
} |
|
flags.clear(); |
|
} |
|
}}
|
|
|