Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class DecoShadowStatic extends Projector
- NoUserCreate;
- var bool bOptionalUpdate;
- var transient ShadowBitMap PLShadow;
- simulated function PostBeginPlay();
- simulated function Tick( float Delta )
- {
- UpdateShadow();
- if (bOptionalUpdate && !bDeleteMe)
- Disable('Tick');
- }
- event PostLoadGame()
- {
- UpdateShadow();
- }
- simulated function UpdateShadow()
- {
- local Actor HitActor;
- local vector HitNormal, HitLocation, ShadowStart;
- local float Distance;
- local bool bInvisible;
- if ( Owner==None || Owner.bDeleteMe)
- {
- Destroy();
- Return;
- }
- DeattachPrjDecal();
- if (!class'GameInfo'.default.bDecoShadows)
- return;
- SetRotation(rot(-16384,0,0));
- ShadowStart = Owner.Location;
- ShadowStart.Z-=(Owner.CollisionHeight-5);
- HitActor = Trace(HitLocation, HitNormal, ShadowStart - vect(0, 0, 200), Location, false, vect(0.8,0.8,0)*Owner.CollisionRadius);
- if (HitActor == none)
- {
- Destroy();
- return;
- }
- if (class'GameInfo'.default.bUseRealtimeShadow && PLShadow == none)
- {
- PLShadow = ShadowBitMap(Level.AllocateObj(Class'ShadowBitMap'));
- if( PLShadow==None )
- PLShadow = new(Outer)Class'ShadowBitMap';
- PLShadow.ProjectingActor = Owner;
- PLShadow.ProjectDirection = rot(16384,0,0);
- ProjectTexture = PLShadow;
- if( PLShadow.USize!=Class'DecoShadow'.Default.ShadowDetailRes )
- PLShadow.SetShadowRes(Class'DecoShadow'.Default.ShadowDetailRes,Class'DecoShadow'.Default.ShadowDetailRes);
- PLShadow.Softness = Class'DecoShadow'.Static.GetShadowSoftness();
- PLShadow.StaticLevel = 1;
- ProjectStyle = STY_AlphaBlend;
- }
- else if (!class'GameInfo'.default.bUseRealtimeShadow && PLShadow != none)
- {
- PLShadow.ProjectingActor = none;
- Level.FreeObject(PLShadow);
- PLShadow = none;
- ProjectTexture = default.ProjectTexture;
- ProjectStyle = default.ProjectStyle;
- }
- Distance = FMax(Owner.Location.Z - Owner.CollisionHeight - HitLocation.Z, 0.f);
- if (PLShadow != none)
- {
- ProjectorScale = FMax(Owner.CollisionRadius, 18.f) * (16.f / class'DecoShadow'.default.ShadowDetailRes);
- PLShadow.ShadowScale = 0.8f / ProjectorScale;
- PLShadow.Gradience = Min(Distance + 100, 255);
- if (PLShadow.Gradience == 255)
- bInvisible = true;
- }
- else
- {
- ProjectorScale = Owner.CollisionRadius/70.f * class'DecoShadow'.default.ShadowScaling *
- (1.f - Distance / FMin(2 * Owner.CollisionRadius, 155.0));
- if (ProjectorScale <= 0)
- bInvisible = true;
- }
- bOptionalUpdate =
- bOptionalUpdate &&
- class'DecoShadow'.default.bOptimizeTracing &&
- (!HitActor.bIsMover || HitActor.Brush == none);
- SetLocation(HitLocation + vect(0, 0, 20));
- if (!bInvisible)
- AttachPrjDecal();
- }
- simulated function Destroyed()
- {
- if( PLShadow!=None )
- {
- PLShadow.ProjectingActor = None;
- Level.FreeObject(PLShadow);
- PLShadow = None;
- }
- Super.Destroyed();
- }
- simulated function Touch( Actor Other )
- {
- if( bProjectActors && !Other.bHidden && Other.DrawType==DT_Mesh && Other.Mesh!=None && Other!=Owner )
- AttachActor(Other);
- }
- defaultproperties
- {
- ProjectTexture=Texture'BlobShadow'
- ProjectorScale=0.50
- ProjectStyle=STY_Modulated
- bCollideActors=false
- bOptionalUpdate=true
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement