bool needsEffectRender(bool flashing) { bool rectEffective = !rect->isEmpty(); bool colorToneEffective = color->hasEffect() || tone->hasEffect() || flashing; return (rectEffective && colorToneEffective && isOnScreen); }
void redrawBaseTex() { if (nullOrDisposed(windowskin)) return; if (base.tex.tex == TEX::ID(0)) return; FBO::bind(base.tex.fbo); /* Clear texture */ glState.clearColor.pushSet(Vec4()); FBO::clear(); glState.clearColor.pop(); glState.viewport.pushSet(IntRect(0, 0, base.tex.width, base.tex.height)); glState.blend.pushSet(false); ShaderBase *shader; if (backOpacity < 255 || tone->hasEffect()) { PlaneShader &planeShader = shState->shaders().plane; planeShader.bind(); planeShader.setColor(Vec4()); planeShader.setFlash(Vec4()); planeShader.setTone(tone->norm); planeShader.setOpacity(backOpacity.norm); shader = &planeShader; } else { shader = &shState->shaders().simple; shader->bind(); } windowskin->bindTex(*shader); TEX::setSmooth(true); shader->setTranslation(Vec2i()); shader->applyViewportProj(); /* Draw stretched layer */ base.vert.draw(0, 1); glState.blend.set(true); glState.blendMode.pushSet(BlendKeepDestAlpha); /* Draw tiled layer */ base.vert.draw(1, base.bgTileQuads); glState.blendMode.set(BlendNormal); /* If we used plane shader before, switch to simple */ if (shader != &shState->shaders().simple) { shader = &shState->shaders().simple; shader->bind(); shader->setTranslation(Vec2i()); shader->applyViewportProj(); windowskin->bindTex(*shader); } base.vert.draw(1+base.bgTileQuads, base.borderQuads); TEX::setSmooth(false); glState.blendMode.pop(); glState.blend.pop(); glState.viewport.pop(); }