1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- import rbush from '../ThirdParty/rbush.js';
- import Check from './Check.js';
- /**
- * Wrapper around rbush for use with Rectangle types.
- * @private
- */
- function RectangleCollisionChecker() {
- this._tree = 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;
|