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

301 lines
13 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;
#namespace duplicate_render_bundle;
//-----------------------------------------------------------------------------
function autoexec __init__sytem__() { system::register("duplicate_render_bundle",&__init__,undefined,undefined); }
function __init__()
{
callback::on_localplayer_spawned( &localplayer_duplicate_render_bundle_init );
}
function localplayer_duplicate_render_bundle_init( localClientNum )
{
init_duplicate_render_bundles();
}
//-----------------------------------------------------------------------------
function init_duplicate_render_bundles()
{
if ( isdefined( self.dupRenderBundelsInited ) )
return;
self.dupRenderBundelsInited = true;
self.playingdupRenderBundle = "";
self.forceStopdupRenderBundle = false;
self.exitdupRenderBundle = false;
/#
self thread dupRenderBundleDebugListen();
#/
}
//-----------------------------------------------------------------------------
// debug - start a dupRender bundle by setting the bundle name in a dvar: "scr_play_duplicate_render_bundle"
/#
function dupRenderBundleDebugListen()
{
self endon("entityshutdown");
SetDvar( "scr_play_duplicate_render_bundle", "" );
SetDvar( "scr_stop_duplicate_render_bundle", "" );
SetDvar( "scr_exit_duplicate_render_bundle", "" );
while ( 1 )
{
playBundleName = GetDvarString( "scr_play_duplicate_render_bundle" );
if ( playBundleName != "" )
{
self thread playdupRenderBundle( playBundleName );
SetDvar( "scr_play_duplicate_render_bundle", "" );
}
stopBundleName = GetDvarString( "scr_stop_duplicate_render_bundle" );
if ( stopBundleName != "" )
{
self thread stopdupRenderBundle();
SetDvar( "scr_stop_duplicate_render_bundle", "" );
}
// For looping bundles
stopBundleName = GetDvarString( "scr_exit_duplicate_render_bundle" );
if ( stopBundleName != "" )
{
self thread exitdupRenderBundle();
SetDvar( "scr_exit_duplicate_render_bundle", "" );
}
wait( 0.5 );
}
}
#/
//-----------------------------------------------------------------------------
function playDupRenderBundle( playBundleName )
{
self endon("entityshutdown");
init_duplicate_render_bundles();
stopPlayingdupRenderBundle();
bundle = struct::get_script_bundle( "duprenderbundle", playBundleName );
if ( !isdefined( bundle ) )
{
/#
println( "ERROR: dupRender bundle '" + playBundleName + "' not found" );
#/
return;
}
totalAccumTime = 0;
filter::init_filter_indices();
self.playingdupRenderBundle = playBundleName;
localClientNum = self.localClientNum;
looping = false;
enterStage = false;
exitStage = false;
finishLoopOnExit = 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 ( looping )
{
num_stages = 1;
if ( enterStage )
num_stages++;
if ( exitStage )
num_stages++;
}
else
{
num_stages = bundle.num_stages;
}
for ( stageIdx = 0 ; stageIdx < num_stages && !self.forceStopdupRenderBundle ; stageIdx++ )
{
stagePrefix = "s";
if ( stageIdx < 10 ) stagePrefix += "0";
stagePrefix += stageIdx + "_";
stageLength = GetStructField( bundle, stagePrefix + "length" );
if ( !isdefined( stageLength ) )
{
finishPlayingdupRenderBundle( localClientNum, stagePrefix + " length not defined" );
return;
}
stageLength *= 1000;
// Set the duplicate render:
AddDupMaterial( localClientNum, bundle, stagePrefix + "fb_", 0 );
AddDupMaterial( localClientNum, bundle, stagePrefix + "dupfb_", 1 );
AddDupMaterial( localClientNum, bundle, stagePrefix + "sonar_", 2 );
loopingStage = looping && ( !enterStage && stageIdx == 0 || enterStage && stageIdx == 1 );
accumTime = 0;
prevTime = self GetClientTime();
while ( ( loopingStage || accumTime < stageLength ) && !self.forceStopdupRenderBundle )
{
// /#
// PrintTopRightln( playBundleName + ": Stage: " + ( stageIdx + 1 ) + " " + accumTime + "/" + stageLength, ( 1, 1, 1 ), 1 );
// #/
gfx::SetStage( localClientNum, bundle, undefined, stagePrefix, stageLength, accumTime, totalAccumTime, &SetShaderConstants );
{wait(.016);};
currTime = self GetClientTime();
deltaTime = currTime - prevTime;
accumTime += deltaTime;
totalAccumTime += deltaTime;
prevTime = currTime;
if ( loopingStage )
{
while ( accumTime >= stageLength )
accumTime -= stageLength;
if ( self.exitdupRenderBundle )
{
loopingStage = false;
if ( !finishLoopOnExit )
break;
}
}
}
self disableduplicaterendering();
}
finishPlayingdupRenderBundle( localClientNum, "Finished " + playBundleName );
}
//-----------------------------------------------------------------------------------------------------------
function AddDupMaterial( localClientNum, bundle, prefix, type )
{
method = 0;
methodStr = GetStructField( bundle, prefix + "method" );
if ( isDefined( methodStr ) )
{
switch( methodStr )
{
case "off":
method = 0;
break;
case "default material":
method = 1;
break;
case "custom material":
method = 3;
break;
case "force custom material":
method = 3;
break;
case "thermal":
method = 2;
break;
case "enemy material":
method = 4;
break;
}
}
materialName = GetStructField( bundle, prefix + "mc_material" );
materialId = -1;
if ( isDefined( materialName ) && materialName != "" )
{
materialName = "mc/" + materialName; // TODO: Don't hard code "mc"?
materialId = filter::mapped_material_id( materialName );
if ( !isDefined( materialId ) )
{
filter::map_material_helper_by_localclientnum( localClientNum, materialName );
materialId = filter::mapped_material_id( );
if ( !isDefined( materialId ) )
materialId = -1;
}
}
self AddDuplicateRenderOption( type, method, materialId );
}
//-----------------------------------------------------------------------------------------------------------
function SetShaderConstants( localClientNum, shaderConstantName, filterid, values )
{
self MapShaderConstant( localClientNum, 0, shaderConstantName, values[0], values[1], values[2], values[3] );
}
//-----------------------------------------------------------------------------
function finishPlayingDupRenderBundle( localClientNum, msg )
{
/#
if ( isdefined( msg ) )
{
println( msg );
}
#/
self.forceStopdupRenderBundle = false;
self.exitdupRenderBundle = false;
self.playingdupRenderBundle = "";
}
//-----------------------------------------------------------------------------
function stopPlayingDupRenderBundle()
{
if ( self.playingdupRenderBundle != "" )
{
stopdupRenderBundle();
}
}
function stopDupRenderBundle()
{
if ( !( isdefined( self.forceStopdupRenderBundle ) && self.forceStopdupRenderBundle ) && isdefined( self.playingdupRenderBundle ) && self.playingdupRenderBundle != "" )
{
self.forceStopdupRenderBundle = true;
while ( self.playingdupRenderBundle != "" )
{
{wait(.016);};
if ( !isdefined( self ) )
{
return;
}
}
}
}
function exitDupRenderBundle()
{
if ( !( isdefined( self.exitdupRenderBundle ) && self.exitdupRenderBundle ) && isdefined( self.playingdupRenderBundle ) && self.playingdupRenderBundle != "" )
{
self.exitdupRenderBundle = true;
}
}