@petkoneo/phaser3-rex-plugins
Version:
2 lines (1 loc) • 6.21 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 o=t(n,"quality",0,1),r=t(n,"distance",10);return e.replace(/__ANGLE_STEP_SIZE__/gi,`${(1/o/r).toFixed(7)}`).replace(/__DIST__/gi,`${Math.round(r).toFixed(0)}.0`)};const o=Phaser.Renderer.WebGL.Pipelines.PostFXPipeline,r=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 o{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(r(e,"outerStrength",4)),this.setInnerStrength(r(e,"innerStrength",0)),this.setGlowColor(r(e,"glowColor",16777215)),this.setKnockout(r(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 p=Phaser.Scene;var g=function(e){return e instanceof p},d=function(e,t,n){var o;(o=e,null==o||"object"!=typeof o?null:f(o)?o:f(o.game)?o.game:g(o)?o.sys.game:g(o.scene)?o.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 o=e.postPipelines[e.postPipelines.length-1];return o.resetFromJSON(n),n.name&&(o.name=n.name),o}(e,this.PostFxPipelineClass,t)}remove(e,t){return function(e,t,n){if(void 0===n)for(var o=(r=e.postPipelines).length-1;o>=0;o--)(s=r[o])instanceof t&&(s.destroy(),P(r,o));else{o=0;for(var r,i=(r=e.postPipelines).length;o<i;o++){var s;(s=r[o])instanceof t&&s.name===n&&(s.destroy(),P(r,o))}}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 o=[],r=0,i=(s=e.postPipelines).length;r<i;r++)(l=s[r])instanceof t&&o.push(l);return o}var s;for(r=0,i=(s=e.postPipelines).length;r<i;r++){var l;if((l=s[r])instanceof t&&l.name===n)return l}}(e,this.PostFxPipelineClass,t)}}var m=function(e){return null==e||""===e||0===e.length};const v=Phaser.Utils.Objects.GetValue;return function(e,t,n,o){if(void 0===o&&(o="."),"object"==typeof e)if(m(t)){if(null==n)return;"object"==typeof n&&(e=n)}else{"string"==typeof t&&(t=t.split(o));var r=t.pop(),i=function(e,t,n){var o=e;if(m(t));else{var r;"string"==typeof t&&(t=t.split("."));for(var i=0,s=t.length;i<s;i++){var l;null!=o[r=t[i]]&&"object"==typeof o[r]||(l=i===s-1?void 0===n?{}:n:{},o[r]=l),o=o[r]}}return o}(e,t);i[r]=n}}(window,"RexPlugins.Pipelines.GlowFilter2PostFx",h),class extends S{constructor(e){super(e),this.setPostPipelineClass(h,"rexGlowFilter2PostFx")}add(e,t){return this.setQuality(v(t,"quality",this.quality)),this.setDistance(v(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();