// shaders stuff extend Class SWWMHandler { static clearscope void ClearAllShaders( bool noscope = false ) { PPShader.SetEnabled("WaterWarp",false); PPShader.SetEnabled("LavaWarp",false); PPShader.SetEnabled("SlimeWarp",false); PPShader.SetEnabled("ZoomBlur",false); if ( !noscope ) PPShader.SetEnabled("SilverScope",false); PPShader.SetEnabled("BarrierShader",false); PPShader.SetEnabled("GhostShader",false); PPShader.SetEnabled("InvinciShader",false); PPShader.SetEnabled("RagekitShader",false); PPShader.SetEnabled("DevastationShader",false); PPShader.SetEnabled("DivineShader",false); PPShader.SetEnabled("Glitch",false); PPShader.SetEnabled("Grain",false); PPShader.SetEnabled("WindBlur",false); } private ui void RenderShaders( RenderEvent e ) { PlayerInfo p = players[consoleplayer]; let mo = p.mo; bool pc = (p.camera == mo); if ( !mo || !swwm_shaders || !pc ) { if ( !swwm_shaders ) ClearAllShaders(true); return; } let divi = DivineSpriteEffect(mo.FindInventory("DivineSpriteEffect")); if ( divi ) { PPShader.SetEnabled("DivineShader",true); PPShader.SetUniform1f("DivineShader","timer",(gametic+e.FracTic)/GameTicRate); double str = divi.AlphInter?(clamp((divi.AlphInter.GetValue()-1000.)/6000.,0.,1.)**2.):0.; PPShader.SetUniform1f("DivineShader","str",str); } else PPShader.SetEnabled("DevastationShader",false); let deva = AngeryPower(mo.FindInventory("AngeryPower")); if ( deva ) { PPShader.SetEnabled("DevastationShader",true); PPShader.SetUniform1f("DevastationShader","timer",(gametic+e.FracTic)/GameTicRate); double xstrastr = 1.+max(0,deva.lastpulse-(gametic+e.Fractic))/35.; PPShader.SetUniform1f("DevastationShader","xtrastr",xstrastr**2.); } else PPShader.SetEnabled("DevastationShader",false); let rage = RagekitPower(mo.FindInventory("RagekitPower")); if ( rage ) { PPShader.SetEnabled("RagekitShader",true); PPShader.SetUniform1f("RagekitShader","timer",(gametic+e.FracTic)/GameTicRate); double xstrastr = 1.+max(0,rage.lastpulse-(gametic+e.Fractic))/35.; PPShader.SetUniform1f("RagekitShader","xtrastr",xstrastr**2.); } else PPShader.SetEnabled("RagekitShader",false); let ghost = GhostPower(mo.FindInventory("GhostPower")); if ( ghost ) PPShader.SetEnabled("GhostShader",true); else PPShader.SetEnabled("GhostShader",false); let sunny = InvinciballPower(mo.FindInventory("InvinciballPower")); if ( sunny ) { PPShader.SetEnabled("InvinciShader",true); double str = max(0,sunny.lastpulse-(gametic+e.Fractic))/35.; PPShader.SetUniform1f("InvinciShader","str",str); } else PPShader.SetEnabled("InvinciShader",false); let coat = BarrierPower(mo.FindInventory("BarrierPower")); if ( coat ) { PPShader.SetEnabled("BarrierShader",true); PPShader.SetUniform1f("BarrierShader","timer",(gametic+e.FracTic)/GameTicRate); } else PPShader.SetEnabled("BarrierShader",false); if ( !(mo is 'Demolitionist') ) { PPShader.SetEnabled("WaterWarp",false); PPShader.SetEnabled("LavaWarp",false); PPShader.SetEnabled("SlimeWarp",false); PPShader.SetEnabled("Glitch",false); PPShader.SetEnabled("Grain",false); PPShader.SetEnabled("ZoomBlur",false); return; } let demo = Demolitionist(mo); if ( demo.lastunder == Demolitionist.UNDER_WATER ) { PPShader.SetEnabled("WaterWarp",true); PPShader.SetUniform1f("WaterWarp","timer",(gametic+e.FracTic)/GameTicRate); PPShader.SetUniform1f("WaterWarp","dfact",coat?.25:1.); PPShader.SetUniform3f("WaterWarp","lightcol",(demo.undercol.r/255.,demo.undercol.g/255.,demo.undercol.b/255.)); } else PPShader.SetEnabled("WaterWarp",false); if ( demo.lastunder == Demolitionist.UNDER_LAVA ) { PPShader.SetEnabled("LavaWarp",true); PPShader.SetUniform1f("LavaWarp","timer",(gametic+e.FracTic)/GameTicRate); PPShader.SetUniform1f("LavaWarp","dfact",coat?.25:1.); PPShader.SetUniform3f("LavaWarp","lightcol",(demo.undercol.r/255.,demo.undercol.g/255.,demo.undercol.b/255.)); } else PPShader.SetEnabled("LavaWarp",false); if ( demo.lastunder == Demolitionist.UNDER_SLIME ) { PPShader.SetEnabled("SlimeWarp",true); PPShader.SetUniform1f("SlimeWarp","timer",(gametic+e.FracTic)/GameTicRate); PPShader.SetUniform1f("SlimeWarp","dfact",coat?.25:1.); PPShader.SetUniform3f("SlimeWarp","lightcol",(demo.undercol.r/255.,demo.undercol.g/255.,demo.undercol.b/255.)); } else PPShader.SetEnabled("SlimeWarp",false); int lastdmg = (demo.Health>0)?demo.lastdamage:Random[Flicker](60,80); int lastdmgtimer = (demo.Health>0)?demo.lastdamagetimer:(gametic+Random[Flicker](30,20)); double noiz = min(lastdmg*.09*max(0,(lastdmgtimer-(gametic+e.Fractic))/35.),.5); PPShader.SetEnabled("Glitch",noiz>0); PPShader.SetEnabled("Grain",noiz>0); if ( noiz > 0 ) { PPShader.SetUniform1f("Glitch","Timer",(gametic+e.FracTic)/GameTicRate); PPShader.SetUniform1f("Grain","Timer",(gametic+e.FracTic)/GameTicRate); PPShader.SetUniform1f("Grain","ni",noiz); noiz = min(lastdmg*.08*max(0,(lastdmgtimer-(gametic+e.Fractic))/35.),.8); PPShader.SetUniform1f("Glitch","str1",noiz); noiz = min(lastdmg*.03*max(0,(lastdmgtimer-(gametic+e.Fractic))/35.),3.5); PPShader.SetUniform1f("Glitch","str2",noiz); } if ( (demo.player.ReadyWeapon is 'ItamexHammer') && demo.IsActorPlayingSound(CHAN_WEAPONEXTRA,"itamex/spin") ) { PPShader.SetEnabled("WindBlur",true); PPShader.SetUniform1f("WindBlur","Speed",ItamexHammer(demo.player.ReadyWeapon).charge/100.); PPShader.SetUniform1f("WindBlur","Fade",(ItamexHammer(demo.player.ReadyWeapon).charge/100.)**.5); } else PPShader.SetEnabled("WindBlur",false); if ( !demo.InStateSequence(demo.CurState,demo.FindState("Dash")) ) { PPShader.SetEnabled("ZoomBlur",false); return; } PPShader.SetEnabled("ZoomBlur",true); Vector3 vel = demo.vel+demo.dashdir*demo.dashboost; double baumpu = max(0.,(demo.bumptic-(gametic+e.Fractic))/35.); vel += demo.dashdir*baumpu; double spd = vel.length(); Vector3 worlddir = vel/spd; PPShader.SetUniform1f("ZoomBlur","Fade",clamp((spd-20.)/60.,0.,1.)); double str = min(spd/40.,15.); Vector3 x, y, z; [x, y, z] = swwm_CoordUtil.GetAxes(e.ViewPitch,e.ViewAngle,e.ViewRoll); Vector3 reldir = (worlddir dot y, worlddir dot z, worlddir dot x); Vector2 centerspot = (.5+reldir.x*.5,.5+reldir.y*.5); if ( reldir.z < 0 ) { centerspot.x = 1.-centerspot.x; centerspot.y = 1.-centerspot.y; str *= -1; } PPShader.SetUniform1f("ZoomBlur","Str",str); PPShader.SetUniform2f("ZoomBlur","CenterSpot",centerspot); } }