UNPKG

excalibur

Version:

Excalibur.js is a simple JavaScript game engine with TypeScript bindings for making 2D games in HTML5 Canvas. Our mission is to make web game development as simple as possible.

667 lines (546 loc) • 1.8 MB
/*! * excalibur - 0.30.3 - 2025-1-1 * https://github.com/excaliburjs/Excalibur * Copyright (c) 2025 Excalibur.js <https://github.com/excaliburjs/Excalibur/graphs/contributors> * Licensed BSD-2-Clause * @preserve */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["ex"] = factory(); else root["ex"] = factory(); })(self, () => { return /******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./Director/Loader.css": /*!*****************************!*\ !*** ./Director/Loader.css ***! \*****************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "../../node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "../../node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, `/* Buttons styles start */ button#excalibur-play { display: inline-block; position: relative; z-index: 999; border-radius: 6px; border: none; /*border: 3px solid; border-color: white; box-shadow: 0 0 10px #ccc;*/ padding: 1rem 1.5rem 1rem 4rem; margin: 0; text-decoration: none; background: #00b233; color: #ffffff; font-family: sans-serif; font-size: 2rem; white-space: nowrap; line-height: 1; cursor: pointer; text-align: center; transition: background 250ms ease-in-out, transform 150ms ease; -webkit-appearance: none; -moz-appearance: none; -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */ -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */ -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */ -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */ animation: excalibur-button-fadein 200ms; } /* button#excalibur-play { display: none; }*/ button#excalibur-play:after { position: absolute; content: ''; border: 8px solid; border-color: transparent transparent transparent white; left: 35px; top: 24px; width: 0; height: 0; } button#excalibur-play:before { position: absolute; content: ''; border: 3px solid; left: 19px; top: 14px; border-radius: 20px; width: 30px; height: 30px; } button#excalibur-play:hover, button#excalibur-play:focus { background: #00982c; } button#excalibur-play:focus { outline: 1px solid #fff; outline-offset: -4px; } button#excalibur-play:active { transform: scale(0.99); } @keyframes excalibur-button-fadein { from { opacity: 0; } to { opacity: 1; } } /* Firefox < 16 */ @-moz-keyframes excalibur-button-fadein { from { opacity: 0; } to { opacity: 1; } } /* Safari, Chrome and Opera > 12.1 */ @-webkit-keyframes excalibur-button-fadein { from { opacity: 0; } to { opacity: 1; } } /* Internet Explorer */ @-ms-keyframes excalibur-button-fadein { from { opacity: 0; } to { opacity: 1; } } /* Opera < 12.1 */ @-o-keyframes excalibur-button-fadein { from { opacity: 0; } to { opacity: 1; } } `, "",{"version":3,"sources":["webpack://./Director/Loader.css"],"names":[],"mappings":"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB;;wBAEsB;EACtB,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF","sourcesContent":["/* Buttons styles start */\r\n\r\nbutton#excalibur-play {\r\n display: inline-block;\r\n position: relative;\r\n z-index: 999;\r\n border-radius: 6px;\r\n border: none;\r\n /*border: 3px solid;\r\n border-color: white;\r\n box-shadow: 0 0 10px #ccc;*/\r\n padding: 1rem 1.5rem 1rem 4rem;\r\n margin: 0;\r\n text-decoration: none;\r\n background: #00b233;\r\n color: #ffffff;\r\n font-family: sans-serif;\r\n font-size: 2rem;\r\n white-space: nowrap;\r\n line-height: 1;\r\n cursor: pointer;\r\n text-align: center;\r\n transition:\r\n background 250ms ease-in-out,\r\n transform 150ms ease;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n\r\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\r\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\r\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\r\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\r\n animation: excalibur-button-fadein 200ms;\r\n}\r\n\r\n/*\r\nbutton#excalibur-play {\r\n display: none;\r\n}*/\r\n\r\nbutton#excalibur-play:after {\r\n position: absolute;\r\n content: '';\r\n border: 8px solid;\r\n border-color: transparent transparent transparent white;\r\n left: 35px;\r\n top: 24px;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\nbutton#excalibur-play:before {\r\n position: absolute;\r\n content: '';\r\n border: 3px solid;\r\n left: 19px;\r\n top: 14px;\r\n border-radius: 20px;\r\n width: 30px;\r\n height: 30px;\r\n}\r\n\r\nbutton#excalibur-play:hover,\r\nbutton#excalibur-play:focus {\r\n background: #00982c;\r\n}\r\n\r\nbutton#excalibur-play:focus {\r\n outline: 1px solid #fff;\r\n outline-offset: -4px;\r\n}\r\n\r\nbutton#excalibur-play:active {\r\n transform: scale(0.99);\r\n}\r\n\r\n@keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Firefox < 16 */\r\n@-moz-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Safari, Chrome and Opera > 12.1 */\r\n@-webkit-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Internet Explorer */\r\n@-ms-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Opera < 12.1 */\r\n@-o-keyframes excalibur-button-fadein {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./Util/Toaster.css": /*!**************************!*\ !*** ./Util/Toaster.css ***! \**************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "../../node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "../../node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, `#ex-toast-container { position: absolute; height: 0; min-width: 50%; left: 50%; top: 0; } .ex-toast-message { left: -50%; position: relative; display: flex; justify-content: space-between; padding: 10px; margin-top: 5px; font-size: 18px; font-family: sans-serif; border-radius: 6px; border: 3px solid #b7b779; background-color: rgb(253, 253, 192); } .ex-toast-message button { align-self: flex-start; } `, "",{"version":3,"sources":["webpack://./Util/Toaster.css"],"names":[],"mappings":"AAAA;EACE,kBAAkB;EAClB,SAAS;EACT,cAAc;EACd,SAAS;EACT,MAAM;AACR;;AAEA;EACE,UAAU;EACV,kBAAkB;EAClB,aAAa;EACb,8BAA8B;;EAE9B,aAAa;EACb,eAAe;EACf,eAAe;EACf,uBAAuB;EACvB,kBAAkB;EAClB,yBAAyB;EACzB,oCAAoC;AACtC;;AAEA;EACE,sBAAsB;AACxB","sourcesContent":["#ex-toast-container {\r\n position: absolute;\r\n height: 0;\r\n min-width: 50%;\r\n left: 50%;\r\n top: 0;\r\n}\r\n\r\n.ex-toast-message {\r\n left: -50%;\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n padding: 10px;\r\n margin-top: 5px;\r\n font-size: 18px;\r\n font-family: sans-serif;\r\n border-radius: 6px;\r\n border: 3px solid #b7b779;\r\n background-color: rgb(253, 253, 192);\r\n}\r\n\r\n.ex-toast-message button {\r\n align-self: flex-start;\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "../../node_modules/css-loader/dist/runtime/api.js": /*!*********************************************************!*\ !*** ../../node_modules/css-loader/dist/runtime/api.js ***! \*********************************************************/ /***/ ((module) => { /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ module.exports = function (cssWithMappingToString) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = ""; var needLayer = typeof item[5] !== "undefined"; if (item[4]) { content += "@supports (".concat(item[4], ") {"); } if (item[2]) { content += "@media ".concat(item[2], " {"); } if (needLayer) { content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); } content += cssWithMappingToString(item); if (needLayer) { content += "}"; } if (item[2]) { content += "}"; } if (item[4]) { content += "}"; } return content; }).join(""); }; // import a list of modules into the list list.i = function i(modules, media, dedupe, supports, layer) { if (typeof modules === "string") { modules = [[null, modules, undefined]]; } var alreadyImportedModules = {}; if (dedupe) { for (var k = 0; k < this.length; k++) { var id = this[k][0]; if (id != null) { alreadyImportedModules[id] = true; } } } for (var _k = 0; _k < modules.length; _k++) { var item = [].concat(modules[_k]); if (dedupe && alreadyImportedModules[item[0]]) { continue; } if (typeof layer !== "undefined") { if (typeof item[5] === "undefined") { item[5] = layer; } else { item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); item[5] = layer; } } if (media) { if (!item[2]) { item[2] = media; } else { item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); item[2] = media; } } if (supports) { if (!item[4]) { item[4] = "".concat(supports); } else { item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); item[4] = supports; } } list.push(item); } }; return list; }; /***/ }), /***/ "../../node_modules/css-loader/dist/runtime/sourceMaps.js": /*!****************************************************************!*\ !*** ../../node_modules/css-loader/dist/runtime/sourceMaps.js ***! \****************************************************************/ /***/ ((module) => { module.exports = function (item) { var content = item[1]; var cssMapping = item[3]; if (!cssMapping) { return content; } if (typeof btoa === "function") { var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping)))); var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64); var sourceMapping = "/*# ".concat(data, " */"); return [content].concat([sourceMapping]).join("\n"); } return [content].join("\n"); }; /***/ }), /***/ "./Graphics/Context/circle-renderer/circle-renderer.frag.glsl": /*!********************************************************************!*\ !*** ./Graphics/Context/circle-renderer/circle-renderer.frag.glsl ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nprecision highp float;\r\n\r\n// UV coord\r\nin vec2 v_uv;\r\n\r\n// Color coord to blend with image\r\nin lowp vec4 v_color;\r\n\r\n// Stroke color if used\r\nin lowp vec4 v_strokeColor;\r\n\r\n// Stroke thickness if used\r\nin lowp float v_strokeThickness;\r\n\r\n// Opacity\r\nin float v_opacity;\r\n\r\nout vec4 fragColor;\r\n\r\nvoid main() {\r\n // make (0, 0) the center the uv \r\n vec2 uv = v_uv * 2.0 - 1.0;\r\n\r\n vec4 color = v_color;\r\n vec4 strokeColor = v_strokeColor;\r\n\r\n // circle border is at radius 1.0 \r\n // dist is > 0 when inside the circle \r\n float d = length(uv);\r\n float dist = 1.0 - length(uv);\r\n\r\n // Fade based on fwidth\r\n float fade = fwidth(dot(uv, uv));\r\n\r\n // if dist is greater than 0 step to 1;\r\n // when we cross this 0 threshold add a smooth fade\r\n float fill = smoothstep(-fade/2.0, fade/2.0, dist);\r\n\r\n // if dist is greater than the stroke thickness step to 1\r\n float stroke = 1.0 - smoothstep(v_strokeThickness, v_strokeThickness + fade, dist);\r\n\r\n strokeColor.a *= fill * stroke;\r\n strokeColor.rgb *= strokeColor.a;\r\n\r\n color.a *= fill * (1.0 - stroke);\r\n color.rgb *= color.a;\r\n\r\n vec4 finalColor = mix(vec4(0.0), (color + strokeColor), fill);\r\n finalColor.rgb = finalColor.rgb * v_opacity;\r\n finalColor.a = finalColor.a * v_opacity;\r\n fragColor = finalColor;\r\n}"); /***/ }), /***/ "./Graphics/Context/circle-renderer/circle-renderer.vert.glsl": /*!********************************************************************!*\ !*** ./Graphics/Context/circle-renderer/circle-renderer.vert.glsl ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nin vec2 a_position;\r\n\r\n// UV coordinate\r\nin vec2 a_uv;\r\nout vec2 v_uv;\r\n\r\n// Opacity \r\nin float a_opacity;\r\nout float v_opacity;\r\n\r\nin vec4 a_color;\r\nout vec4 v_color;\r\n\r\nin vec4 a_strokeColor;\r\nout vec4 v_strokeColor;\r\n\r\nin float a_strokeThickness;\r\nout float v_strokeThickness;\r\n\r\nuniform mat4 u_matrix;\r\n\r\n\r\nvoid main() {\r\n // Set the vertex position using the ortho transform matrix\r\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\r\n\r\n // Pass through UV coords\r\n v_uv = a_uv;\r\n // Pass through the Opacity to the fragment shader\r\n v_opacity = a_opacity;\r\n // Pass through the color to the fragment shader\r\n v_color = a_color;\r\n // Pass through the stroke color to the fragment shader\r\n v_strokeColor = a_strokeColor;\r\n // Pass through the stroke thickenss to the fragment shader\r\n v_strokeThickness = a_strokeThickness;\r\n}"); /***/ }), /***/ "./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl": /*!************************************************************************!*\ !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.frag.glsl ***! \************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nprecision mediump float;\r\n\r\n// UV coord\r\nin vec2 v_texcoord;\r\n\r\n// Textures in the current draw\r\nuniform sampler2D u_textures[%%count%%];\r\n\r\nuniform bool u_pixelart;\r\n\r\nin float v_texture_index;\r\n\r\nin float v_opacity;\r\n\r\nin vec4 v_tint;\r\n\r\n// texture resolution\r\nin vec2 v_res;\r\n\r\nin vec2 v_size;\r\n\r\nin vec2 v_uv_min;\r\nin vec2 v_uv_max;\r\n\r\nout vec4 fragColor;\r\n\r\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\r\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\r\n vec2 pixel = uv * texture_size;\r\n\r\n vec2 seam=floor(pixel+.5);\r\n vec2 dudv=fwidth(pixel);\r\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\r\n\r\n return pixel/texture_size;\r\n}\r\n\r\nfloat lerp(float from, float to, float rel){\r\n return ((1. - rel) * from) + (rel * to);\r\n}\r\n\r\nfloat invLerp(float from, float to, float value){\r\n return (value - from) / (to - from);\r\n}\r\n\r\nfloat remap(float origFrom, float origTo, float targetFrom, float targetTo, float value){\r\n float rel = invLerp(origFrom, origTo, value);\r\n return lerp(targetFrom, targetTo, rel);\r\n}\r\n\r\nvoid main(){\r\n // In order to support the most efficient sprite batching, we have multiple\r\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\r\n // that do not apply to a particular sprite.\r\n\r\n vec4 color=vec4(1.,0,0,1.);\r\n vec2 remapped_uv = v_texcoord;\r\n remapped_uv.x = remap(0.,1., v_uv_min.x, v_uv_max.x, v_texcoord.x);\r\n remapped_uv.y = remap(0.,1., v_uv_min.y, v_uv_max.y, v_texcoord.y);\r\n vec2 uv = u_pixelart ? uv_iq(remapped_uv, v_size) : remapped_uv;\r\n\r\n // GLSL is templated out to pick the right texture and set the vec4 color\r\n %%texture_picker%%\r\n\r\n color.rgb = color.rgb * v_opacity;\r\n color.a = color.a * v_opacity;\r\n fragColor = color * v_tint;\r\n}"); /***/ }), /***/ "./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl": /*!************************************************************************!*\ !*** ./Graphics/Context/image-renderer-v2/image-renderer-v2.vert.glsl ***! \************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nlayout(location=0) in vec2 pos;\r\nlayout(location=1) in vec2 a_texcoord;\r\nout vec2 v_texcoord;\r\n\r\nlayout(location=2) in vec2 a_offset;\r\nlayout(location=3) in vec2 a_mat_column1;\r\nlayout(location=4) in vec2 a_mat_column2;\r\nlayout(location=5) in vec2 a_mat_column3;\r\n\r\nlayout(location=6) in float a_opacity;\r\nout float v_opacity;\r\n\r\n// Texture resolution (could be bigger than a_size)\r\nlayout(location=7) in vec2 a_res;\r\nout vec2 v_res;\r\n\r\n// Final size of graphic\r\nlayout(location=8) in vec2 a_size;\r\nout vec2 v_size;\r\n\r\nlayout(location=9) in lowp float a_texture_index;\r\nout lowp float v_texture_index;\r\n\r\nlayout(location=10) in vec2 a_uv_min;\r\nout vec2 v_uv_min;\r\n\r\nlayout(location=11) in vec2 a_uv_max;\r\nout vec2 v_uv_max;\r\n\r\nlayout(location=12) in vec4 a_tint;\r\nout vec4 v_tint;\r\n\r\nuniform mat4 u_matrix;\r\n\r\nvoid main(){\r\n mat4 world_mat = mat4(\r\n a_mat_column1.x, a_mat_column1.y, 0., 0.,\r\n a_mat_column2.x, a_mat_column2.y, 0., 0.,\r\n 0. , 0. , 1., 0.,\r\n a_mat_column3.x, a_mat_column3.y, 0., 1.\r\n );\r\n\r\n vec2 newPos = vec2(pos.x * a_res.x, pos.y * a_res.y);\r\n gl_Position = u_matrix * world_mat * vec4(newPos + a_offset, 0., 1.);\r\n\r\n v_opacity = a_opacity;\r\n v_texcoord = a_texcoord;\r\n v_uv_min = a_uv_min;\r\n v_uv_max = a_uv_max;\r\n v_res = a_res;\r\n v_size = a_size;\r\n v_texture_index = a_texture_index;\r\n v_tint = a_tint;\r\n}"); /***/ }), /***/ "./Graphics/Context/image-renderer/image-renderer.frag.glsl": /*!******************************************************************!*\ !*** ./Graphics/Context/image-renderer/image-renderer.frag.glsl ***! \******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nprecision mediump float;\r\n\r\n// UV coord\r\nin vec2 v_texcoord;\r\n\r\n// Texture index\r\nin lowp float v_textureIndex;\r\n\r\n// Textures in the current draw\r\nuniform sampler2D u_textures[%%count%%];\r\n\r\nuniform bool u_pixelart;\r\n\r\n// Opacity\r\nin float v_opacity;\r\n\r\nin vec4 v_tint;\r\n\r\nin vec2 v_res;\r\n\r\nout vec4 fragColor;\r\n\r\n// Inigo Quilez pixel art filter https://jorenjoestar.github.io/post/pixel_art_filtering/\r\nvec2 uv_iq(in vec2 uv, in vec2 texture_size) {\r\n vec2 pixel = uv * texture_size;\r\n \r\n vec2 seam=floor(pixel+.5);\r\n vec2 dudv=fwidth(pixel);\r\n pixel=seam+clamp((pixel-seam)/dudv,-.5,.5);\r\n \r\n return pixel/texture_size;\r\n}\r\n\r\nvoid main(){\r\n // In order to support the most efficient sprite batching, we have multiple\r\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\r\n // that do not apply to a particular sprite.\r\n \r\n vec4 color=vec4(1.,0,0,1.);\r\n \r\n // GLSL is templated out to pick the right texture and set the vec4 color\r\n %%texture_picker%%\r\n \r\n color.rgb=color.rgb*v_opacity;\r\n color.a=color.a*v_opacity;\r\n fragColor=color*v_tint;\r\n}"); /***/ }), /***/ "./Graphics/Context/image-renderer/image-renderer.vert.glsl": /*!******************************************************************!*\ !*** ./Graphics/Context/image-renderer/image-renderer.vert.glsl ***! \******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nin vec2 a_position;\r\n\r\n// Opacity\r\nin float a_opacity;\r\nout float v_opacity;\r\n\r\n// UV coordinate\r\nin vec2 a_texcoord;\r\nout vec2 v_texcoord;\r\n\r\n// Texture res\r\nin vec2 a_res;\r\nout vec2 v_res;\r\n\r\n// Texture number\r\nin lowp float a_textureIndex;\r\nout lowp float v_textureIndex;\r\n\r\nin vec4 a_tint;\r\nout vec4 v_tint;\r\n\r\nuniform mat4 u_matrix;\r\n\r\nvoid main(){\r\n // Set the vertex position using the ortho transform matrix\r\n gl_Position=u_matrix*vec4(a_position,0.,1.);\r\n \r\n // Pass through the Opacity to the fragment shader\r\n v_opacity=a_opacity;\r\n // Pass through the UV coord to the fragment shader\r\n v_texcoord=a_texcoord;\r\n\r\n v_res = a_res;\r\n\r\n // Pass through the texture number to the fragment shader\r\n v_textureIndex=a_textureIndex;\r\n // Pass through the tint\r\n v_tint=a_tint;\r\n}"); /***/ }), /***/ "./Graphics/Context/line-renderer/line-fragment.glsl": /*!***********************************************************!*\ !*** ./Graphics/Context/line-renderer/line-fragment.glsl ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nprecision mediump float;\r\n\r\n// Color\r\nin lowp vec4 v_color;\r\n\r\nout vec4 fragColor;\r\n\r\nvoid main() {\r\n fragColor = v_color;\r\n}"); /***/ }), /***/ "./Graphics/Context/line-renderer/line-vertex.glsl": /*!*********************************************************!*\ !*** ./Graphics/Context/line-renderer/line-vertex.glsl ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nin vec2 a_position;\r\nin vec4 a_color;\r\n\r\nout lowp vec4 v_color;\r\n\r\nuniform mat4 u_matrix;\r\n\r\nvoid main() {\r\n // Set the vertex position using the ortho transform matrix\r\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\r\n\r\n // Passthrough the color\r\n v_color = a_color;\r\n}"); /***/ }), /***/ "./Graphics/Context/particle-renderer/particle-fragment.glsl": /*!*******************************************************************!*\ !*** ./Graphics/Context/particle-renderer/particle-fragment.glsl ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nprecision mediump float;\r\n\r\nuniform sampler2D graphic;\r\nuniform bool useTexture;\r\nuniform float maxLifeMs;\r\n\r\nuniform vec4 beginColor;\r\nuniform vec4 endColor;\r\nuniform bool fade;\r\nuniform float startOpacity;\r\n\r\nin float finalRotation;\r\nin float finalLifeMs;\r\nout vec4 fragColor;\r\n\r\nvoid main(){\r\n\r\n float lifePct = finalLifeMs / maxLifeMs;\r\n\r\n if (useTexture) {\r\n /** Draw texture */\r\n if (lifePct <= 0.) discard;\r\n float mid = .5;\r\n float cosine = cos(finalRotation);\r\n float sine = sin(finalRotation);\r\n vec2 rotated = vec2(cosine * (gl_PointCoord.x - mid) + sine * (gl_PointCoord.y - mid) + mid,\r\n cosine * (gl_PointCoord.y - mid) - sine * (gl_PointCoord.x - mid) + mid);\r\n vec4 color = texture(graphic, rotated);\r\n fragColor = color * (fade ? lifePct : 1.0);\r\n } else {\r\n /** Draw circle */\r\n if (lifePct <= 0.) discard;\r\n vec2 uv = gl_PointCoord.xy * 2.0 - 1.0;\r\n float dist = 1.0 - length(uv);\r\n float edge = fwidth(dot(uv, uv));\r\n float circle = smoothstep(-edge/2.0, edge/2.0, dist);\r\n vec3 color = mix(beginColor.rgb, endColor.rgb, 1.0 - lifePct);\r\n fragColor.rgb = color;\r\n fragColor.a = startOpacity * circle * (fade ? lifePct : 1.0);// * mix(beginColor.a, endColor.a, 1.0 - lifePct);\r\n fragColor.rgb *= fragColor.a;\r\n }\r\n}"); /***/ }), /***/ "./Graphics/Context/particle-renderer/particle-vertex.glsl": /*!*****************************************************************!*\ !*** ./Graphics/Context/particle-renderer/particle-vertex.glsl ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nprecision mediump float;\r\n\r\nuniform float deltaMs;\r\nuniform float maxLifeMs;\r\nuniform vec2 gravity;\r\nuniform vec2 focus;\r\nuniform float focusAccel;\r\nuniform mat4 u_matrix;\r\nuniform mat4 u_transform;\r\nuniform float startSize;\r\nuniform float endSize;\r\n// uniform sampler2D obstacle;\r\n\r\nlayout(location=0)in vec2 position;\r\nlayout(location=1)in vec2 velocity;\r\nlayout(location=2)in float rotation;\r\nlayout(location=3)in float angularVelocity;\r\nlayout(location=4)in float lifeMs;\r\n\r\n// TODO z index to handle buffer wrapping?\r\n\r\n// DO NOT RE-ORDER\r\nout vec2 finalPosition;\r\nout vec2 finalVelocity;\r\nout float finalRotation;\r\nout float finalAngularVelocity;\r\nout float finalLifeMs;\r\nvoid main(){\r\n // Evolve particle\r\n float seconds = deltaMs / 1000.;\r\n // euler integration\r\n // Weird artifact of re-using the same buffer layout for update/draw\r\n // we need differently named variables\r\n vec2 finalGravity = gravity + normalize(focus - position) * focusAccel;\r\n finalVelocity = velocity + finalGravity * seconds;\r\n finalPosition = position + velocity * seconds + finalGravity * .5 * seconds * seconds;\r\n finalRotation = rotation + angularVelocity * seconds;\r\n finalAngularVelocity = angularVelocity;\r\n finalLifeMs = clamp(lifeMs - deltaMs, 0., maxLifeMs);\r\n\r\n // Collision mask sampling\r\n // vec2 samplePoint = finalPosition / vec2(width, height);\r\n // vec4 collides = texture(obstacle, samplePoint);\r\n // if (distance(collides,vec4(0.)) > .01) {\r\n // // non opaque means we collide! recalc final pos/vel\r\n // vec2 newVelocity = velocity * -.1;// lose energy\r\n // finalVelocity = newVelocity + gravity * seconds;\r\n // finalPosition = position + newVelocity * seconds + gravity * .5 * seconds * seconds;\r\n // }\r\n\r\n float lifePercent = finalLifeMs / maxLifeMs;\r\n vec2 transformedPos = (u_matrix * u_transform * vec4(finalPosition,0.,1.)).xy;\r\n float scale = sqrt(u_transform[0][0] * u_transform[0][0] + u_transform[1][1] * u_transform[1][1]);\r\n gl_Position = vec4(transformedPos, 1.0 - lifePercent, 1.); // use life percent to sort z\r\n gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent) * scale;\r\n}"); /***/ }), /***/ "./Graphics/Context/point-renderer/point-fragment.glsl": /*!*************************************************************!*\ !*** ./Graphics/Context/point-renderer/point-fragment.glsl ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\n\r\nprecision mediump float;\r\nin lowp vec4 v_color;\r\n\r\nout vec4 fragColor;\r\n\r\nvoid main() {\r\n float r = 0.0, delta = 0.0, alpha = 1.0;\r\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\r\n r = dot(cxy, cxy);\r\n\r\n delta = fwidth(r);\r\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\r\n // \"premultiply\" the color by alpha\r\n vec4 color = v_color;\r\n color.a = color.a * alpha;\r\n color.rgb = color.rgb * color.a;\r\n fragColor = color;\r\n}"); /***/ }), /***/ "./Graphics/Context/point-renderer/point-vertex.glsl": /*!***********************************************************!*\ !*** ./Graphics/Context/point-renderer/point-vertex.glsl ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nin vec2 a_position;\r\nin vec4 a_color;\r\nin float a_size;\r\nout lowp vec4 v_color;\r\nuniform mat4 u_matrix;\r\n\r\nvoid main() {\r\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\r\n gl_PointSize = a_size * 2.0;\r\n v_color = a_color;\r\n}"); /***/ }), /***/ "./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl": /*!**************************************************************************!*\ !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.frag.glsl ***! \**************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\n\r\nprecision mediump float;\r\n\r\n// UV coord\r\nin vec2 v_uv;\r\n\r\nin vec2 v_size; // in pixels\r\n\r\n// Color coord to blend with image\r\nin lowp vec4 v_color;\r\n\r\n// Stroke color if used\r\nin lowp vec4 v_strokeColor;\r\n\r\n// Stroke thickness if used\r\nin lowp float v_strokeThickness; // in pixels\r\n\r\n// Opacity\r\nin float v_opacity;\r\n\r\nout vec4 fragColor;\r\n\r\nvoid main() {\r\n // modified from https://stackoverflow.com/questions/59197671/glsl-rounded-rectangle-with-variable-border\r\n vec2 uv = v_uv;\r\n vec2 fragCoord = uv * v_size;\r\n float maxX = v_size.x - v_strokeThickness;\r\n float minX = v_strokeThickness;\r\n float maxY = v_size.y - v_strokeThickness;\r\n float minY = v_strokeThickness;\r\n\r\n if (fragCoord.x < maxX && fragCoord.x > minX &&\r\n fragCoord.y < maxY && fragCoord.y > minY) {\r\n fragColor = v_color;\r\n } else {\r\n fragColor = v_strokeColor;\r\n }\r\n fragColor.a *= v_opacity;\r\n fragColor.rgb *= fragColor.a;\r\n\r\n // vec2 v2CenteredPos = abs(fragCoord - v_size.xy / 2.0);\r\n // vec2 v2HalfShapeSizePx = v_size.xy/2.0 - v_strokeThickness/2.0;\r\n\r\n // float fHalfBorderDist = 0.0;\r\n // float fHalfBorderThickness = 0.0;\r\n\r\n // if (fragCoord.x > max(v_radius, v_strokeThickness) && \r\n // fragCoord.x < v_size.x - max(v_radius, v_strokeThickness))\r\n // {\r\n // fHalfBorderDist = v2CenteredPos.y - v2HalfShapeSizePx.y;\r\n // fHalfBorderThickness = v_strokeThickness / 2.0;\r\n // }\r\n // else if (fragCoord.y > max(v_radius, v_strokeThickness) && \r\n // fragCoord.y < v_size.y - max(v_radius, v_strokeThickness))\r\n // {\r\n // fHalfBorderDist = v2CenteredPos.x - v2HalfShapeSizePx.x;\r\n // fHalfBorderThickness = v_strokeThickness / 2.0;\r\n // }\r\n // else\r\n // {\r\n // vec2 edgeVec = max(vec2(0.0), v_radius - vec2(\r\n // uv.x > 0.5 ? v_size.x - fragCoord.x : fragCoord.x,\r\n // uv.y > 0.5 ? v_size.y - fragCoord.y : fragCoord.y));\r\n \r\n // float ellipse_ab = v_radius-v_strokeThickness;\r\n // vec2 ellipse_isect = (v_strokeThickness > v_radius || v_strokeThickness > v_radius) ? vec2(0.0) :\r\n // edgeVec.xy * ellipse_ab*ellipse_ab / length(ellipse_ab*edgeVec.yx); \r\n \r\n // fHalfBorderThickness = (v_radius - length(ellipse_isect)) / 2.0;\r\n // fHalfBorderDist = length(edgeVec) - (v_radius - fHalfBorderThickness);\r\n // }\r\n\r\n // vec4 v4FromColor = v_strokeColor;\r\n // v4FromColor.rgb *= v4FromColor.a;\r\n // vec4 v4ToColor = vec4(0.0); // background color is transparent\r\n // if (fHalfBorderDist < 0.0) {\r\n // v4ToColor = v_color;\r\n // v4ToColor.rgb *= v4ToColor.a;\r\n // }\r\n\r\n // float mixPct = abs(fHalfBorderDist) - fHalfBorderThickness;\r\n\r\n // vec4 finalColor = mix(v4FromColor, v4ToColor, mixPct);\r\n // gl_FragColor = finalColor;\r\n}"); /***/ }), /***/ "./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl": /*!**************************************************************************!*\ !*** ./Graphics/Context/rectangle-renderer/rectangle-renderer.vert.glsl ***! \**************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nin vec2 a_position;\r\n\r\n// UV coordinate\r\nin vec2 a_uv;\r\nout vec2 v_uv;\r\n\r\nin vec2 a_size;\r\nout vec2 v_size;\r\n\r\n// Opacity \r\nin float a_opacity;\r\nout float v_opacity;\r\n\r\nin vec4 a_color;\r\nout vec4 v_color;\r\n\r\nin vec4 a_strokeColor;\r\nout vec4 v_strokeColor;\r\n\r\nin float a_strokeThickness;\r\nout float v_strokeThickness;\r\n\r\nuniform mat4 u_matrix;\r\n\r\n\r\nvoid main() {\r\n // Set the vertex position using the ortho transform matrix\r\n gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);\r\n\r\n // Pass through UV coords\r\n v_uv = a_uv;\r\n // Pass through size\r\n v_size = a_size;\r\n // Pass through the Opacity to the fragment shader\r\n v_opacity = a_opacity;\r\n // Pass through the color to the fragment shader\r\n v_color = a_color;\r\n // Pass through the stroke color to the fragment shader\r\n v_strokeColor = a_strokeColor;\r\n // Pass through the stroke thickenss to the fragment shader\r\n v_strokeThickness = a_strokeThickness;\r\n}"); /***/ }), /***/ "./Graphics/Context/screen-pass-painter/screen-fragment.glsl": /*!*******************************************************************!*\ !*** ./Graphics/Context/screen-pass-painter/screen-fragment.glsl ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nprecision mediump float;\r\n\r\n// Passed in from the vertex shader.\r\nin vec2 v_texcoord;\r\n\r\n// The texture.\r\nuniform sampler2D u_texture;\r\n\r\nout vec4 fragColor;\r\n\r\nvoid main() {\r\n fragColor = texture(u_texture, v_texcoord);\r\n}"); /***/ }), /***/ "./Graphics/Context/screen-pass-painter/screen-vertex.glsl": /*!*****************************************************************!*\ !*** ./Graphics/Context/screen-pass-painter/screen-vertex.glsl ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nin vec2 a_position;\r\n\r\nin vec2 a_texcoord;\r\nout vec2 v_texcoord;\r\n\r\nvoid main() {\r\n gl_Position = vec4(a_position, 0.0, 1.0);\r\n\r\n // Pass the texcoord to the fragment shader.\r\n v_texcoord = a_texcoord;\r\n}"); /***/ }), /***/ "./Graphics/PostProcessor/color-blind-fragment.glsl": /*!**********************************************************!*\ !*** ./Graphics/PostProcessor/color-blind-fragment.glsl ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("#version 300 es\r\nprecision mediump float;\r\n// our texture\r\nuniform sampler2D u_image;\r\n// the texCoords passed in from the vertex shader.\r\nin vec2 v_texcoord;\r\n\r\n// color blind type\r\nuniform int u_type;\r\n\r\n// simulation?\r\nuniform bool u_simulate;\r\n\r\nout vec4 fragColor;\r\n\r\nvoid main() {\r\n vec4 o = texture(u_image, v_texcoord);\r\n // RGB to LMS matrix conversion\r\n float L = (17.8824 * o.r) + (43.5161 * o.g) + (4.11935 * o.b);\r\n float M = (3.45565 * o.r) + (27.1554 * o.g) + (3.86714 * o.b);\r\n float S = (0.0299566 * o.r) + (0.184309 * o.g) + (1.46709 * o.b);\r\n // Simulate color blindness\r\n float l;\r\n float m;\r\n float s;\r\n //MODE CODE//\r\n if (u_type == 0) {\r\n // Protanope\r\n l = 0.0 * L + 2.02344 * M + -2.52581 * S;\r\n m = 0.0 * L + 1.0 * M + 0.0 * S;\r\n s = 0.0 * L + 0.0 * M + 1.0 * S;;\r\n } else if (u_type == 1) {\r\n // Deuteranope\r\n l = 1.0 * L + 0.0 * M + 0.0 * S;\r\n m = 0.494207 * L + 0.0 * M + 1.24827 * S;\r\n s = 0.0 * L + 0.0 * M + 1.0 * S;\r\n } else if (u_type == 2) {\r\n // Tritanope\r\n l = 1.0 * L + 0.0 * M + 0.0 * S;\r\n m = 0.0 * L + 1.0 * M + 0.0 * S;\r\n s = -0.395913 * L + 0.801109 * M + 0.0 * S;\r\n }\r\n\r\n // LMS to RGB matrix conversion\r\n vec4 error; // simulate the colors\r\n error.r = (0.0809444479 * l) + (-0.130504409 * m) + (0.116721066 * s);\r\n error.g = (-0.0102485335 * l) + (0.0540193266 * m) + (-0.113614708 * s);\r\n error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + (0.693511405 * s);\r\n error.a = 1.0;\r\n vec4 diff = o - error;\r\n vec4 correction; // correct the colors\r\n correction.r = 0.0;\r\n correction.g = (diff.r * 0.7) + (diff.g * 1.0);\r\n correction.b = (diff.r * 0.7) + (diff.b * 1.0);\r\n correction = o + correction;\r\n correction.a = o.a;\r\n //SIMULATE//\r\n\r\n // sim \r\n if (u_simulate) {\r\n fragColor = error.rgba;\r\n } else {\r\n fragColor = correction.rgba;\r\n }\r\n}"); /***/ }), /***/ "./Actions/Action.ts": /*!***************************!*\ !*** ./Actions/Action.ts ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ nextActionId: () => (/* binding */ nextActionId) /* harmony export */ }); let _ACTION_ID = 0; /** * */ function nextActionId() { return _ACTION_ID++; } /***/ }), /***/ "./Actions/ActionContext.ts": /*!**********************************!*\ !*** ./Actions/ActionContext.ts ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ActionContext: () => (/* binding */ ActionContext) /* harmony export */ }); /* harmony import */ var _Util_EasingFunctions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Util/EasingFunctions */ "./Util/EasingFunctions.ts"); /* harmony import */ var _ActionQueue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActionQueue */ "./Actions/ActionQueue.ts"); /* harmony import */ var _Action_Repeat__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Action/Repeat */ "./Actions/Action/Repeat.ts"); /* harmony import */ var _Action_RepeatForever__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Action/RepeatForever */ "./Actions/Action/RepeatForever.ts"); /* harmony import */ var _Action_MoveBy__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Action/MoveBy */ "./Actions/Action/MoveBy.ts"); /* harmony import */ var _Action_MoveTo__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Action/MoveTo */ "./Actions/Action/MoveTo.ts"); /* harmony import */ var _Action_RotateTo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Action/RotateTo */ "./Actions/Action/RotateTo.ts"); /* harmony import */ var _Action_RotateBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Action/RotateBy */ "./Actions/Action/RotateBy.ts"); /* harmony import */ var _Action_ScaleTo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Action/ScaleTo */ "./Actions/Action/ScaleTo.ts"); /* harmony import */ var _Action_ScaleBy__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Action/ScaleBy */ "./Actions/Action/ScaleBy.ts"); /* harmony import */ var _Action_CallMethod__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Action/CallMethod */ "./Actions/Action/CallMethod.ts"); /* harmony import */ var _Action_EaseTo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Action/EaseTo */ "./Actions/Action/EaseTo.ts"); /* harmony import */ var _Action_EaseBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Action/EaseBy */ "./Actions/Action/EaseBy.ts"); /* harmony import */ var _Action_Blink__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Action/Blink */ "./Actions/Action/Blink.ts"); /* harmony import */ var _Action_Fade__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Action/Fade */ "./Actions/Action/Fade.ts"); /* harmony import */ var _Action_Delay__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Action/Delay */ "./Actions/Action/Delay.ts"); /* harmony import */ var _Action_Die__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Action/Die */ "./Actions/Action/Die.ts"); /* harmony import */ var _Action_Follow__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Action/Follow */ "./Actions/Action/Follow.ts"); /* harmony import */ var _Action_Meet__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Action/Meet */ "./Actions/Action/Meet.ts"); /* harmony import */ var _Math__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Math */ "./Math/vector.ts"); /* harmony import */ var _Action_Flash__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Action/Flash */ "./Actions/Action/Flash.ts"); /* harmony import */ var _Action_CurveTo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Action/CurveTo */ "./Actions/Action/CurveTo.ts"); /* harmony import */ var _Action_CurveBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Action/CurveBy */ "./Actions/Action/CurveBy.ts"); /** * The fluent Action API allows you to perform "actions" on * {@apilink Actor | `actors`} such as following, moving, rotating, and * more. You can implement your own actions by implementing * the {@apilink Action} interface. */ class ActionContext { constructor(entity) { this._entity = entity;