@petkoneo/phaser3-rex-plugins
Version:
2 lines (1 loc) • 9.63 kB
JavaScript
var e,t;e=void 0,t=function(){var e={setBloomEnable(e){return void 0===e&&(e=!0),this.bloomEnable=e,this},setBloomRadius(e){return this.bloomRadius=e,this},setBloomIntensity(e){return this.bloomIntensity=e,this},setBloomThreshold(e){return this.bloomThreshold=e,this},setBloomTexelSize(e,t){return void 0===t&&(t=e),this.bloomTexelWidth=e,this.bloomTexelHeight=t,this}},t={setChromaticEnable(e){return void 0===e&&(e=!0),this.chromaticEnable=e,this},setChabIntensity(e){return this.chabIntensity=e,this}},n={setVignetteEnable(e){return void 0===e&&(e=!0),this.vignetteEnable=e,this},setVignetteStrength(e){return this.vignetteStrength=e,this},setVignetteIntensity(e){return this.vignetteIntensity=e,this}},i={setNoiseEnable(e){return void 0===e&&(e=!0),this.noiseEnable=e,this},setNoiseStrength(e){return this.noiseStrength=e,this},setNoiseSeed(e){return this.noiseSeed=e,this}},s={setVHSEnable(e){return void 0===e&&(e=!0),this.vhsEnable=e,this},setVhsStrength(e){return this.vhsStrength=e,this}},o={setScanlinesEnable(e){return void 0===e&&(e=!0),this.scanlinesEnable=e,this},setScanStrength(e){return this.scanStrength=e,this}},r={setCRTEnable(e){return void 0===e&&(e=!0),this.crtEnable=e,this},setCrtSize(e,t){return void 0===t&&(t=e),this.crtWidth=e,this.crtHeight=t,this}},a={setEnable:function(e){return void 0===e&&(e=!0),this.bloomEnable=e,this.chromaticEnable=e,this.vignetteEnable=e,this.noiseEnable=e,this.vhsEnable=e,this.scanlinesEnable=e,this.crtEnable=e,this}};Object.assign(a,e,t,n,i,s,o,r);const l=Phaser.Game;var h=function(e){return e instanceof l};const c=Phaser.Scene;var u=function(e){return e instanceof c},v=function(e){return null==e||"object"!=typeof e?null:h(e)?e:h(e.game)?e.game:u(e)?e.sys.game:u(e.scene)?e.scene.sys.game:void 0};const m=Phaser.Renderer.WebGL.Pipelines.PostFXPipeline,b=Phaser.Utils.Objects.GetValue;class f extends m{constructor(e){super({name:"rexHorrifiPostFx",game:e,renderTarget:!0,fragShader:"#ifdef GL_FRAGMENT_PRECISION_HIGH\n#define highmedp highp\n#else\n#define highmedp mediump\n#endif\nprecision highmedp float;\n\nuniform float time;\n\n// Scene buffer\nuniform sampler2D uMainSampler; \nvarying vec2 outTexCoord;\n\n// Effect parameters\n#define SAMPLES 32.\n\n// Bloom\nuniform float bloomEnable;\nuniform vec3 bloom;\nuniform vec2 bloomTexel;\n\n// Chromatic abberation\nuniform float chromaticEnable;\nuniform float chabIntensity;\n\n// Vignette\nuniform float vignetteEnable;\nuniform vec2 vignette;\n\n// Noise\nuniform float noiseEnable;\nuniform float noiseStrength;\nuniform float noiseSeed;\n\n// VHS\nuniform float vhsEnable;\nuniform float vhsStrength;\n\n// Scanlines\nuniform float scanlinesEnable;\nuniform float scanStrength;\n\n// CRT\nuniform float crtEnable;\nuniform vec2 crtSize;\n\n\n// Noise\nfloat noise(vec2 uv) {\n return fract(sin(uv.x*12.9898+uv.y*78.233)*437.585453*noiseSeed);\n}\n\n// VHS\nvec4 vhs(vec2 uv) {\n vec2 tcoord = uv;\n tcoord.x += sin(time*noise(uv));\n return texture2D( uMainSampler, tcoord)*vhsStrength;\t\n}\n\n// Vignette\nfloat vig(vec2 uv) {\n uv *= 1. - uv;\n return ( pow(uv.x*uv.y*vignette.x*10.,vignette.y) );\n}\n\n// Chromatic abberation\nvec3 chromatic(vec2 uv, float offset) {\n float r = texture2D( uMainSampler, vec2(uv.x+offset, uv.y)).r;\n float g = texture2D( uMainSampler, uv).g;\n float b = texture2D( uMainSampler, vec2(uv.x-offset, uv.y)).b;\n return vec3(r,g,b);\n}\n\n// Bloom\nvec4 blur(vec2 uv) {\n float total = 0.;\n float rad = 1.;\n mat2 ang = mat2(.73736882209777832,-.67549037933349609,.67549037933349609,.73736882209777832);\n vec2 point = normalize(fract(cos(uv*mat2(195,174,286,183))*742.)-.5)*(bloom.x/sqrt(SAMPLES));\n vec4 amount = vec4(0);\n\t\n for ( float i=0.; i<SAMPLES; i++ ) {\n point*=ang;\n rad+=1./rad;\n vec4 samp = texture2D(uMainSampler, uv + point * (rad-1.) * bloomTexel);\n \n float mul = 1.;\n float lum = ( samp.r+samp.g+samp.b )/3.;\n if ( lum < bloom.z ){ mul = 0.; }\n \n amount += samp*(1./rad)*mul;\n total+=(1./rad);\n }\n amount /= total;\n return amount*bloom.y;\n}\n\n// TV Curve\nvec2 crtCurve( vec2 uv ) {\n uv = uv*2.-1.;\n vec2 uvoff = abs(uv.xy) / crtSize;\n uv = uv + uv * uvoff * uvoff;\n uv = uv * .5 + .5;\n return uv;\n}\n\nvoid main() {\t\n vec2 mainUv = outTexCoord;\n\n // CRT\n if ( crtEnable > .5 ) {\n mainUv = crtCurve(outTexCoord);\n }\n\t\n // Base coloring\n vec4 color = texture2D( uMainSampler, mainUv);\n\t\n // Chromatic abberation\n if ( chromaticEnable > .5 ) {\n color.rgb *= chromatic(mainUv, chabIntensity * 0.01);\n }\n\t\n // Scanlines\n if ( scanlinesEnable > .5 ) {\n color.rgb *= (1.-scanStrength)+(sin(mainUv.y*1024.)*scanStrength);\n }\n\n // Bloom\n if ( bloomEnable > .5 ) {\n color.rgb += blur(mainUv).rgb;\n }\n\t\n // Noise\n if ( noiseEnable > .5 ) {\n color.rgb += noise(mainUv)*noiseStrength;\n }\n\t\n // VHS\n if ( vhsEnable > .5 ) {\n color += vhs(mainUv);\n }\n\t\n // Vignette\n if ( vignetteEnable > .5) {\n color.rgb *= vig(mainUv);\n }\n\t\n // Cutoff edges\n if ( crtEnable > .5) {\n if ( (mainUv.x < 0.)|| (mainUv.y < 0.) || (mainUv.x > 1.)|| (mainUv.y > 1.) ) {\n color.rgb *= 0.;\n }\n }\n\t\n gl_FragColor = color;\n}\n"}),this.now=0,this.bloomEnable=!1,this.bloomRadius=0,this.bloomIntensity=0,this.bloomThreshold=0,this.bloomTexelWidth=0,this.bloomTexelHeight=0,this.chromaticEnable=!1,this.chabIntensity=0,this.vignetteEnable=!1,this.vignetteStrength=0,this.vignetteIntensity=0,this.noiseEnable=!1,this.noiseStrength=0,this.noiseSeed=Math.random(),this.vhsEnable=!1,this.vhsStrength=0,this.scanlinesEnable=!1,this.scanStrength=0,this.crtEnable=!1,this.crtWidth=0,this.crtHeight=0}resetFromJSON(e){var t=b(e,"enable",!1);return this.setBloomEnable(b(e,"bloomEnable",t)),this.setBloomRadius(b(e,"bloomRadius",0)),this.setBloomIntensity(b(e,"bloomIntensity",0)),this.setBloomThreshold(b(e,"bloomThreshold",0)),this.setBloomTexelSize(b(e,"bloomTexelWidth",0),b(e,"bloomTexelHeight")),this.setChromaticEnable(b(e,"chromaticEnable",t)),this.setChabIntensity(b(e,"chabIntensity",0)),this.setVignetteEnable(b(e,"vignetteEnable",t)),this.setVignetteStrength(b(e,"vignetteStrength",0)),this.setVignetteIntensity(b(e,"vignetteIntensity",0)),this.setNoiseEnable(b(e,"noiseEnable",t)),this.setNoiseStrength(b(e,"noiseStrength",0)),this.setNoiseSeed(b(0,"noiseSeed",Math.random())),this.setVHSEnable(b(e,"vhsEnable",t)),this.setVhsStrength(b(e,"vhsStrength",0)),this.setScanlinesEnable(b(e,"scanlinesEnable",t)),this.setScanStrength(b(e,"scanStrength",0)),this.setCRTEnable(b(e,"crtEnable",t)),this.setCrtSize(b(e,"crtWidth",0),b(e,"crtHeight",void 0)),this}onPreRender(){var e;this.set1f("noiseSeed",this.noiseSeed),this.set1f("bloomEnable",this.bloomEnable?1:0),this.set3f("bloom",this.bloomRadius,this.bloomIntensity,this.bloomThreshold),this.set2f("bloomTexel",this.bloomTexelWidth,this.bloomTexelHeight),this.set1f("chromaticEnable",this.chromaticEnable?1:0),this.set1f("chabIntensity",this.chabIntensity),this.set1f("vignetteEnable",this.vignetteEnable?1:0),this.set2f("vignette",this.vignetteStrength,this.vignetteIntensity),this.set1f("noiseEnable",this.noiseEnable?1:0),this.set1f("noiseStrength",this.noiseStrength),this.set1f("vhsEnable",this.vhsEnable?1:0),this.set1f("vhsStrength",this.vhsStrength),this.set1f("scanlinesEnable",this.scanlinesEnable?1:0),this.set1f("scanStrength",this.scanStrength),this.set1f("crtEnable",this.crtEnable?1:0),this.set2f("crtSize",this.crtWidth,this.crtHeight),this.vhsEnable&&(this.now+=(e=this.game,v(e).loop.delta)),this.set1f("time",this.now)}}Object.assign(f.prototype,a);const g=Phaser.Utils.Array.SpliceOne;class d extends Phaser.Plugins.BasePlugin{setPostPipelineClass(e,t){return this.PostFxPipelineClass=e,this.postFxPipelineName=t,this}start(){var e,t,n;this.game.events.once("destroy",this.destroy,this),e=this.game,t=this.postFxPipelineName,n=this.PostFxPipelineClass,v(e).renderer.pipelines.addPostPipeline(t,n)}add(e,t){return function(e,t,n){void 0===n&&(n={}),e.setPostPipeline(t);var i=e.postPipelines[e.postPipelines.length-1];return i.resetFromJSON(n),n.name&&(i.name=n.name),i}(e,this.PostFxPipelineClass,t)}remove(e,t){return function(e,t,n){if(void 0===n)for(var i=(s=e.postPipelines).length-1;i>=0;i--)(r=s[i])instanceof t&&(r.destroy(),g(s,i));else{i=0;for(var s,o=(s=e.postPipelines).length;i<o;i++){var r;(r=s[i])instanceof t&&r.name===n&&(r.destroy(),g(s,i))}}e.hasPostPipeline=e.postPipelines.length>0}(e,this.PostFxPipelineClass,t),this}get(e,t){return function(e,t,n){if(void 0===n){for(var i=[],s=0,o=(r=e.postPipelines).length;s<o;s++)(a=r[s])instanceof t&&i.push(a);return i}var r;for(s=0,o=(r=e.postPipelines).length;s<o;s++){var a;if((a=r[s])instanceof t&&a.name===n)return a}}(e,this.PostFxPipelineClass,t)}}var p=function(e){return null==e||""===e||0===e.length};return function(e,t,n,i){if(void 0===i&&(i="."),"object"==typeof e)if(p(t)){if(null==n)return;"object"==typeof n&&(e=n)}else{"string"==typeof t&&(t=t.split(i));var s=t.pop(),o=function(e,t,n){var i=e;if(p(t));else{var s;"string"==typeof t&&(t=t.split("."));for(var o=0,r=t.length;o<r;o++){var a;null!=i[s=t[o]]&&"object"==typeof i[s]||(a=o===r-1?void 0===n?{}:n:{},i[s]=a),i=i[s]}}return i}(e,t);o[s]=n}}(window,"RexPlugins.Pipelines.HorrifiPostFx",f),class extends d{constructor(e){super(e),this.setPostPipelineClass(f,"rexHorrifiPostFx")}}},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).rexhorrifipipelineplugin=t();