360 lines
15 KiB
Plaintext
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 );
|
|
}
|
|
|