phaser4-rex-plugins
Version:
2 lines (1 loc) • 10.3 kB
JavaScript
var e,t;e=void 0,t=function(){const e="rexFilterHorrifi",t=Phaser.Game;var n=function(e){return e instanceof t};const i=Phaser.Scene;var s=function(e){return e instanceof i},r=function(e){return null==e||"object"!=typeof e?null:n(e)?e:n(e.game)?e.game:s(e)?e.sys.game:s(e.scene)?e.scene.sys.game:void 0};const o=36e5;var a=function(e,t){var n=t+r(e).loop.delta;return n>=o&&(n-=o),n};class l extends Phaser.Renderer.WebGL.RenderNodes.BaseFilterShader{static FilterName=e;constructor(t){super(e,t,null,"#pragma phaserTemplate(shaderName)\n\n#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\n#pragma phaserTemplate(fragmentHeader)\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")}setupUniforms(e,t){const n=this.programManager;n.setUniform("noiseSeed",e.noiseSeed),n.setUniform("bloomEnable",e.bloomEnable?1:0),n.setUniform("bloom",[e.bloomRadius,e.bloomIntensity,e.bloomThreshold]),n.setUniform("bloomTexel",[e.bloomTexelWidth,e.bloomTexelHeight]),n.setUniform("chromaticEnable",e.chromaticEnable?1:0),n.setUniform("chabIntensity",e.chabIntensity),n.setUniform("vignetteEnable",e.vignetteEnable?1:0),n.setUniform("vignette",[e.vignetteStrength,e.vignetteIntensity]),n.setUniform("noiseEnable",e.noiseEnable?1:0),n.setUniform("noiseStrength",e.noiseStrength),n.setUniform("vhsEnable",e.vhsEnable?1:0),n.setUniform("vhsStrength",e.vhsStrength),n.setUniform("scanlinesEnable",e.scanlinesEnable?1:0),n.setUniform("scanStrength",e.scanStrength),n.setUniform("crtEnable",e.crtEnable?1:0),n.setUniform("crtSize",[e.crtWidth,e.crtHeight]),e.vhsEnable&&(e.now=a(this.manager.renderer.game,e.now)),n.setUniform("time",e.now)}}var h={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}},m={setChromaticEnable(e){return void 0===e&&(e=!0),this.chromaticEnable=e,this},setChabIntensity(e){return this.chabIntensity=e,this}},c={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}},u={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}},v={setVHSEnable(e){return void 0===e&&(e=!0),this.vhsEnable=e,this},setVhsStrength(e){return this.vhsStrength=e,this}},f={setScanlinesEnable(e){return void 0===e&&(e=!0),this.scanlinesEnable=e,this},setScanStrength(e){return this.scanStrength=e,this}},b={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}},g={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(g,h,m,c,u,v,f,b);const d=Phaser.Utils.Objects.GetValue;class S extends Phaser.Filters.Controller{static FilterName=e;constructor(t,n){super(t,e),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,this.resetFromJSON(n)}resetFromJSON(e){var t=d(e,"enable",!1);return this.setBloomEnable(d(e,"bloomEnable",t)),this.setBloomRadius(d(e,"bloomRadius",0)),this.setBloomIntensity(d(e,"bloomIntensity",0)),this.setBloomThreshold(d(e,"bloomThreshold",0)),this.setBloomTexelSize(d(e,"bloomTexelWidth",0),d(e,"bloomTexelHeight")),this.setChromaticEnable(d(e,"chromaticEnable",t)),this.setChabIntensity(d(e,"chabIntensity",0)),this.setVignetteEnable(d(e,"vignetteEnable",t)),this.setVignetteStrength(d(e,"vignetteStrength",0)),this.setVignetteIntensity(d(e,"vignetteIntensity",0)),this.setNoiseEnable(d(e,"noiseEnable",t)),this.setNoiseStrength(d(e,"noiseStrength",0)),this.setNoiseSeed(d(0,"noiseSeed",Math.random())),this.setVHSEnable(d(e,"vhsEnable",t)),this.setVhsStrength(d(e,"vhsStrength",0)),this.setScanlinesEnable(d(e,"scanlinesEnable",t)),this.setScanStrength(d(e,"scanStrength",0)),this.setCRTEnable(d(e,"crtEnable",t)),this.setCrtSize(d(e,"crtWidth",0),d(e,"crtHeight",void 0)),this}}Object.assign(S.prototype,g);var E=function(e,t){var n=t.FilterName,i=r(e).renderer.renderNodes;return!i.hasNode(n)&&(i.addNodeConstructor(n,t),!0)},p=function(e,t){return void 0===t&&(t=!1),e.filters||e.enableFilters().focusFilters(),t?e.filters.external:e.filters.internal};const y=Phaser.Utils.Array.SpliceOne;class x extends Phaser.Plugins.BasePlugin{setFilterClass(e,t){return this.FilterClass=e,this.ControllerClass=t,this}setFilterListMethod(e,t){return function(e,t){var n=Phaser.GameObjects.Components.FilterList.prototype;n[e]||(n[e]=t)}(e,t),this}start(){var e=this.game.events;e.once("destroy",this.destroy,this),this.game.isRunning?E(this.game,this.FilterClass):e.once("ready",(function(){E(this.game,this.FilterClass)}),this)}add(e,t,n=!1){return function(e,t,n,i){void 0===n&&(n={});var s=p(e,i),r=s.add(new t(s.camera,n));return n.name&&(r.name=n.name),r}(e,this.ControllerClass,t,n)}remove(e,t,n=!1){return function(e,t,n,i){var s=p(e,i).list;if(void 0===n)for(var r=s.length-1;r>=0;r--)(a=s[r])instanceof t&&(a.destroy(),y(a,r));else{r=0;for(var o=s.length;r<o;r++){var a;(a=s[r])instanceof t&&a.name===n&&(a.destroy(),y(a,r))}}}(e,this.ControllerClass,t,n),this}get(e,t,n=!1){return function(e,t,n,i){var s=p(e,i).list;if(void 0===n){for(var r=[],o=0,a=s.length;o<a;o++)(l=s[o])instanceof t&&r.push(l);return r}for(o=0,a=s.length;o<a;o++){var l;if((l=s[o])instanceof t&&l.name===n)return l}}(e,this.ControllerClass,t,n)}}var C=function(e){return null==e||""===e||0===e.length},U=function(e,t,n,i){if(void 0===i&&(i="."),"object"==typeof e){if(C(t)){if(null==n)return;"object"==typeof n&&(e=n)}else{"string"==typeof t&&(t=t.split(i));var s=t.pop(),r=function(e,t,n){var i=e;if(C(t));else{var s;"string"==typeof t&&(t=t.split("."));for(var r=0,o=t.length;r<o;r++){var a;null!=i[s=t[r]]&&"object"==typeof i[s]||(a=r===o-1?void 0===n?{}:n:{},i[s]=a),i=i[s]}}return i}(e,t);r[s]=n}return e}};return U(window,"RexPlugins.Filters.HorrifiFilter",l),U(window,"RexPlugins.Filters.HorrifiController",S),class extends x{constructor(e){super(e),this.setFilterClass(l,S),this.setFilterListMethod("addRexHorrifi",(function(e){return this.add(new S(this.camera,e))}))}}},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).rexhorrififilterplugin=t();