pperhmpghosts.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. if (m_IsRunning)
  52. ProcessSimulation(delta);
  53. super.OnUpdate(delta);
  54. if (m_IsRunning)
  55. SetRequesterUpdating(true);
  56. }
  57. protected void ProcessSimulation(float delta)
  58. {
  59. if (m_Stopping)
  60. ProcessFading(delta);
  61. if (m_PulseActive)
  62. {
  63. //channel weights
  64. float time = m_ElapsedTime * 0.65;
  65. SampleChannels(time);
  66. ReSampleChannels(time);
  67. //noise
  68. float nOffsetX = (Math.Sin( time * 0.29 ) * 0.5 + 0.5) * 0.3;
  69. float nOffsetY = (Math.Cos( time * 0.17 ) * 0.5 + 0.5) * 0.3;
  70. //channel remapping
  71. float animLo = (Math.Sin( time ) * 0.5 + 0.5) * 1;
  72. float animHi = (Math.Sin( time ) * 0.5 + 0.5) * 1;
  73. float rmpLoAll = Math.Lerp(0.1,0.3,animLo);
  74. float rmpHiAll = Math.Lerp(0.9,1.2,animHi);
  75. SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_CHANNEL_WEIGHT,m_ChannelWeights,PPEGhost.L_1_HMP,PPOperators.SET);
  76. SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_OFFSET_X,false, nOffsetX,PPEGhost.L_2_HMP,PPOperators.ADD);
  77. SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_OFFSET_Y,false, nOffsetY,PPEGhost.L_3_HMP,PPOperators.ADD);
  78. SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_REMAP_LO,{rmpLoAll,rmpLoAll,rmpLoAll,rmpLoAll},PPEGhost.L_1_HMP,PPOperators.SET);
  79. SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_REMAP_HI,{rmpHiAll,rmpHiAll,rmpHiAll,rmpHiAll},PPEGhost.L_1_HMP,PPOperators.SET);
  80. m_PulseActive = m_PulseProgress < 1.0;
  81. }
  82. m_ElapsedTime += delta;
  83. }
  84. protected void SampleChannels(float time)
  85. {
  86. float offset;
  87. // luckily 4 channels * 90 fit into 360 nicely, so no need to distribute weights other way
  88. for (int i = 0; i < 4; ++i)
  89. {
  90. offset = i * Math.PI_HALF;
  91. m_ChannelWeights[i] = Math.Sin( time + offset );
  92. }
  93. }
  94. protected void ReSampleChannels(float time)
  95. {
  96. float rampingCoef = 1.1;
  97. float w = Math.Clamp((Math.Sin(m_PulseProgress * Math.PI) * rampingCoef),0,1);
  98. w = Math.Lerp(0,w,1 - m_FadingProgress);
  99. for (int i = 0; i < 4; ++i)
  100. m_ChannelWeights[i] = w * m_ChannelWeights[i];
  101. }
  102. protected void ProcessFading(float delta)
  103. {
  104. m_FadingTimeElapsed += delta;
  105. m_FadingProgress = m_FadingTimeElapsed/m_FadeOutTimeTarget;
  106. m_StopNext = m_FadingProgress >= 1.0;
  107. }
  108. void SetPulseProgress(float progress) //0..1
  109. {
  110. m_PulseActive = true;
  111. m_PulseProgress = progress;
  112. }
  113. void FadeOutEffect(float targetTime)
  114. {
  115. m_Stopping = true;
  116. m_FadeOutTimeTarget = targetTime;
  117. m_FadingTimeElapsed = 0.0;
  118. }
  119. }