Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class ObjectShadow extends Decal
- Config(User)
- Abstract;
- #exec TEXTURE IMPORT NAME=BlobShadow FILE=Textures\BlobShadow.pcx LODSET=2
- var() config int ShadowDetailRes; // Must be a value in power of 2
- var() float ShadowScaling;
- var transient vector OldOwnerLocation;
- var transient int OldShadowDetail;
- var transient bool bOptionalUpdate;
- var ShadowBitMap PLShadow;
- function AttachToSurface();
- function Timer();
- simulated event Tick( float Delta )
- {
- local Actor HitActor;
- local Vector HitNormal, HitLocation, ShadowStart;
- local float ShadowDetail;
- local float Distance;
- if ( Owner==None || Owner.bDeleteMe )
- {
- Destroy();
- Return;
- }
- if (!class'GameInfo'.default.bCastShadow ||
- Owner.Style == STY_Translucent ||
- Owner.bHidden ||
- Owner.DrawType == DT_None)
- {
- DetachDecal();
- bOptionalUpdate = false;
- return;
- }
- if (class'GameInfo'.Default.bUseRealtimeShadow)
- ShadowDetail = ShadowDetailRes; // else keep the initial value - zero
- if (bOptionalUpdate && OldOwnerLocation == Owner.Location && ShadowDetail == OldShadowDetail)
- return;
- OldOwnerLocation = Owner.Location;
- OldShadowDetail = ShadowDetail;
- bOptionalUpdate = true;
- DetachDecal();
- ShadowStart = Owner.Location;
- ShadowStart.Z-=(Owner.CollisionHeight-5);
- HitActor = Trace(HitLocation, HitNormal, ShadowStart - vect(0, 0, 200), ShadowStart, false);
- if (HitActor == none)
- 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);
- Texture = PLShadow;
- if (PLShadow.USize != ShadowDetailRes || PLShadow.VSize != ShadowDetailRes)
- PLShadow.SetShadowRes(ShadowDetailRes, ShadowDetailRes);
- PLShadow.Softness = GetShadowSoftness();
- PLShadow.StaticLevel = 0;
- Style = STY_AlphaBlend;
- }
- else if (!class'GameInfo'.Default.bUseRealtimeShadow && PLShadow != none)
- {
- PLShadow.ProjectingActor = none;
- Level.FreeObject(PLShadow);
- PLShadow = none;
- Texture = default.Texture;
- Style = default.Style;
- }
- Distance = FMax(Owner.Location.Z - Owner.CollisionHeight - HitLocation.Z, 0.f);
- if (PLShadow != none)
- {
- if (PLShadow.USize != ShadowDetailRes || PLShadow.VSize != ShadowDetailRes)
- {
- PLShadow.SetShadowRes(ShadowDetailRes, ShadowDetailRes);
- PLShadow.Softness = GetShadowSoftness();
- }
- DrawScale = FMax(Owner.CollisionRadius,16.f)*(12.f/ShadowDetailRes);
- PLShadow.ShadowScale = 1.f/DrawScale;
- PLShadow.Gradience = Min(Distance + 100, 255);
- if (PLShadow.Gradience == 255)
- return;
- }
- else
- {
- DrawScale = Owner.CollisionRadius/70.f * ShadowScaling * (1.f - Distance / FMin(2 * Owner.CollisionRadius, 155.0));
- if (DrawScale <= 0)
- return;
- }
- SetLocation(HitLocation + HitNormal);
- SetRotation(rotator(HitNormal));
- AttachDecal(30, vect(1,0,0));
- }
- simulated function Destroyed()
- {
- if( PLShadow!=None )
- {
- PLShadow.ProjectingActor = None;
- Level.FreeObject(PLShadow);
- PLShadow = None;
- }
- Super.Destroyed();
- }
- simulated static final function byte GetShadowSoftness()
- {
- if( Default.ShadowDetailRes<=64 )
- return 0;
- switch( Default.ShadowDetailRes )
- {
- case 128:
- return 1;
- case 256:
- return 2;
- case 512:
- return 3;
- default:
- return 4;
- }
- }
- defaultproperties
- {
- MultiDecalLevel=3
- Texture=Texture'BlobShadow'
- DrawScale=0.50
- ShadowScaling=1
- bAttachPanningSurfs=True
- ShadowDetailRes=128
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement