Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class PawnShadowX extends Projector
- NoUserCreate;
- #exec TEXTURE IMPORT NAME=BlobShadow FILE=Textures\BlobShadow.pcx LODSET=2
- var transient vector OldOwnerLocation;
- var transient int OldShadowDetail;
- var transient bool bOptionalUpdate;
- var transient ShadowBitMap PLShadow;
- simulated function PostBeginPlay()
- {
- SetRotation(rot(-16384,0,0));
- }
- simulated final function bool IsViewActor()
- {
- local PlayerPawn P;
- P = Level.GetLocalPlayerPawn();
- return (P!=None && (P.ViewTarget==Owner || P==Owner));
- }
- simulated event Tick( float Delta )
- {
- UpdateShadow();
- }
- simulated function UpdateShadow()
- {
- local Actor HitActor;
- local vector HitNormal, HitLocation, ShadowStart;
- local float ShadowDetail;
- local float Distance;
- local bool bInvisible, bHitMovingBrush;
- if ( Owner==None || Owner.bDeleteMe )
- {
- Destroy();
- Return;
- }
- if( (Level.TimeSeconds-LastRenderedTime)>1.f && (Level.TimeSeconds-Owner.LastRenderedTime)>1.f && !IsViewActor() )
- {
- if( bHasAttached )
- {
- DeattachPrjDecal();
- bOptionalUpdate = false;
- }
- return;
- }
- if (!class'GameInfo'.default.bCastShadow ||
- Owner.Style == STY_Translucent ||
- Owner.bHidden ||
- Owner.DrawType == DT_None)
- {
- if (bHasAttached)
- DeattachPrjDecal();
- bOptionalUpdate = false;
- return;
- }
- if (class'GameInfo'.Default.bUseRealtimeShadow)
- ShadowDetail = class'PawnShadow'.default.ShadowDetailRes; // else keep the initial value - zero
- if (class'PawnShadow'.default.bOptimizeTracing && bOptionalUpdate && Owner.Location == OldOwnerLocation && ShadowDetail == OldShadowDetail)
- return;
- OldOwnerLocation = Owner.Location;
- OldShadowDetail = ShadowDetail;
- if (bHasAttached)
- DeattachPrjDecal();
- ShadowStart = Owner.Location;
- ShadowStart.Z-=(Owner.CollisionHeight-5);
- HitActor = Trace(HitLocation, HitNormal, ShadowStart - vect(0, 0, 200), ShadowStart, false, vect(0.9, 0.9, 0) * Owner.CollisionRadius);
- if (HitActor == none)
- {
- bOptionalUpdate = true;
- 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'PawnShadow'.default.ShadowDetailRes)
- PLShadow.SetShadowRes(class'PawnShadow'.default.ShadowDetailRes, class'PawnShadow'.default.ShadowDetailRes);
- PLShadow.Softness = class'PawnShadow'.static.GetShadowSoftness();
- PLShadow.StaticLevel = 0;
- 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)
- {
- if (PLShadow.USize != class'PawnShadow'.default.ShadowDetailRes)
- {
- PLShadow.SetShadowRes(class'PawnShadow'.default.ShadowDetailRes, class'PawnShadow'.default.ShadowDetailRes);
- PLShadow.Softness = class'PawnShadow'.static.GetShadowSoftness();
- }
- ProjectorScale = FMax(Owner.CollisionRadius, 16.f) * (12.f / class'PawnShadow'.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'PawnShadow'.default.ShadowScaling *
- (1.f - Distance / FMin(2 * Owner.CollisionRadius, 155.0));
- if (ProjectorScale <= 0)
- bInvisible = true;
- }
- HitLocation += vect(0, 0, 20);
- bHitMovingBrush = HitActor.bIsMover && HitActor.Brush != none;
- bOptionalUpdate = Location == HitLocation && !bHitMovingBrush;
- SetLocation(HitLocation);
- if (bInvisible)
- return;
- AttachPrjDecal();
- if (HitActor != Level && !bHitMovingBrush)
- AttachActor(HitActor);
- }
- 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'
- DrawScale=0.50
- RemoteRole=ROLE_None
- ProjectStyle=STY_Modulated
- bCollideActors=false
- MaxDistance=155.0
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement