bool Stencil2Test::isApplicable() const { return (have_ATI_separate_stencil() || have_EXT_stencil_two_side() || have_EXT_stencil_two_side()); }
void Stencil2Test::runOne(Stencil2Result &r, Window &w) { (void) w; // silence warning r.pass = true; get_ext_functions(); // how many stencil bits (we assume at least 8 above) glGetIntegerv(GL_STENCIL_BITS, &stencilBits); stencilMax = (1 << stencilBits) - 1; assert(stencilBits >= 8); glViewport(0, 0, windowSize, windowSize); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, windowSize, 0, windowSize, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if (have_ATI_separate_stencil()) { r.pass &= test_stencil(ATI); } if (have_EXT_stencil_two_side()) { r.pass &= test_stencil(EXT); } if (have_GL2_stencil_two_side()) { r.pass &= test_stencil(GL2); } }
void enable_shadow_stencil() { assert(have_EXT_stencil_wrap()); if (have_EXT_stencil_two_side()) { glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT); glActiveStencilFaceEXT(GL_BACK); glStencilFunc(GL_ALWAYS, 1, ~0U); glStencilOp(GL_KEEP, GL_KEEP, GL_INCR_WRAP); glActiveStencilFaceEXT(GL_FRONT); glStencilFunc(GL_ALWAYS, 1, ~0U); glStencilOp(GL_KEEP, GL_KEEP, GL_DECR_WRAP); } else if (have_ATI_separate_stencil()) { glStencilFuncSeparateATI( GL_ALWAYS, GL_ALWAYS, 1, ~0U ); glStencilOpSeparateATI( GL_BACK, GL_KEEP, GL_KEEP, GL_INCR_WRAP ); glStencilOpSeparateATI( GL_FRONT, GL_KEEP, GL_KEEP, GL_DECR_WRAP ); } else { assert(0); } }