1
0
KF2-Dev-Scripts/UDKBase/classes/UDKEmitterPool.uc
2020-12-13 18:01:13 +03:00

122 lines
3.6 KiB
Ucode

/**
*
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*/
class UDKEmitterPool extends EmitterPool
native;
/** info about attached explosion lights */
struct native AttachedExplosionLight
{
var UDKExplosionLight Light;
var Actor Base;
var vector RelativeLocation;
};
var array<AttachedExplosionLight> RelativeExplosionLights;
cpptext
{
virtual void TickSpecial(FLOAT DeltaTime);
}
/**
* Support for particle emitter LOD based on "drop detail" (when frame rate is low) and distance.
*/
function ParticleSystemComponent SpawnEmitter(ParticleSystem EmitterTemplate, vector SpawnLocation, optional rotator SpawnRotation, optional Actor AttachToActor, optional Actor InInstigator, optional int MaxDLEPooledReuses, optional bool bInheritScaleFromBase)
{
local PlayerController PC;
local int LODLevel;
local ParticleSystemComponent PSC;
if( EmitterTemplate == none )
{
`log( "UDKEmitterPool was passed a none EmitterTemplate" );
// ScriptTrace();
return none;
}
PSC = Super.SpawnEmitter(EmitterTemplate, SpawnLocation, SpawnRotation, AttachToActor, InInstigator, MaxDLEPooledReuses, bInheritScaleFromBase);
// reduce detail if low framerate
if (WorldInfo.bDropDetail)
{
LODLevel = 1;
}
// NVCHANGE_BEGIN: JCAO - Fix on override particle systems LOD settings
// Do not use EmitterTemplate any more, because it may be replaced by PhysX particle system override
else if (PSC.Template.LODDistances.length > 1)
{
// also reduce detail if all local players are too far away or effect is behind them
LODLevel = 1;
foreach LocalPlayerControllers(class'PlayerController', PC)
{
if ( PC.ViewTarget != None && VSize(PC.ViewTarget.Location - SpawnLocation) * PC.LODDistanceFactor < PSC.Template.LODDistances[1] &&
vector(PC.Rotation) dot (SpawnLocation - PC.ViewTarget.Location) >= 0.0 )
{
LODLevel = 0;
break;
}
}
}
// NVCHANGE_END: JCAO - Fix on Mutated particle systems LOD settings
PSC.SetLODLevel(LODLevel);
PSC.SetDepthPriorityGroup(SDPG_World);
return PSC;
}
/** hooked up to UDKExplosionLight's OnLightFinished delegate to clean it up */
function OnExplosionLightFinished(UDKExplosionLight Light)
{
local int i;
DetachComponent(Light);
i = RelativeExplosionLights.Find('Light', Light);
if (i != INDEX_NONE)
{
RelativeExplosionLights.Remove(i, 1);
}
}
/** creates an explosion light (currently not pooled) */
function UDKExplosionLight SpawnExplosionLight(class<UDKExplosionLight> LightClass, vector SpawnLocation, optional Actor AttachToActor)
{
local UDKExplosionLight Light;
local int i;
// AttachToActor is only for movement, so if it can't move, then there is no point in using it
if (AttachToActor != None && (AttachToActor.bStatic || !AttachToActor.bMovable))
{
AttachToActor = None;
}
Light = new(self) LightClass;
Light.SetTranslation(SpawnLocation);
Light.OnLightFinished = OnExplosionLightFinished;
AttachComponent(Light);
if (AttachToActor != None)
{
i = RelativeExplosionLights.length;
RelativeExplosionLights.length = i + 1;
RelativeExplosionLights[i].Light = Light;
RelativeExplosionLights[i].Base = AttachToActor;
RelativeExplosionLights[i].RelativeLocation = SpawnLocation - AttachToActor.Location;
}
return Light;
}
defaultproperties
{
Begin Object Name=ParticleSystemComponent0
bAcceptsLights=false
SecondsBeforeInactive=0
bOverrideLODMethod=true
LODMethod=PARTICLESYSTEMLODMETHOD_DirectSet
End Object
MaxActiveEffects=200
SMC_MIC_ReductionTime=2.0
IdealStaticMeshComponents=200
IdealMaterialInstanceConstants=200
}