/* ================= SV_IsSimulating ================= */ qboolean SV_IsSimulating( void ) { if( sv.background && SV_Active() && CL_Active()) { if( CL_IsInConsole( )) return false; return true; // force simulating for background map } if( sv.hostflags & SVF_PLAYERSONLY ) return false; if( !SV_HasActivePlayers()) return false; if( !sv.paused && CL_IsInGame( )) return true; return false; }
static void _makeFrameBlack( float opacity ) { if ( opacity < 0.0f || opacity > 1.0f ) opacity = 1.0f; if ( CL_IsInConsole( ) ) // No strobing on the console { pglEnable( GL_SCISSOR_TEST ); pglScissor( con_rect.x, ( -con_rect.y ) - ( con_rect.h * 1.25 ), con_rect.w, con_rect.h ); // Preview strobe setting on static pglClearColor( 0.0f, 0.0f, 0.0f, opacity ); pglClear( GL_COLOR_BUFFER_BIT ); pglDisable( GL_SCISSOR_TEST ); } else { pglClearColor( 0.0f, 0.0f, 0.0f, opacity ); pglClear( GL_COLOR_BUFFER_BIT ); } }
void R_Strobe_Tick( void ) { double delta, delta2; double currentTime = Sys_DoubleTime( ); static int frameSnapshot = 0; static double recentTime2 = 0.0; static double recentTime = 0.0; static double deltaArray[DEVIATION_SIZE] = {0.0}; if ( CL_IsInMenu( ) || ( !vid_fullscreen->integer && CL_IsInConsole( ) ) ) // Disable when not in fullscreen due to viewport problems { R_Set2DMode( false ); return; } delta2 = currentTime - recentTime2; recentTime2 = currentTime; strobe.elapsedTime = currentTime - strobe.initialTime; /* if (deltaArray[0] == -1.0) { for ( int k = 0; k < ARRAYSIZE( deltaArray ); ++k ) { deltaArray[k] = _currentFPS( ); } } */ if ( strobe.cdTimer >= 0.0 && delta2 > 0.0 ) strobe.cdTimer += delta2; if ( strobe.fCounter - frameSnapshot == 1 ) { deltaArray[strobe.fCounter % ARRAYSIZE( deltaArray )] = _currentFPS( ); strobe.deviation = _standardDeviation( deltaArray, ARRAYSIZE( deltaArray ) ); } frameSnapshot = strobe.fCounter; if ( r_strobe_cooldown->integer > 0 ) { if ( ( strobe.cdTimer > (double)abs( r_strobe_cooldown->integer ) ) && strobe.cdTriggered == true ) { strobe.cdTriggered = false; strobe.cdTimer = -1.0; } if ( strobe.fCounter > ARRAYSIZE( deltaArray ) ) { if ( strobe.deviation > DEVIATION_LIMIT ) { strobe.cdTriggered = true; strobe.cdTimer = 0.0; } } } else { strobe.cdTriggered = false; } if ( ( ( strobe.strobeInterval != r_strobe->integer ) && ( strobe.strobeInterval ) ) || /*((swapInterval != r_strobe_swapinterval->integer) && (swapInterval != 0)) || */ strobe.fCounter == INT_MAX ) { _reset( ); R_Strobe_Tick( ); } strobe.strobeInterval = r_strobe->integer; strobe.swapInterval = r_strobe_swapinterval->integer; if ( ( strobe.strobeInterval == 0 ) || ( ( gl_swapInterval->integer == 0 ) && ( strobe.strobeInterval ) ) || ( strobe.strobeInterval > 25 || strobe.strobeInterval < -25 ) ) { if ( !gl_swapInterval->integer ) MsgDev( D_WARN, "Strobing requires V-SYNC enabled! (gl_swapInterval != 0) \n" ); if ( strobe.strobeInterval ) { Cvar_Set( "r_strobe", "0" ); } R_Set2DMode( false ); return; } if ( ( strobe.fCounter % 2 ) == 0 ) { ++strobe.pCounter; strobe.frameState |= PHASE_POSITIVE; } else { ++strobe.nCounter; strobe.frameState &= ~PHASE_POSITIVE; } if ( strobe.swapInterval < 0 ) strobe.swapInterval = abs( strobe.swapInterval ); if ( ( strobe.swapInterval ) && ( strobe.strobeInterval % 2 ) ) // Swapping not enabled for even intervals as it is neither necessary nor works as intended { delta = currentTime - recentTime; if ( ( delta >= (double)( strobe.swapInterval ) ) && ( delta < (double)( 2 * strobe.swapInterval ) ) ) // Basic timer { strobe.frameState |= PHASE_INVERTED; } else if ( delta < (double)( strobe.swapInterval ) ) { strobe.frameState &= ~PHASE_INVERTED; } else //if (delta >= (double)(2 * swapInterval)) { recentTime = currentTime; } } switch ( strobe.frameState & ( PHASE_POSITIVE | PHASE_INVERTED ) ) { case ( PHASE_POSITIVE | PHASE_INVERTED ): if ( ( abs( strobe.strobeInterval ) % 2 ) == 0 ) strobe.frameState = ( ( ( strobe.pCounter - 1 ) % ( abs( strobe.strobeInterval ) + 1 ) ) == ( abs( strobe.strobeInterval ) / 2 ) ) ? strobe.frameState | FRAME_RENDER : strobe.frameState & ~FRAME_RENDER; //even else strobe.frameState &= ~FRAME_RENDER; break; case ( PHASE_POSITIVE & ~PHASE_INVERTED ): if ( abs( strobe.strobeInterval ) % 2 == 0 ) strobe.frameState = ( ( ( strobe.pCounter - 1 ) % ( abs( strobe.strobeInterval ) + 1 ) ) == 0 ) ? strobe.frameState | FRAME_RENDER : strobe.frameState & ~FRAME_RENDER; //even else { if ( abs( strobe.strobeInterval ) == 1 ) strobe.frameState |= FRAME_RENDER; else strobe.frameState = ( ( ( strobe.pCounter - 1 ) % ( ( abs( strobe.strobeInterval ) + 1 ) / 2 ) ) == 0 ) ? strobe.frameState | FRAME_RENDER : strobe.frameState & ~FRAME_RENDER; //odd } break; case ( ~PHASE_POSITIVE & PHASE_INVERTED ): if ( abs( strobe.strobeInterval ) % 2 == 0 ) strobe.frameState = ( ( ( strobe.nCounter - 1 ) % ( abs( strobe.strobeInterval ) + 1 ) ) == 0 ) ? strobe.frameState | FRAME_RENDER : strobe.frameState & ~FRAME_RENDER; //even else { if ( abs( strobe.strobeInterval ) == 1 ) strobe.frameState |= FRAME_RENDER; else strobe.frameState = ( ( ( strobe.nCounter - 1 ) % ( ( abs( strobe.strobeInterval ) + 1 ) / 2 ) ) == 0 ) ? strobe.frameState | FRAME_RENDER : strobe.frameState & ~FRAME_RENDER; //odd } break; case 0: if ( ( abs( strobe.strobeInterval ) % 2 ) == 0 ) strobe.frameState = ( ( ( strobe.nCounter - 1 ) % ( abs( strobe.strobeInterval ) + 1 ) ) == ( abs( strobe.strobeInterval ) / 2 ) ) ? strobe.frameState | FRAME_RENDER : strobe.frameState & ~FRAME_RENDER; //even else strobe.frameState &= ~FRAME_RENDER; break; default: strobe.frameState = ( PHASE_POSITIVE | FRAME_RENDER ); } if ( strobe.strobeInterval < 0 ) strobe.frameState ^= FRAME_RENDER; _processFrame( ); }