diff --git a/dist/base-system.d.ts b/dist/base-system.d.ts index 4837827..20ac2c0 100644 --- a/dist/base-system.d.ts +++ b/dist/base-system.d.ts @@ -35,7 +35,7 @@ export declare class BaseSystem extends RBush */ createPolygon(position: PotentialVector, points: PotentialVector[], options?: BodyOptions): Polygon; /** - * re-insert body into collision tree and update its aabb + * re-insert body into collision tree and update its bbox * every body can be part of only one system */ insert(body: TBody): RBush; diff --git a/dist/base-system.js b/dist/base-system.js index 2c51640..31ab232 100644 --- a/dist/base-system.js +++ b/dist/base-system.js @@ -63,7 +63,7 @@ class BaseSystem extends model_1.RBush { return polygon; } /** - * re-insert body into collision tree and update its aabb + * re-insert body into collision tree and update its bbox * every body can be part of only one system */ insert(body) { @@ -81,8 +81,6 @@ class BaseSystem extends model_1.RBush { body.minY = body.bbox.minY - body.padding; body.maxX = body.bbox.maxX + body.padding; body.maxY = body.bbox.maxY + body.padding; - // set system for later body.system.updateBody(body) - body.system = this; // reinsert bounding box to collision tree return super.insert(body); } diff --git a/dist/bodies/circle.d.ts b/dist/bodies/circle.d.ts index 782ab8e..427848f 100644 --- a/dist/bodies/circle.d.ts +++ b/dist/bodies/circle.d.ts @@ -1,6 +1,6 @@ import { BBox } from "rbush"; import { Circle as SATCircle } from "sat"; -import { BaseSystem } from "../base-system"; +import { System } from "../system"; import { BodyGroup, BodyOptions, BodyProps, BodyType, PotentialVector, SATVector, Vector } from "../model"; /** * collider - circle @@ -53,7 +53,7 @@ export declare class Circle extends SATCircle implements BBox, BodyProps { /** * reference to collision system */ - system?: BaseSystem; + system?: System; /** * was the polygon modified and needs update in the next checkCollision */ diff --git a/dist/demo/demo.js b/dist/demo/demo.js index 4b22658..42d4b55 100644 --- a/dist/demo/demo.js +++ b/dist/demo/demo.js @@ -2124,7 +2124,7 @@ class BaseSystem extends model_1.RBush { return polygon; } /** - * re-insert body into collision tree and update its aabb + * re-insert body into collision tree and update its bbox * every body can be part of only one system */ insert(body) { @@ -2142,8 +2142,6 @@ class BaseSystem extends model_1.RBush { body.minY = body.bbox.minY - body.padding; body.maxX = body.bbox.maxX + body.padding; body.maxY = body.bbox.maxY + body.padding; - // set system for later body.system.updateBody(body) - body.system = this; // reinsert bounding box to collision tree return super.insert(body); } @@ -3319,7 +3317,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.BodyGroup = exports.getGroup = exports.BodyType = exports.SATCircle = exports.SATPolygon = exports.SATVector = exports.Response = exports.RBush = exports.isSimple = exports.bin2dec = void 0; +exports.BodyGroup = exports.getGroup = exports.BodyType = exports.SATCircle = exports.SATPolygon = exports.SATVector = exports.Response = exports.RBush = exports.isSimple = void 0; const rbush_1 = __importDefault(__webpack_require__(/*! rbush */ "./node_modules/rbush/rbush.min.js")); Object.defineProperty(exports, "RBush", ({ enumerable: true, get: function () { return rbush_1.default; } })); const sat_1 = __webpack_require__(/*! sat */ "./node_modules/sat/SAT.js"); @@ -3327,13 +3325,6 @@ Object.defineProperty(exports, "SATCircle", ({ enumerable: true, get: function ( Object.defineProperty(exports, "SATPolygon", ({ enumerable: true, get: function () { return sat_1.Polygon; } })); Object.defineProperty(exports, "Response", ({ enumerable: true, get: function () { return sat_1.Response; } })); Object.defineProperty(exports, "SATVector", ({ enumerable: true, get: function () { return sat_1.Vector; } })); -/** - * binary string to decimal number - */ -function bin2dec(binary) { - return Number(`0b${binary}`.replace(/\s/g, "")); -} -exports.bin2dec = bin2dec; var poly_decomp_es_1 = __webpack_require__(/*! poly-decomp-es */ "./node_modules/poly-decomp-es/dist/poly-decomp-es.js"); Object.defineProperty(exports, "isSimple", ({ enumerable: true, get: function () { return poly_decomp_es_1.isSimple; } })); /** @@ -3482,6 +3473,16 @@ class System extends base_system_1.BaseSystem { */ this.response = new model_1.Response(); } + /** + * re-insert body into collision tree and update its bbox + * every body can be part of only one system + */ + insert(body) { + const insertResult = super.insert(body); + // set system for later body.system.updateBody(body) + body.system = this; + return insertResult; + } /** * separate (move away) bodies */ @@ -3524,6 +3525,16 @@ class System extends base_system_1.BaseSystem { }; return (0, optimized_1.some)(bodies, checkCollision); } + /** + * callback all bodies in area + */ + checkArea(area, callback = utils_1.returnTrue, response = this.response) { + const bodies = this.search(area); + const checkOne = (body) => { + return this.checkOne(body, callback, response); + }; + return (0, optimized_1.some)(bodies, checkOne); + } /** * check all bodies collisions with callback */ @@ -3630,7 +3641,7 @@ exports.System = System; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.returnTrue = exports.cloneResponse = exports.drawBVH = exports.drawPolygon = exports.dashLineTo = exports.getSATTest = exports.getBounceDirection = exports.mapArrayToVector = exports.mapVectorToArray = exports.clonePointsArray = exports.checkAInB = exports.areSameGroup = exports.intersectAABB = exports.notIntersectAABB = exports.bodyMoved = exports.extendBody = exports.clockwise = exports.distance = exports.ensurePolygonPoints = exports.ensureVectorPoint = exports.createBox = exports.createEllipse = exports.rad2deg = exports.deg2rad = exports.RAD2DEG = exports.DEG2RAD = void 0; +exports.bin2dec = exports.returnTrue = exports.cloneResponse = exports.drawBVH = exports.drawPolygon = exports.dashLineTo = exports.getSATTest = exports.getBounceDirection = exports.mapArrayToVector = exports.mapVectorToArray = exports.clonePointsArray = exports.checkAInB = exports.areSameGroup = exports.intersectAABB = exports.notIntersectAABB = exports.bodyMoved = exports.extendBody = exports.clockwise = exports.distance = exports.ensurePolygonPoints = exports.ensureVectorPoint = exports.createBox = exports.createEllipse = exports.rad2deg = exports.deg2rad = exports.RAD2DEG = exports.DEG2RAD = void 0; const sat_1 = __webpack_require__(/*! sat */ "./node_modules/sat/SAT.js"); const intersect_1 = __webpack_require__(/*! ./intersect */ "./src/intersect.ts"); const model_1 = __webpack_require__(/*! ./model */ "./src/model.ts"); @@ -3917,6 +3928,13 @@ function returnTrue() { return true; } exports.returnTrue = returnTrue; +/** + * binary string to decimal number + */ +function bin2dec(binary) { + return Number(`0b${binary}`.replace(/\s/g, "")); +} +exports.bin2dec = bin2dec; /***/ }), @@ -4030,34 +4048,34 @@ module.exports.height = height; \****************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -const { BodyGroup } = __webpack_require__(/*! ../model */ "./src/model.ts") -const { System } = __webpack_require__(/*! ../system */ "./src/system.ts") -const { getBounceDirection } = __webpack_require__(/*! ../utils */ "./src/utils.ts") -const { width, height, loop } = __webpack_require__(/*! ./canvas */ "./src/demo/canvas.js") -const seededRandom = (__webpack_require__(/*! random-seed */ "./node_modules/random-seed/index.js").create)("@Prozi").random +const { BodyGroup } = __webpack_require__(/*! ../model */ "./src/model.ts"); +const { System } = __webpack_require__(/*! ../system */ "./src/system.ts"); +const { getBounceDirection } = __webpack_require__(/*! ../utils */ "./src/utils.ts"); +const { width, height, loop } = __webpack_require__(/*! ./canvas */ "./src/demo/canvas.js"); +const seededRandom = (__webpack_require__(/*! random-seed */ "./node_modules/random-seed/index.js").create)("@Prozi").random; function random(min, max) { - return Math.floor(seededRandom() * max) + min + return Math.floor(seededRandom() * max) + min; } class Stress { constructor(count = 2000) { - this.size = Math.sqrt((width * height) / (count * 50)) - - this.physics = new System(5) - this.bodies = [] - this.polygons = 0 - this.boxes = 0 - this.circles = 0 - this.ellipses = 0 - this.lines = 0 - this.lastVariant = 0 - this.count = count - this.bounds = this.getBounds() - this.enableFiltering = false + this.size = Math.sqrt((width * height) / (count * 50)); + + this.physics = new System(5); + this.bodies = []; + this.polygons = 0; + this.boxes = 0; + this.circles = 0; + this.ellipses = 0; + this.lines = 0; + this.lastVariant = 0; + this.count = count; + this.bounds = this.getBounds(); + this.enableFiltering = false; for (let i = 0; i < count; ++i) { - this.createShape(!random(0, 20)) + this.createShape(!random(0, 20)); } this.legend = `
Total: ${count}
@@ -4071,10 +4089,10 @@ class Stress { Enable Collision Filtering - ` + `; - this.lastTime = Date.now() - this.updateBody = this.updateBody.bind(this) + this.lastTime = Date.now(); + this.updateBody = this.updateBody.bind(this); // observer #debug & add filtering checkbox event const observer = new window.MutationObserver((mutations) => { @@ -4083,20 +4101,20 @@ class Stress { if (node.id == "debug") { document .querySelector("#filtering") - .addEventListener("change", () => this.toggleFiltering()) - observer.disconnect() + .addEventListener("change", () => this.toggleFiltering()); + observer.disconnect(); } - }) - }) - }) + }); + }); + }); observer.observe(document.querySelector("body"), { subtree: false, childList: true, - }) + }); this.start = () => { - loop(this.update.bind(this)) - } + loop(this.update.bind(this)); + }; } getBounds() { @@ -4113,152 +4131,152 @@ class Stress { this.physics.createBox({ x: 0, y: 0 }, 10, height, { isStatic: true, }), - ] + ]; } toggleFiltering() { - this.enableFiltering = !this.enableFiltering - this.physics.clear() - this.bodies.length = 0 - this.polygons = 0 - this.boxes = 0 - this.circles = 0 - this.ellipses = 0 - this.lines = 0 - this.lastVariant = 0 - this.bounds = this.getBounds() + this.enableFiltering = !this.enableFiltering; + this.physics.clear(); + this.bodies.length = 0; + this.polygons = 0; + this.boxes = 0; + this.circles = 0; + this.ellipses = 0; + this.lines = 0; + this.lastVariant = 0; + this.bounds = this.getBounds(); for (let i = 0; i < this.count; ++i) { - this.createShape(!random(0, 20)) + this.createShape(!random(0, 20)); } } update() { - const now = Date.now() - this.timeScale = Math.min(1000, now - this.lastTime) / 60 - this.lastTime = now - this.bodies.forEach(this.updateBody) + const now = Date.now(); + this.timeScale = Math.min(1000, now - this.lastTime) / 60; + this.lastTime = now; + this.bodies.forEach(this.updateBody); } updateBody(body) { - body.setAngle(body.angle + body.rotationSpeed * this.timeScale, false) + body.setAngle(body.angle + body.rotationSpeed * this.timeScale, false); if (seededRandom() < 0.05 * this.timeScale) { - body.targetScale.x = 0.5 + seededRandom() + body.targetScale.x = 0.5 + seededRandom(); } if (seededRandom() < 0.05 * this.timeScale) { - body.targetScale.y = 0.5 + seededRandom() + body.targetScale.y = 0.5 + seededRandom(); } if (Math.abs(body.targetScale.x - body.scaleX) > 0.01) { const scaleX = body.scaleX + - Math.sign(body.targetScale.x - body.scaleX) * 0.02 * this.timeScale + Math.sign(body.targetScale.x - body.scaleX) * 0.02 * this.timeScale; const scaleY = body.scaleY + - Math.sign(body.targetScale.y - body.scaleY) * 0.02 * this.timeScale + Math.sign(body.targetScale.y - body.scaleY) * 0.02 * this.timeScale; - body.setScale(scaleX, scaleY, false) + body.setScale(scaleX, scaleY, false); } // as last step update position, and bounding box body.setPosition( body.x + body.directionX * this.timeScale, - body.y + body.directionY * this.timeScale - ) + body.y + body.directionY * this.timeScale, + ); // separate + bounce - this.bounceBody(body) + this.bounceBody(body); } bounceBody(body) { - const bounces = { x: 0, y: 0 } + const bounces = { x: 0, y: 0 }; const addBounces = ({ overlapV: { x, y } }) => { - bounces.x += x - bounces.y += y - } + bounces.x += x; + bounces.y += y; + }; - this.physics.checkOne(body, addBounces) + this.physics.checkOne(body, addBounces); if (bounces.x || bounces.y) { - const size = 0.5 * (body.scaleX + body.scaleY) + const size = 0.5 * (body.scaleX + body.scaleY); const bounce = getBounceDirection(body, { x: body.x + bounces.x, y: body.y + bounces.y, - }) + }); bounce.scale(body.size).add({ x: body.directionX * size, y: body.directionY * size, - }) + }); - const { x, y } = bounce.normalize() + const { x, y } = bounce.normalize(); - body.directionX = x - body.directionY = y - body.rotationSpeed = (seededRandom() - seededRandom()) * 0.1 + body.directionX = x; + body.directionY = y; + body.rotationSpeed = (seededRandom() - seededRandom()) * 0.1; - body.setPosition(body.x - bounces.x, body.y - bounces.y) + body.setPosition(body.x - bounces.x, body.y - bounces.y); } } createShape(large) { - const minSize = this.size * 1.0 * (large ? seededRandom() + 1 : 1) - const maxSize = this.size * 1.25 * (large ? seededRandom() * 2 + 1 : 1) - const x = random(0, width) - const y = random(0, height) - const direction = (random(0, 360) * Math.PI) / 180 + const minSize = this.size * 1.0 * (large ? seededRandom() + 1 : 1); + const maxSize = this.size * 1.25 * (large ? seededRandom() * 2 + 1 : 1); + const x = random(0, width); + const y = random(0, height); + const direction = (random(0, 360) * Math.PI) / 180; const options = { isCentered: true, padding: (minSize + maxSize) * 0.2, - } + }; - let body - let variant = this.lastVariant++ % 5 + let body; + let variant = this.lastVariant++ % 5; switch (variant) { case 0: if (this.enableFiltering) { - options.group = BodyGroup.Circle + options.group = BodyGroup.Circle; } body = this.physics.createCircle( { x, y }, random(minSize, maxSize) / 2, - options - ) + options, + ); - ++this.circles - break + ++this.circles; + break; case 1: - const width = random(minSize, maxSize) - const height = random(minSize, maxSize) + const width = random(minSize, maxSize); + const height = random(minSize, maxSize); if (this.enableFiltering) { - options.group = BodyGroup.Ellipse - console.log() + options.group = BodyGroup.Ellipse; + console.log(); } - body = this.physics.createEllipse({ x, y }, width, height, 2, options) + body = this.physics.createEllipse({ x, y }, width, height, 2, options); - ++this.ellipses - break + ++this.ellipses; + break; case 2: if (this.enableFiltering) { - options.group = BodyGroup.Box + options.group = BodyGroup.Box; } body = this.physics.createBox( { x, y }, random(minSize, maxSize), random(minSize, maxSize), - options - ) + options, + ); - ++this.boxes - break + ++this.boxes; + break; case 3: if (this.enableFiltering) { - options.group = BodyGroup.Line + options.group = BodyGroup.Line; } body = this.physics.createLine( { x, y }, @@ -4266,15 +4284,15 @@ class Stress { x: x + random(minSize, maxSize), y: y + random(minSize, maxSize), }, - options - ) + options, + ); - ++this.lines - break + ++this.lines; + break; default: if (this.enableFiltering) { - options.group = BodyGroup.Polygon + options.group = BodyGroup.Polygon; } body = this.physics.createPolygon( { x, y }, @@ -4284,28 +4302,28 @@ class Stress { { x: random(minSize, maxSize), y: -random(minSize, maxSize) }, { x: -random(minSize, maxSize), y: -random(minSize, maxSize) }, ], - options - ) + options, + ); - ++this.polygons - break + ++this.polygons; + break; } // set initial rotation angle direction - body.rotationSpeed = (seededRandom() - seededRandom()) * 0.1 - body.setAngle((random(0, 360) * Math.PI) / 180) + body.rotationSpeed = (seededRandom() - seededRandom()) * 0.1; + body.setAngle((random(0, 360) * Math.PI) / 180); - body.targetScale = { x: 1, y: 1 } - body.size = (minSize + maxSize) / 2 + body.targetScale = { x: 1, y: 1 }; + body.size = (minSize + maxSize) / 2; - body.directionX = Math.cos(direction) - body.directionY = Math.sin(direction) + body.directionX = Math.cos(direction); + body.directionY = Math.sin(direction); - this.bodies.push(body) + this.bodies.push(body); } } -module.exports = Stress +module.exports = Stress; /***/ }), diff --git a/dist/model.d.ts b/dist/model.d.ts index cf914c3..15ff909 100644 --- a/dist/model.d.ts +++ b/dist/model.d.ts @@ -1,16 +1,12 @@ import { BBox, default as RBush } from "rbush"; import { Circle as SATCircle, Polygon as SATPolygon, Response, Vector as SATVector } from "sat"; -import { BaseSystem } from "./base-system"; +import { System } from "./system"; import { Box } from "./bodies/box"; import { Circle } from "./bodies/circle"; import { Ellipse } from "./bodies/ellipse"; import { Line } from "./bodies/line"; import { Point } from "./bodies/point"; import { Polygon } from "./bodies/polygon"; -/** - * binary string to decimal number - */ -export declare function bin2dec(binary: string): number; export { Polygon as DecompPolygon, Point as DecompPoint, isSimple } from "poly-decomp-es"; export { RBush, BBox, Response, SATVector, SATPolygon, SATCircle }; export type CollisionCallback = (response: Response) => boolean | void; @@ -149,7 +145,7 @@ export interface BodyProps extends Required { /** * collisions system reference */ - system?: BaseSystem; + system?: System; /** * was the body modified and needs update in the next checkCollision */ diff --git a/dist/model.js b/dist/model.js index ae0a1f0..b3577b4 100644 --- a/dist/model.js +++ b/dist/model.js @@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.BodyGroup = exports.getGroup = exports.BodyType = exports.SATCircle = exports.SATPolygon = exports.SATVector = exports.Response = exports.RBush = exports.isSimple = exports.bin2dec = void 0; +exports.BodyGroup = exports.getGroup = exports.BodyType = exports.SATCircle = exports.SATPolygon = exports.SATVector = exports.Response = exports.RBush = exports.isSimple = void 0; const rbush_1 = __importDefault(require("rbush")); Object.defineProperty(exports, "RBush", { enumerable: true, get: function () { return rbush_1.default; } }); const sat_1 = require("sat"); @@ -11,13 +11,6 @@ Object.defineProperty(exports, "SATCircle", { enumerable: true, get: function () Object.defineProperty(exports, "SATPolygon", { enumerable: true, get: function () { return sat_1.Polygon; } }); Object.defineProperty(exports, "Response", { enumerable: true, get: function () { return sat_1.Response; } }); Object.defineProperty(exports, "SATVector", { enumerable: true, get: function () { return sat_1.Vector; } }); -/** - * binary string to decimal number - */ -function bin2dec(binary) { - return Number(`0b${binary}`.replace(/\s/g, "")); -} -exports.bin2dec = bin2dec; var poly_decomp_es_1 = require("poly-decomp-es"); Object.defineProperty(exports, "isSimple", { enumerable: true, get: function () { return poly_decomp_es_1.isSimple; } }); /** diff --git a/dist/system.d.ts b/dist/system.d.ts index a505686..ae8bb16 100644 --- a/dist/system.d.ts +++ b/dist/system.d.ts @@ -1,7 +1,7 @@ /// import { BaseSystem } from "./base-system"; import { Line } from "./bodies/line"; -import { Body, CollisionCallback, RaycastHit, Response, Vector } from "./model"; +import { BBox, Body, CollisionCallback, RBush, RaycastHit, Response, Vector } from "./model"; /** * collision system */ @@ -14,6 +14,11 @@ export declare class System extends BaseSystem * for raycasting */ protected ray: Line; + /** + * re-insert body into collision tree and update its bbox + * every body can be part of only one system + */ + insert(body: TBody): RBush; /** * separate (move away) bodies */ @@ -26,6 +31,10 @@ export declare class System extends BaseSystem * check one body collisions with callback */ checkOne(body: TBody, callback?: CollisionCallback, response?: Response): boolean; + /** + * callback all bodies in area + */ + checkArea(area: BBox, callback?: CollisionCallback, response?: Response): boolean; /** * check all bodies collisions with callback */ diff --git a/dist/system.js b/dist/system.js index 3d33d89..f79d42b 100644 --- a/dist/system.js +++ b/dist/system.js @@ -18,6 +18,16 @@ class System extends base_system_1.BaseSystem { */ this.response = new model_1.Response(); } + /** + * re-insert body into collision tree and update its bbox + * every body can be part of only one system + */ + insert(body) { + const insertResult = super.insert(body); + // set system for later body.system.updateBody(body) + body.system = this; + return insertResult; + } /** * separate (move away) bodies */ @@ -60,6 +70,16 @@ class System extends base_system_1.BaseSystem { }; return (0, optimized_1.some)(bodies, checkCollision); } + /** + * callback all bodies in area + */ + checkArea(area, callback = utils_1.returnTrue, response = this.response) { + const bodies = this.search(area); + const checkOne = (body) => { + return this.checkOne(body, callback, response); + }; + return (0, optimized_1.some)(bodies, checkOne); + } /** * check all bodies collisions with callback */ diff --git a/dist/utils.d.ts b/dist/utils.d.ts index c2e3c32..da63702 100644 --- a/dist/utils.d.ts +++ b/dist/utils.d.ts @@ -103,3 +103,7 @@ export declare function cloneResponse(response: Response): Response; * dummy fn used as default, for optimization */ export declare function returnTrue(): boolean; +/** + * binary string to decimal number + */ +export declare function bin2dec(binary: string): number; diff --git a/dist/utils.js b/dist/utils.js index 337b3bf..6156e64 100644 --- a/dist/utils.js +++ b/dist/utils.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.returnTrue = exports.cloneResponse = exports.drawBVH = exports.drawPolygon = exports.dashLineTo = exports.getSATTest = exports.getBounceDirection = exports.mapArrayToVector = exports.mapVectorToArray = exports.clonePointsArray = exports.checkAInB = exports.areSameGroup = exports.intersectAABB = exports.notIntersectAABB = exports.bodyMoved = exports.extendBody = exports.clockwise = exports.distance = exports.ensurePolygonPoints = exports.ensureVectorPoint = exports.createBox = exports.createEllipse = exports.rad2deg = exports.deg2rad = exports.RAD2DEG = exports.DEG2RAD = void 0; +exports.bin2dec = exports.returnTrue = exports.cloneResponse = exports.drawBVH = exports.drawPolygon = exports.dashLineTo = exports.getSATTest = exports.getBounceDirection = exports.mapArrayToVector = exports.mapVectorToArray = exports.clonePointsArray = exports.checkAInB = exports.areSameGroup = exports.intersectAABB = exports.notIntersectAABB = exports.bodyMoved = exports.extendBody = exports.clockwise = exports.distance = exports.ensurePolygonPoints = exports.ensureVectorPoint = exports.createBox = exports.createEllipse = exports.rad2deg = exports.deg2rad = exports.RAD2DEG = exports.DEG2RAD = void 0; const sat_1 = require("sat"); const intersect_1 = require("./intersect"); const model_1 = require("./model"); @@ -287,3 +287,10 @@ function returnTrue() { return true; } exports.returnTrue = returnTrue; +/** + * binary string to decimal number + */ +function bin2dec(binary) { + return Number(`0b${binary}`.replace(/\s/g, "")); +} +exports.bin2dec = bin2dec; diff --git a/docs/assets/search.js b/docs/assets/search.js index e3c2bc6..c6c51b9 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1,2 +1,2 @@ window.searchData = - "data:application/octet-stream;base64,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"; + "data:application/octet-stream;base64,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"; diff --git a/docs/classes/Circle.html b/docs/classes/Circle.html index 093ada5..8a842ce 100644 --- a/docs/classes/Circle.html +++ b/docs/classes/Circle.html @@ -1103,7 +1103,8 @@
  • Defined in src/system.ts:31src/system.ts:33
  • @@ -187,6 +187,11 @@

    Methods

    checkAll + + checkArea Methods getPotentials - insert
  • Defined in src/system.ts:40src/system.ts:42
  • @@ -605,8 +608,8 @@

  • Defined in src/system.ts:101src/system.ts:131 +
  • + + + + + +
    + + +
      + +
    • +
      +

      callback all bodies in area

      +
      +
      +

      Parameters

      + +
      +

      + Returns boolean +

      +
      +
    @@ -922,8 +1017,8 @@

  • Defined in src/system.ts:75src/system.ts:89
  • @@ -1904,8 +1999,8 @@

  • Defined in src/base-system.ts:164src/base-system.ts:161
  • @@ -1966,8 +2061,8 @@

  • Defined in src/base-system.ts:173src/base-system.ts:170
  • @@ -2141,8 +2236,8 @@

    Deprecated

  • Defined in src/base-system.ts:198src/base-system.ts:195
  • @@ -2150,7 +2245,7 @@

    Deprecated

    -
    +
    -
      +
      • - re-insert body into collision tree and update its aabb every + re-insert body into collision tree and update its bbox every body can be part of only one system

        @@ -2218,13 +2313,13 @@

      @@ -2577,8 +2672,8 @@

    • Defined in src/base-system.ts:188src/base-system.ts:185
    @@ -2708,8 +2803,8 @@

  • Defined in src/system.ts:45src/system.ts:59
  • @@ -2774,8 +2869,8 @@

  • Defined in src/system.ts:54src/system.ts:68
  • @@ -3050,8 +3145,8 @@

  • Defined in src/base-system.ts:206src/base-system.ts:203
  • @@ -3098,8 +3193,8 @@

  • Defined in src/base-system.ts:155src/base-system.ts:152
  • @@ -3165,8 +3260,8 @@

  • Defined in src/base-system.ts:148src/base-system.ts:145
  • @@ -3368,6 +3463,10 @@

    > checkAll + checkArea > getPotentials insert { + return this.checkOne(body, callback, response); + }; + return (0, optimized_1.some)(bodies, checkOne); + } /** * check all bodies collisions with callback */ @@ -4537,7 +4551,8 @@ which is good. See: http://baagoe.com/en/RandomMusings/hash/avalanche.xhtml "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - exports.returnTrue = + exports.bin2dec = + exports.returnTrue = exports.cloneResponse = exports.drawBVH = exports.drawPolygon = @@ -4886,6 +4901,13 @@ which is good. See: http://baagoe.com/en/RandomMusings/hash/avalanche.xhtml return true; } exports.returnTrue = returnTrue; + /** + * binary string to decimal number + */ + function bin2dec(binary) { + return Number(`0b${binary}`.replace(/\s/g, "")); + } + exports.bin2dec = bin2dec; /***/ }, diff --git a/docs/enums/BodyGroup.html b/docs/enums/BodyGroup.html index d6ec083..0d425f1 100644 --- a/docs/enums/BodyGroup.html +++ b/docs/enums/BodyGroup.html @@ -73,8 +73,8 @@

    Enumeration BodyGroup

  • Defined in src/model.ts:58src/model.ts:51
  • @@ -156,8 +156,8 @@

    Enumeration BodyType

  • Defined in src/model.ts:37src/model.ts:30
  • @@ -156,8 +156,8 @@

  • Defined in src/model.ts:20src/utils.ts:382
  • diff --git a/docs/functions/ensureConvex.html b/docs/functions/ensureConvex.html index f43015a..6a5554f 100644 --- a/docs/functions/ensureConvex.html +++ b/docs/functions/ensureConvex.html @@ -123,14 +123,14 @@

    Type Parameters

    >Polygon | CirclePoint | PointCircle diff --git a/docs/functions/getGroup.html b/docs/functions/getGroup.html index 2142785..b590321 100644 --- a/docs/functions/getGroup.html +++ b/docs/functions/getGroup.html @@ -104,8 +104,8 @@

  • Defined in src/model.ts:49src/model.ts:42
  • diff --git a/docs/interfaces/BodyOptions.html b/docs/interfaces/BodyOptions.html index 20573a1..50b1e30 100644 --- a/docs/interfaces/BodyOptions.html +++ b/docs/interfaces/BodyOptions.html @@ -111,8 +111,8 @@

    Interface BodyOptions

  • Defined in src/model.ts:91src/model.ts:84
  • @@ -199,8 +199,8 @@

    Interface BodyProps

    >;
        system?: BaseSystemSystem<Implemented by

  • Defined in src/model.ts:162src/model.ts:155
  • @@ -510,8 +513,8 @@