Advertisement
RaYRoDTV

ScanPulseEffectOverlay

Mar 27th, 2023 (edited)
3,572
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. vec3 ScanPulseEffectOverlay(
  2.     float lfTime,
  3.     vec2 lScreenSpaceUV,
  4.     vec3 lInputColour,
  5.     vec3 lWorldPosition,
  6.     vec4 lScanConfigPos,
  7.     vec4 lColour1AndBlend,
  8.     vec4 lColour2AndTime,
  9.     inout vec3 lSunColourVec3 )
  10. {
  11.     // MIXING COLOURS
  12.     if (lColour1AndBlend.w <= 0.0)
  13.         return lInputColour;
  14.  
  15.     // Make the scan effect slower at the beginning
  16.     lColour2AndTime.w = pow(lColour2AndTime.w, 3.0);
  17.  
  18.     vec3  lWorldToScanPt = lWorldPosition - lScanConfigPos.xyz;
  19.     float lfDistToScanPt = length(lWorldToScanPt);
  20.  
  21.     // adjust distance so that values inside the pulse radius fall 0..1
  22.     float lfDistanceScale = 2.0 / lfDistToScanPt;
  23.     float lfRadius = 1.0 / lScanConfigPos.w;
  24.     float lfCurrent01 = lfDistToScanPt * lScanConfigPos.w * lfRadius * lfDistanceScale;
  25.     float lfTarget = lColour2AndTime.w * lfRadius * lfDistanceScale;
  26.  
  27.     // calculate wave parameters
  28.     float lfAbsTargetToCurrent = abs(lfTarget - lfCurrent01) * 3.0;
  29.     float lfCurrentToTarget = (lfCurrent01 - lfTarget) * 2.9;
  30.     float lfBaseWaveMask = 1.0 - (lfAbsTargetToCurrent * 2.0);
  31.     float lfEdge = clamp(lfBaseWaveMask, -0.0, 1.0);
  32.     lfBaseWaveMask -= lfCurrentToTarget * 2.0;
  33.     lfBaseWaveMask = clamp(lfBaseWaveMask, 0.0, 1.0);
  34.     lfBaseWaveMask = smoothstep(0.0, 1.1, pow(lfBaseWaveMask, 8.0));
  35.     float lfFineEdgeMask = smoothstep(0.88, 0.98, lfEdge * lfEdge) * 5.0;
  36.  
  37.     // get scan colors
  38.     vec3 scanCol = lColour1AndBlend.xyz;
  39.     vec3 scanCol2 = lColour2AndTime.xyz;
  40.  
  41.     // save original colors
  42.     vec3 origColour = lInputColour;
  43.     vec3 origSun = lSunColourVec3;
  44.  
  45.     // apply wave effect
  46.     vec3 waveCol = mix(scanCol2, scanCol, lfAbsTargetToCurrent);
  47.     lInputColour = mix(lInputColour, waveCol, lfBaseWaveMask);
  48.     lSunColourVec3 = mix(lSunColourVec3, vec3(0.0), lfBaseWaveMask);
  49.  
  50.     // apply detail scan lines
  51.     float scanDetailLines = clamp(
  52.         sin((lScreenSpaceUV.y) * 1500.0 + lfTime* 5.0) * 0.8,
  53.         0.0, 1.0);
  54.     lInputColour = mix(lInputColour, scanCol, scanDetailLines * lfBaseWaveMask);
  55.     lSunColourVec3 = mix(lSunColourVec3, vec3(0.0), scanDetailLines * lfBaseWaveMask);
  56.  
  57.     // apply edge line
  58.     vec3 lEdgeColour = mix(vec3(1.0), vec3(1.0, 0.0, 0.0), smoothstep(0.25, 1.0, 0.9));
  59.  
  60. // calculate scan luminance
  61. float lfScanLuminance = (lInputColour.x * 0.3) + (lInputColour.y * 0.59) + (lInputColour.z * 0.11);
  62.  
  63. // blend original and modified colors based on luminance and other factors
  64. float alpha = 0.9;
  65. origColour = mix(origColour,
  66.     origColour * 0.0,
  67.     (1.0 - lfScanLuminance) * scanDetailLines * lfBaseWaveMask * lColour1AndBlend.w);
  68. lInputColour = mix(origColour, lInputColour, alpha*lColour1AndBlend.w);
  69. lSunColourVec3 = mix(origSun, lSunColourVec3, alpha*lColour1AndBlend.w);
  70.  
  71. // return modified color
  72. return lInputColour;
  73.  
  74. }
  75.    
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement