PDGL_API void pdglCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border ) { if(pglCopyTexImage2D) { pglCopyTexImage2D(target, level, internalformat, x, y, width, height, border); return; } pglCopyTexImage2D=pdglGetProcAddress("glCopyTexImage2D"); pglCopyTexImage2D(target, level, internalformat, x, y, width, height, border); }
/* ============================================================= SHADOW RENDERING ============================================================= */ int R_AllocateShadowTexture( void ) { int i = tr.num_shadows_used; if( i >= MAX_SHADOWS ) { ALERT( at_error, "R_AllocateShadowTexture: shadow textures limit exceeded!\n" ); return 0; // disable } int texture = tr.shadowTextures[i]; tr.num_shadows_used++; if( !tr.shadowTextures[i] ) { char txName[16]; Q_snprintf( txName, sizeof( txName ), "*shadow%i", i ); tr.shadowTextures[i] = CREATE_TEXTURE( txName, RI.viewport[2], RI.viewport[3], NULL, TF_SHADOW ); texture = tr.shadowTextures[i]; } GL_Bind( GL_TEXTURE0, texture ); pglCopyTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, RI.viewport[0], RI.viewport[1], RI.viewport[2], RI.viewport[3], 0 ); return texture; }
/* ================ R_AllocateMirrorTexture Allocate the screen texture and make copy ================ */ int R_AllocateMirrorTexture( void ) { rgbdata_t r_screen; int i, texture; char txName[16]; i = tr.num_mirrors_used; if( i >= MAX_MIRRORS ) { MsgDev( D_ERROR, "R_AllocateMirrorTexture: mirror textures limit exceeded!\n" ); return 0; // disable } texture = tr.mirrorTextures[i]; tr.num_mirrors_used++; if( !texture ) { // not initialized ? Q_memset( &r_screen, 0, sizeof( r_screen )); Q_snprintf( txName, sizeof( txName ), "*screen%i", i ); r_screen.width = RI.viewport[2]; r_screen.height = RI.viewport[3]; r_screen.type = PF_RGBA_32; r_screen.size = r_screen.width * r_screen.height * 4; r_screen.flags = IMAGE_HAS_COLOR; r_screen.buffer = NULL; // create empty texture for now tr.mirrorTextures[i] = GL_LoadTextureInternal( txName, &r_screen, TF_IMAGE, false ); GL_SetTextureType( tr.mirrorTextures[i], TEX_SCREENCOPY ); texture = tr.mirrorTextures[i]; } GL_Bind( GL_TEXTURE0, texture ); pglCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, RI.viewport[0], RI.viewport[1], RI.viewport[2], RI.viewport[3], 0 ); return texture; }