/* ================= R_Postprocess_InitTextures ================= */ static void R_Postprocess_InitTextures( void ) { byte *data; // find closer power of 2 to screen size for (postproc.screen.width = 1;postproc.screen.width< glConfig.vidWidth;postproc.screen.width *= 2); for (postproc.screen.height = 1;postproc.screen.height < glConfig.vidHeight;postproc.screen.height *= 2); postproc.screen.readW = glConfig.vidWidth / (float)postproc.screen.width; postproc.screen.readH = glConfig.vidHeight / (float)postproc.screen.height; // find closer power of 2 to effect size postproc.work.width = r_bloom_sample_size->integer; postproc.work.height = postproc.work.width * ( glConfig.vidWidth / glConfig.vidHeight ); for (postproc.effect.width = 1;postproc.effect.width < postproc.work.width;postproc.effect.width *= 2); for (postproc.effect.height = 1;postproc.effect.height < postproc.work.height;postproc.effect.height *= 2); postproc.effect.readW = postproc.work.width / (float)postproc.effect.width; postproc.effect.readH = postproc.work.height / (float)postproc.effect.height; // disable blooms if we can't handle a texture of that size if( postproc.screen.width > glConfig.maxTextureSize || postproc.screen.height > glConfig.maxTextureSize ) { ri.Cvar_Set( "r_postprocess", "none" ); Com_Printf( S_COLOR_YELLOW"WARNING: 'R_InitPostprocessTextures' too high resolution for postprocessing, effect disabled\n" ); postprocess=0; return; } data = ri.Hunk_AllocateTempMemory( postproc.screen.width * postproc.screen.height * 4 ); Com_Memset( data, 0, postproc.screen.width * postproc.screen.height * 4 ); postproc.screen.texture = R_CreateImage( "***postproc screen texture***", data, postproc.screen.width, postproc.screen.height, qfalse, qfalse, GL_CLAMP_TO_EDGE ); ri.Hunk_FreeTempMemory( data ); // GLSL Depth Buffer data = ri.Hunk_AllocateTempMemory( postproc.screen.width * postproc.screen.height *34); Com_Memset( data, 0, postproc.screen.width * postproc.screen.height * 34 ); depthimage=1; postproc.depth.texture = R_CreateImage( "***depthbuffer texture***", data, postproc.screen.width, postproc.screen.height, qfalse, qfalse, GL_CLAMP_TO_EDGE ); depthimage=0; ri.Hunk_FreeTempMemory( data ); postproc.started = qtrue; }
void R_InitGamma(void) { byte *data; if (!GLEW_ARB_fragment_program) { Ren_Print("WARNING: R_InitGamma() skipped - no ARB_fragment_program\n"); return; } if (ri.Cvar_VariableIntegerValue("r_ignorehwgamma")) { Ren_Print("INFO: R_InitGamma() skipped - r_ignorehwgamma is set\n"); return; } data = (byte *)ri.Hunk_AllocateTempMemory(glConfig.vidWidth * glConfig.vidHeight * 4); if (!data) { Ren_Print("WARNING: R_InitGamma() can't allocate temp memory\n"); // fatal? return; } screenImage = R_CreateImage("screenBufferImage_skies", data, glConfig.vidWidth, glConfig.vidHeight, qfalse, qfalse, GL_CLAMP_TO_EDGE); if (!screenImage) { Ren_Print("WARNING: R_InitGamma() screen image is NULL\n"); } ri.Hunk_FreeTempMemory(data); Com_Memset(&gammaProgram, 0, sizeof(shaderProgram_t)); R_BuildGammaProgram(); }
static void R_LoadLightmaps( lump_t *l, const char *psMapName ) { byte *buf, *buf_p; int len; MAC_STATIC byte image[LIGHTMAP_SIZE*LIGHTMAP_SIZE*4]; int i, j; float maxIntensity = 0; double sumIntensity = 0; len = l->filelen; if ( !len ) { return; } buf = fileBase + l->fileofs; // we are about to upload textures R_SyncRenderThread(); // create all the lightmaps tr.numLightmaps = len / (LIGHTMAP_SIZE * LIGHTMAP_SIZE * 3); // if we are in r_vertexLight mode, we don't need the lightmaps at all if ( r_vertexLight->integer ) { return; } char sMapName[MAX_QPATH]; COM_StripExtension(psMapName,sMapName); // will already by MAX_QPATH legal, so no length check for ( i = 0 ; i < tr.numLightmaps ; i++ ) { // expand the 24 bit on-disk to 32 bit buf_p = buf + i * LIGHTMAP_SIZE*LIGHTMAP_SIZE * 3; if ( r_lightmap->integer == 2 ) { // color code by intensity as development tool (FIXME: check range) for ( j = 0; j < LIGHTMAP_SIZE * LIGHTMAP_SIZE; j++ ) { float r = buf_p[j*3+0]; float g = buf_p[j*3+1]; float b = buf_p[j*3+2]; float intensity; float out[3]; intensity = 0.33f * r + 0.685 * g + 0.063f * b; if ( intensity > 255 ) intensity = 1.0f; else intensity /= 255.0f; if ( intensity > maxIntensity ) maxIntensity = intensity; HSVtoRGB( intensity, 1.00, 0.50, out ); image[j*4+0] = out[0] * 255; image[j*4+1] = out[1] * 255; image[j*4+2] = out[2] * 255; image[j*4+3] = 255; sumIntensity += intensity; } } else { for ( j = 0 ; j < LIGHTMAP_SIZE*LIGHTMAP_SIZE ; j++ ) { R_ColorShiftLightingBytes( &buf_p[j*3], &image[j*4] ); image[j*4+3] = 255; } } tr.lightmaps[i] = R_CreateImage( va("*%s/lightmap%d",sMapName,i), image, LIGHTMAP_SIZE, LIGHTMAP_SIZE, qfalse, qfalse, r_ext_compressed_lightmaps->integer, GL_CLAMP); } if ( r_lightmap->integer == 2 ) { ri.Printf( PRINT_ALL, "Brightest lightmap value: %d\n", ( int ) ( maxIntensity * 255 ) ); } }
static void R_LoadLightmaps( lump_t *l, const char *psMapName, world_t &worldData ) { byte *buf, *buf_p; int len; byte image[LIGHTMAP_SIZE*LIGHTMAP_SIZE*4]; int i, j; float maxIntensity = 0; double sumIntensity = 0; int count; if (&worldData == &s_worldData) { tr.numLightmaps = 0; } len = l->filelen; if ( !len ) { return; } buf = fileBase + l->fileofs; // we are about to upload textures R_IssuePendingRenderCommands(); // // create all the lightmaps worldData.startLightMapIndex = tr.numLightmaps; count = len / (LIGHTMAP_SIZE * LIGHTMAP_SIZE * 3); tr.numLightmaps += count; // if we are in r_vertexLight mode, we don't need the lightmaps at all if ( r_vertexLight->integer ) { return; } char sMapName[MAX_QPATH]; COM_StripExtension(psMapName,sMapName, sizeof(sMapName)); for ( i = 0 ; i < count ; i++ ) { // expand the 24 bit on-disk to 32 bit buf_p = buf + i * LIGHTMAP_SIZE*LIGHTMAP_SIZE * 3; if ( r_lightmap->integer == 2 ) { // color code by intensity as development tool (FIXME: check range) for ( j = 0; j < LIGHTMAP_SIZE * LIGHTMAP_SIZE; j++ ) { float r = buf_p[j*3+0]; float g = buf_p[j*3+1]; float b = buf_p[j*3+2]; float intensity; float out[3] = {0.0f, 0.0f, 0.0f}; intensity = 0.33f * r + 0.685f * g + 0.063f * b; if ( intensity > 255 ) intensity = 1.0f; else intensity /= 255.0f; if ( intensity > maxIntensity ) maxIntensity = intensity; HSVtoRGB( intensity, 1.00, 0.50, out ); image[j*4+0] = out[0] * 255; image[j*4+1] = out[1] * 255; image[j*4+2] = out[2] * 255; image[j*4+3] = 255; sumIntensity += intensity; } } else { for ( j = 0 ; j < LIGHTMAP_SIZE * LIGHTMAP_SIZE; j++ ) { R_ColorShiftLightingBytes( &buf_p[j*3], &image[j*4] ); image[j*4+3] = 255; } } tr.lightmaps[worldData.startLightMapIndex+i] = R_CreateImage( va("$%s/lightmap%d", sMapName, worldData.startLightMapIndex+i), image, LIGHTMAP_SIZE, LIGHTMAP_SIZE, GL_RGBA, qfalse, qfalse, (qboolean)(r_ext_compressed_lightmaps->integer != 0), GL_CLAMP); } if ( r_lightmap->integer == 2 ) { ri.Printf( PRINT_ALL, "Brightest lightmap value: %d\n", ( int ) ( maxIntensity * 255 ) ); } }
/* ================= R_Bloom_InitTextures ================= */ static void R_Bloom_InitTextures( void ) { byte *data; // find closer power of 2 to screen size for (bloom.screen.width = 1;bloom.screen.width< glConfig.vidWidth;bloom.screen.width *= 2); for (bloom.screen.height = 1;bloom.screen.height < glConfig.vidHeight;bloom.screen.height *= 2); bloom.screen.readW = glConfig.vidWidth / (float)bloom.screen.width; bloom.screen.readH = glConfig.vidHeight / (float)bloom.screen.height; // find closer power of 2 to effect size bloom.work.width = r_bloom_sample_size->integer; bloom.work.height = bloom.work.width * ( glConfig.vidWidth / glConfig.vidHeight ); for (bloom.effect.width = 1;bloom.effect.width < bloom.work.width;bloom.effect.width *= 2); for (bloom.effect.height = 1;bloom.effect.height < bloom.work.height;bloom.effect.height *= 2); bloom.effect.readW = bloom.work.width / (float)bloom.effect.width; bloom.effect.readH = bloom.work.height / (float)bloom.effect.height; bloom.effect2.readW=bloom.effect.readW; bloom.effect2.readH=bloom.effect.readH; bloom.effect2.width=bloom.effect.width; bloom.effect2.height=bloom.effect.height; // disable blooms if we can't handle a texture of that size if( bloom.screen.width > glConfig.maxTextureSize || bloom.screen.height > glConfig.maxTextureSize || bloom.effect.width > glConfig.maxTextureSize || bloom.effect.height > glConfig.maxTextureSize || bloom.work.width > glConfig.vidWidth || bloom.work.height > glConfig.vidHeight ) { ri.Cvar_Set( "r_bloom", "0" ); Com_Printf( S_COLOR_YELLOW"WARNING: 'R_InitBloomTextures' too high resolution for light bloom, effect disabled\n" ); return; } // LEILEI // Disable bloom if we can't get a 32-bit texture // disable blooms if we can't handle a texture of that size if( r_texturebits->integer < 32 ) { ri.Cvar_Set( "r_bloom", "0" ); Com_Printf( S_COLOR_YELLOW"WARNING: 'R_InitBloomTextures' no support for 32-bit textures, effect disabled\n" ); return; } data = ri.Hunk_AllocateTempMemory( bloom.screen.width * bloom.screen.height * 4 ); Com_Memset( data, 0, bloom.screen.width * bloom.screen.height * 4 ); bloom.screen.texture = R_CreateImage( "***bloom screen texture***", data, bloom.screen.width, bloom.screen.height, qfalse, qfalse, GL_CLAMP_TO_EDGE ); ri.Hunk_FreeTempMemory( data ); data = ri.Hunk_AllocateTempMemory( bloom.effect.width * bloom.effect.height * 4 ); Com_Memset( data, 0, bloom.effect.width * bloom.effect.height * 4 ); bloom.effect.texture = R_CreateImage( "***bloom effect texture***", data, bloom.effect.width, bloom.effect.height, qfalse, qfalse, GL_CLAMP_TO_EDGE ); bloom.effect2.texture = R_CreateImage( "***bloom effect texture 2***", data, bloom.effect.width, bloom.effect.height, qfalse, qfalse, GL_CLAMP_TO_EDGE ); ri.Hunk_FreeTempMemory( data ); bloom.started = qtrue; }
CRainSystem::CRainSystem(int maxRain) : mMaxRain(maxRain), mNextWindGust(0), mRainHeight(5), mAlpha(0.15f), mWindAngle(1.0f), mFadeAlpha(0.0f), mIsRaining(false) { char name[256]; unsigned char *data, *pos; int width, height; int x, y; mSpread[0] = (float)(M_PI*2.0); // angle spread mSpread[1] = 20.0f; // radius spread mSpread[2] = 20.0f; // z spread mMinVelocity[0] = 0.1f; mMaxVelocity[0] = -0.1f; mMinVelocity[1] = 0.1f; mMaxVelocity[1] = -0.1f; mMinVelocity[2] = -60.0; mMaxVelocity[2] = -50.0; mWindDuration = 15; mWindLow = 50; mWindMin = 0.01f; mWindMax = 0.05f; mWindChange = 0; mWindDirection[0] = mWindDirection[1] = mWindDirection[2] = 0.0; mRainList = new SParticle[mMaxRain]; sprintf(name, "gfx/world/rain.tga"); R_LoadImage( name, &data, &width, &height ); if (!data) { ri.Error (ERR_DROP, "Could not load %s", name); } pos = data; for(y=0;y<height;y++) { for(x=0;x<width;x++) { pos[3] = pos[0]; pos += 4; } } mImage = R_CreateImage(name, data, width, height, false, false, false, GL_CLAMP); GL_Bind(mImage); qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); Init(); }