void gld_SetupFloodStencil(GLWall *wall) { int recursion = 0; // Create stencil glStencilFunc(GL_EQUAL, recursion, ~0); // create stencil glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); // increment stencil of valid pixels glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // don't write to the graphics buffer gld_EnableTexture2D(GL_TEXTURE0_ARB, false); glColor3f(1, 1, 1); glEnable(GL_DEPTH_TEST); glDepthMask(true); glBegin(GL_TRIANGLE_FAN); glVertex3f(wall->glseg->x1, wall->ytop, wall->glseg->z1); glVertex3f(wall->glseg->x1, wall->ybottom, wall->glseg->z1); glVertex3f(wall->glseg->x2, wall->ybottom, wall->glseg->z2); glVertex3f(wall->glseg->x2, wall->ytop, wall->glseg->z2); glEnd(); glStencilFunc(GL_EQUAL, recursion+1, ~0); // draw sky into stencil glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // this stage doesn't modify the stencil glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // don't write to the graphics buffer gld_EnableTexture2D(GL_TEXTURE0_ARB, true); glDisable(GL_DEPTH_TEST); glDepthMask(false); }
GLuint CaptureScreenAsTexID(void) { GLuint id; gld_EnableTexture2D(GL_TEXTURE0_ARB, true); qglGenTextures(1, &id); qglBindTexture(GL_TEXTURE_2D, id); qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #ifdef ANDROID qglTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, #else qglTexImage2D(GL_TEXTURE_2D, 0, 3, #endif gld_GetTexDimension(SCREENWIDTH), gld_GetTexDimension(SCREENHEIGHT), 0, GL_RGB, GL_UNSIGNED_BYTE, 0); qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, SCREENWIDTH, SCREENHEIGHT); return id; }
void gld_DrawFakeSkyStrips(void) { int i; // This draws a valid z-buffer into the stencil's contents to ensure it // doesn't get overwritten by the level's geometry. // Because some of outdated hardware has no support for // glColorMask(0, 0, 0, 0) or something, // I need to render fake strips of sky before dome with using // full clearing of color buffer (only in compatibility mode) if (!gl_compatibility) { glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // no graphics } gld_EnableTexture2D(GL_TEXTURE0_ARB, false); for (i = gld_drawinfo.num_items[GLDIT_SWALL] - 1; i >= 0; i--) { GLWall* wall = gld_drawinfo.items[GLDIT_SWALL][i].item.wall; glBegin(GL_TRIANGLE_STRIP); glVertex3f(wall->glseg->x1,wall->ytop,wall->glseg->z1); glVertex3f(wall->glseg->x1,wall->ybottom,wall->glseg->z1); glVertex3f(wall->glseg->x2,wall->ytop,wall->glseg->z2); glVertex3f(wall->glseg->x2,wall->ybottom,wall->glseg->z2); glEnd(); } gld_EnableTexture2D(GL_TEXTURE0_ARB, true); if (!gl_compatibility) { glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } else { glClear(GL_COLOR_BUFFER_BIT); } }
int gld_wipe_doMelt(int ticks, int *y_lookup) { int i; int total_w, total_h; float fU1, fU2, fV1, fV2; total_w = gld_GetTexDimension(SCREENWIDTH); total_h = gld_GetTexDimension(SCREENHEIGHT); fU1 = 0.0f; fV1 = (float)SCREENHEIGHT / (float)total_h; fU2 = (float)SCREENWIDTH / (float)total_w; fV2 = 0.0f; gld_EnableTexture2D(GL_TEXTURE0_ARB, true); qglBindTexture(GL_TEXTURE_2D, wipe_scr_end_tex); qglColor3f(1.0f, 1.0f, 1.0f); qglBegin(GL_TRIANGLE_STRIP); { qglTexCoord2f(fU1, fV1); qglVertex2f(0.0f, 0.0f); qglTexCoord2f(fU1, fV2); qglVertex2f(0.0f, (float)SCREENHEIGHT); qglTexCoord2f(fU2, fV1); qglVertex2f((float)SCREENWIDTH, 0.0f); qglTexCoord2f(fU2, fV2); qglVertex2f((float)SCREENWIDTH, (float)SCREENHEIGHT); } qglEnd(); qglBindTexture(GL_TEXTURE_2D, wipe_scr_start_tex); qglColor3f(1.0f, 1.0f, 1.0f); qglBegin(GL_QUAD_STRIP); for (i=0; i <= SCREENWIDTH; i++) { int yoffs = MAX(0, y_lookup[i]); float tx = (float) i / total_w; float sx = (float) i; float sy = (float) yoffs; qglTexCoord2f(tx, fV1); qglVertex2f(sx, sy); qglTexCoord2f(tx, fV2); qglVertex2f(sx, sy + (float)SCREENHEIGHT); } qglEnd(); return 0; }
void gld_ClearFloodStencil(GLWall *wall) { int recursion = 0; glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); gld_EnableTexture2D(GL_TEXTURE0_ARB, false); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // don't write to the graphics buffer glColor3f(1, 1, 1); glBegin(GL_TRIANGLE_FAN); glVertex3f(wall->glseg->x1, wall->ytop, wall->glseg->z1); glVertex3f(wall->glseg->x1, wall->ybottom, wall->glseg->z1); glVertex3f(wall->glseg->x2, wall->ybottom, wall->glseg->z2); glVertex3f(wall->glseg->x2, wall->ytop, wall->glseg->z2); glEnd(); // restore old stencil op. glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glStencilFunc(GL_EQUAL, recursion, ~0); gld_EnableTexture2D(GL_TEXTURE0_ARB, true); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glEnable(GL_DEPTH_TEST); glDepthMask(true); }