1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
#include "GLBlending.h"
namespace nCine
{
GLBlending::State GLBlending::state_;
void GLBlending::Enable()
{
if (state_.enabled == false) {
glEnable(GL_BLEND);
state_.enabled = true;
}
}
void GLBlending::Disable()
{
if (state_.enabled == true) {
glDisable(GL_BLEND);
state_.enabled = false;
}
}
void GLBlending::SetBlendFunc(GLenum sfactor, GLenum dfactor)
{
if (sfactor != state_.srcRgb || dfactor != state_.dstRgb ||
sfactor != state_.srcAlpha || dfactor != state_.dstAlpha) {
glBlendFunc(sfactor, dfactor);
state_.srcRgb = sfactor;
state_.dstRgb = dfactor;
state_.srcAlpha = sfactor;
state_.dstAlpha = dfactor;
}
}
void GLBlending::SetBlendFunc(GLenum srcRgb, GLenum dstRgb, GLenum srcAlpha, GLenum dstAlpha)
{
if (srcRgb != state_.srcRgb || dstRgb != state_.dstRgb ||
srcAlpha != state_.srcAlpha || dstAlpha != state_.dstAlpha) {
glBlendFuncSeparate(srcRgb, dstRgb, srcAlpha, dstAlpha);
state_.srcRgb = srcRgb;
state_.dstRgb = dstRgb;
state_.srcAlpha = srcAlpha;
state_.dstAlpha = dstAlpha;
}
}
void GLBlending::SetState(State newState)
{
if (newState.enabled)
Enable();
else
Disable();
if (newState.srcRgb == newState.srcAlpha && newState.dstRgb == newState.dstAlpha)
SetBlendFunc(newState.srcRgb, newState.dstRgb);
else
SetBlendFunc(newState.srcRgb, newState.dstRgb, newState.srcAlpha, newState.dstAlpha);
state_ = newState;
}
}
|