You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.5 KiB
JavaScript
96 lines
2.5 KiB
JavaScript
import RBush from "../ThirdParty/rbush.js";
|
|
import Check from "./Check.js";
|
|
|
|
/**
|
|
* Wrapper around rbush for use with Rectangle types.
|
|
* @private
|
|
*/
|
|
function RectangleCollisionChecker() {
|
|
this._tree = new RBush();
|
|
}
|
|
|
|
function RectangleWithId() {
|
|
this.minX = 0.0;
|
|
this.minY = 0.0;
|
|
this.maxX = 0.0;
|
|
this.maxY = 0.0;
|
|
this.id = "";
|
|
}
|
|
|
|
RectangleWithId.fromRectangleAndId = function (id, rectangle, result) {
|
|
result.minX = rectangle.west;
|
|
result.minY = rectangle.south;
|
|
result.maxX = rectangle.east;
|
|
result.maxY = rectangle.north;
|
|
result.id = id;
|
|
return result;
|
|
};
|
|
|
|
/**
|
|
* Insert a rectangle into the collision checker.
|
|
*
|
|
* @param {String} id Unique string ID for the rectangle being inserted.
|
|
* @param {Rectangle} rectangle A Rectangle
|
|
* @private
|
|
*/
|
|
RectangleCollisionChecker.prototype.insert = function (id, rectangle) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
Check.typeOf.string("id", id);
|
|
Check.typeOf.object("rectangle", rectangle);
|
|
//>>includeEnd('debug');
|
|
|
|
var withId = RectangleWithId.fromRectangleAndId(
|
|
id,
|
|
rectangle,
|
|
new RectangleWithId()
|
|
);
|
|
this._tree.insert(withId);
|
|
};
|
|
|
|
function idCompare(a, b) {
|
|
return a.id === b.id;
|
|
}
|
|
|
|
var removalScratch = new RectangleWithId();
|
|
/**
|
|
* Remove a rectangle from the collision checker.
|
|
*
|
|
* @param {String} id Unique string ID for the rectangle being removed.
|
|
* @param {Rectangle} rectangle A Rectangle
|
|
* @private
|
|
*/
|
|
RectangleCollisionChecker.prototype.remove = function (id, rectangle) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
Check.typeOf.string("id", id);
|
|
Check.typeOf.object("rectangle", rectangle);
|
|
//>>includeEnd('debug');
|
|
|
|
var withId = RectangleWithId.fromRectangleAndId(
|
|
id,
|
|
rectangle,
|
|
removalScratch
|
|
);
|
|
this._tree.remove(withId, idCompare);
|
|
};
|
|
|
|
var collisionScratch = new RectangleWithId();
|
|
/**
|
|
* Checks if a given rectangle collides with any of the rectangles in the collection.
|
|
*
|
|
* @param {Rectangle} rectangle A Rectangle that should be checked against the rectangles in the collision checker.
|
|
* @returns {Boolean} Whether the rectangle collides with any of the rectangles in the collision checker.
|
|
*/
|
|
RectangleCollisionChecker.prototype.collides = function (rectangle) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
Check.typeOf.object("rectangle", rectangle);
|
|
//>>includeEnd('debug');
|
|
|
|
var withId = RectangleWithId.fromRectangleAndId(
|
|
"",
|
|
rectangle,
|
|
collisionScratch
|
|
);
|
|
return this._tree.collides(withId);
|
|
};
|
|
export default RectangleCollisionChecker;
|