boiii-scripts/shared/postfx_shared.csc
2023-04-13 17:30:38 +02:00

360 lines
15 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\filter_shared;
#using scripts\shared\math_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\gfx_shared;
#using scripts\shared\duplicaterenderbundle; // Just so it will be included
#namespace postfx;
//-----------------------------------------------------------------------------
function autoexec __init__sytem__() { system::register("postfx_bundle",&__init__,undefined,undefined); }
function __init__()
{
callback::on_localplayer_spawned( &localplayer_postfx_bundle_init );
}
function localplayer_postfx_bundle_init( localClientNum )
{
init_postfx_bundles();
}
//-----------------------------------------------------------------------------
function init_postfx_bundles()
{
if ( isdefined( self.postfxBundelsInited ) )
return;
self.postfxBundelsInited = true;
self.playingPostfxBundle = "";
self.forceStopPostfxBundle = false;
self.exitPostfxBundle = false;
/#
self thread postfxBundleDebugListen();
#/
}
//-----------------------------------------------------------------------------
// debug - start a postfx bundle by setting the bundle name in a dvar: "scr_play_postfx_bundle"
/#
function postfxBundleDebugListen()
{
self endon("entityshutdown");
SetDvar( "scr_play_postfx_bundle", "" );
SetDvar( "scr_stop_postfx_bundle", "" );
SetDvar( "scr_exit_postfx_bundle", "" );
while ( 1 )
{
playBundleName = GetDvarString( "scr_play_postfx_bundle" );
if ( playBundleName != "" )
{
self thread playPostfxBundle( playBundleName );
SetDvar( "scr_play_postfx_bundle", "" );
}
stopBundleName = GetDvarString( "scr_stop_postfx_bundle" );
if ( stopBundleName != "" )
{
self thread stopPostfxBundle();
SetDvar( "scr_stop_postfx_bundle", "" );
}
// For looping bundles
stopBundleName = GetDvarString( "scr_exit_postfx_bundle" );
if ( stopBundleName != "" )
{
self thread exitPostfxBundle();
SetDvar( "scr_exit_postfx_bundle", "" );
}
wait( 0.5 );
}
}
#/
//-----------------------------------------------------------------------------
function playPostfxBundle( playBundleName )
{
self endon("entityshutdown");
self endon("death");
init_postfx_bundles();
stopPlayingPostfxBundle();
bundle = struct::get_script_bundle( "postfxbundle", playBundleName );
if ( !isdefined( bundle ) )
{
/#
println( "ERROR: postfx bundle '" + playBundleName + "' not found" );
#/
return;
}
filterid = 0;
totalAccumTime = 0;
filter::init_filter_indices();
self.playingPostfxBundle = playBundleName;
localClientNum = self.localClientNum;
looping = false;
enterStage = false;
exitStage = false;
finishLoopOnExit = false;
firstPersonOnly = false;
if ( isdefined( bundle.looping) ) { looping = bundle.looping; };
if ( isdefined( bundle.enterStage) ) { enterStage = bundle.enterStage; };
if ( isdefined( bundle.exitStage) ) { exitStage = bundle.exitStage; };
if ( isdefined( bundle.finishLoopOnExit) ) { finishLoopOnExit = bundle.finishLoopOnExit; };
if ( isdefined( bundle.firstPersonOnly) ) { firstPersonOnly = bundle.firstPersonOnly; };
if ( looping )
{
num_stages = 1;
if ( enterStage )
num_stages++;
if ( exitStage )
num_stages++;
}
else
{
num_stages = bundle.num_stages;
}
self.captureImageName = undefined;
if ( isDefined( bundle.screenCapture ) && bundle.screenCapture )
{
self.captureImageName = playBundleName;
CreateSceneCodeImage( localClientNum, self.captureImageName );
CaptureFrame( localClientNum, self.captureImageName );
setFilterPassCodeTexture( localClientNum, filterid, 0, 0, self.captureImageName );
}
self thread watchEntityShutdown( localClientNum, filterid );
for ( stageIdx = 0 ; stageIdx < num_stages && !self.forceStopPostfxBundle ; stageIdx++ )
{
stagePrefix = "s";
if ( stageIdx < 10 ) stagePrefix += "0";
stagePrefix += stageIdx + "_";
stageLength = GetStructField( bundle, stagePrefix + "length" );
if ( !isdefined( stageLength ) )
{
finishPlayingPostfxBundle( localClientNum, stagePrefix + "length not defined", filterid );
return;
}
stageLength *= 1000;
stageMaterial = GetStructField( bundle, stagePrefix + "material" );
if ( !isdefined( stageMaterial ) )
{
finishPlayingPostfxBundle( localClientNum, stagePrefix + "material not defined", filterid );
return;
}
filter::map_material_helper( self, stageMaterial );
setFilterPassMaterial( localClientNum, filterid, 0, filter::mapped_material_id( stageMaterial ) );
setFilterPassEnabled( localClientNum, filterid, 0, true, false, firstPersonOnly );
stageCapture = GetStructField( bundle, stagePrefix + "screenCapture" );
if ( isDefined( stageCapture ) && stageCapture )
{
if ( isDefined( self.captureImageName ) )
{
FreeCodeImage( localClientNum, self.captureImageName );
self.captureImageName = undefined;
setFilterPassCodeTexture( localClientNum, filterid, 0, 0, "" );
}
self.captureImageName = stagePrefix + playBundleName;
CreateSceneCodeImage( localClientNum, self.captureImageName );
captureFrame( localClientNum, self.captureImageName );
setFilterPassCodeTexture( localClientNum, filterid, 0, 0, self.captureImageName );
}
stageSprite = GetStructField( bundle, stagePrefix + "spriteFilter" );
if ( isDefined( stageSprite ) && stageSprite )
{
setfilterpassquads( localClientNum, filterid, 0, 2048 );
}
else
{
setfilterpassquads( localClientNum, filterid, 0, 0 );
}
thermal = GetStructField( bundle, stagePrefix + "thermal" );
EnableThermalDraw( localClientNum, isDefined( thermal ) && thermal );
loopingStage = looping && ( !enterStage && stageIdx == 0 || enterStage && stageIdx == 1 );
accumTime = 0;
prevTime = self GetClientTime();
while ( ( loopingStage || accumTime < stageLength ) && !self.forceStopPostfxBundle )
{
// /#
// PrintTopRightln( playBundleName + ": Stage: " + ( stageIdx + 1 ) + " " + accumTime + "/" + stageLength, ( 1, 1, 1 ), 1 );
// #/
gfx::SetStage( localClientNum, bundle, filterid, stagePrefix, stageLength, accumTime, totalAccumTime, &SetFilterConstants );
{wait(.016);};
currTime = self GetClientTime();
deltaTime = currTime - prevTime;
accumTime += deltaTime;
totalAccumTime += deltaTime;
prevTime = currTime;
if ( loopingStage )
{
while ( accumTime >= stageLength )
accumTime -= stageLength;
if ( self.exitPostfxBundle )
{
loopingStage = false;
if ( !finishLoopOnExit )
break;
}
}
}
setFilterPassEnabled( localClientNum, filterid, 0, false );
}
finishPlayingPostfxBundle( localClientNum, "Finished " + playBundleName, filterid );
}
function watchEntityShutdown( localClientNum, filterid )
{
self util::waittill_any( "entityshutdown", "death", "finished_playing_postfx_bundle" );
finishPlayingPostfxBundle( localClientNum, "Entity Shutdown", filterid );
}
//-----------------------------------------------------------------------------------------------------------
function SetFilterConstants( localClientNum, shaderConstantName, filterid, values )
{
baseShaderConstIndex = gfx::getShaderConstantIndex( shaderConstantName );
setFilterPassConstant( localClientNum, filterid, 0, baseShaderConstIndex + 0, values[0] );
setFilterPassConstant( localClientNum, filterid, 0, baseShaderConstIndex + 1, values[1] );
setFilterPassConstant( localClientNum, filterid, 0, baseShaderConstIndex + 2, values[2] );
setFilterPassConstant( localClientNum, filterid, 0, baseShaderConstIndex + 3, values[3] );
}
//-----------------------------------------------------------------------------
function finishPlayingPostfxBundle( localClientNum, msg, filterid )
{
/#
if ( isdefined( msg ) )
{
println( msg );
}
#/
if( isDefined( self ) )
{
self notify ( "finished_playing_postfx_bundle" );
self.forceStopPostfxBundle = false;
self.exitPostfxBundle = false;
self.playingPostfxBundle = "";
}
setFilterPassQuads( localClientNum, filterid, 0, 0 );
setFilterPassEnabled( localClientNum, filterid, 0, false );
EnableThermalDraw( localClientNum, false );
if ( isDefined( self.captureImageName ) )
{
setFilterPassCodeTexture( localClientNum, filterid, 0, 0, "" );
FreeCodeImage( localClientNum, self.captureImageName );
self.captureImageName = undefined;
}
}
//-----------------------------------------------------------------------------
function stopPlayingPostfxBundle()
{
if ( self.playingPostfxBundle != "" )
{
stopPostfxBundle();
}
}
function stopPostfxBundle()
{
self notify( "stopPostfxBundle_singleton" );
self endon( "stopPostfxBundle_singleton" );
if ( isdefined( self.playingPostfxBundle ) && self.playingPostfxBundle != "" )
{
self.forceStopPostfxBundle = true;
while ( self.playingPostfxBundle != "" )
{
{wait(.016);};
if ( !isdefined( self ) )
{
return;
}
}
}
}
function exitPostfxBundle()
{
if ( !( isdefined( self.exitPostfxBundle ) && self.exitPostfxBundle ) && isdefined( self.playingPostfxBundle ) && self.playingPostfxBundle != "" )
{
self.exitPostfxBundle = true;
}
}
function setFrontendStreamingOverlay( localClientNum, system, enabled )
{
if( !isdefined( self.overlayClients ) )
{
self.overlayClients = [];
}
if( !isdefined( self.overlayClients[localClientNum] ) )
{
self.overlayClients[localClientNum] = [];
}
self.overlayClients[localClientNum][system] = enabled;
foreach( _, en in self.overlayClients[localClientNum] )
{
if( en )
{
EnableFrontendStreamingOverlay( localClientNum, true );
return;
}
}
EnableFrontendStreamingOverlay( localClientNum, false );
}