void Bitmap::hueChange(int hue) { GUARD_DISPOSED; GUARD_MEGA; if ((hue % 360) == 0) return; flush(); TEXFBO newTex = shState->texPool().request(width(), height()); FloatRect texRect(rect()); Quad &quad = shState->gpQuad(); quad.setTexPosRect(texRect, texRect); quad.setColor(Vec4(1, 1, 1, 1)); /* Calculate hue parameter */ hue = wrapRange(hue, 0, 359); float hueAdj = -((M_PI * 2) / 360) * hue; HueShader &shader = shState->shaders().hue; shader.bind(); shader.setHueAdjust(hueAdj); FBO::bind(newTex.fbo, FBO::Draw); p->pushSetViewport(shader); p->bindTexture(shader); p->blitQuad(quad); shader.unbind(); p->popViewport(); TEX::unbind(); shState->texPool().release(p->gl); p->gl = newTex; modified(); }
void Bitmap::hueChange(int hue) { guardDisposed(); GUARD_MEGA; if ((hue % 360) == 0) return; TEXFBO newTex = shState->texPool().request(width(), height()); FloatRect texRect(rect()); Quad &quad = shState->gpQuad(); quad.setTexPosRect(texRect, texRect); quad.setColor(Vec4(1, 1, 1, 1)); HueShader &shader = shState->shaders().hue; shader.bind(); /* Shader expects normalized value */ shader.setHueAdjust(wrapRange(hue, 0, 359) / 360.0f); FBO::bind(newTex.fbo); p->pushSetViewport(shader); p->bindTexture(shader); p->blitQuad(quad); p->popViewport(); TEX::unbind(); shState->texPool().release(p->gl); p->gl = newTex; p->onModified(); }