/* ================== FullscreenFXManager::CreateFX ================== */ void FullscreenFXManager::CreateFX( idStr name, idStr fxtype, int fade ) { FullscreenFX *pfx = NULL; if ( fxtype == "helltime" ) { pfx = new (TAG_FX) FullscreenFX_Helltime; } else if ( fxtype == "warp" ) { pfx = new (TAG_FX) FullscreenFX_Warp; } else if ( fxtype == "envirosuit" ) { pfx = new (TAG_FX) FullscreenFX_EnviroSuit; } else if ( fxtype == "doublevision" ) { pfx = new (TAG_FX) FullscreenFX_DoubleVision; } else if ( fxtype == "multiplayer" ) { pfx = new (TAG_FX) FullscreenFX_Multiplayer; } else if ( fxtype == "influencevision" ) { pfx = new (TAG_FX) FullscreenFX_InfluenceVision; } else if ( fxtype == "bloom" ) { pfx = new (TAG_FX) FullscreenFX_Bloom; } else { assert( 0 ); } if ( pfx ) { pfx->Initialize(); pfx->SetFXManager( this ); pfx->SetName( name ); pfx->SetFadeSpeed( fade ); fx.Append( pfx ); } }
/* ================== FullscreenFXManager::Restore ================== */ void FullscreenFXManager::Restore( idRestoreGame* savefile ) { for( int i = 0; i < fx.Num(); i++ ) { FullscreenFX* pfx = fx[i]; pfx->Restore( savefile ); } }
/* ================== FullscreenFXManager::Restore ================== */ void FullscreenFXManager::Restore( idRestoreGame *savefile ) { savefile->ReadBool( highQualityMode ); savefile->ReadVec2( shiftScale ); for ( int i = 0; i < fx.Num(); i++ ) { FullscreenFX *pfx = fx[i]; pfx->Restore( savefile ); } }
/* ================== FullscreenFXManager::Save ================== */ void FullscreenFXManager::Save( idSaveGame *savefile ) { savefile->WriteBool( highQualityMode ); savefile->WriteVec2( shiftScale ); for ( int i = 0; i < fx.Num(); i++ ) { FullscreenFX *pfx = fx[i]; pfx->Save( savefile ); } }
/* ================== FullscreenFXManager::Process ================== */ void FullscreenFXManager::Process( const renderView_t *view ) { bool allpass = false; bool atLeastOneFX = false; if ( g_testFullscreenFX.GetInteger() == -2 ) { allpass = true; } // do the first render gameRenderWorld->RenderScene( view ); // we should consider these on a case-by-case basis for stereo rendering // double vision could be implemented "for real" by shifting the // eye views if ( IsGameStereoRendered() && !player_allowScreenFXInStereo.GetBool() ) { return; } // do the process for ( int i = 0; i < fx.Num(); i++ ) { FullscreenFX *pfx = fx[i]; bool drawIt = false; // determine if we need to draw if ( pfx->Active() || g_testFullscreenFX.GetInteger() == i || allpass ) { drawIt = pfx->SetTriggerState( true ); } else { drawIt = pfx->SetTriggerState( false ); } // do the actual drawing if ( drawIt ) { atLeastOneFX = true; // we need to dump to _currentRender renderSystem->CaptureRenderToImage( "_currentRender" ); // handle the accum pass if we have one if ( pfx->HasAccum() ) { // we need to crop the accum pass renderSystem->CropRenderSize( 512, 512 ); pfx->AccumPass( view ); renderSystem->CaptureRenderToImage( "_accum" ); renderSystem->UnCrop(); } // do the high quality pass pfx->HighQuality(); // do the blendback Blendback( pfx->GetFadeAlpha() ); } } }
/* ================== FullscreenFXManager::Process ================== */ void FullscreenFXManager::Process( const renderView_t *view ) { bool allpass = false; bool atLeastOneFX = false; if ( g_testFullscreenFX.GetInteger() == -2 ) { allpass = true; } if ( g_lowresFullscreenFX.GetBool() ) { highQualityMode = false; } else { highQualityMode = true; } // compute the shift scale if ( highQualityMode ) { int vidWidth, vidHeight; renderSystem->GetGLSettings( vidWidth, vidHeight ); float pot; int w = vidWidth; pot = MakePowerOfTwo( w ); shiftScale.x = (float)w / pot; int h = vidHeight; pot = MakePowerOfTwo( h ); shiftScale.y = (float)h / pot; } else { // if we're in low-res mode, shrink view down shiftScale.x = 1; shiftScale.y = 1; renderSystem->CropRenderSize( 512, 512, true ); } // do the first render gameRenderWorld->RenderScene( view ); // do the process for ( int i = 0; i < fx.Num(); i++ ) { FullscreenFX *pfx = fx[i]; bool drawIt = false; // determine if we need to draw if ( pfx->Active() || g_testFullscreenFX.GetInteger() == i || allpass ) { drawIt = pfx->SetTriggerState( true ); } else { drawIt = pfx->SetTriggerState( false ); } // do the actual drawing if ( drawIt ) { atLeastOneFX = true; // we need to dump to _currentRender CaptureCurrentRender(); // handle the accum pass if we have one if ( pfx->HasAccum() ) { // if we're in high quality mode, we need to crop the accum pass if ( highQualityMode ) { renderSystem->CropRenderSize( 512, 512, true ); pfx->AccumPass( view ); renderSystem->UnCrop(); } else { pfx->AccumPass( view ); } } // do the high quality pass pfx->HighQuality(); // do the blendback Blendback( pfx->GetFadeAlpha() ); } } if ( !highQualityMode ) { // we need to dump to _currentRender CaptureCurrentRender(); // uncrop view renderSystem->UnCrop(); // draw the final full-screen image renderSystem->SetColor4( 1, 1, 1, 1 ); renderSystem->DrawStretchPic( 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1, 1, 0.f, blendBackMaterial ); } }