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; }
GLTexture *gld_RegisterFlat(int lump, dboolean mipmap) { GLTexture *gltexture; gltexture=gld_AddNewGLPatchTexture(firstflat+lump); if (!gltexture) return NULL; if (gltexture->textype==GLDT_UNREGISTERED) { gltexture->textype=GLDT_BROKEN; gltexture->index=firstflat+lump; //e6y gltexture->flags = 0; if (mipmap && tex_filter[MIP_TEXTURE].mipmap) gltexture->flags |= GLTEXTURE_MIPMAP; gltexture->realtexwidth=64; gltexture->realtexheight=64; gltexture->leftoffset=0; gltexture->topoffset=0; gltexture->tex_width=gld_GetTexDimension(gltexture->realtexwidth); gltexture->tex_height=gld_GetTexDimension(gltexture->realtexheight); gltexture->width=MIN(gltexture->realtexwidth, gltexture->tex_width); gltexture->height=MIN(gltexture->realtexheight, gltexture->tex_height); gltexture->buffer_width=gltexture->tex_width; gltexture->buffer_height=gltexture->tex_height; #ifdef USE_GLU_IMAGESCALE gltexture->width=gltexture->tex_width; gltexture->height=gltexture->tex_height; gltexture->buffer_width=gltexture->realtexwidth; gltexture->buffer_height=gltexture->realtexheight; #endif if (gltexture->flags & GLTEXTURE_MIPMAP) { gltexture->width=gltexture->tex_width; gltexture->height=gltexture->tex_height; gltexture->buffer_width=gltexture->realtexwidth; gltexture->buffer_height=gltexture->realtexheight; } //e6y: right/bottom UV coordinates for flat drawing gltexture->scalexfac=(float)gltexture->width/(float)gltexture->tex_width; gltexture->scaleyfac=(float)gltexture->height/(float)gltexture->tex_height; gltexture->buffer_size=gltexture->buffer_width*gltexture->buffer_height*4; if (gltexture->realtexwidth>gltexture->buffer_width) return gltexture; if (gltexture->realtexheight>gltexture->buffer_height) return gltexture; gltexture->textype=GLDT_FLAT; gld_SetTexDetail(gltexture); } return gltexture; }
//e6y: "force" flag for loading texture with zero index GLTexture *gld_RegisterTexture(int texture_num, boolean mipmap, boolean force) { GLTexture *gltexture; //e6y: textures with zero index should be loaded sometimes if (texture_num==NO_TEXTURE && !force) return NULL; gltexture=gld_AddNewGLTexture(texture_num); if (!gltexture) return NULL; if (gltexture->textype==GLDT_UNREGISTERED) { texture_t *texture=NULL; if ((texture_num>=0) || (texture_num<numtextures)) texture=textures[texture_num]; if (!texture) return NULL; gltexture->textype=GLDT_BROKEN; gltexture->index=texture_num; gltexture->mipmap=mipmap; gltexture->realtexwidth=texture->width; gltexture->realtexheight=texture->height; gltexture->leftoffset=0; gltexture->topoffset=0; gltexture->tex_width=gld_GetTexDimension(gltexture->realtexwidth); gltexture->tex_height=gld_GetTexDimension(gltexture->realtexheight); gltexture->width=MIN(gltexture->realtexwidth, gltexture->tex_width); gltexture->height=MIN(gltexture->realtexheight, gltexture->tex_height); gltexture->buffer_width=gltexture->tex_width; gltexture->buffer_height=gltexture->tex_height; #ifdef USE_GLU_IMAGESCALE gltexture->width=gltexture->tex_width; gltexture->height=gltexture->tex_height; gltexture->buffer_width=gltexture->realtexwidth; gltexture->buffer_height=gltexture->realtexheight; #endif if (gltexture->mipmap & use_mipmapping) { gltexture->width=gltexture->tex_width; gltexture->height=gltexture->tex_height; gltexture->buffer_width=gltexture->realtexwidth; gltexture->buffer_height=gltexture->realtexheight; } gltexture->buffer_size=gltexture->buffer_width*gltexture->buffer_height*4; if (gltexture->realtexwidth>gltexture->buffer_width) return gltexture; if (gltexture->realtexheight>gltexture->buffer_height) return gltexture; gltexture->textype=GLDT_TEXTURE; } return gltexture; }
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; }
GLTexture *gld_RegisterFlat(int lump, boolean mipmap) { GLTexture *gltexture; gltexture=gld_AddNewGLPatchTexture(firstflat+lump); if (!gltexture) return NULL; if (gltexture->textype==GLDT_UNREGISTERED) { gltexture->textype=GLDT_BROKEN; gltexture->index=firstflat+lump; gltexture->mipmap=mipmap; gltexture->realtexwidth=64; gltexture->realtexheight=64; gltexture->leftoffset=0; gltexture->topoffset=0; gltexture->tex_width=gld_GetTexDimension(gltexture->realtexwidth); gltexture->tex_height=gld_GetTexDimension(gltexture->realtexheight); gltexture->width=MIN(gltexture->realtexwidth, gltexture->tex_width); gltexture->height=MIN(gltexture->realtexheight, gltexture->tex_height); gltexture->buffer_width=gltexture->tex_width; gltexture->buffer_height=gltexture->tex_height; #ifdef USE_GLU_IMAGESCALE gltexture->width=gltexture->tex_width; gltexture->height=gltexture->tex_height; gltexture->buffer_width=gltexture->realtexwidth; gltexture->buffer_height=gltexture->realtexheight; #endif if (gltexture->mipmap & use_mipmapping) { gltexture->width=gltexture->tex_width; gltexture->height=gltexture->tex_height; gltexture->buffer_width=gltexture->realtexwidth; gltexture->buffer_height=gltexture->realtexheight; } gltexture->buffer_size=gltexture->buffer_width*gltexture->buffer_height*4; if (gltexture->realtexwidth>gltexture->buffer_width) return gltexture; if (gltexture->realtexheight>gltexture->buffer_height) return gltexture; gltexture->textype=GLDT_FLAT; } return gltexture; }
GLTexture *gld_RegisterPatch(int lump, int cm) { const rpatch_t *patch; GLTexture *gltexture; gltexture=gld_AddNewGLPatchTexture(lump); if (!gltexture) return NULL; if (gltexture->textype==GLDT_UNREGISTERED) { patch=R_CachePatchNum(lump); if (!patch) return NULL; gltexture->textype=GLDT_BROKEN; gltexture->index=lump; gltexture->mipmap=false; gltexture->realtexwidth=patch->width; gltexture->realtexheight=patch->height; gltexture->leftoffset=patch->leftoffset; gltexture->topoffset=patch->topoffset; gltexture->tex_width=gld_GetTexDimension(gltexture->realtexwidth); gltexture->tex_height=gld_GetTexDimension(gltexture->realtexheight); gltexture->width=MIN(gltexture->realtexwidth, gltexture->tex_width); gltexture->height=MIN(gltexture->realtexheight, gltexture->tex_height); gltexture->buffer_width=gltexture->tex_width; gltexture->buffer_height=gltexture->tex_height; #ifdef USE_GLU_IMAGESCALE gltexture->width=MIN(gltexture->realtexwidth, gltexture->tex_width); gltexture->height=MIN(gltexture->realtexheight, gltexture->tex_height); gltexture->buffer_width=MAX(gltexture->realtexwidth, gltexture->tex_width); gltexture->buffer_height=MAX(gltexture->realtexheight, gltexture->tex_height); #endif gltexture->buffer_size=gltexture->buffer_width*gltexture->buffer_height*4; R_UnlockPatchNum(lump); if (gltexture->realtexwidth>gltexture->buffer_width) return gltexture; if (gltexture->realtexheight>gltexture->buffer_height) return gltexture; gltexture->textype=GLDT_PATCH; } return gltexture; }
int gld_BuildTexture(GLTexture *gltexture, void *data, dboolean readonly, int width, int height) { int result = false; int tex_width, tex_height, tex_buffer_size; unsigned char *tex_buffer = NULL; tex_width = gld_GetTexDimension(width); tex_height = gld_GetTexDimension(height); tex_buffer_size = tex_width * tex_height * 4; //your video is modern if (gl_arb_texture_non_power_of_two) { qglTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, ((gltexture->flags & GLTEXTURE_MIPMAP) ? GL_TRUE : GL_FALSE)); qglTexImage2D( GL_TEXTURE_2D, 0, gl_tex_format, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); gld_RecolorMipLevels(data); gld_SetTexFilters(gltexture); result = true; goto l_exit; } #ifdef USE_GLU_MIPMAP if (gltexture->flags & GLTEXTURE_MIPMAP) { gluBuild2DMipmaps(GL_TEXTURE_2D, gl_tex_format, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); gld_RecolorMipLevels(data); gld_SetTexFilters(gltexture); result = true; goto l_exit; } else #endif // USE_GLU_MIPMAP { #ifdef USE_GLU_IMAGESCALE if ((width != tex_width) || (height != tex_height)) { tex_buffer = malloc(tex_buffer_size); if (!tex_buffer) { goto l_exit; } gluScaleImage(GL_RGBA, width, height, GL_UNSIGNED_BYTE, data, tex_width, tex_height, GL_UNSIGNED_BYTE, tex_buffer); qglTexImage2D( GL_TEXTURE_2D, 0, gl_tex_format, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_buffer); } else #endif // USE_GLU_IMAGESCALE { if ((width != tex_width) || (height != tex_height)) { if (width == tex_width) { tex_buffer = malloc(tex_buffer_size); memcpy(tex_buffer, data, width * height * 4); } else { int y; tex_buffer = calloc(1, tex_buffer_size); for (y = 0; y < height; y++) { memcpy(tex_buffer + y * tex_width * 4, ((unsigned char*)data) + y * width * 4, width * 4); } } } else { tex_buffer = data; } if (gl_paletted_texture) { gld_SetTexturePalette(GL_TEXTURE_2D); qglTexImage2D( GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, tex_width, tex_height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, tex_buffer); } else { qglTexImage2D( GL_TEXTURE_2D, 0, gl_tex_format, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_buffer); } } gltexture->flags &= ~GLTEXTURE_MIPMAP; gld_SetTexFilters(gltexture); result = true; } l_exit: if (result) { qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } if (tex_buffer && tex_buffer != data) { free(tex_buffer); tex_buffer = NULL; } if (!readonly) { free(data); data = NULL; } return result; }
//e6y: "force" flag for loading texture with zero index GLTexture *gld_RegisterTexture(int texture_num, dboolean mipmap, dboolean force) { GLTexture *gltexture; //e6y: textures with zero index should be loaded sometimes if (texture_num==NO_TEXTURE && !force) return NULL; gltexture=gld_AddNewGLTexture(texture_num); if (!gltexture) return NULL; if (gltexture->textype==GLDT_UNREGISTERED) { texture_t *texture=NULL; if ((texture_num>=0) || (texture_num<numtextures)) texture=textures[texture_num]; if (!texture) return NULL; gltexture->textype=GLDT_BROKEN; gltexture->index=texture_num; //e6y gltexture->flags = 0; if (mipmap && tex_filter[MIP_TEXTURE].mipmap) gltexture->flags |= GLTEXTURE_MIPMAP; gltexture->realtexwidth=texture->width; gltexture->realtexheight=texture->height; gltexture->leftoffset=0; gltexture->topoffset=0; gltexture->tex_width=gld_GetTexDimension(gltexture->realtexwidth); gltexture->tex_height=gld_GetTexDimension(gltexture->realtexheight); gltexture->width=MIN(gltexture->realtexwidth, gltexture->tex_width); gltexture->height=MIN(gltexture->realtexheight, gltexture->tex_height); gltexture->buffer_width=gltexture->tex_width; gltexture->buffer_height=gltexture->tex_height; #ifdef USE_GLU_IMAGESCALE gltexture->width=gltexture->tex_width; gltexture->height=gltexture->tex_height; gltexture->buffer_width=gltexture->realtexwidth; gltexture->buffer_height=gltexture->realtexheight; #endif if (gltexture->flags & GLTEXTURE_MIPMAP) { gltexture->width=gltexture->tex_width; gltexture->height=gltexture->tex_height; gltexture->buffer_width=gltexture->realtexwidth; gltexture->buffer_height=gltexture->realtexheight; } //e6y: right/bottom UV coordinates for texture drawing gltexture->scalexfac=(float)gltexture->width/(float)gltexture->tex_width; gltexture->scaleyfac=(float)gltexture->height/(float)gltexture->tex_height; gltexture->buffer_size=gltexture->buffer_width*gltexture->buffer_height*4; if (gltexture->realtexwidth>gltexture->buffer_width) return gltexture; if (gltexture->realtexheight>gltexture->buffer_height) return gltexture; gltexture->textype=GLDT_TEXTURE; gld_SetTexDetail(gltexture); } return gltexture; }
GLTexture *gld_RegisterPatch(int lump, int cm) { const rpatch_t *patch; GLTexture *gltexture; gltexture=gld_AddNewGLPatchTexture(lump); if (!gltexture) return NULL; if (gltexture->textype==GLDT_UNREGISTERED) { patch=R_CachePatchNum(lump); if (!patch) return NULL; gltexture->textype=GLDT_BROKEN; gltexture->index=lump; //e6y gltexture->flags = 0; if (lump >= firstspritelump && lump > (firstspritelump + numsprites)) { gltexture->flags |= GLTEXTURE_SPRITE; if (tex_filter[MIP_SPRITE].mipmap) gltexture->flags |= GLTEXTURE_MIPMAP; } else { if (tex_filter[MIP_PATCH].mipmap) gltexture->flags |= GLTEXTURE_MIPMAP; } //gltexture->wrap_mode = (patch->flags & PATCH_REPEAT ? GL_REPEAT : GLEXT_CLAMP_TO_EDGE); gltexture->realtexwidth=patch->width; gltexture->realtexheight=patch->height; gltexture->leftoffset=patch->leftoffset; gltexture->topoffset=patch->topoffset; gltexture->tex_width=gld_GetTexDimension(gltexture->realtexwidth); gltexture->tex_height=gld_GetTexDimension(gltexture->realtexheight); gltexture->width=MIN(gltexture->realtexwidth, gltexture->tex_width); gltexture->height=MIN(gltexture->realtexheight, gltexture->tex_height); gltexture->buffer_width=gltexture->tex_width; gltexture->buffer_height=gltexture->tex_height; #ifdef USE_GLU_IMAGESCALE gltexture->width=MIN(gltexture->realtexwidth, gltexture->tex_width); gltexture->height=MIN(gltexture->realtexheight, gltexture->tex_height); gltexture->buffer_width=MAX(gltexture->realtexwidth, gltexture->tex_width); gltexture->buffer_height=MAX(gltexture->realtexheight, gltexture->tex_height); #endif if (gltexture->flags & GLTEXTURE_MIPMAP) { gltexture->width=gltexture->tex_width; gltexture->height=gltexture->tex_height; gltexture->buffer_width=gltexture->realtexwidth; gltexture->buffer_height=gltexture->realtexheight; } //e6y: right/bottom UV coordinates for patch drawing gltexture->scalexfac=(float)gltexture->width/(float)gltexture->tex_width; gltexture->scaleyfac=(float)gltexture->height/(float)gltexture->tex_height; gltexture->buffer_size=gltexture->buffer_width*gltexture->buffer_height*4; R_UnlockPatchNum(lump); if (gltexture->realtexwidth>gltexture->buffer_width) return gltexture; if (gltexture->realtexheight>gltexture->buffer_height) return gltexture; gltexture->textype=GLDT_PATCH; } return gltexture; }