#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; } }