Advertisement
Guest User

ObjectShadow.uc

a guest
Apr 12th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class ObjectShadow extends Decal
  2.     Config(User)
  3.     Abstract;
  4.  
  5. #exec TEXTURE IMPORT NAME=BlobShadow FILE=Textures\BlobShadow.pcx LODSET=2
  6.  
  7. var() config int ShadowDetailRes; // Must be a value in power of 2
  8. var() config bool bOptimizeTracing;
  9. var() float ShadowScaling;
  10. var transient vector OldOwnerLocation;
  11. var transient int OldShadowDetail;
  12. var transient bool bOptionalUpdate;
  13. var transient ShadowBitMap PLShadow;
  14.  
  15. function AttachToSurface();
  16.  
  17. function Timer();
  18.  
  19. simulated event Tick( float Delta )
  20. {
  21.     UpdateShadow();
  22. }
  23.  
  24. simulated function UpdateShadow()
  25. {
  26.     local Actor HitActor;
  27.     local vector HitNormal, HitLocation, ShadowStart;
  28.     local float ShadowDetail;
  29.     local float Distance;
  30.     local bool bInvisible;
  31.  
  32.     if ( Owner==None || Owner.bDeleteMe )
  33.     {
  34.         Destroy();
  35.         Return;
  36.     }
  37.  
  38.     if (!class'GameInfo'.default.bCastShadow ||
  39.         Owner.Style == STY_Translucent ||
  40.         Owner.bHidden ||
  41.         Owner.DrawType == DT_None)
  42.     {
  43.         DetachDecal();
  44.         bOptionalUpdate = false;
  45.         return;
  46.     }
  47.  
  48.     if (class'GameInfo'.Default.bUseRealtimeShadow)
  49.         ShadowDetail = ShadowDetailRes; // else keep the initial value - zero
  50.     if (bOptimizeTracing && bOptionalUpdate && Owner.Location == OldOwnerLocation && ShadowDetail == OldShadowDetail)
  51.         return;
  52.  
  53.     OldOwnerLocation = Owner.Location;
  54.     OldShadowDetail = ShadowDetail;
  55.     DetachDecal();
  56.  
  57.     ShadowStart = Owner.Location;
  58.     ShadowStart.Z-=(Owner.CollisionHeight-5);
  59.     HitActor = Trace(HitLocation, HitNormal, ShadowStart - vect(0, 0, 200), ShadowStart, false);
  60.  
  61.     if (HitActor == none)
  62.     {
  63.         bOptionalUpdate = true;
  64.         return;
  65.     }
  66.  
  67.     if (class'GameInfo'.default.bUseRealtimeShadow && PLShadow == none)
  68.     {
  69.         PLShadow = ShadowBitMap(Level.AllocateObj(Class'ShadowBitMap'));
  70.         if (PLShadow == none)
  71.             PLShadow = new(Outer) class'ShadowBitMap';
  72.         PLShadow.ProjectingActor = Owner;
  73.         PLShadow.ProjectDirection = rot(16384,0,0);
  74.         Texture = PLShadow;
  75.         if (PLShadow.USize != ShadowDetailRes || PLShadow.VSize != ShadowDetailRes)
  76.             PLShadow.SetShadowRes(ShadowDetailRes, ShadowDetailRes);
  77.         PLShadow.Softness = GetShadowSoftness();
  78.         PLShadow.StaticLevel = 0;
  79.         Style = STY_AlphaBlend;
  80.     }
  81.     else if (!class'GameInfo'.default.bUseRealtimeShadow && PLShadow != none)
  82.     {
  83.         PLShadow.ProjectingActor = none;
  84.         Level.FreeObject(PLShadow);
  85.         PLShadow = none;
  86.         Texture = default.Texture;
  87.         Style = default.Style;
  88.     }
  89.  
  90.     Distance = FMax(Owner.Location.Z - Owner.CollisionHeight - HitLocation.Z, 0.f);
  91.  
  92.     if (PLShadow != none)
  93.     {
  94.         if (PLShadow.USize != ShadowDetailRes || PLShadow.VSize != ShadowDetailRes)
  95.         {
  96.             PLShadow.SetShadowRes(ShadowDetailRes, ShadowDetailRes);
  97.             PLShadow.Softness = GetShadowSoftness();
  98.         }
  99.         DrawScale = FMax(Owner.CollisionRadius, 16.f) * (12.f / ShadowDetailRes);
  100.         PLShadow.ShadowScale = 1.f / DrawScale;
  101.         PLShadow.Gradience = Min(Distance + 100, 255);
  102.         if (PLShadow.Gradience == 255)
  103.             bInvisible = true;
  104.     }
  105.     else
  106.     {
  107.         DrawScale = Owner.CollisionRadius/70.f * ShadowScaling * (1.f - Distance / FMin(2 * Owner.CollisionRadius, 155.0));
  108.         if (DrawScale <= 0)
  109.             bInvisible = true;
  110.     }
  111.  
  112.     HitLocation += HitNormal;
  113.     bOptionalUpdate = Location == HitLocation && (!HitActor.bIsMover || HitActor.Brush == none);
  114.  
  115.     SetLocation(HitLocation);
  116.     SetRotation(rotator(HitNormal));
  117.     if (!bInvisible)
  118.         AttachDecal(30, vect(1,0,0));
  119. }
  120.  
  121. simulated function Destroyed()
  122. {
  123.     if( PLShadow!=None )
  124.     {
  125.         PLShadow.ProjectingActor = None;
  126.         Level.FreeObject(PLShadow);
  127.         PLShadow = None;
  128.     }
  129.     Super.Destroyed();
  130. }
  131.  
  132. simulated static final function byte GetShadowSoftness()
  133. {
  134.     if( Default.ShadowDetailRes<=64 )
  135.         return 0;
  136.     switch( Default.ShadowDetailRes )
  137.     {
  138.     case 128:
  139.         return 1;
  140.     case 256:
  141.         return 2;
  142.     case 512:
  143.         return 3;
  144.     default:
  145.         return 4;
  146.     }
  147. }
  148.  
  149. static function UpdateAllShadows(LevelInfo Level, optional bool bUpdateDetail)
  150. {
  151.     local ObjectShadow Shadow;
  152.     local DecoShadowStatic DecoShadow;
  153.  
  154.     foreach Level.AllActors(class'ObjectShadow', Shadow)
  155.     {
  156.         if (bUpdateDetail)
  157.             Shadow.ShadowDetailRes = Shadow.default.ShadowDetailRes;
  158.         Shadow.bOptionalUpdate = false;
  159.         Shadow.UpdateShadow();
  160.         Shadow.bOptionalUpdate = false;
  161.     }
  162.  
  163.     foreach Level.AllActors(class'DecoShadowStatic', DecoShadow)
  164.         DecoShadow.UpdateShadow();
  165. }
  166.  
  167. defaultproperties
  168. {
  169.     MultiDecalLevel=3
  170.     Texture=Texture'BlobShadow'
  171.     DrawScale=0.50
  172.     ShadowScaling=1
  173.     bAttachPanningSurfs=True
  174.     ShadowDetailRes=128
  175.     bOptimizeTracing=True
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement