class PPERequester_HMPGhosts extends PPERequester_GameplayBase { protected bool m_PulseActive; protected float m_PulseProgress; protected ref array m_ChannelWeights = { 0, 0, 0, 0 }; protected ref array m_ColorMod = { 1, 1, 1, 1 }; protected bool m_Stopping; protected bool m_StopNext; protected float m_FadeOutTimeTarget; protected float m_FadingTimeElapsed; protected float m_FadingProgress; protected float m_ElapsedTime; override protected void OnStart(Param par = null) { super.OnStart(par); m_Stopping = false; m_StopNext = false; m_ElapsedTime = 0.0; m_FadingTimeElapsed = 0.0; m_FadingProgress = 0.0; //following changes only performed once, on start //noise float nScaleX = 0.05; //inverse scaling! float nScaleY = 0.05; //inverse scaling! //ghosts float gOffsetX = 30; float gOffsetY = 13; float gScaleX = 1; //inverse scaling! float gScaleY = 1; //inverse scaling! //color modulation m_ColorMod[0] = 0.8; m_ColorMod[1] = 0.8; m_ColorMod[2] = 0.8; m_ColorMod[3] = 0.85; SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_SCALE_X,false, nScaleX,PPEGhost.L_4_HMP,PPOperators.LOWEST); SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_SCALE_Y,false, nScaleY,PPEGhost.L_5_HMP,PPOperators.LOWEST); SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_GHOST_OFFSET_X,false, gOffsetX,PPEGhost.L_6_HMP,PPOperators.ADD); SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_GHOST_OFFSET_Y,false, gOffsetY,PPEGhost.L_7_HMP,PPOperators.ADD); SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_GHOST_SCALE_X,false, gScaleX,PPEGhost.L_8_HMP,PPOperators.LOWEST); SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_GHOST_SCALE_Y,false, gScaleY,PPEGhost.L_9_HMP,PPOperators.LOWEST); SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_GHOST_COLOR_MOD,m_ColorMod,PPEGhost.L_1_HMP,PPOperators.SET); } override protected void OnUpdate(float delta) { if (m_StopNext) { if (m_IsRunning) Stop(); return; } if (m_IsRunning) ProcessSimulation(delta); super.OnUpdate(delta); if (m_IsRunning) SetRequesterUpdating(true); } protected void ProcessSimulation(float delta) { if (m_Stopping) ProcessFading(delta); if (m_PulseActive) { //channel weights float time = m_ElapsedTime * 0.65; SampleChannels(time); ReSampleChannels(time); //noise float nOffsetX = (Math.Sin( time * 0.29 ) * 0.5 + 0.5) * 0.3; float nOffsetY = (Math.Cos( time * 0.17 ) * 0.5 + 0.5) * 0.3; //channel remapping float animLo = (Math.Sin( time ) * 0.5 + 0.5) * 1; float animHi = (Math.Sin( time ) * 0.5 + 0.5) * 1; float rmpLoAll = Math.Lerp(0.1,0.3,animLo); float rmpHiAll = Math.Lerp(0.9,1.2,animHi); SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_CHANNEL_WEIGHT,m_ChannelWeights,PPEGhost.L_1_HMP,PPOperators.SET); SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_OFFSET_X,false, nOffsetX,PPEGhost.L_2_HMP,PPOperators.ADD); SetTargetValueFloat(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_OFFSET_Y,false, nOffsetY,PPEGhost.L_3_HMP,PPOperators.ADD); SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_REMAP_LO,{rmpLoAll,rmpLoAll,rmpLoAll,rmpLoAll},PPEGhost.L_1_HMP,PPOperators.SET); SetTargetValueColor(PostProcessEffectType.Ghost,PPEGhost.PARAM_NOISE_REMAP_HI,{rmpHiAll,rmpHiAll,rmpHiAll,rmpHiAll},PPEGhost.L_1_HMP,PPOperators.SET); m_PulseActive = m_PulseProgress < 1.0; } m_ElapsedTime += delta; } protected void SampleChannels(float time) { float offset; // luckily 4 channels * 90 fit into 360 nicely, so no need to distribute weights other way for (int i = 0; i < 4; ++i) { offset = i * Math.PI_HALF; m_ChannelWeights[i] = Math.Sin( time + offset ); } } protected void ReSampleChannels(float time) { float rampingCoef = 1.1; float w = Math.Clamp((Math.Sin(m_PulseProgress * Math.PI) * rampingCoef),0,1); w = Math.Lerp(0,w,1 - m_FadingProgress); for (int i = 0; i < 4; ++i) m_ChannelWeights[i] = w * m_ChannelWeights[i]; } protected void ProcessFading(float delta) { m_FadingTimeElapsed += delta; m_FadingProgress = m_FadingTimeElapsed/m_FadeOutTimeTarget; m_StopNext = m_FadingProgress >= 1.0; } void SetPulseProgress(float progress) //0..1 { m_PulseActive = true; m_PulseProgress = progress; } void FadeOutEffect(float targetTime) { m_Stopping = true; m_FadeOutTimeTarget = targetTime; m_FadingTimeElapsed = 0.0; } }