pperhmpghosts.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. class PPERequester_HMPGhosts extends PPERequester_GameplayBase
  2. {
  3. protected bool m_PulseActive;
  4. protected float m_PulseProgress;
  5. protected ref array<float> m_ChannelWeights = { 0, 0, 0, 0 };
  6. protected ref array<float> m_ColorMod = { 1, 1, 1, 1 };
  7. protected bool m_Stopping;
  8. protected bool m_StopNext;
  9. protected float m_FadeOutTimeTarget;
  10. protected float m_FadingTimeElapsed;
  11. protected float m_FadingProgress;
  12. protected float m_ElapsedTime;
  13. override protected void OnStart(Param par = null)
  14. {
  15. super.OnStart(par);
  16. m_Stopping = false;
  17. m_StopNext = false;
  18. m_ElapsedTime = 0.0;
  19. m_FadingTimeElapsed = 0.0;
  20. m_FadingProgress = 0.0;
  21. //following changes only performed once, on start
  22. //noise
  23. float nScaleX = 0.05; //inverse scaling!
  24. float nScaleY = 0.05; //inverse scaling!
  25. //ghosts
  26. float gOffsetX = 30;
  27. float gOffsetY = 13;
  28. float gScaleX = 1; //inverse scaling!
  29. float gScaleY = 1; //inverse scaling!
  30. //color modulation
  31. m_ColorMod[0] = 0.8;
  32. m_ColorMod[1] = 0.8;
  33. m_ColorMod[2] = 0.8;
  34. m_ColorMod[3] = 0.85;
  35. SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_SCALE_X,false, nScaleX,PPEGhost.L_4_HMP,PPOperators.LOWEST);
  36. SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_SCALE_Y,false, nScaleY,PPEGhost.L_5_HMP,PPOperators.LOWEST);
  37. SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_GHOST_OFFSET_X,false, gOffsetX,PPEGhost.L_6_HMP,PPOperators.ADD);
  38. SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_GHOST_OFFSET_Y,false, gOffsetY,PPEGhost.L_7_HMP,PPOperators.ADD);
  39. SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_GHOST_SCALE_X,false, gScaleX,PPEGhost.L_8_HMP,PPOperators.LOWEST);
  40. SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_GHOST_SCALE_Y,false, gScaleY,PPEGhost.L_9_HMP,PPOperators.LOWEST);
  41. SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_GHOST_COLOR_MOD,m_ColorMod,PPEGhost.L_1_HMP,PPOperators.SET);
  42. }
  43. override protected void OnUpdate(float delta)
  44. {
  45. if (m_StopNext)
  46. {
  47. if (m_IsRunning)
  48. Stop();
  49. return;
  50. }
  51. ProcessSimulation(delta);
  52. super.OnUpdate(delta);
  53. SetRequesterUpdating(true);
  54. }
  55. protected void ProcessSimulation(float delta)
  56. {
  57. if (m_Stopping)
  58. ProcessFading(delta);
  59. if (m_PulseActive)
  60. {
  61. //channel weights
  62. float time = m_ElapsedTime * 0.65;
  63. SampleChannels(time);
  64. ReSampleChannels(time);
  65. //noise
  66. float nOffsetX = (Math.Sin( time * 0.29 ) * 0.5 + 0.5) * 0.3;
  67. float nOffsetY = (Math.Cos( time * 0.17 ) * 0.5 + 0.5) * 0.3;
  68. //channel remapping
  69. float animLo = (Math.Sin( time ) * 0.5 + 0.5) * 1;
  70. float animHi = (Math.Sin( time ) * 0.5 + 0.5) * 1;
  71. float rmpLoAll = Math.Lerp(0.1,0.3,animLo);
  72. float rmpHiAll = Math.Lerp(0.9,1.2,animHi);
  73. SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_CHANNEL_WEIGHT,m_ChannelWeights,PPEGhost.L_1_HMP,PPOperators.SET);
  74. SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_OFFSET_X,false, nOffsetX,PPEGhost.L_2_HMP,PPOperators.ADD);
  75. SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_OFFSET_Y,false, nOffsetY,PPEGhost.L_3_HMP,PPOperators.ADD);
  76. SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_REMAP_LO,{rmpLoAll,rmpLoAll,rmpLoAll,rmpLoAll},PPEGhost.L_1_HMP,PPOperators.SET);
  77. SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_REMAP_HI,{rmpHiAll,rmpHiAll,rmpHiAll,rmpHiAll},PPEGhost.L_1_HMP,PPOperators.SET);
  78. m_PulseActive = m_PulseProgress < 1.0;
  79. }
  80. m_ElapsedTime += delta;
  81. }
  82. protected void SampleChannels(float time)
  83. {
  84. float offset;
  85. // luckily 4 channels * 90 fit into 360 nicely, so no need to distribute weights other way
  86. for (int i = 0; i < 4; ++i)
  87. {
  88. offset = i * Math.PI_HALF;
  89. m_ChannelWeights[i] = Math.Sin( time + offset );
  90. }
  91. }
  92. protected void ReSampleChannels(float time)
  93. {
  94. float rampingCoef = 1.1;
  95. float w = Math.Clamp((Math.Sin(m_PulseProgress * Math.PI) * rampingCoef),0,1);
  96. w = Math.Lerp(0,w,1 - m_FadingProgress);
  97. for (int i = 0; i < 4; ++i)
  98. m_ChannelWeights[i] = w * m_ChannelWeights[i];
  99. }
  100. protected void ProcessFading(float delta)
  101. {
  102. m_FadingTimeElapsed += delta;
  103. m_FadingProgress = m_FadingTimeElapsed/m_FadeOutTimeTarget;
  104. m_StopNext = m_FadingProgress >= 1.0;
  105. }
  106. void SetPulseProgress(float progress) //0..1
  107. {
  108. m_PulseActive = true;
  109. m_PulseProgress = progress;
  110. }
  111. void FadeOutEffect(float targetTime)
  112. {
  113. m_Stopping = true;
  114. m_FadeOutTimeTarget = targetTime;
  115. m_FadingTimeElapsed = 0.0;
  116. }
  117. }