phaser3-rex-plugins
Version:
2 lines (1 loc) • 6.25 kB
JavaScript
var e,t;e=void 0,t=function(){const e="#ifdef GL_FRAGMENT_PRECISION_HIGH\n#define highmedp highp\n#else\n#define highmedp mediump\n#endif\nprecision highmedp float;\n\n// Scene buffer\nuniform sampler2D uMainSampler; \nvarying vec2 outTexCoord;\n\n// Effect parameters\nuniform vec2 texSize;\nuniform float outerStrength;\nuniform float innerStrength;\nuniform vec4 glowColor; // (0, 0, 0);\nuniform float knockout;\n\n// const\nconst float PI = 3.14159265358979323846264;\n\nconst float DIST = __DIST__;\nconst float ANGLE_STEP_SIZE = min(__ANGLE_STEP_SIZE__, PI * 2.0);\nconst float ANGLE_STEP_NUM = ceil(PI * 2.0 / ANGLE_STEP_SIZE);\n\nconst float MAX_TOTAL_ALPHA = ANGLE_STEP_NUM * DIST * (DIST + 1.0) / 2.0;\n\n\nvoid main(void) {\n vec2 px = vec2(1./texSize.x, 1./texSize.y);\n\n float totalAlpha = 0.0;\n\n vec2 direction;\n vec2 offset;\n vec4 curColor;\n\n for (float angle = 0.; angle < PI * 2.; angle += ANGLE_STEP_SIZE) {\n direction = vec2(cos(angle), sin(angle)) * px;\n\n for (float curDistance = 0.0; curDistance < DIST; curDistance++) {\n offset = direction * (curDistance + 1.0);\n curColor = texture2D(uMainSampler, outTexCoord + offset);\n totalAlpha += (DIST - curDistance) * curColor.a;\n }\n }\n \n curColor = texture2D(uMainSampler, outTexCoord);\n\n float alphaRatio = (totalAlpha / MAX_TOTAL_ALPHA);\n\n float innerGlowAlpha = (1.0 - alphaRatio) * innerStrength * curColor.a;\n float innerGlowStrength = min(1.0, innerGlowAlpha);\n \n vec4 innerColor = mix(curColor, glowColor, innerGlowStrength);\n\n float outerGlowAlpha = alphaRatio * outerStrength * (1. - curColor.a);\n float outerGlowStrength = min(1.0 - innerColor.a, outerGlowAlpha);\n\n vec4 outerGlowColor = outerGlowStrength * glowColor.rgba;\n \n if (knockout > 0.) {\n float resultAlpha = outerGlowAlpha + innerGlowAlpha;\n gl_FragColor = vec4(glowColor.rgb * resultAlpha, resultAlpha);\n }\n else {\n gl_FragColor = innerColor + outerGlowColor;\n }\n}\n",t=Phaser.Utils.Objects.GetValue;var n=function(n){var r=t(n,"quality",0,1),o=t(n,"distance",10);return e.replace(/__ANGLE_STEP_SIZE__/gi,`${(1/r/o).toFixed(7)}`).replace(/__DIST__/gi,`${Math.round(o).toFixed(0)}.0`)};const r=Phaser.Renderer.WebGL.Pipelines.PostFXPipeline,o=Phaser.Utils.Objects.GetValue,i=Phaser.Display.Color.IntegerToRGB,s=Phaser.Display.Color;var l=.1,a=10,u=n({quality:l,distance:a});class h extends r{constructor(e){super({name:"rexGlowFilterPostFx",game:e,renderTarget:!0,fragShader:u}),this.outerStrength=0,this.innerStrength=0,this._glowColor=new s,this.knockout=!1}resetFromJSON(e){return this.setOuterStrength(o(e,"outerStrength",4)),this.setInnerStrength(o(e,"innerStrength",0)),this.setGlowColor(o(e,"glowColor",16777215)),this.setKnockout(o(e,"knockout",!1)),this}onPreRender(){this.set1f("outerStrength",this.outerStrength),this.set1f("innerStrength",this.innerStrength);var e=this._glowColor;this.set4f("glowColor",e.redGL,e.greenGL,e.blueGL,e.alphaGL),this.set1f("knockout",this.knockout?1:0),this.set2f("texSize",this.renderer.width,this.renderer.height)}setOuterStrength(e){return this.outerStrength=e,this}setInnerStrength(e){return this.innerStrength=e,this}get glowColor(){return this._glowColor}set glowColor(e){"number"==typeof e&&(e=i(e)),this._glowColor.setFromRGB(e)}setGlowColor(e){return this.glowColor=e,this}setKnockout(e){return this.knockout=e,this}static setQuality(e){l!==e&&(u=n({quality:l=e,distance:a}))}static getQuality(){return l}static setDistance(e){a!==e&&(u=n({quality:l,distance:a=e}))}static getDistance(){return a}}const c=Phaser.Game;var f=function(e){return e instanceof c};const g=Phaser.Scene;var p=function(e){return e instanceof g},d=function(e,t,n){var r;(r=e,null==r||"object"!=typeof r?null:f(r)?r:f(r.game)?r.game:p(r)?r.sys.game:p(r.scene)?r.scene.sys.game:void 0).renderer.pipelines.addPostPipeline(t,n)};const P=Phaser.Utils.Array.SpliceOne;class S extends Phaser.Plugins.BasePlugin{setPostPipelineClass(e,t){return this.PostFxPipelineClass=e,this.postFxPipelineName=t,this}start(){this.game.events.once("destroy",this.destroy,this),d(this.game,this.postFxPipelineName,this.PostFxPipelineClass)}add(e,t){return function(e,t,n){void 0===n&&(n={}),e.setPostPipeline(t);var r=e.postPipelines[e.postPipelines.length-1];return r.resetFromJSON(n),n.name&&(r.name=n.name),r}(e,this.PostFxPipelineClass,t)}remove(e,t){return function(e,t,n){if(void 0===n)for(var r=(o=e.postPipelines).length-1;r>=0;r--)(s=o[r])instanceof t&&(s.destroy(),P(o,r));else{r=0;for(var o,i=(o=e.postPipelines).length;r<i;r++){var s;(s=o[r])instanceof t&&s.name===n&&(s.destroy(),P(o,r))}}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 r=[],o=0,i=(s=e.postPipelines).length;o<i;o++)(l=s[o])instanceof t&&r.push(l);return r}var s;for(o=0,i=(s=e.postPipelines).length;o<i;o++){var l;if((l=s[o])instanceof t&&l.name===n)return l}}(e,this.PostFxPipelineClass,t)}}var m=function(e){return null!==e&&"object"==typeof e};const _=Phaser.Utils.Objects.GetValue;return function(e,t,n,r="."){if(!m(e))return e;if(function(e){return null==e}(t)||""===t||Array.isArray(t)&&0===t.length)return e;if("string"==typeof t&&-1===t.indexOf(r)||"number"==typeof t)return e[t]=n,e;var o=function(e,t){return Array.isArray(e)||(e="string"!=typeof e||""===e.trim()?[]:e.split(t).filter(Boolean)),e}(t,r);if(0===o.length)return e;for(var i=e,s=o.length,l=0;l<s-1;l++){var a=o[l],u=i[a];m(u)||(i[a]={}),i=i[a]}i[o[s-1]]=n}(window,"RexPlugins.Pipelines.GlowFilter2PostFx",h),class extends S{constructor(e){super(e),this.setPostPipelineClass(h,"rexGlowFilter2PostFx")}add(e,t){return this.setQuality(_(t,"quality",this.quality)),this.setDistance(_(t,"distance",this.distance)),super.add(e,t)}setQuality(e){return h.setQuality(e),this}set quality(e){this.setQuality(e)}get quality(){return h.getQuality()}setDistance(e){return h.setDistance(e),this}set distance(e){this.setDistance(e)}get distance(){return h.getDistance()}}},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).rexglowfilter2pipelineplugin=t();