Zone.prototype.sort = function sort() { if (!this._changed) return; this._changed = false; var misses = []; for (var i = 0; i < this.items.length - 1; i++) { var current = this.items[i], next = this.items[i + 1]; if (Item.compare(current, next) > 0) { misses.push(next); this.items.splice(i + 1, 1); i--; } } if (misses.length > 100) { this.items = this.items.concat(misses); this.items.sort(Item.compare); } else { for (var i = 0; i < misses.length; i++) { this.insert(misses[i]); } } };
Zone.prototype.insert = function insert(item) { // Fast case if (this.items.length === 0) { this.items.push(item); return; } // Binary-search + insertion var i = 0, j = this.items.length - 1, middle = 0; while (i <= j) { middle = (i + j) >> 1; var cmp = Item.compare(item, this.items[middle]); if (cmp == 0) { break; } else if (cmp < 0) { j = middle - 1; } else { i = middle + 1; } } if (cmp > 0) { middle++; } // Insert this.items.splice(middle, 0, item); };
Zone.prototype.getItemAtPos = function getItemAtPos(x, y, z) { // Fast case if (this.items.length === 0) return false; // Binary-search var cell = { _sortId: -1, rx: x, ry: y, rz: z }, i = 0, j = this.items.length - 1, middle = 0; while (i <= j) { middle = (i + j) >> 1; var cmp = Item.compare(cell, this.items[middle]); if (cmp == 0) { break; } else if (cmp < 0) { j = middle - 1; } else { i = middle + 1; } } if (cmp > 0) { middle++; } // Start searching from middle for (var i = middle; i < this.items.length; i++) { var item = this.items[i], cmp = Item.compare(cell, item); if (cmp > 0) break; if (round(x) === item.rx && round(y) === item.ry && round(z) === item.rz) { return item; } } return false; };