301 lines
13 KiB
Plaintext
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;
|
|
}
|
|
}
|