phaser3-rex-plugins
Version:
2 lines (1 loc) • 9.48 kB
JavaScript
!function(e,t){"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();}(undefined,(function(){function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,(o=r.key,i=void 0,"symbol"==typeof(i=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return ("string"===t?String:Number)(e)}(o,"string"))?i:String(i)),r);}var o,i;}function r(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t);}function i(e){return i=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},i(e)}function s(e,t){return s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},s(e,t)}function u(e,t){if(t&&("object"==typeof t||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function l(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return !1;if(Reflect.construct.sham)return !1;if("function"==typeof Proxy)return !0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return !1}}();return function(){var n,r=i(e);if(t){var o=i(this).constructor;n=Reflect.construct(r,arguments,o);}else n=r.apply(this,arguments);return u(this,n)}}function c(){return c="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=i(e)););return e}(e,t);if(r){var o=Object.getOwnPropertyDescriptor(r,t);return o.get?o.get.call(arguments.length<3?e:n):o.value}},c.apply(this,arguments)}var a=function(e){return e--,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,++e},f=Phaser.GameObjects.Shader,h=Phaser.Utils.Array.Add,y=Phaser.Utils.Array.Remove,v=function(n){o(u,n);var s=l(u);function u(n,r,o,i,l,c){var f;if(t(this,u),"object"===e(o)){var h=o;o=h.x,i=h.y,l=h.width,c=h.height;}void 0===o&&(o=0),void 0===i&&(i=0),void 0===l&&(l=n.sys.scale.width),void 0===c&&(c=n.sys.scale.height),l=a(l),c=a(c);var y=n.make.renderTexture({x:o,y:i,width:l,height:c,add:!1});return (f=s.call(this,n,r,o,i,l,c)).type="rexEffectLayer",f.setSampler2DBuffer("iChannel0",y.frame.glTexture,l,c,0).setScrollFactor(0).setOrigin(0),f.rt=y,f.children=[],f.boot(),f}return r(u,[{key:"boot",value:function(){this.scene.game.events.on("prerender",this.drawTargets,this),this.scene.sys.scale.on("resize",this.onWindowResize,this);}},{key:"destroy",value:function(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(),c(i(u.prototype),"destroy",this).call(this,e),this.rt.destroy(e),this.rt=null);}},{key:"drawTargets",value:function(){var e,t=this.scene.sys.cameras.main,n=t.scrollX+this.x,r=t.scrollY+this.y,o=this.rt;o.clear();for(var i=0,s=this.children.length;i<s;i++)e=this.children[i],o.draw(e,e.x-n,e.y-r);}},{key:"set1f",value:function(e,t){return this.setUniform("".concat(e,".value"),t),this}},{key:"set2f",value:function(e,t,n){return this.setUniform("".concat(e,".value.x"),t),this.setUniform("".concat(e,".value.y"),n),this}},{key:"set3f",value:function(e,t,n,r){return this.setUniform("".concat(e,".value.x"),t),this.setUniform("".concat(e,".value.y"),n),this.setUniform("".concat(e,".value.z"),r),this}},{key:"setFloat4",value:function(e,t,n,r,o){return this.setUniform("".concat(e,".value.x"),t),this.setUniform("".concat(e,".value.y"),n),this.setUniform("".concat(e,".value.z"),r),this.setUniform("".concat(e,".value.w"),o),this}},{key:"contains",value:function(e){return -1!==this.children.indexOf(e)}},{key:"add",value:function(e){return h(this.children,e,0,(function(e){e.once("destroy",this.onChildDestroy,this);}),this),this}},{key:"remove",value:function(e,t){return void 0===t&&(t=!1),y(this.children,e,(function(e){e.off("destroy",this.onChildDestroy,this),t&&e.destroy();})),this}},{key:"clear",value:function(e){for(var t,n=0,r=this.children.length;n<r;n++)(t=this.children[n]).off("destroy",this.onChildDestroy,this),e&&t.destroy();return this.children.length=0,this}},{key:"onChildDestroy",value:function(e,t){this.remove(e,!t);}},{key:"resize",value:function(e,t){e=a(e),t=a(t);var n=this.rt;return n.setSize(e,t),this.setSampler2DBuffer("iChannel0",n.frame.glTexture,e,t,0),this.setSize(e,t),this}},{key:"onWindowResize",value:function(){var e=this.scene.sys.scale.width,t=this.scene.sys.scale.height;this.resize(e,t);}}]),u}(f);function d(e){var t=e.quality,n=void 0===t?.1:t,r=Math.max(100*n,1),o=(2*Math.PI/r).toFixed(7);return "\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}".replace(/\#\{angleStep\}/,o)}var p=Phaser.Display.BaseShader,g=Phaser.Utils.Objects.GetValue,m=Phaser.Display.Color.IntegerToRGB,k=Phaser.Display.Color,b=function(e){o(i,e);var n=l(i);function i(e,r){var o;t(this,i),void 0===r&&(r={});var s=d(r),u=new p("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}}});return (o=n.call(this,e,u,r)).type="rexOutlineEffectLayer",o._knockout=0,o._thickness=0,o._outlineColor=new k,o.resetFromJSON(r),o}return r(i,[{key:"resetFromJSON",value:function(e){return this.setKnockout(g(e,"knockout",!1)),this.setThickness(g(e,"thickness",3)),this.setOutlineColor(g(e,"outlineColor",16777215)),this}},{key:"knockout",get:function(){return this._knockout},set:function(e){e=!!e,this._knockout!==e&&(this._knockout=e,this.set1f("knockout",e));}},{key:"setKnockout",value:function(e){return this.knockout=e,this}},{key:"thickness",get:function(){return this._thickness},set:function(e){this._thickness!==e&&(this._thickness=e,this.set2f("thickness",e,e));}},{key:"setThickness",value:function(e){return this.thickness=e,this}},{key:"outlineColor",get:function(){return this._outlineColor},set:function(e){"number"==typeof e&&(e=m(e));var t=this._outlineColor;t.setFromRGB(e),this.set3f("outlineColor",t.redGL,t.greenGL,t.blueGL);}},{key:"setOutlineColor",value:function(e){return this.outlineColor=e,this}}]),i}(v);function C(e){var t=new b(this.scene,e);return this.scene.add.existing(t),t}function x(e,t){void 0===e&&(e={}),void 0!==t&&(e.add=t);var n=new b(this.scene,e);return this.scene.add.existing(n),n}var O=function(e){return null==e||""===e||0===e.length},w=function(e){o(i,Phaser.Plugins.BasePlugin);var n=l(i);function i(e){var r;return t(this,i),r=n.call(this,e),e.registerGameObject("rexOutlineEffectLayer",C,x),r}return r(i,[{key:"start",value:function(){this.game.events.on("destroy",this.destroy,this);}}]),i}();return function(t,n,r,o){if(void 0===o&&(o="."),"object"===e(t)){if(O(n)){if(null==r)return;"object"===e(r)&&(t=r);}else {"string"==typeof n&&(n=n.split(o));var i=n.pop(),s=function(t,n,r){var o=t;if(O(n));else {var i;"string"==typeof n&&(n=n.split("."));for(var s=0,u=n.length;s<u;s++){var l;null!=o[i=n[s]]&&"object"===e(o[i])||(l=s===u-1?void 0===r?{}:r:{},o[i]=l),o=o[i];}}return o}(t,n);s[i]=r;}}}(window,"RexPlugins.GameObjects.OutlineEffectLayer",b),w}));