UNPKG

@petkoneo/phaser3-rex-plugins

Version:
2 lines (1 loc) 6.14 kB
var e,t;e=void 0,t=function(){var e=function(e){return e--,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,++e};const t=Phaser.GameObjects.Shader,s=Phaser.Utils.Array.Add,n=Phaser.Utils.Array.Remove;class i extends t{constructor(t,s,n,i,r,o){if("object"==typeof n){var h=n;({x:n,y:i,width:r,height:o}=h)}void 0===n&&(n=0),void 0===i&&(i=0),void 0===r&&(r=t.sys.scale.width),void 0===o&&(o=t.sys.scale.height),r=e(r),o=e(o);var l=t.make.renderTexture({x:n,y:i,width:r,height:o,add:!1});super(t,s,n,i,r,o),this.type="rexEffectLayer",this.setSampler2DBuffer("iChannel0",l.frame.glTexture,r,o,0).setScrollFactor(0).setOrigin(0),this.rt=l,this.children=[],this.boot()}boot(){this.scene.game.events.on("prerender",this.drawTargets,this),this.scene.sys.scale.on("resize",this.onWindowResize,this)}destroy(e){this.scene&&!this.ignoreDestroy&&(this.scene.game.events.off("prerender",this.drawTargets,this),this.scene.sys.scale.off("resize",this.onWindowResize,this),this.clear(),super.destroy(e),this.rt.destroy(e),this.rt=null)}drawTargets(){var e,t=this.scene.sys.cameras.main,s=t.scrollX+this.x,n=t.scrollY+this.y,i=this.rt;i.clear();for(var r=0,o=this.children.length;r<o;r++)e=this.children[r],i.draw(e,e.x-s,e.y-n)}set1f(e,t){return this.setUniform(`${e}.value`,t),this}set2f(e,t,s){return this.setUniform(`${e}.value.x`,t),this.setUniform(`${e}.value.y`,s),this}set3f(e,t,s,n){return this.setUniform(`${e}.value.x`,t),this.setUniform(`${e}.value.y`,s),this.setUniform(`${e}.value.z`,n),this}setFloat4(e,t,s,n,i){return this.setUniform(`${e}.value.x`,t),this.setUniform(`${e}.value.y`,s),this.setUniform(`${e}.value.z`,n),this.setUniform(`${e}.value.w`,i),this}contains(e){return-1!==this.children.indexOf(e)}add(e){return s(this.children,e,0,(function(e){e.once("destroy",this.onChildDestroy,this)}),this),this}remove(e,t){return void 0===t&&(t=!1),n(this.children,e,(function(e){e.off("destroy",this.onChildDestroy,this),t&&e.destroy()})),this}clear(e){for(var t,s=0,n=this.children.length;s<n;s++)(t=this.children[s]).off("destroy",this.onChildDestroy,this),e&&t.destroy();return this.children.length=0,this}onChildDestroy(e,t){this.remove(e,!t)}resize(t,s){t=e(t),s=e(s);var n=this.rt;return n.setSize(t,s),this.setSampler2DBuffer("iChannel0",n.frame.glTexture,t,s,0),this.setSize(t,s),this}onWindowResize(){var e=this.scene.sys.scale.width,t=this.scene.sys.scale.height;this.resize(e,t)}}const r="\n#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 iChannel0; \nvarying vec2 fragCoord;\nuniform vec2 resolution;\n\n// Effect parameters\nuniform bool knockout;\nuniform vec2 thickness;\nuniform vec3 outlineColor; // (0, 0, 0);\n\nconst float DOUBLE_PI = 3.14159265358979323846264 * 2.;\n\nvoid main() {\n vec2 uv = fragCoord / resolution;\n if ((thickness.x > 0.0) || (thickness.y > 0.0)) {\n vec4 front = texture2D(iChannel0, uv);\n vec2 mag = thickness/resolution;\n vec4 curColor;\n float maxAlpha = 0.;\n vec2 offset;\n for (float angle = 0.; angle <= DOUBLE_PI; angle += #{angleStep}) {\n offset = vec2(mag.x * cos(angle), mag.y * sin(angle)); \n curColor = texture2D(iChannel0, uv + offset);\n maxAlpha = max(maxAlpha, curColor.a);\n }\n float resultAlpha = max(maxAlpha, front.a);\n vec4 resultColor = vec4((front.rgb + (outlineColor.rgb * (1. - front.a) * resultAlpha)), resultAlpha);\n\n if (knockout && (resultColor == front)) {\n gl_FragColor = vec4(0);\n } else {\n gl_FragColor = resultColor;\n }\n\n } else {\n if (knockout) {\n gl_FragColor = vec4(0);\n } else {\n gl_FragColor = texture2D(iChannel0, uv);\n }\n\n }\n\n}";function o({quality:e=.1}){var t=Math.max(100*e,1),s=(2*Math.PI/t).toFixed(7);return r.replace(/\#\{angleStep\}/,s)}const h=Phaser.Display.BaseShader,l=Phaser.Utils.Objects.GetValue,a=Phaser.Display.Color.IntegerToRGB,u=Phaser.Display.Color;class c extends i{constructor(e,t){void 0===t&&(t={});var s=o(t);super(e,new h("Outline",s,void 0,{knockout:{type:"1f",value:!0},thickness:{type:"2f",value:{x:0,y:0}},outlineColor:{type:"3f",value:{x:0,y:0,z:0}}}),t),this.type="rexOutlineEffectLayer",this._knockout=0,this._thickness=0,this._outlineColor=new u,this.resetFromJSON(t)}resetFromJSON(e){return this.setKnockout(l(e,"knockout",!1)),this.setThickness(l(e,"thickness",3)),this.setOutlineColor(l(e,"outlineColor",16777215)),this}get knockout(){return this._knockout}set knockout(e){e=!!e,this._knockout!==e&&(this._knockout=e,this.set1f("knockout",e))}setKnockout(e){return this.knockout=e,this}get thickness(){return this._thickness}set thickness(e){this._thickness!==e&&(this._thickness=e,this.set2f("thickness",e,e))}setThickness(e){return this.thickness=e,this}get outlineColor(){return this._outlineColor}set outlineColor(e){"number"==typeof e&&(e=a(e));var t=this._outlineColor;t.setFromRGB(e),this.set3f("outlineColor",t.redGL,t.greenGL,t.blueGL)}setOutlineColor(e){return this.outlineColor=e,this}}function f(e){var t=new c(this.scene,e);return this.scene.add.existing(t),t}function d(e,t){void 0===e&&(e={}),void 0!==t&&(e.add=t);var s=new c(this.scene,e);return this.scene.add.existing(s),s}var v=function(e){return null==e||""===e||0===e.length};class g extends Phaser.Plugins.BasePlugin{constructor(e){super(e),e.registerGameObject("rexOutlineEffectLayer",f,d)}start(){this.game.events.on("destroy",this.destroy,this)}}return function(e,t,s,n){if(void 0===n&&(n="."),"object"==typeof e)if(v(t)){if(null==s)return;"object"==typeof s&&(e=s)}else{"string"==typeof t&&(t=t.split(n));var i=t.pop(),r=function(e,t,s){var n=e;if(v(t));else{var i;"string"==typeof t&&(t=t.split("."));for(var r=0,o=t.length;r<o;r++){var h;null!=n[i=t[r]]&&"object"==typeof n[i]||(h=r===o-1?void 0===s?{}:s:{},n[i]=h),n=n[i]}}return n}(e,t);r[i]=s}}(window,"RexPlugins.GameObjects.OutlineEffectLayer",c),g},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).rexoutlineeffectlayerplugin=t();