eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _modules_BVH_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/BVH.mjs */ \"./src/modules/BVH.mjs\");\n/* harmony import */ var _modules_Circle_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/Circle.mjs */ \"./src/modules/Circle.mjs\");\n/* harmony import */ var _modules_Polygon_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/Polygon.mjs */ \"./src/modules/Polygon.mjs\");\n/* harmony import */ var _modules_Point_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/Point.mjs */ \"./src/modules/Point.mjs\");\n/* harmony import */ var _modules_Result_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/Result.mjs */ \"./src/modules/Result.mjs\");\n/* harmony import */ var _modules_SAT_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/SAT.mjs */ \"./src/modules/SAT.mjs\");\n\n\n\n\n\n\n\n/**\n * A collision system used to track bodies in order to improve collision detection performance\n * @class\n */\nclass Collisions {\n\t/**\n\t * @constructor\n\t */\n\tconstructor() {\n\t\t/** @private */\n\t\tthis._bvh = new _modules_BVH_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n\t}\n\n\t/**\n\t * Creates a {@link Circle} and inserts it into the collision system\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Number} [radius = 0] The radius\n\t * @param {Number} [scale = 1] The scale\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t * @returns {Circle}\n\t */\n\tcreateCircle(x = 0, y = 0, radius = 0, scale = 1, padding = 0) {\n\t\tconst body = new _modules_Circle_mjs__WEBPACK_IMPORTED_MODULE_1__[\"default\"](x, y, radius, scale, padding);\n\n\t\tthis._bvh.insert(body);\n\n\t\treturn body;\n\t}\n\n\t/**\n\t * Creates a {@link Polygon} and inserts it into the collision system\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Array<Number[]>} [points = []] An array of coordinate pairs making up the polygon - [[x1, y1], [x2, y2], ...]\n\t * @param {Number} [angle = 0] The starting rotation in radians\n\t * @param {Number} [scale_x = 1] The starting scale along the X axis\n\t * @param {Number} [scale_y = 1] The starting scale long the Y axis\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t * @returns {Polygon}\n\t */\n\tcreatePolygon(x = 0, y = 0, points = [[0, 0]], angle = 0, scale_x = 1, scale_y = 1, padding = 0) {\n\t\tconst body = new _modules_Polygon_mjs__WEBPACK_IMPORTED_MODULE_2__[\"default\"](x, y, points, angle, scale_x, scale_y, padding);\n\n\t\tthis._bvh.insert(body);\n\n\t\treturn body;\n\t}\n\n\t/**\n\t * Creates a {@link Point} and inserts it into the collision system\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t * @returns {Point}\n\t */\n\tcreatePoint(x = 0, y = 0, padding = 0) {\n\t\tconst body = new _modules_Point_mjs__WEBPACK_IMPORTED_MODULE_3__[\"default\"](x, y, padding);\n\n\t\tthis._bvh.insert(body);\n\n\t\treturn body;\n\t}\n\n\t/**\n\t * Creates a {@link Result} used to collect the detailed results of a collision test\n\t */\n\tcreateResult() {\n\t\treturn new _modules_Result_mjs__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n\t}\n\n\t/**\n\t * Creates a Result used to collect the detailed results of a collision test\n\t */\n\tstatic createResult() {\n\t\treturn new _modules_Result_mjs__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n\t}\n\n\t/**\n\t * Inserts bodies into the collision system\n\t * @param {...Circle|...Polygon|...Point} bodies\n\t */\n\tinsert(...bodies){\n\t\tfor(constbodyofbodies){\n\t\t\tthis._bvh.insert(body,false);\n\t\t}\n\n\t\treturnthis
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Body; });\n/* harmony import */ var _Result_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Result.mjs */ \"./src/modules/Result.mjs\");\n/* harmony import */ var _SAT_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SAT.mjs */ \"./src/modules/SAT.mjs\");\n\n\n\n/**\n * The base class for bodies used to detect collisions\n * @class\n * @protected\n */\nclass Body {\n\t/**\n\t * @constructor\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t */\n\tconstructor(x = 0, y = 0, padding = 0) {\n\t\t/**\n\t\t * @desc The X coordinate of the body\n\t\t * @type {Number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * @desc The Y coordinate of the body\n\t\t * @type {Number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * @desc The amount to pad the bounding volume when testing for potential collisions\n\t\t * @type {Number}\n\t\t */\n\t\tthis.padding = padding;\n\n\t\t/** @private */\n\t\tthis._circle = false;\n\n\t\t/** @private */\n\t\tthis._polygon = false;\n\n\t\t/** @private */\n\t\tthis._point = false;\n\n\t\t/** @private */\n\t\tthis._bvh = null;\n\n\t\t/** @private */\n\t\tthis._bvh_parent = null;\n\n\t\t/** @private */\n\t\tthis._bvh_branch = false;\n\n\t\t/** @private */\n\t\tthis._bvh_padding = padding;\n\n\t\t/** @private */\n\t\tthis._bvh_min_x = 0;\n\n\t\t/** @private */\n\t\tthis._bvh_min_y = 0;\n\n\t\t/** @private */\n\t\tthis._bvh_max_x = 0;\n\n\t\t/** @private */\n\t\tthis._bvh_max_y = 0;\n\t}\n\n\t/**\n\t * Determines if the body is colliding with another body\n\t * @param {Circle|Polygon|Point} target The target body to test against\n\t * @param {Result} [result = null] A Result object on which to store information about the collision\n\t * @param {Boolean} [aabb = true] Set to false to skip the AABB test (useful if you use your own potential collision heuristic)\n\t * @returns {Boolean}\n\t */\n\tcollides(target, result = null, aabb = true) {\n\t\treturn Object(_SAT_mjs__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(this, target, result, aabb);\n\t}\n\n\t/**\n\t * Returns a list of potential collisions\n\t * @returns {Array<Body>}\n\t */\n\tpotentials() {\n\t\tconst bvh = this._bvh;\n\n\t\tif(bvh === null) {\n\t\t\tthrow new Error('Body does not belong to a collision system');\n\t\t}\n\n\t\treturn bvh.potentials(this);\n\t}\n\n\t/**\n\t * Removes the body from its current collision system\n\t */\n\tremove() {\n\t\tconst bvh = this._bvh;\n\n\t\tif(bvh) {\n\t\t\tbvh.remove(this, false);\n\t\t}\n\t}\n\n\t/**\n\t * Creates a {@link Result} used to collect the detailed results of a collision test\n\t */\n\tcreateResult() {\n\t\treturn new _Result_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n\t}\n\n\t/**\n\t * Creates a Result used to collect the detailed results of a collision test\n\t */\n\tstatic createResult() {\n\t\treturn new _Result_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n\t}\n};\n\n\n//# sourceURL=webpack:///./src/modules/Body.mjs?");
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Polygon; });\n/* harmony import */ var _Body_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Body.mjs */ \"./src/modules/Body.mjs\");\n\n\n/**\n * A polygon used to detect collisions\n * @class\n */\nclass Polygon extends _Body_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"]{\n\t/**\n\t * @constructor\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Array<Number[]>} [points = []] An array of coordinate pairs making up the polygon - [[x1, y1], [x2, y2], ...]\n\t * @param {Number} [angle = 0] The starting rotation in radians\n\t * @param {Number} [scale_x = 1] The starting scale along the X axis\n\t * @param {Number} [scale_y = 1] The starting scale long the Y axis\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t */\n\tconstructor(x=0,y=0,points=[],angle=0,scale_x=1,scale_y=1,padding=0){\n\t\tsuper(x,y,padding);\n\n\t\t/**\n\t\t * @desc The angle of the body in radians\n\t\t * @type {Number}\n\t\t */\n\t\tthis.angle=angle;\n\n\t\t/**\n\t\t * @desc The scale of the body along the X axis\n\t\t * @type {Number}\n\t\t */\n\t\tthis.scale_x=scale_x;\n\n\t\t/**\n\t\t * @desc The scale of the body along the Y axis\n\t\t * @type {Number}\n\t\t */\n\t\tthis.scale_y=scale_y;\n\n\n\t\t/** @private */\n\t\tthis._polygon=true;\n\n\t\t/** @private */\n\t\tthis._x=x;\n\n\t\t/** @private */\n\t\tthis._y=y;\n\n\t\t/** @private */\n\t\tthis._angle=angle;\n\n\t\t/** @private */\n\t\tthis._scale_x=scale_x;\n\n\t\t/** @private */\n\t\tthis._scale_y=scale_y;\n\n\t\t/** @private */\n\t\tthis._min_x=0;\n\n\t\t/** @private */\n\t\tthis._min_y=0;\n\n\t\t/** @private */\n\t\tthis._max_x=0;\n\n\t\t/** @private */\n\t\tthis._max_y=0;\n\n\t\t/** @private */\n\t\tthis._points=null;\n\n\t\t/** @private */\n\t\tthis._coords=null;\n\n\t\t/** @private */\n\t\tthis._edges=null;\n\n\t\t/** @private */\n\t\tthis._normals=null;\n\n\t\t/** @private */\n\t\tthis._dirty_coords=true;\n\n\t\t/** @private */\n\t\tthis._dirty_normals=true;\n\n\t\tPolygon.prototype.setPoints.call(this,points);\n\t}\n\n\t/**\n\t * Draws the polygon to a CanvasRenderingContext2D's current path\n\t * @param {CanvasRenderingContext2D} context The context to add the shape to\n\t */\n\tdraw(context){\n\t\tif(\n\t\t\tthis._dirty_coords||\n\t\t\tthis.x!==this._x||\n\t\t\tthis.y!==this._y||\n\t\t\tthis.angle!==this._angle||\n\t\t\tthis.scale_x!==this._scale_x||\n\t\t\tthis.scale_y!==this._scale_y\n\t\t){\n\t\t\tthis._calculateCoords();\n\t\t}\n\n\t\tconstcoords=this._coords;\n\n\t\tif(coords.length===2){\n\t\t\tcontext.moveTo(coords[0],coords[1]);\n\t\t\tcontext.arc(coords[0],coords[1],1,0,Math.PI*2);\n\t\t}\n\t\telse{\n\t\t\tcontext.moveTo(coords[0],coords[1]);\n\n\t\t\tfor(leti=2;i<coords.length;i+=2){\n\t\t\t\tcontext.lineTo(coords[i],coords[i+1]);\n\t\t\t}\n\n\t\t\tif(coords.length>4){\n\t\t\t\tcontext.lineTo(coords[0],coords[1]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Sets the points making up the polygon. It's important to use this function when changing the polygon's shape to ensure internal data is also updated.\n\t * @param {Array<Number[]>} new_points An array of coordinate pairs making up the polygon - [[x1, y1], [x2, y2], ...]\n\t */\n\tsetPoints(new_points){\n\t\tconstcount=new_points.length;\n\n\t\tthis._points=newFloat64Array(count*2);\n\t\tthis._coords=newFloat64Array(count*2);\n\t\tthis._edges=newFloat64Array(count*2);\n\t\tthis._normals=newFloat64Array(count*2);\n\n\t\tconstpoints=this._points;\n\n\t\tfor(leti=0,ix=0,iy=1;i<count;++i,ix+=2,iy+=2){\n\t\t\tconstnew_point=new_points[i];\n\n\t\t\tpoints[ix]=new_point[0];\n\t\t\tpoints[iy]=new_point[1];\n\t\t}\n\n\t\tthis._dirty_coords=true;\n\t
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Result; });\n/**\n * An object used to collect the detailed results of a collision test\n *\n * > **Note:** It is highly recommended you recycle the same Result object if possible in order to avoid wasting memory\n * @class\n */\nclass Result {\n\t/**\n\t * @constructor\n\t */\n\tconstructor() {\n\t\t/**\n\t\t * @desc True if a collision was detected\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis.collision = false;\n\n\t\t/**\n\t\t * @desc The source body tested\n\t\t * @type {Circle|Polygon|Point}\n\t\t */\n\t\tthis.a = null;\n\n\t\t/**\n\t\t * @desc The target body tested against\n\t\t * @type {Circle|Polygon|Point}\n\t\t */\n\t\tthis.b = null;\n\n\t\t/**\n\t\t * @desc True if A is completely contained within B\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis.a_in_b = false;\n\n\t\t/**\n\t\t * @desc True if B is completely contained within A\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis.b_in_a = false;\n\n\t\t/**\n\t\t * @desc The magnitude of the shortest axis of overlap\n\t\t * @type {Number}\n\t\t */\n\t\tthis.overlap = 0;\n\n\t\t/**\n\t\t * @desc The X direction of the shortest axis of overlap\n\t\t * @type {Number}\n\t\t */\n\t\tthis.overlap_x = 0;\n\n\t\t/**\n\t\t * @desc The Y direction of the shortest axis of overlap\n\t\t * @type {Number}\n\t\t */\n\t\tthis.overlap_y = 0;\n\t}\n};\n\n\n//# sourceURL=webpack:///./src/modules/Result.mjs?");
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */__webpack_require__.d(__webpack_exports__,\"default\",function(){returnSAT;});\n/**\n * Determines if two bodies are colliding using the Separating Axis Theorem\n * @private\n * @param {Circle|Polygon|Point} a The source body to test\n * @param {Circle|Polygon|Point} b The target body to test against\n * @param {Result} [result = null] A Result object on which to store information about the collision\n * @param {Boolean} [aabb = true] Set to false to skip the AABB test (useful if you use your own collision heuristic)\n * @returns {Boolean}\n */\nfunctionSAT(a,b,result=null,aabb=true){\n\tconsta_polygon=a._polygon;\n\tconstb_polygon=b._polygon;\n\n\tletcollision=false;\n\n\tif(result){\n\t\tresult.a=a;\n\t\tresult.b=b;\n\t\tresult.a_in_b=true;\n\t\tresult.b_in_a=true;\n\t\tresult.overlap=null;\n\t\tresult.overlap_x=0;\n\t\tresult.overlap_y=0;\n\t}\n\n\tif(a_polygon){\n\t\tif(\n\t\t\ta._dirty_coords||\n\t\t\ta.x!==a._x||\n\t\t\ta.y!==a._y||\n\t\t\ta.angle!==a._angle||\n\t\t\ta.scale_x!==a._scale_x||\n\t\t\ta.scale_y!==a._scale_y\n\t\t){\n\t\t\ta._calculateCoords();\n\t\t}\n\t}\n\n\tif(b_polygon){\n\t\tif(\n\t\t\tb._dirty_coords||\n\t\t\tb.x!==b._x||\n\t\t\tb.y!==b._y||\n\t\t\tb.angle!==b._angle||\n\t\t\tb.scale_x!==b._scale_x||\n\t\t\tb.scale_y!==b._scale_y\n\t\t){\n\t\t\tb._calculateCoords();\n\t\t}\n\t}\n\n\tif(!aabb||aabbAABB(a,b)){\n\t\tif(a_polygon&&a._dirty_normals){\n\t\t\ta._calculateNormals();\n\t\t}\n\n\t\tif(b_polygon&&b._dirty_normals){\n\t\t\tb._calculateNormals();\n\t\t}\n\n\t\tcollision=(\n\t\t\ta_polygon&&b_polygon?polygonPolygon(a,b,result):\n\t\t\ta_polygon?polygonCircle(a,b,result,false):\n\t\t\tb_polygon?polygonCircle(b,a,result,true):\n\t\t\tcircleCircle(a,b,result)\n\t\t);\n\t}\n\n\tif(result){\n\t\tresult.collision=collision;\n\t}\n\n\treturncollision;\n};\n\n/**\n * Determines if two bodies' axis aligned bounding boxes are colliding\n * @param {Circle|Polygon|Point} a The source body to test\n * @param {Circle|Polygon|Point} b The target body to test against\n */\nfunctionaabbAABB(a,b){\n\tconsta_polygon=a._polygon;\n\tconsta_x=a_polygon?0:a.x;\n\tconsta_y=a_polygon?0:a.y;\n\tconsta_radius=a_polygon?0:a.radius*a.scale;\n\tconsta_min_x=a_polygon?a._min_x:a_x-a_radius;\n\tconsta_min_y=a_polygon?a._min_y:a_y-a_radius;\n\tconsta_max_x=a_polygon?a._max_x:a_x+a_radius;\n\tconsta_max_y=a_polygon?a._max_y:a_y+a_radius;\n\n\tconstb_polygon=b._polygon;\n\tconstb_x=b_polygon?0:b.x;\n\tconstb_y=b_polygon?0:b.y;\n\tconstb_radius=b_polygon?0:b.radius*b.scale;\n\tconstb_min_x=b_polygon?b._min_x:b_x-b_radius;\n\tconstb_min_y=b_polygon?b._min_y:b_y-b_radius;\n\tconstb_max_x=b_polygon?b._max_x:b_x+b_radius;\n\tconstb_max_y=b_polygon?b._max_y:b_y+b_radius;\n\n\treturna_min_x<b_max_x&&a_min_y<b_max_y&&a_max_x>b_min_x&&a_max_y>b_min_y;\n}\n\n/**\n * Determines if two polygons are colliding\n * @param {Polygon} a The source polygon to test\n * @param {Polygon} b The target polygon to test against\n * @param {Result} [result = null] A Result object on which to store information about the collision\n * @returns {Boolean}\n */\nfunctionpolygonPolygon(a,b,result=null){\n\tconsta_count=a._coords.length;\n\tconstb_count=b._coords.length;\n\n\t// Handle points specially\n\tif(a_count === 2 && b_count === 2) {\n\t\tconst a_coords = a._coords;\n\t\tconst b_coords = b._coords;\n\n\t\tif(result) {\n\t\t\tresult.overlap = 0;\n\t\t}\n\n\t\treturn a_coords[0] === b_coords[0] && a_coords[1] === b_coords[1];\n\t}\n\n\tconst a_coords = a._coords;\n\tconst b_coords = b._coords;\n\tconst a_normals = a._normals;\n\tconst b_normals = b._normals;\n\n\tif(a_count > 2) {\n\t\tfor(let ix = 0, iy = 1; ix < a_cou