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
JavaScript
/*!
* 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;